Added --gpu-temp-retain support for windows through nvapi
[hashcat.git] / src / shared.c
1 /**
2 * Authors.....: Jens Steube <jens.steube@gmail.com>
3 * Gabriele Gristina <matrix@hashcat.net>
4 * magnum <john.magnum@hushmail.com>
5 *
6 * License.....: MIT
7 */
8
9 #ifdef OSX
10 #include <stdio.h>
11 #endif
12
13 #include <shared.h>
14 #include <limits.h>
15
16 /**
17 * basic bit handling
18 */
19
20 u32 is_power_of_2(u32 v)
21 {
22 return (v && !(v & (v - 1)));
23 }
24
25 u32 rotl32 (const u32 a, const u32 n)
26 {
27 return ((a << n) | (a >> (32 - n)));
28 }
29
30 u32 rotr32 (const u32 a, const u32 n)
31 {
32 return ((a >> n) | (a << (32 - n)));
33 }
34
35 u64 rotl64 (const u64 a, const u64 n)
36 {
37 return ((a << n) | (a >> (64 - n)));
38 }
39
40 u64 rotr64 (const u64 a, const u64 n)
41 {
42 return ((a >> n) | (a << (64 - n)));
43 }
44
45 u32 byte_swap_32 (const u32 n)
46 {
47 return (n & 0xff000000) >> 24
48 | (n & 0x00ff0000) >> 8
49 | (n & 0x0000ff00) << 8
50 | (n & 0x000000ff) << 24;
51 }
52
53 u64 byte_swap_64 (const u64 n)
54 {
55 return (n & 0xff00000000000000ULL) >> 56
56 | (n & 0x00ff000000000000ULL) >> 40
57 | (n & 0x0000ff0000000000ULL) >> 24
58 | (n & 0x000000ff00000000ULL) >> 8
59 | (n & 0x00000000ff000000ULL) << 8
60 | (n & 0x0000000000ff0000ULL) << 24
61 | (n & 0x000000000000ff00ULL) << 40
62 | (n & 0x00000000000000ffULL) << 56;
63 }
64
65 /**
66 * ciphers for use on cpu
67 */
68
69 #include "cpu-des.c"
70 #include "cpu-aes.c"
71
72 /**
73 * hashes for use on cpu
74 */
75
76 #include "cpu-md5.c"
77 #include "cpu-sha1.c"
78 #include "cpu-sha256.c"
79
80 /**
81 * logging
82 */
83
84 int last_len = 0;
85
86 void log_final (FILE *fp, const char *fmt, va_list ap)
87 {
88 if (last_len)
89 {
90 fputc ('\r', fp);
91
92 for (int i = 0; i < last_len; i++)
93 {
94 fputc (' ', fp);
95 }
96
97 fputc ('\r', fp);
98 }
99
100 char s[4096] = { 0 };
101
102 int max_len = (int) sizeof (s);
103
104 int len = vsnprintf (s, max_len, fmt, ap);
105
106 if (len > max_len) len = max_len;
107
108 fwrite (s, len, 1, fp);
109
110 fflush (fp);
111
112 last_len = len;
113 }
114
115 void log_out_nn (FILE *fp, const char *fmt, ...)
116 {
117 if (SUPPRESS_OUTPUT) return;
118
119 va_list ap;
120
121 va_start (ap, fmt);
122
123 log_final (fp, fmt, ap);
124
125 va_end (ap);
126 }
127
128 void log_info_nn (const char *fmt, ...)
129 {
130 if (SUPPRESS_OUTPUT) return;
131
132 va_list ap;
133
134 va_start (ap, fmt);
135
136 log_final (stdout, fmt, ap);
137
138 va_end (ap);
139 }
140
141 void log_error_nn (const char *fmt, ...)
142 {
143 if (SUPPRESS_OUTPUT) return;
144
145 va_list ap;
146
147 va_start (ap, fmt);
148
149 log_final (stderr, fmt, ap);
150
151 va_end (ap);
152 }
153
154 void log_out (FILE *fp, const char *fmt, ...)
155 {
156 if (SUPPRESS_OUTPUT) return;
157
158 va_list ap;
159
160 va_start (ap, fmt);
161
162 log_final (fp, fmt, ap);
163
164 va_end (ap);
165
166 fputc ('\n', fp);
167
168 last_len = 0;
169 }
170
171 void log_info (const char *fmt, ...)
172 {
173 if (SUPPRESS_OUTPUT) return;
174
175 va_list ap;
176
177 va_start (ap, fmt);
178
179 log_final (stdout, fmt, ap);
180
181 va_end (ap);
182
183 fputc ('\n', stdout);
184
185 last_len = 0;
186 }
187
188 void log_error (const char *fmt, ...)
189 {
190 if (SUPPRESS_OUTPUT) return;
191
192 fputc ('\n', stderr);
193 fputc ('\n', stderr);
194
195 va_list ap;
196
197 va_start (ap, fmt);
198
199 log_final (stderr, fmt, ap);
200
201 va_end (ap);
202
203 fputc ('\n', stderr);
204 fputc ('\n', stderr);
205
206 last_len = 0;
207 }
208
209 /**
210 * converter
211 */
212
213 u8 int_to_base32 (const u8 c)
214 {
215 static const u8 tbl[0x20] =
216 {
217 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50,
218 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
219 };
220
221 return tbl[c];
222 }
223
224 u8 base32_to_int (const u8 c)
225 {
226 if ((c >= 'A') && (c <= 'Z')) return c - 'A';
227 else if ((c >= '2') && (c <= '7')) return c - '2' + 26;
228
229 return 0;
230 }
231
232 u8 int_to_itoa32 (const u8 c)
233 {
234 static const u8 tbl[0x20] =
235 {
236 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66,
237 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76,
238 };
239
240 return tbl[c];
241 }
242
243 u8 itoa32_to_int (const u8 c)
244 {
245 if ((c >= '0') && (c <= '9')) return c - '0';
246 else if ((c >= 'a') && (c <= 'v')) return c - 'a' + 10;
247
248 return 0;
249 }
250
251 u8 int_to_itoa64 (const u8 c)
252 {
253 static const u8 tbl[0x40] =
254 {
255 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44,
256 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54,
257 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a,
258 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a,
259 };
260
261 return tbl[c];
262 }
263
264 u8 itoa64_to_int (const u8 c)
265 {
266 static const u8 tbl[0x100] =
267 {
268 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21,
269 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31,
270 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01,
271 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a,
272 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a,
273 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x20, 0x21, 0x22, 0x23, 0x24,
274 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34,
275 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01, 0x02, 0x03, 0x04,
276 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14,
277 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24,
278 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34,
279 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01, 0x02, 0x03, 0x04,
280 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14,
281 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24,
282 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34,
283 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01, 0x02, 0x03, 0x04,
284 };
285
286 return tbl[c];
287 }
288
289 u8 int_to_base64 (const u8 c)
290 {
291 static const u8 tbl[0x40] =
292 {
293 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50,
294 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66,
295 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76,
296 0x77, 0x78, 0x79, 0x7a, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x2b, 0x2f,
297 };
298
299 return tbl[c];
300 }
301
302 u8 base64_to_int (const u8 c)
303 {
304 static const u8 tbl[0x100] =
305 {
306 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
307 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
308 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x3f,
309 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
310 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
311 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00,
312 0x00, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,
313 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00,
314 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
315 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
316 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
317 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
318 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
319 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
320 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
321 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
322 };
323
324 return tbl[c];
325 }
326
327 u8 int_to_bf64 (const u8 c)
328 {
329 static const u8 tbl[0x40] =
330 {
331 0x2e, 0x2f, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e,
332 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64,
333 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74,
334 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
335 };
336
337 return tbl[c];
338 }
339
340 u8 bf64_to_int (const u8 c)
341 {
342 static const u8 tbl[0x100] =
343 {
344 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
345 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
346 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
347 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
348 0x00, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
349 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00,
350 0x00, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a,
351 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00,
352 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
353 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
354 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
355 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
356 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
357 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
358 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
359 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
360 };
361
362 return tbl[c];
363 }
364
365 u8 int_to_lotus64 (const u8 c)
366 {
367 if (c < 10) return '0' + c;
368 else if (c < 36) return 'A' + c - 10;
369 else if (c < 62) return 'a' + c - 36;
370 else if (c == 62) return '+';
371 else if (c == 63) return '/';
372
373 return 0;
374 }
375
376 u8 lotus64_to_int (const u8 c)
377 {
378 if ((c >= '0') && (c <= '9')) return c - '0';
379 else if ((c >= 'A') && (c <= 'Z')) return c - 'A' + 10;
380 else if ((c >= 'a') && (c <= 'z')) return c - 'a' + 36;
381 else if (c == '+') return 62;
382 else if (c == '/') return 63;
383 else
384
385 return 0;
386 }
387
388 int base32_decode (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf)
389 {
390 const u8 *in_ptr = in_buf;
391
392 u8 *out_ptr = out_buf;
393
394 for (int i = 0; i < in_len; i += 8)
395 {
396 const u8 out_val0 = f (in_ptr[0] & 0x7f);
397 const u8 out_val1 = f (in_ptr[1] & 0x7f);
398 const u8 out_val2 = f (in_ptr[2] & 0x7f);
399 const u8 out_val3 = f (in_ptr[3] & 0x7f);
400 const u8 out_val4 = f (in_ptr[4] & 0x7f);
401 const u8 out_val5 = f (in_ptr[5] & 0x7f);
402 const u8 out_val6 = f (in_ptr[6] & 0x7f);
403 const u8 out_val7 = f (in_ptr[7] & 0x7f);
404
405 out_ptr[0] = ((out_val0 << 3) & 0xf8) | ((out_val1 >> 2) & 0x07);
406 out_ptr[1] = ((out_val1 << 6) & 0xc0) | ((out_val2 << 1) & 0x3e) | ((out_val3 >> 4) & 0x01);
407 out_ptr[2] = ((out_val3 << 4) & 0xf0) | ((out_val4 >> 1) & 0x0f);
408 out_ptr[3] = ((out_val4 << 7) & 0x80) | ((out_val5 << 2) & 0x7c) | ((out_val6 >> 3) & 0x03);
409 out_ptr[4] = ((out_val6 << 5) & 0xe0) | ((out_val7 >> 0) & 0x1f);
410
411 in_ptr += 8;
412 out_ptr += 5;
413 }
414
415 for (int i = 0; i < in_len; i++)
416 {
417 if (in_buf[i] != '=') continue;
418
419 in_len = i;
420 }
421
422 int out_len = (in_len * 5) / 8;
423
424 return out_len;
425 }
426
427 int base32_encode (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf)
428 {
429 const u8 *in_ptr = in_buf;
430
431 u8 *out_ptr = out_buf;
432
433 for (int i = 0; i < in_len; i += 5)
434 {
435 const u8 out_val0 = f ( ((in_ptr[0] >> 3) & 0x1f));
436 const u8 out_val1 = f (((in_ptr[0] << 2) & 0x1c) | ((in_ptr[1] >> 6) & 0x03));
437 const u8 out_val2 = f ( ((in_ptr[1] >> 1) & 0x1f));
438 const u8 out_val3 = f (((in_ptr[1] << 4) & 0x10) | ((in_ptr[2] >> 4) & 0x0f));
439 const u8 out_val4 = f (((in_ptr[2] << 1) & 0x1e) | ((in_ptr[3] >> 7) & 0x01));
440 const u8 out_val5 = f ( ((in_ptr[3] >> 2) & 0x1f));
441 const u8 out_val6 = f (((in_ptr[3] << 3) & 0x18) | ((in_ptr[4] >> 5) & 0x07));
442 const u8 out_val7 = f ( ((in_ptr[4] >> 0) & 0x1f));
443
444 out_ptr[0] = out_val0 & 0x7f;
445 out_ptr[1] = out_val1 & 0x7f;
446 out_ptr[2] = out_val2 & 0x7f;
447 out_ptr[3] = out_val3 & 0x7f;
448 out_ptr[4] = out_val4 & 0x7f;
449 out_ptr[5] = out_val5 & 0x7f;
450 out_ptr[6] = out_val6 & 0x7f;
451 out_ptr[7] = out_val7 & 0x7f;
452
453 in_ptr += 5;
454 out_ptr += 8;
455 }
456
457 int out_len = (int) (((0.5 + (float) in_len) * 8) / 5); // ceil (in_len * 8 / 5)
458
459 while (out_len % 8)
460 {
461 out_buf[out_len] = '=';
462
463 out_len++;
464 }
465
466 return out_len;
467 }
468
469 int base64_decode (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf)
470 {
471 const u8 *in_ptr = in_buf;
472
473 u8 *out_ptr = out_buf;
474
475 for (int i = 0; i < in_len; i += 4)
476 {
477 const u8 out_val0 = f (in_ptr[0] & 0x7f);
478 const u8 out_val1 = f (in_ptr[1] & 0x7f);
479 const u8 out_val2 = f (in_ptr[2] & 0x7f);
480 const u8 out_val3 = f (in_ptr[3] & 0x7f);
481
482 out_ptr[0] = ((out_val0 << 2) & 0xfc) | ((out_val1 >> 4) & 0x03);
483 out_ptr[1] = ((out_val1 << 4) & 0xf0) | ((out_val2 >> 2) & 0x0f);
484 out_ptr[2] = ((out_val2 << 6) & 0xc0) | ((out_val3 >> 0) & 0x3f);
485
486 in_ptr += 4;
487 out_ptr += 3;
488 }
489
490 for (int i = 0; i < in_len; i++)
491 {
492 if (in_buf[i] != '=') continue;
493
494 in_len = i;
495 }
496
497 int out_len = (in_len * 6) / 8;
498
499 return out_len;
500 }
501
502 int base64_encode (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf)
503 {
504 const u8 *in_ptr = in_buf;
505
506 u8 *out_ptr = out_buf;
507
508 for (int i = 0; i < in_len; i += 3)
509 {
510 const u8 out_val0 = f ( ((in_ptr[0] >> 2) & 0x3f));
511 const u8 out_val1 = f (((in_ptr[0] << 4) & 0x30) | ((in_ptr[1] >> 4) & 0x0f));
512 const u8 out_val2 = f (((in_ptr[1] << 2) & 0x3c) | ((in_ptr[2] >> 6) & 0x03));
513 const u8 out_val3 = f ( ((in_ptr[2] >> 0) & 0x3f));
514
515 out_ptr[0] = out_val0 & 0x7f;
516 out_ptr[1] = out_val1 & 0x7f;
517 out_ptr[2] = out_val2 & 0x7f;
518 out_ptr[3] = out_val3 & 0x7f;
519
520 in_ptr += 3;
521 out_ptr += 4;
522 }
523
524 int out_len = (int) (((0.5 + (float) in_len) * 8) / 6); // ceil (in_len * 8 / 6)
525
526 while (out_len % 4)
527 {
528 out_buf[out_len] = '=';
529
530 out_len++;
531 }
532
533 return out_len;
534 }
535
536 int is_valid_hex_char (const u8 c)
537 {
538 if ((c >= '0') && (c <= '9')) return 1;
539 if ((c >= 'A') && (c <= 'F')) return 1;
540 if ((c >= 'a') && (c <= 'f')) return 1;
541
542 return 0;
543 }
544
545 u8 hex_convert (const u8 c)
546 {
547 return (c & 15) + (c >> 6) * 9;
548 }
549
550 u8 hex_to_u8 (const u8 hex[2])
551 {
552 u8 v = 0;
553
554 v |= (hex_convert (hex[1]) << 0);
555 v |= (hex_convert (hex[0]) << 4);
556
557 return (v);
558 }
559
560 u32 hex_to_u32 (const u8 hex[8])
561 {
562 u32 v = 0;
563
564 v |= ((u32) hex_convert (hex[7])) << 0;
565 v |= ((u32) hex_convert (hex[6])) << 4;
566 v |= ((u32) hex_convert (hex[5])) << 8;
567 v |= ((u32) hex_convert (hex[4])) << 12;
568 v |= ((u32) hex_convert (hex[3])) << 16;
569 v |= ((u32) hex_convert (hex[2])) << 20;
570 v |= ((u32) hex_convert (hex[1])) << 24;
571 v |= ((u32) hex_convert (hex[0])) << 28;
572
573 return (v);
574 }
575
576 u64 hex_to_u64 (const u8 hex[16])
577 {
578 u64 v = 0;
579
580 v |= ((u64) hex_convert (hex[15]) << 0);
581 v |= ((u64) hex_convert (hex[14]) << 4);
582 v |= ((u64) hex_convert (hex[13]) << 8);
583 v |= ((u64) hex_convert (hex[12]) << 12);
584 v |= ((u64) hex_convert (hex[11]) << 16);
585 v |= ((u64) hex_convert (hex[10]) << 20);
586 v |= ((u64) hex_convert (hex[ 9]) << 24);
587 v |= ((u64) hex_convert (hex[ 8]) << 28);
588 v |= ((u64) hex_convert (hex[ 7]) << 32);
589 v |= ((u64) hex_convert (hex[ 6]) << 36);
590 v |= ((u64) hex_convert (hex[ 5]) << 40);
591 v |= ((u64) hex_convert (hex[ 4]) << 44);
592 v |= ((u64) hex_convert (hex[ 3]) << 48);
593 v |= ((u64) hex_convert (hex[ 2]) << 52);
594 v |= ((u64) hex_convert (hex[ 1]) << 56);
595 v |= ((u64) hex_convert (hex[ 0]) << 60);
596
597 return (v);
598 }
599
600 void bin_to_hex_lower (const u32 v, u8 hex[8])
601 {
602 hex[0] = v >> 28 & 15;
603 hex[1] = v >> 24 & 15;
604 hex[2] = v >> 20 & 15;
605 hex[3] = v >> 16 & 15;
606 hex[4] = v >> 12 & 15;
607 hex[5] = v >> 8 & 15;
608 hex[6] = v >> 4 & 15;
609 hex[7] = v >> 0 & 15;
610
611 u32 add;
612
613 hex[0] += 6; add = ((hex[0] & 0x10) >> 4) * 39; hex[0] += 42 + add;
614 hex[1] += 6; add = ((hex[1] & 0x10) >> 4) * 39; hex[1] += 42 + add;
615 hex[2] += 6; add = ((hex[2] & 0x10) >> 4) * 39; hex[2] += 42 + add;
616 hex[3] += 6; add = ((hex[3] & 0x10) >> 4) * 39; hex[3] += 42 + add;
617 hex[4] += 6; add = ((hex[4] & 0x10) >> 4) * 39; hex[4] += 42 + add;
618 hex[5] += 6; add = ((hex[5] & 0x10) >> 4) * 39; hex[5] += 42 + add;
619 hex[6] += 6; add = ((hex[6] & 0x10) >> 4) * 39; hex[6] += 42 + add;
620 hex[7] += 6; add = ((hex[7] & 0x10) >> 4) * 39; hex[7] += 42 + add;
621 }
622
623 /**
624 * decoder
625 */
626
627 static void AES128_decrypt_cbc (const u32 key[4], const u32 iv[4], const u32 in[16], u32 out[16])
628 {
629 AES_KEY skey;
630
631 AES_set_decrypt_key ((const u8 *) key, 128, &skey);
632
633 u32 _iv[4] = { 0 };
634
635 _iv[0] = iv[0];
636 _iv[1] = iv[1];
637 _iv[2] = iv[2];
638 _iv[3] = iv[3];
639
640 for (int i = 0; i < 16; i += 4)
641 {
642 u32 _in[4] = { 0 };
643 u32 _out[4] = { 0 };
644
645 _in[0] = in[i + 0];
646 _in[1] = in[i + 1];
647 _in[2] = in[i + 2];
648 _in[3] = in[i + 3];
649
650 AES_decrypt (&skey, (const u8 *) _in, (u8 *) _out);
651
652 _out[0] ^= _iv[0];
653 _out[1] ^= _iv[1];
654 _out[2] ^= _iv[2];
655 _out[3] ^= _iv[3];
656
657 out[i + 0] = _out[0];
658 out[i + 1] = _out[1];
659 out[i + 2] = _out[2];
660 out[i + 3] = _out[3];
661
662 _iv[0] = _in[0];
663 _iv[1] = _in[1];
664 _iv[2] = _in[2];
665 _iv[3] = _in[3];
666 }
667 }
668
669 static void juniper_decrypt_hash (char *in, char *out)
670 {
671 // base64 decode
672
673 u8 base64_buf[100] = { 0 };
674
675 base64_decode (base64_to_int, (const u8 *) in, DISPLAY_LEN_MIN_501, base64_buf);
676
677 // iv stuff
678
679 u32 juniper_iv[4] = { 0 };
680
681 memcpy (juniper_iv, base64_buf, 12);
682
683 memcpy (out, juniper_iv, 12);
684
685 // reversed key
686
687 u32 juniper_key[4] = { 0 };
688
689 juniper_key[0] = byte_swap_32 (0xa6707a7e);
690 juniper_key[1] = byte_swap_32 (0x8df91059);
691 juniper_key[2] = byte_swap_32 (0xdea70ae5);
692 juniper_key[3] = byte_swap_32 (0x2f9c2442);
693
694 // AES decrypt
695
696 u32 *in_ptr = (u32 *) (base64_buf + 12);
697 u32 *out_ptr = (u32 *) (out + 12);
698
699 AES128_decrypt_cbc (juniper_key, juniper_iv, in_ptr, out_ptr);
700 }
701
702 void phpass_decode (u8 digest[16], u8 buf[22])
703 {
704 int l;
705
706 l = itoa64_to_int (buf[ 0]) << 0;
707 l |= itoa64_to_int (buf[ 1]) << 6;
708 l |= itoa64_to_int (buf[ 2]) << 12;
709 l |= itoa64_to_int (buf[ 3]) << 18;
710
711 digest[ 0] = (l >> 0) & 0xff;
712 digest[ 1] = (l >> 8) & 0xff;
713 digest[ 2] = (l >> 16) & 0xff;
714
715 l = itoa64_to_int (buf[ 4]) << 0;
716 l |= itoa64_to_int (buf[ 5]) << 6;
717 l |= itoa64_to_int (buf[ 6]) << 12;
718 l |= itoa64_to_int (buf[ 7]) << 18;
719
720 digest[ 3] = (l >> 0) & 0xff;
721 digest[ 4] = (l >> 8) & 0xff;
722 digest[ 5] = (l >> 16) & 0xff;
723
724 l = itoa64_to_int (buf[ 8]) << 0;
725 l |= itoa64_to_int (buf[ 9]) << 6;
726 l |= itoa64_to_int (buf[10]) << 12;
727 l |= itoa64_to_int (buf[11]) << 18;
728
729 digest[ 6] = (l >> 0) & 0xff;
730 digest[ 7] = (l >> 8) & 0xff;
731 digest[ 8] = (l >> 16) & 0xff;
732
733 l = itoa64_to_int (buf[12]) << 0;
734 l |= itoa64_to_int (buf[13]) << 6;
735 l |= itoa64_to_int (buf[14]) << 12;
736 l |= itoa64_to_int (buf[15]) << 18;
737
738 digest[ 9] = (l >> 0) & 0xff;
739 digest[10] = (l >> 8) & 0xff;
740 digest[11] = (l >> 16) & 0xff;
741
742 l = itoa64_to_int (buf[16]) << 0;
743 l |= itoa64_to_int (buf[17]) << 6;
744 l |= itoa64_to_int (buf[18]) << 12;
745 l |= itoa64_to_int (buf[19]) << 18;
746
747 digest[12] = (l >> 0) & 0xff;
748 digest[13] = (l >> 8) & 0xff;
749 digest[14] = (l >> 16) & 0xff;
750
751 l = itoa64_to_int (buf[20]) << 0;
752 l |= itoa64_to_int (buf[21]) << 6;
753
754 digest[15] = (l >> 0) & 0xff;
755 }
756
757 void phpass_encode (u8 digest[16], u8 buf[22])
758 {
759 int l;
760
761 l = (digest[ 0] << 0) | (digest[ 1] << 8) | (digest[ 2] << 16);
762
763 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
764 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
765 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
766 buf[ 3] = int_to_itoa64 (l & 0x3f);
767
768 l = (digest[ 3] << 0) | (digest[ 4] << 8) | (digest[ 5] << 16);
769
770 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
771 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
772 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
773 buf[ 7] = int_to_itoa64 (l & 0x3f);
774
775 l = (digest[ 6] << 0) | (digest[ 7] << 8) | (digest[ 8] << 16);
776
777 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
778 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
779 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
780 buf[11] = int_to_itoa64 (l & 0x3f);
781
782 l = (digest[ 9] << 0) | (digest[10] << 8) | (digest[11] << 16);
783
784 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
785 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
786 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
787 buf[15] = int_to_itoa64 (l & 0x3f);
788
789 l = (digest[12] << 0) | (digest[13] << 8) | (digest[14] << 16);
790
791 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
792 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
793 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
794 buf[19] = int_to_itoa64 (l & 0x3f);
795
796 l = (digest[15] << 0);
797
798 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
799 buf[21] = int_to_itoa64 (l & 0x3f);
800 }
801
802 void md5crypt_decode (u8 digest[16], u8 buf[22])
803 {
804 int l;
805
806 l = itoa64_to_int (buf[ 0]) << 0;
807 l |= itoa64_to_int (buf[ 1]) << 6;
808 l |= itoa64_to_int (buf[ 2]) << 12;
809 l |= itoa64_to_int (buf[ 3]) << 18;
810
811 digest[ 0] = (l >> 16) & 0xff;
812 digest[ 6] = (l >> 8) & 0xff;
813 digest[12] = (l >> 0) & 0xff;
814
815 l = itoa64_to_int (buf[ 4]) << 0;
816 l |= itoa64_to_int (buf[ 5]) << 6;
817 l |= itoa64_to_int (buf[ 6]) << 12;
818 l |= itoa64_to_int (buf[ 7]) << 18;
819
820 digest[ 1] = (l >> 16) & 0xff;
821 digest[ 7] = (l >> 8) & 0xff;
822 digest[13] = (l >> 0) & 0xff;
823
824 l = itoa64_to_int (buf[ 8]) << 0;
825 l |= itoa64_to_int (buf[ 9]) << 6;
826 l |= itoa64_to_int (buf[10]) << 12;
827 l |= itoa64_to_int (buf[11]) << 18;
828
829 digest[ 2] = (l >> 16) & 0xff;
830 digest[ 8] = (l >> 8) & 0xff;
831 digest[14] = (l >> 0) & 0xff;
832
833 l = itoa64_to_int (buf[12]) << 0;
834 l |= itoa64_to_int (buf[13]) << 6;
835 l |= itoa64_to_int (buf[14]) << 12;
836 l |= itoa64_to_int (buf[15]) << 18;
837
838 digest[ 3] = (l >> 16) & 0xff;
839 digest[ 9] = (l >> 8) & 0xff;
840 digest[15] = (l >> 0) & 0xff;
841
842 l = itoa64_to_int (buf[16]) << 0;
843 l |= itoa64_to_int (buf[17]) << 6;
844 l |= itoa64_to_int (buf[18]) << 12;
845 l |= itoa64_to_int (buf[19]) << 18;
846
847 digest[ 4] = (l >> 16) & 0xff;
848 digest[10] = (l >> 8) & 0xff;
849 digest[ 5] = (l >> 0) & 0xff;
850
851 l = itoa64_to_int (buf[20]) << 0;
852 l |= itoa64_to_int (buf[21]) << 6;
853
854 digest[11] = (l >> 0) & 0xff;
855 }
856
857 void md5crypt_encode (u8 digest[16], u8 buf[22])
858 {
859 int l;
860
861 l = (digest[ 0] << 16) | (digest[ 6] << 8) | (digest[12] << 0);
862
863 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
864 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
865 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
866 buf[ 3] = int_to_itoa64 (l & 0x3f); l >>= 6;
867
868 l = (digest[ 1] << 16) | (digest[ 7] << 8) | (digest[13] << 0);
869
870 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
871 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
872 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
873 buf[ 7] = int_to_itoa64 (l & 0x3f); l >>= 6;
874
875 l = (digest[ 2] << 16) | (digest[ 8] << 8) | (digest[14] << 0);
876
877 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
878 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
879 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
880 buf[11] = int_to_itoa64 (l & 0x3f); l >>= 6;
881
882 l = (digest[ 3] << 16) | (digest[ 9] << 8) | (digest[15] << 0);
883
884 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
885 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
886 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
887 buf[15] = int_to_itoa64 (l & 0x3f); l >>= 6;
888
889 l = (digest[ 4] << 16) | (digest[10] << 8) | (digest[ 5] << 0);
890
891 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
892 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
893 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
894 buf[19] = int_to_itoa64 (l & 0x3f); l >>= 6;
895
896 l = (digest[11] << 0);
897
898 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
899 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
900 }
901
902 void sha512crypt_decode (u8 digest[64], u8 buf[86])
903 {
904 int l;
905
906 l = itoa64_to_int (buf[ 0]) << 0;
907 l |= itoa64_to_int (buf[ 1]) << 6;
908 l |= itoa64_to_int (buf[ 2]) << 12;
909 l |= itoa64_to_int (buf[ 3]) << 18;
910
911 digest[ 0] = (l >> 16) & 0xff;
912 digest[21] = (l >> 8) & 0xff;
913 digest[42] = (l >> 0) & 0xff;
914
915 l = itoa64_to_int (buf[ 4]) << 0;
916 l |= itoa64_to_int (buf[ 5]) << 6;
917 l |= itoa64_to_int (buf[ 6]) << 12;
918 l |= itoa64_to_int (buf[ 7]) << 18;
919
920 digest[22] = (l >> 16) & 0xff;
921 digest[43] = (l >> 8) & 0xff;
922 digest[ 1] = (l >> 0) & 0xff;
923
924 l = itoa64_to_int (buf[ 8]) << 0;
925 l |= itoa64_to_int (buf[ 9]) << 6;
926 l |= itoa64_to_int (buf[10]) << 12;
927 l |= itoa64_to_int (buf[11]) << 18;
928
929 digest[44] = (l >> 16) & 0xff;
930 digest[ 2] = (l >> 8) & 0xff;
931 digest[23] = (l >> 0) & 0xff;
932
933 l = itoa64_to_int (buf[12]) << 0;
934 l |= itoa64_to_int (buf[13]) << 6;
935 l |= itoa64_to_int (buf[14]) << 12;
936 l |= itoa64_to_int (buf[15]) << 18;
937
938 digest[ 3] = (l >> 16) & 0xff;
939 digest[24] = (l >> 8) & 0xff;
940 digest[45] = (l >> 0) & 0xff;
941
942 l = itoa64_to_int (buf[16]) << 0;
943 l |= itoa64_to_int (buf[17]) << 6;
944 l |= itoa64_to_int (buf[18]) << 12;
945 l |= itoa64_to_int (buf[19]) << 18;
946
947 digest[25] = (l >> 16) & 0xff;
948 digest[46] = (l >> 8) & 0xff;
949 digest[ 4] = (l >> 0) & 0xff;
950
951 l = itoa64_to_int (buf[20]) << 0;
952 l |= itoa64_to_int (buf[21]) << 6;
953 l |= itoa64_to_int (buf[22]) << 12;
954 l |= itoa64_to_int (buf[23]) << 18;
955
956 digest[47] = (l >> 16) & 0xff;
957 digest[ 5] = (l >> 8) & 0xff;
958 digest[26] = (l >> 0) & 0xff;
959
960 l = itoa64_to_int (buf[24]) << 0;
961 l |= itoa64_to_int (buf[25]) << 6;
962 l |= itoa64_to_int (buf[26]) << 12;
963 l |= itoa64_to_int (buf[27]) << 18;
964
965 digest[ 6] = (l >> 16) & 0xff;
966 digest[27] = (l >> 8) & 0xff;
967 digest[48] = (l >> 0) & 0xff;
968
969 l = itoa64_to_int (buf[28]) << 0;
970 l |= itoa64_to_int (buf[29]) << 6;
971 l |= itoa64_to_int (buf[30]) << 12;
972 l |= itoa64_to_int (buf[31]) << 18;
973
974 digest[28] = (l >> 16) & 0xff;
975 digest[49] = (l >> 8) & 0xff;
976 digest[ 7] = (l >> 0) & 0xff;
977
978 l = itoa64_to_int (buf[32]) << 0;
979 l |= itoa64_to_int (buf[33]) << 6;
980 l |= itoa64_to_int (buf[34]) << 12;
981 l |= itoa64_to_int (buf[35]) << 18;
982
983 digest[50] = (l >> 16) & 0xff;
984 digest[ 8] = (l >> 8) & 0xff;
985 digest[29] = (l >> 0) & 0xff;
986
987 l = itoa64_to_int (buf[36]) << 0;
988 l |= itoa64_to_int (buf[37]) << 6;
989 l |= itoa64_to_int (buf[38]) << 12;
990 l |= itoa64_to_int (buf[39]) << 18;
991
992 digest[ 9] = (l >> 16) & 0xff;
993 digest[30] = (l >> 8) & 0xff;
994 digest[51] = (l >> 0) & 0xff;
995
996 l = itoa64_to_int (buf[40]) << 0;
997 l |= itoa64_to_int (buf[41]) << 6;
998 l |= itoa64_to_int (buf[42]) << 12;
999 l |= itoa64_to_int (buf[43]) << 18;
1000
1001 digest[31] = (l >> 16) & 0xff;
1002 digest[52] = (l >> 8) & 0xff;
1003 digest[10] = (l >> 0) & 0xff;
1004
1005 l = itoa64_to_int (buf[44]) << 0;
1006 l |= itoa64_to_int (buf[45]) << 6;
1007 l |= itoa64_to_int (buf[46]) << 12;
1008 l |= itoa64_to_int (buf[47]) << 18;
1009
1010 digest[53] = (l >> 16) & 0xff;
1011 digest[11] = (l >> 8) & 0xff;
1012 digest[32] = (l >> 0) & 0xff;
1013
1014 l = itoa64_to_int (buf[48]) << 0;
1015 l |= itoa64_to_int (buf[49]) << 6;
1016 l |= itoa64_to_int (buf[50]) << 12;
1017 l |= itoa64_to_int (buf[51]) << 18;
1018
1019 digest[12] = (l >> 16) & 0xff;
1020 digest[33] = (l >> 8) & 0xff;
1021 digest[54] = (l >> 0) & 0xff;
1022
1023 l = itoa64_to_int (buf[52]) << 0;
1024 l |= itoa64_to_int (buf[53]) << 6;
1025 l |= itoa64_to_int (buf[54]) << 12;
1026 l |= itoa64_to_int (buf[55]) << 18;
1027
1028 digest[34] = (l >> 16) & 0xff;
1029 digest[55] = (l >> 8) & 0xff;
1030 digest[13] = (l >> 0) & 0xff;
1031
1032 l = itoa64_to_int (buf[56]) << 0;
1033 l |= itoa64_to_int (buf[57]) << 6;
1034 l |= itoa64_to_int (buf[58]) << 12;
1035 l |= itoa64_to_int (buf[59]) << 18;
1036
1037 digest[56] = (l >> 16) & 0xff;
1038 digest[14] = (l >> 8) & 0xff;
1039 digest[35] = (l >> 0) & 0xff;
1040
1041 l = itoa64_to_int (buf[60]) << 0;
1042 l |= itoa64_to_int (buf[61]) << 6;
1043 l |= itoa64_to_int (buf[62]) << 12;
1044 l |= itoa64_to_int (buf[63]) << 18;
1045
1046 digest[15] = (l >> 16) & 0xff;
1047 digest[36] = (l >> 8) & 0xff;
1048 digest[57] = (l >> 0) & 0xff;
1049
1050 l = itoa64_to_int (buf[64]) << 0;
1051 l |= itoa64_to_int (buf[65]) << 6;
1052 l |= itoa64_to_int (buf[66]) << 12;
1053 l |= itoa64_to_int (buf[67]) << 18;
1054
1055 digest[37] = (l >> 16) & 0xff;
1056 digest[58] = (l >> 8) & 0xff;
1057 digest[16] = (l >> 0) & 0xff;
1058
1059 l = itoa64_to_int (buf[68]) << 0;
1060 l |= itoa64_to_int (buf[69]) << 6;
1061 l |= itoa64_to_int (buf[70]) << 12;
1062 l |= itoa64_to_int (buf[71]) << 18;
1063
1064 digest[59] = (l >> 16) & 0xff;
1065 digest[17] = (l >> 8) & 0xff;
1066 digest[38] = (l >> 0) & 0xff;
1067
1068 l = itoa64_to_int (buf[72]) << 0;
1069 l |= itoa64_to_int (buf[73]) << 6;
1070 l |= itoa64_to_int (buf[74]) << 12;
1071 l |= itoa64_to_int (buf[75]) << 18;
1072
1073 digest[18] = (l >> 16) & 0xff;
1074 digest[39] = (l >> 8) & 0xff;
1075 digest[60] = (l >> 0) & 0xff;
1076
1077 l = itoa64_to_int (buf[76]) << 0;
1078 l |= itoa64_to_int (buf[77]) << 6;
1079 l |= itoa64_to_int (buf[78]) << 12;
1080 l |= itoa64_to_int (buf[79]) << 18;
1081
1082 digest[40] = (l >> 16) & 0xff;
1083 digest[61] = (l >> 8) & 0xff;
1084 digest[19] = (l >> 0) & 0xff;
1085
1086 l = itoa64_to_int (buf[80]) << 0;
1087 l |= itoa64_to_int (buf[81]) << 6;
1088 l |= itoa64_to_int (buf[82]) << 12;
1089 l |= itoa64_to_int (buf[83]) << 18;
1090
1091 digest[62] = (l >> 16) & 0xff;
1092 digest[20] = (l >> 8) & 0xff;
1093 digest[41] = (l >> 0) & 0xff;
1094
1095 l = itoa64_to_int (buf[84]) << 0;
1096 l |= itoa64_to_int (buf[85]) << 6;
1097
1098 digest[63] = (l >> 0) & 0xff;
1099 }
1100
1101 void sha512crypt_encode (u8 digest[64], u8 buf[86])
1102 {
1103 int l;
1104
1105 l = (digest[ 0] << 16) | (digest[21] << 8) | (digest[42] << 0);
1106
1107 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1108 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1109 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1110 buf[ 3] = int_to_itoa64 (l & 0x3f); l >>= 6;
1111
1112 l = (digest[22] << 16) | (digest[43] << 8) | (digest[ 1] << 0);
1113
1114 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1115 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1116 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1117 buf[ 7] = int_to_itoa64 (l & 0x3f); l >>= 6;
1118
1119 l = (digest[44] << 16) | (digest[ 2] << 8) | (digest[23] << 0);
1120
1121 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1122 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1123 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1124 buf[11] = int_to_itoa64 (l & 0x3f); l >>= 6;
1125
1126 l = (digest[ 3] << 16) | (digest[24] << 8) | (digest[45] << 0);
1127
1128 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1129 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1130 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1131 buf[15] = int_to_itoa64 (l & 0x3f); l >>= 6;
1132
1133 l = (digest[25] << 16) | (digest[46] << 8) | (digest[ 4] << 0);
1134
1135 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1136 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1137 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1138 buf[19] = int_to_itoa64 (l & 0x3f); l >>= 6;
1139
1140 l = (digest[47] << 16) | (digest[ 5] << 8) | (digest[26] << 0);
1141
1142 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1143 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1144 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1145 buf[23] = int_to_itoa64 (l & 0x3f); l >>= 6;
1146
1147 l = (digest[ 6] << 16) | (digest[27] << 8) | (digest[48] << 0);
1148
1149 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1150 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1151 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
1152 buf[27] = int_to_itoa64 (l & 0x3f); l >>= 6;
1153
1154 l = (digest[28] << 16) | (digest[49] << 8) | (digest[ 7] << 0);
1155
1156 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
1157 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
1158 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
1159 buf[31] = int_to_itoa64 (l & 0x3f); l >>= 6;
1160
1161 l = (digest[50] << 16) | (digest[ 8] << 8) | (digest[29] << 0);
1162
1163 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
1164 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
1165 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
1166 buf[35] = int_to_itoa64 (l & 0x3f); l >>= 6;
1167
1168 l = (digest[ 9] << 16) | (digest[30] << 8) | (digest[51] << 0);
1169
1170 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
1171 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
1172 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
1173 buf[39] = int_to_itoa64 (l & 0x3f); l >>= 6;
1174
1175 l = (digest[31] << 16) | (digest[52] << 8) | (digest[10] << 0);
1176
1177 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
1178 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
1179 buf[42] = int_to_itoa64 (l & 0x3f); l >>= 6;
1180 buf[43] = int_to_itoa64 (l & 0x3f); l >>= 6;
1181
1182 l = (digest[53] << 16) | (digest[11] << 8) | (digest[32] << 0);
1183
1184 buf[44] = int_to_itoa64 (l & 0x3f); l >>= 6;
1185 buf[45] = int_to_itoa64 (l & 0x3f); l >>= 6;
1186 buf[46] = int_to_itoa64 (l & 0x3f); l >>= 6;
1187 buf[47] = int_to_itoa64 (l & 0x3f); l >>= 6;
1188
1189 l = (digest[12] << 16) | (digest[33] << 8) | (digest[54] << 0);
1190
1191 buf[48] = int_to_itoa64 (l & 0x3f); l >>= 6;
1192 buf[49] = int_to_itoa64 (l & 0x3f); l >>= 6;
1193 buf[50] = int_to_itoa64 (l & 0x3f); l >>= 6;
1194 buf[51] = int_to_itoa64 (l & 0x3f); l >>= 6;
1195
1196 l = (digest[34] << 16) | (digest[55] << 8) | (digest[13] << 0);
1197
1198 buf[52] = int_to_itoa64 (l & 0x3f); l >>= 6;
1199 buf[53] = int_to_itoa64 (l & 0x3f); l >>= 6;
1200 buf[54] = int_to_itoa64 (l & 0x3f); l >>= 6;
1201 buf[55] = int_to_itoa64 (l & 0x3f); l >>= 6;
1202
1203 l = (digest[56] << 16) | (digest[14] << 8) | (digest[35] << 0);
1204
1205 buf[56] = int_to_itoa64 (l & 0x3f); l >>= 6;
1206 buf[57] = int_to_itoa64 (l & 0x3f); l >>= 6;
1207 buf[58] = int_to_itoa64 (l & 0x3f); l >>= 6;
1208 buf[59] = int_to_itoa64 (l & 0x3f); l >>= 6;
1209
1210 l = (digest[15] << 16) | (digest[36] << 8) | (digest[57] << 0);
1211
1212 buf[60] = int_to_itoa64 (l & 0x3f); l >>= 6;
1213 buf[61] = int_to_itoa64 (l & 0x3f); l >>= 6;
1214 buf[62] = int_to_itoa64 (l & 0x3f); l >>= 6;
1215 buf[63] = int_to_itoa64 (l & 0x3f); l >>= 6;
1216
1217 l = (digest[37] << 16) | (digest[58] << 8) | (digest[16] << 0);
1218
1219 buf[64] = int_to_itoa64 (l & 0x3f); l >>= 6;
1220 buf[65] = int_to_itoa64 (l & 0x3f); l >>= 6;
1221 buf[66] = int_to_itoa64 (l & 0x3f); l >>= 6;
1222 buf[67] = int_to_itoa64 (l & 0x3f); l >>= 6;
1223
1224 l = (digest[59] << 16) | (digest[17] << 8) | (digest[38] << 0);
1225
1226 buf[68] = int_to_itoa64 (l & 0x3f); l >>= 6;
1227 buf[69] = int_to_itoa64 (l & 0x3f); l >>= 6;
1228 buf[70] = int_to_itoa64 (l & 0x3f); l >>= 6;
1229 buf[71] = int_to_itoa64 (l & 0x3f); l >>= 6;
1230
1231 l = (digest[18] << 16) | (digest[39] << 8) | (digest[60] << 0);
1232
1233 buf[72] = int_to_itoa64 (l & 0x3f); l >>= 6;
1234 buf[73] = int_to_itoa64 (l & 0x3f); l >>= 6;
1235 buf[74] = int_to_itoa64 (l & 0x3f); l >>= 6;
1236 buf[75] = int_to_itoa64 (l & 0x3f); l >>= 6;
1237
1238 l = (digest[40] << 16) | (digest[61] << 8) | (digest[19] << 0);
1239
1240 buf[76] = int_to_itoa64 (l & 0x3f); l >>= 6;
1241 buf[77] = int_to_itoa64 (l & 0x3f); l >>= 6;
1242 buf[78] = int_to_itoa64 (l & 0x3f); l >>= 6;
1243 buf[79] = int_to_itoa64 (l & 0x3f); l >>= 6;
1244
1245 l = (digest[62] << 16) | (digest[20] << 8) | (digest[41] << 0);
1246
1247 buf[80] = int_to_itoa64 (l & 0x3f); l >>= 6;
1248 buf[81] = int_to_itoa64 (l & 0x3f); l >>= 6;
1249 buf[82] = int_to_itoa64 (l & 0x3f); l >>= 6;
1250 buf[83] = int_to_itoa64 (l & 0x3f); l >>= 6;
1251
1252 l = 0 | 0 | (digest[63] << 0);
1253
1254 buf[84] = int_to_itoa64 (l & 0x3f); l >>= 6;
1255 buf[85] = int_to_itoa64 (l & 0x3f); l >>= 6;
1256 }
1257
1258 void sha1aix_decode (u8 digest[20], u8 buf[27])
1259 {
1260 int l;
1261
1262 l = itoa64_to_int (buf[ 0]) << 0;
1263 l |= itoa64_to_int (buf[ 1]) << 6;
1264 l |= itoa64_to_int (buf[ 2]) << 12;
1265 l |= itoa64_to_int (buf[ 3]) << 18;
1266
1267 digest[ 2] = (l >> 0) & 0xff;
1268 digest[ 1] = (l >> 8) & 0xff;
1269 digest[ 0] = (l >> 16) & 0xff;
1270
1271 l = itoa64_to_int (buf[ 4]) << 0;
1272 l |= itoa64_to_int (buf[ 5]) << 6;
1273 l |= itoa64_to_int (buf[ 6]) << 12;
1274 l |= itoa64_to_int (buf[ 7]) << 18;
1275
1276 digest[ 5] = (l >> 0) & 0xff;
1277 digest[ 4] = (l >> 8) & 0xff;
1278 digest[ 3] = (l >> 16) & 0xff;
1279
1280 l = itoa64_to_int (buf[ 8]) << 0;
1281 l |= itoa64_to_int (buf[ 9]) << 6;
1282 l |= itoa64_to_int (buf[10]) << 12;
1283 l |= itoa64_to_int (buf[11]) << 18;
1284
1285 digest[ 8] = (l >> 0) & 0xff;
1286 digest[ 7] = (l >> 8) & 0xff;
1287 digest[ 6] = (l >> 16) & 0xff;
1288
1289 l = itoa64_to_int (buf[12]) << 0;
1290 l |= itoa64_to_int (buf[13]) << 6;
1291 l |= itoa64_to_int (buf[14]) << 12;
1292 l |= itoa64_to_int (buf[15]) << 18;
1293
1294 digest[11] = (l >> 0) & 0xff;
1295 digest[10] = (l >> 8) & 0xff;
1296 digest[ 9] = (l >> 16) & 0xff;
1297
1298 l = itoa64_to_int (buf[16]) << 0;
1299 l |= itoa64_to_int (buf[17]) << 6;
1300 l |= itoa64_to_int (buf[18]) << 12;
1301 l |= itoa64_to_int (buf[19]) << 18;
1302
1303 digest[14] = (l >> 0) & 0xff;
1304 digest[13] = (l >> 8) & 0xff;
1305 digest[12] = (l >> 16) & 0xff;
1306
1307 l = itoa64_to_int (buf[20]) << 0;
1308 l |= itoa64_to_int (buf[21]) << 6;
1309 l |= itoa64_to_int (buf[22]) << 12;
1310 l |= itoa64_to_int (buf[23]) << 18;
1311
1312 digest[17] = (l >> 0) & 0xff;
1313 digest[16] = (l >> 8) & 0xff;
1314 digest[15] = (l >> 16) & 0xff;
1315
1316 l = itoa64_to_int (buf[24]) << 0;
1317 l |= itoa64_to_int (buf[25]) << 6;
1318 l |= itoa64_to_int (buf[26]) << 12;
1319
1320 digest[19] = (l >> 8) & 0xff;
1321 digest[18] = (l >> 16) & 0xff;
1322 }
1323
1324 void sha1aix_encode (u8 digest[20], u8 buf[27])
1325 {
1326 int l;
1327
1328 l = (digest[ 2] << 0) | (digest[ 1] << 8) | (digest[ 0] << 16);
1329
1330 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1331 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1332 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1333 buf[ 3] = int_to_itoa64 (l & 0x3f);
1334
1335 l = (digest[ 5] << 0) | (digest[ 4] << 8) | (digest[ 3] << 16);
1336
1337 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1338 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1339 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1340 buf[ 7] = int_to_itoa64 (l & 0x3f);
1341
1342 l = (digest[ 8] << 0) | (digest[ 7] << 8) | (digest[ 6] << 16);
1343
1344 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1345 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1346 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1347 buf[11] = int_to_itoa64 (l & 0x3f);
1348
1349 l = (digest[11] << 0) | (digest[10] << 8) | (digest[ 9] << 16);
1350
1351 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1352 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1353 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1354 buf[15] = int_to_itoa64 (l & 0x3f);
1355
1356 l = (digest[14] << 0) | (digest[13] << 8) | (digest[12] << 16);
1357
1358 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1359 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1360 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1361 buf[19] = int_to_itoa64 (l & 0x3f);
1362
1363 l = (digest[17] << 0) | (digest[16] << 8) | (digest[15] << 16);
1364
1365 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1366 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1367 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1368 buf[23] = int_to_itoa64 (l & 0x3f);
1369
1370 l = 0 | (digest[19] << 8) | (digest[18] << 16);
1371
1372 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1373 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1374 buf[26] = int_to_itoa64 (l & 0x3f);
1375 }
1376
1377 void sha256aix_decode (u8 digest[32], u8 buf[43])
1378 {
1379 int l;
1380
1381 l = itoa64_to_int (buf[ 0]) << 0;
1382 l |= itoa64_to_int (buf[ 1]) << 6;
1383 l |= itoa64_to_int (buf[ 2]) << 12;
1384 l |= itoa64_to_int (buf[ 3]) << 18;
1385
1386 digest[ 2] = (l >> 0) & 0xff;
1387 digest[ 1] = (l >> 8) & 0xff;
1388 digest[ 0] = (l >> 16) & 0xff;
1389
1390 l = itoa64_to_int (buf[ 4]) << 0;
1391 l |= itoa64_to_int (buf[ 5]) << 6;
1392 l |= itoa64_to_int (buf[ 6]) << 12;
1393 l |= itoa64_to_int (buf[ 7]) << 18;
1394
1395 digest[ 5] = (l >> 0) & 0xff;
1396 digest[ 4] = (l >> 8) & 0xff;
1397 digest[ 3] = (l >> 16) & 0xff;
1398
1399 l = itoa64_to_int (buf[ 8]) << 0;
1400 l |= itoa64_to_int (buf[ 9]) << 6;
1401 l |= itoa64_to_int (buf[10]) << 12;
1402 l |= itoa64_to_int (buf[11]) << 18;
1403
1404 digest[ 8] = (l >> 0) & 0xff;
1405 digest[ 7] = (l >> 8) & 0xff;
1406 digest[ 6] = (l >> 16) & 0xff;
1407
1408 l = itoa64_to_int (buf[12]) << 0;
1409 l |= itoa64_to_int (buf[13]) << 6;
1410 l |= itoa64_to_int (buf[14]) << 12;
1411 l |= itoa64_to_int (buf[15]) << 18;
1412
1413 digest[11] = (l >> 0) & 0xff;
1414 digest[10] = (l >> 8) & 0xff;
1415 digest[ 9] = (l >> 16) & 0xff;
1416
1417 l = itoa64_to_int (buf[16]) << 0;
1418 l |= itoa64_to_int (buf[17]) << 6;
1419 l |= itoa64_to_int (buf[18]) << 12;
1420 l |= itoa64_to_int (buf[19]) << 18;
1421
1422 digest[14] = (l >> 0) & 0xff;
1423 digest[13] = (l >> 8) & 0xff;
1424 digest[12] = (l >> 16) & 0xff;
1425
1426 l = itoa64_to_int (buf[20]) << 0;
1427 l |= itoa64_to_int (buf[21]) << 6;
1428 l |= itoa64_to_int (buf[22]) << 12;
1429 l |= itoa64_to_int (buf[23]) << 18;
1430
1431 digest[17] = (l >> 0) & 0xff;
1432 digest[16] = (l >> 8) & 0xff;
1433 digest[15] = (l >> 16) & 0xff;
1434
1435 l = itoa64_to_int (buf[24]) << 0;
1436 l |= itoa64_to_int (buf[25]) << 6;
1437 l |= itoa64_to_int (buf[26]) << 12;
1438 l |= itoa64_to_int (buf[27]) << 18;
1439
1440 digest[20] = (l >> 0) & 0xff;
1441 digest[19] = (l >> 8) & 0xff;
1442 digest[18] = (l >> 16) & 0xff;
1443
1444 l = itoa64_to_int (buf[28]) << 0;
1445 l |= itoa64_to_int (buf[29]) << 6;
1446 l |= itoa64_to_int (buf[30]) << 12;
1447 l |= itoa64_to_int (buf[31]) << 18;
1448
1449 digest[23] = (l >> 0) & 0xff;
1450 digest[22] = (l >> 8) & 0xff;
1451 digest[21] = (l >> 16) & 0xff;
1452
1453 l = itoa64_to_int (buf[32]) << 0;
1454 l |= itoa64_to_int (buf[33]) << 6;
1455 l |= itoa64_to_int (buf[34]) << 12;
1456 l |= itoa64_to_int (buf[35]) << 18;
1457
1458 digest[26] = (l >> 0) & 0xff;
1459 digest[25] = (l >> 8) & 0xff;
1460 digest[24] = (l >> 16) & 0xff;
1461
1462 l = itoa64_to_int (buf[36]) << 0;
1463 l |= itoa64_to_int (buf[37]) << 6;
1464 l |= itoa64_to_int (buf[38]) << 12;
1465 l |= itoa64_to_int (buf[39]) << 18;
1466
1467 digest[29] = (l >> 0) & 0xff;
1468 digest[28] = (l >> 8) & 0xff;
1469 digest[27] = (l >> 16) & 0xff;
1470
1471 l = itoa64_to_int (buf[40]) << 0;
1472 l |= itoa64_to_int (buf[41]) << 6;
1473 l |= itoa64_to_int (buf[42]) << 12;
1474
1475 //digest[32] = (l >> 0) & 0xff;
1476 digest[31] = (l >> 8) & 0xff;
1477 digest[30] = (l >> 16) & 0xff;
1478 }
1479
1480 void sha256aix_encode (u8 digest[32], u8 buf[43])
1481 {
1482 int l;
1483
1484 l = (digest[ 2] << 0) | (digest[ 1] << 8) | (digest[ 0] << 16);
1485
1486 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1487 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1488 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1489 buf[ 3] = int_to_itoa64 (l & 0x3f);
1490
1491 l = (digest[ 5] << 0) | (digest[ 4] << 8) | (digest[ 3] << 16);
1492
1493 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1494 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1495 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1496 buf[ 7] = int_to_itoa64 (l & 0x3f);
1497
1498 l = (digest[ 8] << 0) | (digest[ 7] << 8) | (digest[ 6] << 16);
1499
1500 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1501 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1502 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1503 buf[11] = int_to_itoa64 (l & 0x3f);
1504
1505 l = (digest[11] << 0) | (digest[10] << 8) | (digest[ 9] << 16);
1506
1507 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1508 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1509 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1510 buf[15] = int_to_itoa64 (l & 0x3f);
1511
1512 l = (digest[14] << 0) | (digest[13] << 8) | (digest[12] << 16);
1513
1514 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1515 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1516 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1517 buf[19] = int_to_itoa64 (l & 0x3f);
1518
1519 l = (digest[17] << 0) | (digest[16] << 8) | (digest[15] << 16);
1520
1521 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1522 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1523 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1524 buf[23] = int_to_itoa64 (l & 0x3f);
1525
1526 l = (digest[20] << 0) | (digest[19] << 8) | (digest[18] << 16);
1527
1528 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1529 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1530 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
1531 buf[27] = int_to_itoa64 (l & 0x3f);
1532
1533 l = (digest[23] << 0) | (digest[22] << 8) | (digest[21] << 16);
1534
1535 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
1536 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
1537 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
1538 buf[31] = int_to_itoa64 (l & 0x3f);
1539
1540 l = (digest[26] << 0) | (digest[25] << 8) | (digest[24] << 16);
1541
1542 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
1543 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
1544 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
1545 buf[35] = int_to_itoa64 (l & 0x3f);
1546
1547 l = (digest[29] << 0) | (digest[28] << 8) | (digest[27] << 16);
1548
1549 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
1550 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
1551 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
1552 buf[39] = int_to_itoa64 (l & 0x3f);
1553
1554 l = 0 | (digest[31] << 8) | (digest[30] << 16);
1555
1556 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
1557 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
1558 buf[42] = int_to_itoa64 (l & 0x3f);
1559 }
1560
1561 void sha512aix_decode (u8 digest[64], u8 buf[86])
1562 {
1563 int l;
1564
1565 l = itoa64_to_int (buf[ 0]) << 0;
1566 l |= itoa64_to_int (buf[ 1]) << 6;
1567 l |= itoa64_to_int (buf[ 2]) << 12;
1568 l |= itoa64_to_int (buf[ 3]) << 18;
1569
1570 digest[ 2] = (l >> 0) & 0xff;
1571 digest[ 1] = (l >> 8) & 0xff;
1572 digest[ 0] = (l >> 16) & 0xff;
1573
1574 l = itoa64_to_int (buf[ 4]) << 0;
1575 l |= itoa64_to_int (buf[ 5]) << 6;
1576 l |= itoa64_to_int (buf[ 6]) << 12;
1577 l |= itoa64_to_int (buf[ 7]) << 18;
1578
1579 digest[ 5] = (l >> 0) & 0xff;
1580 digest[ 4] = (l >> 8) & 0xff;
1581 digest[ 3] = (l >> 16) & 0xff;
1582
1583 l = itoa64_to_int (buf[ 8]) << 0;
1584 l |= itoa64_to_int (buf[ 9]) << 6;
1585 l |= itoa64_to_int (buf[10]) << 12;
1586 l |= itoa64_to_int (buf[11]) << 18;
1587
1588 digest[ 8] = (l >> 0) & 0xff;
1589 digest[ 7] = (l >> 8) & 0xff;
1590 digest[ 6] = (l >> 16) & 0xff;
1591
1592 l = itoa64_to_int (buf[12]) << 0;
1593 l |= itoa64_to_int (buf[13]) << 6;
1594 l |= itoa64_to_int (buf[14]) << 12;
1595 l |= itoa64_to_int (buf[15]) << 18;
1596
1597 digest[11] = (l >> 0) & 0xff;
1598 digest[10] = (l >> 8) & 0xff;
1599 digest[ 9] = (l >> 16) & 0xff;
1600
1601 l = itoa64_to_int (buf[16]) << 0;
1602 l |= itoa64_to_int (buf[17]) << 6;
1603 l |= itoa64_to_int (buf[18]) << 12;
1604 l |= itoa64_to_int (buf[19]) << 18;
1605
1606 digest[14] = (l >> 0) & 0xff;
1607 digest[13] = (l >> 8) & 0xff;
1608 digest[12] = (l >> 16) & 0xff;
1609
1610 l = itoa64_to_int (buf[20]) << 0;
1611 l |= itoa64_to_int (buf[21]) << 6;
1612 l |= itoa64_to_int (buf[22]) << 12;
1613 l |= itoa64_to_int (buf[23]) << 18;
1614
1615 digest[17] = (l >> 0) & 0xff;
1616 digest[16] = (l >> 8) & 0xff;
1617 digest[15] = (l >> 16) & 0xff;
1618
1619 l = itoa64_to_int (buf[24]) << 0;
1620 l |= itoa64_to_int (buf[25]) << 6;
1621 l |= itoa64_to_int (buf[26]) << 12;
1622 l |= itoa64_to_int (buf[27]) << 18;
1623
1624 digest[20] = (l >> 0) & 0xff;
1625 digest[19] = (l >> 8) & 0xff;
1626 digest[18] = (l >> 16) & 0xff;
1627
1628 l = itoa64_to_int (buf[28]) << 0;
1629 l |= itoa64_to_int (buf[29]) << 6;
1630 l |= itoa64_to_int (buf[30]) << 12;
1631 l |= itoa64_to_int (buf[31]) << 18;
1632
1633 digest[23] = (l >> 0) & 0xff;
1634 digest[22] = (l >> 8) & 0xff;
1635 digest[21] = (l >> 16) & 0xff;
1636
1637 l = itoa64_to_int (buf[32]) << 0;
1638 l |= itoa64_to_int (buf[33]) << 6;
1639 l |= itoa64_to_int (buf[34]) << 12;
1640 l |= itoa64_to_int (buf[35]) << 18;
1641
1642 digest[26] = (l >> 0) & 0xff;
1643 digest[25] = (l >> 8) & 0xff;
1644 digest[24] = (l >> 16) & 0xff;
1645
1646 l = itoa64_to_int (buf[36]) << 0;
1647 l |= itoa64_to_int (buf[37]) << 6;
1648 l |= itoa64_to_int (buf[38]) << 12;
1649 l |= itoa64_to_int (buf[39]) << 18;
1650
1651 digest[29] = (l >> 0) & 0xff;
1652 digest[28] = (l >> 8) & 0xff;
1653 digest[27] = (l >> 16) & 0xff;
1654
1655 l = itoa64_to_int (buf[40]) << 0;
1656 l |= itoa64_to_int (buf[41]) << 6;
1657 l |= itoa64_to_int (buf[42]) << 12;
1658 l |= itoa64_to_int (buf[43]) << 18;
1659
1660 digest[32] = (l >> 0) & 0xff;
1661 digest[31] = (l >> 8) & 0xff;
1662 digest[30] = (l >> 16) & 0xff;
1663
1664 l = itoa64_to_int (buf[44]) << 0;
1665 l |= itoa64_to_int (buf[45]) << 6;
1666 l |= itoa64_to_int (buf[46]) << 12;
1667 l |= itoa64_to_int (buf[47]) << 18;
1668
1669 digest[35] = (l >> 0) & 0xff;
1670 digest[34] = (l >> 8) & 0xff;
1671 digest[33] = (l >> 16) & 0xff;
1672
1673 l = itoa64_to_int (buf[48]) << 0;
1674 l |= itoa64_to_int (buf[49]) << 6;
1675 l |= itoa64_to_int (buf[50]) << 12;
1676 l |= itoa64_to_int (buf[51]) << 18;
1677
1678 digest[38] = (l >> 0) & 0xff;
1679 digest[37] = (l >> 8) & 0xff;
1680 digest[36] = (l >> 16) & 0xff;
1681
1682 l = itoa64_to_int (buf[52]) << 0;
1683 l |= itoa64_to_int (buf[53]) << 6;
1684 l |= itoa64_to_int (buf[54]) << 12;
1685 l |= itoa64_to_int (buf[55]) << 18;
1686
1687 digest[41] = (l >> 0) & 0xff;
1688 digest[40] = (l >> 8) & 0xff;
1689 digest[39] = (l >> 16) & 0xff;
1690
1691 l = itoa64_to_int (buf[56]) << 0;
1692 l |= itoa64_to_int (buf[57]) << 6;
1693 l |= itoa64_to_int (buf[58]) << 12;
1694 l |= itoa64_to_int (buf[59]) << 18;
1695
1696 digest[44] = (l >> 0) & 0xff;
1697 digest[43] = (l >> 8) & 0xff;
1698 digest[42] = (l >> 16) & 0xff;
1699
1700 l = itoa64_to_int (buf[60]) << 0;
1701 l |= itoa64_to_int (buf[61]) << 6;
1702 l |= itoa64_to_int (buf[62]) << 12;
1703 l |= itoa64_to_int (buf[63]) << 18;
1704
1705 digest[47] = (l >> 0) & 0xff;
1706 digest[46] = (l >> 8) & 0xff;
1707 digest[45] = (l >> 16) & 0xff;
1708
1709 l = itoa64_to_int (buf[64]) << 0;
1710 l |= itoa64_to_int (buf[65]) << 6;
1711 l |= itoa64_to_int (buf[66]) << 12;
1712 l |= itoa64_to_int (buf[67]) << 18;
1713
1714 digest[50] = (l >> 0) & 0xff;
1715 digest[49] = (l >> 8) & 0xff;
1716 digest[48] = (l >> 16) & 0xff;
1717
1718 l = itoa64_to_int (buf[68]) << 0;
1719 l |= itoa64_to_int (buf[69]) << 6;
1720 l |= itoa64_to_int (buf[70]) << 12;
1721 l |= itoa64_to_int (buf[71]) << 18;
1722
1723 digest[53] = (l >> 0) & 0xff;
1724 digest[52] = (l >> 8) & 0xff;
1725 digest[51] = (l >> 16) & 0xff;
1726
1727 l = itoa64_to_int (buf[72]) << 0;
1728 l |= itoa64_to_int (buf[73]) << 6;
1729 l |= itoa64_to_int (buf[74]) << 12;
1730 l |= itoa64_to_int (buf[75]) << 18;
1731
1732 digest[56] = (l >> 0) & 0xff;
1733 digest[55] = (l >> 8) & 0xff;
1734 digest[54] = (l >> 16) & 0xff;
1735
1736 l = itoa64_to_int (buf[76]) << 0;
1737 l |= itoa64_to_int (buf[77]) << 6;
1738 l |= itoa64_to_int (buf[78]) << 12;
1739 l |= itoa64_to_int (buf[79]) << 18;
1740
1741 digest[59] = (l >> 0) & 0xff;
1742 digest[58] = (l >> 8) & 0xff;
1743 digest[57] = (l >> 16) & 0xff;
1744
1745 l = itoa64_to_int (buf[80]) << 0;
1746 l |= itoa64_to_int (buf[81]) << 6;
1747 l |= itoa64_to_int (buf[82]) << 12;
1748 l |= itoa64_to_int (buf[83]) << 18;
1749
1750 digest[62] = (l >> 0) & 0xff;
1751 digest[61] = (l >> 8) & 0xff;
1752 digest[60] = (l >> 16) & 0xff;
1753
1754 l = itoa64_to_int (buf[84]) << 0;
1755 l |= itoa64_to_int (buf[85]) << 6;
1756
1757 digest[63] = (l >> 16) & 0xff;
1758 }
1759
1760 void sha512aix_encode (u8 digest[64], u8 buf[86])
1761 {
1762 int l;
1763
1764 l = (digest[ 2] << 0) | (digest[ 1] << 8) | (digest[ 0] << 16);
1765
1766 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1767 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1768 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1769 buf[ 3] = int_to_itoa64 (l & 0x3f);
1770
1771 l = (digest[ 5] << 0) | (digest[ 4] << 8) | (digest[ 3] << 16);
1772
1773 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1774 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1775 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1776 buf[ 7] = int_to_itoa64 (l & 0x3f);
1777
1778 l = (digest[ 8] << 0) | (digest[ 7] << 8) | (digest[ 6] << 16);
1779
1780 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1781 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1782 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1783 buf[11] = int_to_itoa64 (l & 0x3f);
1784
1785 l = (digest[11] << 0) | (digest[10] << 8) | (digest[ 9] << 16);
1786
1787 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1788 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1789 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1790 buf[15] = int_to_itoa64 (l & 0x3f);
1791
1792 l = (digest[14] << 0) | (digest[13] << 8) | (digest[12] << 16);
1793
1794 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1795 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1796 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1797 buf[19] = int_to_itoa64 (l & 0x3f);
1798
1799 l = (digest[17] << 0) | (digest[16] << 8) | (digest[15] << 16);
1800
1801 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1802 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1803 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1804 buf[23] = int_to_itoa64 (l & 0x3f);
1805
1806 l = (digest[20] << 0) | (digest[19] << 8) | (digest[18] << 16);
1807
1808 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1809 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1810 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
1811 buf[27] = int_to_itoa64 (l & 0x3f);
1812
1813 l = (digest[23] << 0) | (digest[22] << 8) | (digest[21] << 16);
1814
1815 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
1816 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
1817 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
1818 buf[31] = int_to_itoa64 (l & 0x3f);
1819
1820 l = (digest[26] << 0) | (digest[25] << 8) | (digest[24] << 16);
1821
1822 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
1823 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
1824 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
1825 buf[35] = int_to_itoa64 (l & 0x3f);
1826
1827 l = (digest[29] << 0) | (digest[28] << 8) | (digest[27] << 16);
1828
1829 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
1830 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
1831 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
1832 buf[39] = int_to_itoa64 (l & 0x3f);
1833
1834 l = (digest[32] << 0) | (digest[31] << 8) | (digest[30] << 16);
1835
1836 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
1837 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
1838 buf[42] = int_to_itoa64 (l & 0x3f); l >>= 6;
1839 buf[43] = int_to_itoa64 (l & 0x3f);
1840
1841 l = (digest[35] << 0) | (digest[34] << 8) | (digest[33] << 16);
1842
1843 buf[44] = int_to_itoa64 (l & 0x3f); l >>= 6;
1844 buf[45] = int_to_itoa64 (l & 0x3f); l >>= 6;
1845 buf[46] = int_to_itoa64 (l & 0x3f); l >>= 6;
1846 buf[47] = int_to_itoa64 (l & 0x3f);
1847
1848 l = (digest[38] << 0) | (digest[37] << 8) | (digest[36] << 16);
1849
1850 buf[48] = int_to_itoa64 (l & 0x3f); l >>= 6;
1851 buf[49] = int_to_itoa64 (l & 0x3f); l >>= 6;
1852 buf[50] = int_to_itoa64 (l & 0x3f); l >>= 6;
1853 buf[51] = int_to_itoa64 (l & 0x3f);
1854
1855 l = (digest[41] << 0) | (digest[40] << 8) | (digest[39] << 16);
1856
1857 buf[52] = int_to_itoa64 (l & 0x3f); l >>= 6;
1858 buf[53] = int_to_itoa64 (l & 0x3f); l >>= 6;
1859 buf[54] = int_to_itoa64 (l & 0x3f); l >>= 6;
1860 buf[55] = int_to_itoa64 (l & 0x3f);
1861
1862 l = (digest[44] << 0) | (digest[43] << 8) | (digest[42] << 16);
1863
1864 buf[56] = int_to_itoa64 (l & 0x3f); l >>= 6;
1865 buf[57] = int_to_itoa64 (l & 0x3f); l >>= 6;
1866 buf[58] = int_to_itoa64 (l & 0x3f); l >>= 6;
1867 buf[59] = int_to_itoa64 (l & 0x3f);
1868
1869 l = (digest[47] << 0) | (digest[46] << 8) | (digest[45] << 16);
1870
1871 buf[60] = int_to_itoa64 (l & 0x3f); l >>= 6;
1872 buf[61] = int_to_itoa64 (l & 0x3f); l >>= 6;
1873 buf[62] = int_to_itoa64 (l & 0x3f); l >>= 6;
1874 buf[63] = int_to_itoa64 (l & 0x3f);
1875
1876 l = (digest[50] << 0) | (digest[49] << 8) | (digest[48] << 16);
1877
1878 buf[64] = int_to_itoa64 (l & 0x3f); l >>= 6;
1879 buf[65] = int_to_itoa64 (l & 0x3f); l >>= 6;
1880 buf[66] = int_to_itoa64 (l & 0x3f); l >>= 6;
1881 buf[67] = int_to_itoa64 (l & 0x3f);
1882
1883 l = (digest[53] << 0) | (digest[52] << 8) | (digest[51] << 16);
1884
1885 buf[68] = int_to_itoa64 (l & 0x3f); l >>= 6;
1886 buf[69] = int_to_itoa64 (l & 0x3f); l >>= 6;
1887 buf[70] = int_to_itoa64 (l & 0x3f); l >>= 6;
1888 buf[71] = int_to_itoa64 (l & 0x3f);
1889
1890 l = (digest[56] << 0) | (digest[55] << 8) | (digest[54] << 16);
1891
1892 buf[72] = int_to_itoa64 (l & 0x3f); l >>= 6;
1893 buf[73] = int_to_itoa64 (l & 0x3f); l >>= 6;
1894 buf[74] = int_to_itoa64 (l & 0x3f); l >>= 6;
1895 buf[75] = int_to_itoa64 (l & 0x3f);
1896
1897 l = (digest[59] << 0) | (digest[58] << 8) | (digest[57] << 16);
1898
1899 buf[76] = int_to_itoa64 (l & 0x3f); l >>= 6;
1900 buf[77] = int_to_itoa64 (l & 0x3f); l >>= 6;
1901 buf[78] = int_to_itoa64 (l & 0x3f); l >>= 6;
1902 buf[79] = int_to_itoa64 (l & 0x3f);
1903
1904 l = (digest[62] << 0) | (digest[61] << 8) | (digest[60] << 16);
1905
1906 buf[80] = int_to_itoa64 (l & 0x3f); l >>= 6;
1907 buf[81] = int_to_itoa64 (l & 0x3f); l >>= 6;
1908 buf[82] = int_to_itoa64 (l & 0x3f); l >>= 6;
1909 buf[83] = int_to_itoa64 (l & 0x3f);
1910
1911 l = 0 | 0 | (digest[63] << 16);
1912
1913 buf[84] = int_to_itoa64 (l & 0x3f); l >>= 6;
1914 buf[85] = int_to_itoa64 (l & 0x3f); l >>= 6;
1915 }
1916
1917 void sha256crypt_decode (u8 digest[32], u8 buf[43])
1918 {
1919 int l;
1920
1921 l = itoa64_to_int (buf[ 0]) << 0;
1922 l |= itoa64_to_int (buf[ 1]) << 6;
1923 l |= itoa64_to_int (buf[ 2]) << 12;
1924 l |= itoa64_to_int (buf[ 3]) << 18;
1925
1926 digest[ 0] = (l >> 16) & 0xff;
1927 digest[10] = (l >> 8) & 0xff;
1928 digest[20] = (l >> 0) & 0xff;
1929
1930 l = itoa64_to_int (buf[ 4]) << 0;
1931 l |= itoa64_to_int (buf[ 5]) << 6;
1932 l |= itoa64_to_int (buf[ 6]) << 12;
1933 l |= itoa64_to_int (buf[ 7]) << 18;
1934
1935 digest[21] = (l >> 16) & 0xff;
1936 digest[ 1] = (l >> 8) & 0xff;
1937 digest[11] = (l >> 0) & 0xff;
1938
1939 l = itoa64_to_int (buf[ 8]) << 0;
1940 l |= itoa64_to_int (buf[ 9]) << 6;
1941 l |= itoa64_to_int (buf[10]) << 12;
1942 l |= itoa64_to_int (buf[11]) << 18;
1943
1944 digest[12] = (l >> 16) & 0xff;
1945 digest[22] = (l >> 8) & 0xff;
1946 digest[ 2] = (l >> 0) & 0xff;
1947
1948 l = itoa64_to_int (buf[12]) << 0;
1949 l |= itoa64_to_int (buf[13]) << 6;
1950 l |= itoa64_to_int (buf[14]) << 12;
1951 l |= itoa64_to_int (buf[15]) << 18;
1952
1953 digest[ 3] = (l >> 16) & 0xff;
1954 digest[13] = (l >> 8) & 0xff;
1955 digest[23] = (l >> 0) & 0xff;
1956
1957 l = itoa64_to_int (buf[16]) << 0;
1958 l |= itoa64_to_int (buf[17]) << 6;
1959 l |= itoa64_to_int (buf[18]) << 12;
1960 l |= itoa64_to_int (buf[19]) << 18;
1961
1962 digest[24] = (l >> 16) & 0xff;
1963 digest[ 4] = (l >> 8) & 0xff;
1964 digest[14] = (l >> 0) & 0xff;
1965
1966 l = itoa64_to_int (buf[20]) << 0;
1967 l |= itoa64_to_int (buf[21]) << 6;
1968 l |= itoa64_to_int (buf[22]) << 12;
1969 l |= itoa64_to_int (buf[23]) << 18;
1970
1971 digest[15] = (l >> 16) & 0xff;
1972 digest[25] = (l >> 8) & 0xff;
1973 digest[ 5] = (l >> 0) & 0xff;
1974
1975 l = itoa64_to_int (buf[24]) << 0;
1976 l |= itoa64_to_int (buf[25]) << 6;
1977 l |= itoa64_to_int (buf[26]) << 12;
1978 l |= itoa64_to_int (buf[27]) << 18;
1979
1980 digest[ 6] = (l >> 16) & 0xff;
1981 digest[16] = (l >> 8) & 0xff;
1982 digest[26] = (l >> 0) & 0xff;
1983
1984 l = itoa64_to_int (buf[28]) << 0;
1985 l |= itoa64_to_int (buf[29]) << 6;
1986 l |= itoa64_to_int (buf[30]) << 12;
1987 l |= itoa64_to_int (buf[31]) << 18;
1988
1989 digest[27] = (l >> 16) & 0xff;
1990 digest[ 7] = (l >> 8) & 0xff;
1991 digest[17] = (l >> 0) & 0xff;
1992
1993 l = itoa64_to_int (buf[32]) << 0;
1994 l |= itoa64_to_int (buf[33]) << 6;
1995 l |= itoa64_to_int (buf[34]) << 12;
1996 l |= itoa64_to_int (buf[35]) << 18;
1997
1998 digest[18] = (l >> 16) & 0xff;
1999 digest[28] = (l >> 8) & 0xff;
2000 digest[ 8] = (l >> 0) & 0xff;
2001
2002 l = itoa64_to_int (buf[36]) << 0;
2003 l |= itoa64_to_int (buf[37]) << 6;
2004 l |= itoa64_to_int (buf[38]) << 12;
2005 l |= itoa64_to_int (buf[39]) << 18;
2006
2007 digest[ 9] = (l >> 16) & 0xff;
2008 digest[19] = (l >> 8) & 0xff;
2009 digest[29] = (l >> 0) & 0xff;
2010
2011 l = itoa64_to_int (buf[40]) << 0;
2012 l |= itoa64_to_int (buf[41]) << 6;
2013 l |= itoa64_to_int (buf[42]) << 12;
2014
2015 digest[31] = (l >> 8) & 0xff;
2016 digest[30] = (l >> 0) & 0xff;
2017 }
2018
2019 void sha256crypt_encode (u8 digest[32], u8 buf[43])
2020 {
2021 int l;
2022
2023 l = (digest[ 0] << 16) | (digest[10] << 8) | (digest[20] << 0);
2024
2025 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
2026 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
2027 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
2028 buf[ 3] = int_to_itoa64 (l & 0x3f); l >>= 6;
2029
2030 l = (digest[21] << 16) | (digest[ 1] << 8) | (digest[11] << 0);
2031
2032 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
2033 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
2034 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
2035 buf[ 7] = int_to_itoa64 (l & 0x3f); l >>= 6;
2036
2037 l = (digest[12] << 16) | (digest[22] << 8) | (digest[ 2] << 0);
2038
2039 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
2040 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
2041 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
2042 buf[11] = int_to_itoa64 (l & 0x3f); l >>= 6;
2043
2044 l = (digest[ 3] << 16) | (digest[13] << 8) | (digest[23] << 0);
2045
2046 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
2047 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
2048 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
2049 buf[15] = int_to_itoa64 (l & 0x3f); l >>= 6;
2050
2051 l = (digest[24] << 16) | (digest[ 4] << 8) | (digest[14] << 0);
2052
2053 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
2054 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
2055 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
2056 buf[19] = int_to_itoa64 (l & 0x3f); l >>= 6;
2057
2058 l = (digest[15] << 16) | (digest[25] << 8) | (digest[ 5] << 0);
2059
2060 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
2061 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
2062 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
2063 buf[23] = int_to_itoa64 (l & 0x3f); l >>= 6;
2064
2065 l = (digest[ 6] << 16) | (digest[16] << 8) | (digest[26] << 0);
2066
2067 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
2068 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
2069 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
2070 buf[27] = int_to_itoa64 (l & 0x3f); l >>= 6;
2071
2072 l = (digest[27] << 16) | (digest[ 7] << 8) | (digest[17] << 0);
2073
2074 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
2075 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
2076 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
2077 buf[31] = int_to_itoa64 (l & 0x3f); l >>= 6;
2078
2079 l = (digest[18] << 16) | (digest[28] << 8) | (digest[ 8] << 0);
2080
2081 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
2082 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
2083 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
2084 buf[35] = int_to_itoa64 (l & 0x3f); l >>= 6;
2085
2086 l = (digest[ 9] << 16) | (digest[19] << 8) | (digest[29] << 0);
2087
2088 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
2089 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
2090 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
2091 buf[39] = int_to_itoa64 (l & 0x3f); l >>= 6;
2092
2093 l = 0 | (digest[31] << 8) | (digest[30] << 0);
2094
2095 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
2096 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
2097 buf[42] = int_to_itoa64 (l & 0x3f);
2098 }
2099
2100 void drupal7_decode (u8 digest[64], u8 buf[44])
2101 {
2102 int l;
2103
2104 l = itoa64_to_int (buf[ 0]) << 0;
2105 l |= itoa64_to_int (buf[ 1]) << 6;
2106 l |= itoa64_to_int (buf[ 2]) << 12;
2107 l |= itoa64_to_int (buf[ 3]) << 18;
2108
2109 digest[ 0] = (l >> 0) & 0xff;
2110 digest[ 1] = (l >> 8) & 0xff;
2111 digest[ 2] = (l >> 16) & 0xff;
2112
2113 l = itoa64_to_int (buf[ 4]) << 0;
2114 l |= itoa64_to_int (buf[ 5]) << 6;
2115 l |= itoa64_to_int (buf[ 6]) << 12;
2116 l |= itoa64_to_int (buf[ 7]) << 18;
2117
2118 digest[ 3] = (l >> 0) & 0xff;
2119 digest[ 4] = (l >> 8) & 0xff;
2120 digest[ 5] = (l >> 16) & 0xff;
2121
2122 l = itoa64_to_int (buf[ 8]) << 0;
2123 l |= itoa64_to_int (buf[ 9]) << 6;
2124 l |= itoa64_to_int (buf[10]) << 12;
2125 l |= itoa64_to_int (buf[11]) << 18;
2126
2127 digest[ 6] = (l >> 0) & 0xff;
2128 digest[ 7] = (l >> 8) & 0xff;
2129 digest[ 8] = (l >> 16) & 0xff;
2130
2131 l = itoa64_to_int (buf[12]) << 0;
2132 l |= itoa64_to_int (buf[13]) << 6;
2133 l |= itoa64_to_int (buf[14]) << 12;
2134 l |= itoa64_to_int (buf[15]) << 18;
2135
2136 digest[ 9] = (l >> 0) & 0xff;
2137 digest[10] = (l >> 8) & 0xff;
2138 digest[11] = (l >> 16) & 0xff;
2139
2140 l = itoa64_to_int (buf[16]) << 0;
2141 l |= itoa64_to_int (buf[17]) << 6;
2142 l |= itoa64_to_int (buf[18]) << 12;
2143 l |= itoa64_to_int (buf[19]) << 18;
2144
2145 digest[12] = (l >> 0) & 0xff;
2146 digest[13] = (l >> 8) & 0xff;
2147 digest[14] = (l >> 16) & 0xff;
2148
2149 l = itoa64_to_int (buf[20]) << 0;
2150 l |= itoa64_to_int (buf[21]) << 6;
2151 l |= itoa64_to_int (buf[22]) << 12;
2152 l |= itoa64_to_int (buf[23]) << 18;
2153
2154 digest[15] = (l >> 0) & 0xff;
2155 digest[16] = (l >> 8) & 0xff;
2156 digest[17] = (l >> 16) & 0xff;
2157
2158 l = itoa64_to_int (buf[24]) << 0;
2159 l |= itoa64_to_int (buf[25]) << 6;
2160 l |= itoa64_to_int (buf[26]) << 12;
2161 l |= itoa64_to_int (buf[27]) << 18;
2162
2163 digest[18] = (l >> 0) & 0xff;
2164 digest[19] = (l >> 8) & 0xff;
2165 digest[20] = (l >> 16) & 0xff;
2166
2167 l = itoa64_to_int (buf[28]) << 0;
2168 l |= itoa64_to_int (buf[29]) << 6;
2169 l |= itoa64_to_int (buf[30]) << 12;
2170 l |= itoa64_to_int (buf[31]) << 18;
2171
2172 digest[21] = (l >> 0) & 0xff;
2173 digest[22] = (l >> 8) & 0xff;
2174 digest[23] = (l >> 16) & 0xff;
2175
2176 l = itoa64_to_int (buf[32]) << 0;
2177 l |= itoa64_to_int (buf[33]) << 6;
2178 l |= itoa64_to_int (buf[34]) << 12;
2179 l |= itoa64_to_int (buf[35]) << 18;
2180
2181 digest[24] = (l >> 0) & 0xff;
2182 digest[25] = (l >> 8) & 0xff;
2183 digest[26] = (l >> 16) & 0xff;
2184
2185 l = itoa64_to_int (buf[36]) << 0;
2186 l |= itoa64_to_int (buf[37]) << 6;
2187 l |= itoa64_to_int (buf[38]) << 12;
2188 l |= itoa64_to_int (buf[39]) << 18;
2189
2190 digest[27] = (l >> 0) & 0xff;
2191 digest[28] = (l >> 8) & 0xff;
2192 digest[29] = (l >> 16) & 0xff;
2193
2194 l = itoa64_to_int (buf[40]) << 0;
2195 l |= itoa64_to_int (buf[41]) << 6;
2196 l |= itoa64_to_int (buf[42]) << 12;
2197 l |= itoa64_to_int (buf[43]) << 18;
2198
2199 digest[30] = (l >> 0) & 0xff;
2200 digest[31] = (l >> 8) & 0xff;
2201 digest[32] = (l >> 16) & 0xff;
2202
2203 digest[33] = 0;
2204 digest[34] = 0;
2205 digest[35] = 0;
2206 digest[36] = 0;
2207 digest[37] = 0;
2208 digest[38] = 0;
2209 digest[39] = 0;
2210 digest[40] = 0;
2211 digest[41] = 0;
2212 digest[42] = 0;
2213 digest[43] = 0;
2214 digest[44] = 0;
2215 digest[45] = 0;
2216 digest[46] = 0;
2217 digest[47] = 0;
2218 digest[48] = 0;
2219 digest[49] = 0;
2220 digest[50] = 0;
2221 digest[51] = 0;
2222 digest[52] = 0;
2223 digest[53] = 0;
2224 digest[54] = 0;
2225 digest[55] = 0;
2226 digest[56] = 0;
2227 digest[57] = 0;
2228 digest[58] = 0;
2229 digest[59] = 0;
2230 digest[60] = 0;
2231 digest[61] = 0;
2232 digest[62] = 0;
2233 digest[63] = 0;
2234 }
2235
2236 void drupal7_encode (u8 digest[64], u8 buf[43])
2237 {
2238 int l;
2239
2240 l = (digest[ 0] << 0) | (digest[ 1] << 8) | (digest[ 2] << 16);
2241
2242 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
2243 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
2244 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
2245 buf[ 3] = int_to_itoa64 (l & 0x3f);
2246
2247 l = (digest[ 3] << 0) | (digest[ 4] << 8) | (digest[ 5] << 16);
2248
2249 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
2250 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
2251 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
2252 buf[ 7] = int_to_itoa64 (l & 0x3f);
2253
2254 l = (digest[ 6] << 0) | (digest[ 7] << 8) | (digest[ 8] << 16);
2255
2256 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
2257 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
2258 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
2259 buf[11] = int_to_itoa64 (l & 0x3f);
2260
2261 l = (digest[ 9] << 0) | (digest[10] << 8) | (digest[11] << 16);
2262
2263 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
2264 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
2265 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
2266 buf[15] = int_to_itoa64 (l & 0x3f);
2267
2268 l = (digest[12] << 0) | (digest[13] << 8) | (digest[14] << 16);
2269
2270 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
2271 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
2272 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
2273 buf[19] = int_to_itoa64 (l & 0x3f);
2274
2275 l = (digest[15] << 0) | (digest[16] << 8) | (digest[17] << 16);
2276
2277 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
2278 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
2279 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
2280 buf[23] = int_to_itoa64 (l & 0x3f);
2281
2282 l = (digest[18] << 0) | (digest[19] << 8) | (digest[20] << 16);
2283
2284 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
2285 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
2286 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
2287 buf[27] = int_to_itoa64 (l & 0x3f);
2288
2289 l = (digest[21] << 0) | (digest[22] << 8) | (digest[23] << 16);
2290
2291 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
2292 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
2293 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
2294 buf[31] = int_to_itoa64 (l & 0x3f);
2295
2296 l = (digest[24] << 0) | (digest[25] << 8) | (digest[26] << 16);
2297
2298 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
2299 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
2300 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
2301 buf[35] = int_to_itoa64 (l & 0x3f);
2302
2303 l = (digest[27] << 0) | (digest[28] << 8) | (digest[29] << 16);
2304
2305 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
2306 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
2307 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
2308 buf[39] = int_to_itoa64 (l & 0x3f);
2309
2310 l = (digest[30] << 0) | (digest[31] << 8) | (digest[32] << 16);
2311
2312 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
2313 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
2314 buf[42] = int_to_itoa64 (l & 0x3f); l >>= 6;
2315 //buf[43] = int_to_itoa64 (l & 0x3f);
2316 }
2317
2318 /**
2319 * tty
2320 */
2321
2322 #ifdef LINUX
2323 static struct termio savemodes;
2324 static int havemodes = 0;
2325
2326 int tty_break()
2327 {
2328 struct termio modmodes;
2329
2330 if (ioctl (fileno (stdin), TCGETA, &savemodes) < 0) return -1;
2331
2332 havemodes = 1;
2333
2334 modmodes = savemodes;
2335 modmodes.c_lflag &= ~ICANON;
2336 modmodes.c_cc[VMIN] = 1;
2337 modmodes.c_cc[VTIME] = 0;
2338
2339 return ioctl (fileno (stdin), TCSETAW, &modmodes);
2340 }
2341
2342 int tty_getchar()
2343 {
2344 fd_set rfds;
2345
2346 FD_ZERO (&rfds);
2347
2348 FD_SET (fileno (stdin), &rfds);
2349
2350 struct timeval tv;
2351
2352 tv.tv_sec = 1;
2353 tv.tv_usec = 0;
2354
2355 int retval = select (1, &rfds, NULL, NULL, &tv);
2356
2357 if (retval == 0) return 0;
2358 if (retval == -1) return -1;
2359
2360 return getchar();
2361 }
2362
2363 int tty_fix()
2364 {
2365 if (!havemodes) return 0;
2366
2367 return ioctl (fileno (stdin), TCSETAW, &savemodes);
2368 }
2369 #endif
2370
2371 #ifdef OSX
2372 static struct termios savemodes;
2373 static int havemodes = 0;
2374
2375 int tty_break()
2376 {
2377 struct termios modmodes;
2378
2379 if (ioctl (fileno (stdin), TIOCGETA, &savemodes) < 0) return -1;
2380
2381 havemodes = 1;
2382
2383 modmodes = savemodes;
2384 modmodes.c_lflag &= ~ICANON;
2385 modmodes.c_cc[VMIN] = 1;
2386 modmodes.c_cc[VTIME] = 0;
2387
2388 return ioctl (fileno (stdin), TIOCSETAW, &modmodes);
2389 }
2390
2391 int tty_getchar()
2392 {
2393 fd_set rfds;
2394
2395 FD_ZERO (&rfds);
2396
2397 FD_SET (fileno (stdin), &rfds);
2398
2399 struct timeval tv;
2400
2401 tv.tv_sec = 1;
2402 tv.tv_usec = 0;
2403
2404 int retval = select (1, &rfds, NULL, NULL, &tv);
2405
2406 if (retval == 0) return 0;
2407 if (retval == -1) return -1;
2408
2409 return getchar();
2410 }
2411
2412 int tty_fix()
2413 {
2414 if (!havemodes) return 0;
2415
2416 return ioctl (fileno (stdin), TIOCSETAW, &savemodes);
2417 }
2418 #endif
2419
2420 #ifdef WIN
2421 static DWORD saveMode = 0;
2422
2423 int tty_break()
2424 {
2425 HANDLE stdinHandle = GetStdHandle (STD_INPUT_HANDLE);
2426
2427 GetConsoleMode (stdinHandle, &saveMode);
2428 SetConsoleMode (stdinHandle, ENABLE_PROCESSED_INPUT);
2429
2430 return 0;
2431 }
2432
2433 int tty_getchar()
2434 {
2435 HANDLE stdinHandle = GetStdHandle (STD_INPUT_HANDLE);
2436
2437 DWORD rc = WaitForSingleObject (stdinHandle, 1000);
2438
2439 if (rc == WAIT_TIMEOUT) return 0;
2440 if (rc == WAIT_ABANDONED) return -1;
2441 if (rc == WAIT_FAILED) return -1;
2442
2443 // The whole ReadConsoleInput () part is a workaround.
2444 // For some unknown reason, maybe a mingw bug, a random signal
2445 // is sent to stdin which unblocks WaitForSingleObject () and sets rc 0.
2446 // Then it wants to read with getche () a keyboard input
2447 // which has never been made.
2448
2449 INPUT_RECORD buf[100];
2450
2451 DWORD num = 0;
2452
2453 memset (buf, 0, sizeof (buf));
2454
2455 ReadConsoleInput (stdinHandle, buf, 100, &num);
2456
2457 FlushConsoleInputBuffer (stdinHandle);
2458
2459 for (uint i = 0; i < num; i++)
2460 {
2461 if (buf[i].EventType != KEY_EVENT) continue;
2462
2463 KEY_EVENT_RECORD KeyEvent = buf[i].Event.KeyEvent;
2464
2465 if (KeyEvent.bKeyDown != TRUE) continue;
2466
2467 return KeyEvent.uChar.AsciiChar;
2468 }
2469
2470 return 0;
2471 }
2472
2473 int tty_fix()
2474 {
2475 HANDLE stdinHandle = GetStdHandle (STD_INPUT_HANDLE);
2476
2477 SetConsoleMode (stdinHandle, saveMode);
2478
2479 return 0;
2480 }
2481 #endif
2482
2483 /**
2484 * mem alloc
2485 */
2486
2487 #define MSG_ENOMEM "Insufficient memory available"
2488
2489 void *mycalloc (size_t nmemb, size_t size)
2490 {
2491 void *p = calloc (nmemb, size);
2492
2493 if (p == NULL)
2494 {
2495 log_error ("ERROR: %s", MSG_ENOMEM);
2496
2497 exit (-1);
2498 }
2499
2500 return (p);
2501 }
2502
2503 void *mymalloc (size_t size)
2504 {
2505 void *p = malloc (size);
2506
2507 if (p == NULL)
2508 {
2509 log_error ("ERROR: %s", MSG_ENOMEM);
2510
2511 exit (-1);
2512 }
2513
2514 memset (p, 0, size);
2515
2516 return (p);
2517 }
2518
2519 void myfree (void *ptr)
2520 {
2521 if (ptr == NULL) return;
2522
2523 free (ptr);
2524 }
2525
2526 void *myrealloc (void *ptr, size_t oldsz, size_t add)
2527 {
2528 void *p = realloc (ptr, oldsz + add);
2529
2530 if (p == NULL)
2531 {
2532 log_error ("ERROR: %s", MSG_ENOMEM);
2533
2534 exit (-1);
2535 }
2536
2537 memset ((char *) p + oldsz, 0, add);
2538
2539 return (p);
2540 }
2541
2542 char *mystrdup (const char *s)
2543 {
2544 const size_t len = strlen (s);
2545
2546 char *b = (char *) mymalloc (len + 1);
2547
2548 memcpy (b, s, len);
2549
2550 return (b);
2551 }
2552
2553 FILE *logfile_open (char *logfile)
2554 {
2555 FILE *fp = fopen (logfile, "ab");
2556
2557 if (fp == NULL)
2558 {
2559 fp = stdout;
2560 }
2561
2562 return fp;
2563 }
2564
2565 void logfile_close (FILE *fp)
2566 {
2567 if (fp == stdout) return;
2568
2569 fclose (fp);
2570 }
2571
2572 void logfile_append (const char *fmt, ...)
2573 {
2574 if (data.logfile_disable == 1) return;
2575
2576 FILE *fp = logfile_open (data.logfile);
2577
2578 va_list ap;
2579
2580 va_start (ap, fmt);
2581
2582 vfprintf (fp, fmt, ap);
2583
2584 va_end (ap);
2585
2586 fputc ('\n', fp);
2587
2588 fflush (fp);
2589
2590 logfile_close (fp);
2591 }
2592
2593 int logfile_generate_id ()
2594 {
2595 const int n = rand ();
2596
2597 time_t t;
2598
2599 time (&t);
2600
2601 return t + n;
2602 }
2603
2604 char *logfile_generate_topid ()
2605 {
2606 const int id = logfile_generate_id ();
2607
2608 char *topid = (char *) mymalloc (1 + 16 + 1);
2609
2610 snprintf (topid, 1 + 16, "TOP%08x", id);
2611
2612 return topid;
2613 }
2614
2615 char *logfile_generate_subid ()
2616 {
2617 const int id = logfile_generate_id ();
2618
2619 char *subid = (char *) mymalloc (1 + 16 + 1);
2620
2621 snprintf (subid, 1 + 16, "SUB%08x", id);
2622
2623 return subid;
2624 }
2625
2626 /**
2627 * system
2628 */
2629
2630 #if F_SETLKW
2631 void lock_file (FILE *fp)
2632 {
2633 struct flock lock;
2634
2635 memset (&lock, 0, sizeof (struct flock));
2636
2637 lock.l_type = F_WRLCK;
2638 while (fcntl(fileno(fp), F_SETLKW, &lock))
2639 {
2640 if (errno != EINTR)
2641 {
2642 log_error ("ERROR: failed acquiring write lock: %s", strerror (errno));
2643
2644 exit (-1);
2645 }
2646 }
2647 }
2648
2649 void unlock_file (FILE *fp)
2650 {
2651 struct flock lock;
2652
2653 memset (&lock, 0, sizeof (struct flock));
2654
2655 lock.l_type = F_UNLCK;
2656 fcntl(fileno(fp), F_SETLK, &lock);
2657 }
2658 #endif // F_SETLKW
2659
2660 #ifdef _WIN
2661 void fsync (int fd)
2662 {
2663 HANDLE h = (HANDLE) _get_osfhandle (fd);
2664
2665 FlushFileBuffers (h);
2666 }
2667 #endif
2668
2669 /**
2670 * thermal
2671 */
2672
2673 #ifdef HAVE_HWMON
2674
2675 int get_adapters_num_adl (void *adl, int *iNumberAdapters)
2676 {
2677 if (hm_ADL_Adapter_NumberOfAdapters_Get ((ADL_PTR *) adl, iNumberAdapters) != ADL_OK) return -1;
2678
2679 if (iNumberAdapters == 0)
2680 {
2681 log_info ("WARN: No ADL adapters found.");
2682
2683 return -1;
2684 }
2685
2686 return 0;
2687 }
2688
2689 /*
2690 int hm_show_performance_level (HM_LIB hm_dll, int iAdapterIndex)
2691 {
2692 ADLODPerformanceLevels *lpOdPerformanceLevels = NULL;
2693 ADLODParameters lpOdParameters;
2694
2695 lpOdParameters.iSize = sizeof (ADLODParameters);
2696 size_t plevels_size = 0;
2697
2698 if (hm_ADL_Overdrive_ODParameters_Get (hm_dll, iAdapterIndex, &lpOdParameters) != ADL_OK) return -1;
2699
2700 log_info ("[DEBUG] %s, adapter %d performance level (%d) : %s %s",
2701 __func__, iAdapterIndex,
2702 lpOdParameters.iNumberOfPerformanceLevels,
2703 (lpOdParameters.iActivityReportingSupported) ? "activity reporting" : "",
2704 (lpOdParameters.iDiscretePerformanceLevels) ? "discrete performance levels" : "performance ranges");
2705
2706 plevels_size = sizeof (ADLODPerformanceLevels) + sizeof (ADLODPerformanceLevel) * (lpOdParameters.iNumberOfPerformanceLevels - 1);
2707
2708 lpOdPerformanceLevels = (ADLODPerformanceLevels *) mymalloc (plevels_size);
2709
2710 lpOdPerformanceLevels->iSize = sizeof (ADLODPerformanceLevels) + sizeof (ADLODPerformanceLevel) * (lpOdParameters.iNumberOfPerformanceLevels - 1);
2711
2712 if (hm_ADL_Overdrive_ODPerformanceLevels_Get (hm_dll, iAdapterIndex, 0, lpOdPerformanceLevels) != ADL_OK) return -1;
2713
2714 for (int j = 0; j < lpOdParameters.iNumberOfPerformanceLevels; j++)
2715 log_info ("[DEBUG] %s, adapter %d, level %d : engine %d, memory %d, voltage: %d",
2716 __func__, iAdapterIndex, j,
2717 lpOdPerformanceLevels->aLevels[j].iEngineClock / 100, lpOdPerformanceLevels->aLevels[j].iMemoryClock / 100, lpOdPerformanceLevels->aLevels[j].iVddc);
2718
2719 myfree (lpOdPerformanceLevels);
2720
2721 return 0;
2722 }
2723 */
2724
2725 LPAdapterInfo hm_get_adapter_info_adl (void *adl, int iNumberAdapters)
2726 {
2727 size_t AdapterInfoSize = iNumberAdapters * sizeof (AdapterInfo);
2728
2729 LPAdapterInfo lpAdapterInfo = (LPAdapterInfo) mymalloc (AdapterInfoSize);
2730
2731 if (hm_ADL_Adapter_AdapterInfo_Get ((ADL_PTR *) adl, lpAdapterInfo, AdapterInfoSize) != ADL_OK) return NULL;
2732
2733 return lpAdapterInfo;
2734 }
2735
2736 int hm_get_adapter_index_nvapi (HM_ADAPTER_NVAPI nvapiGPUHandle[DEVICES_MAX])
2737 {
2738 NvU32 pGpuCount;
2739
2740 if (hm_NvAPI_EnumPhysicalGPUs (data.hm_nvapi, nvapiGPUHandle, &pGpuCount) != NVAPI_OK) return (0);
2741
2742 if (pGpuCount == 0)
2743 {
2744 log_info ("WARN: No NvAPI adapters found");
2745
2746 return (0);
2747 }
2748
2749 return (pGpuCount);
2750 }
2751
2752 int hm_get_adapter_index_nvml (HM_ADAPTER_NVML nvmlGPUHandle[DEVICES_MAX])
2753 {
2754 int pGpuCount = 0;
2755
2756 for (uint i = 0; i < DEVICES_MAX; i++)
2757 {
2758 if (hm_NVML_nvmlDeviceGetHandleByIndex (data.hm_nvml, 1, i, &nvmlGPUHandle[i]) != NVML_SUCCESS) break;
2759
2760 // can be used to determine if the device by index matches the cuda device by index
2761 // char name[100]; memset (name, 0, sizeof (name));
2762 // hm_NVML_nvmlDeviceGetName (data.hm_nvml, nvGPUHandle[i], name, sizeof (name) - 1);
2763
2764 pGpuCount++;
2765 }
2766
2767 if (pGpuCount == 0)
2768 {
2769 log_info ("WARN: No NVML adapters found");
2770
2771 return (0);
2772 }
2773
2774 return (pGpuCount);
2775 }
2776
2777 /*
2778 //
2779 // does not help at all, since ADL does not assign different bus id, device id when we have multi GPU setups
2780 //
2781
2782 int hm_get_opencl_device_index (hm_attrs_t *hm_device, uint num_adl_adapters, int bus_num, int dev_num)
2783 {
2784 u32 idx = -1;
2785
2786 for (uint i = 0; i < num_adl_adapters; i++)
2787 {
2788 int opencl_bus_num = hm_device[i].busid;
2789 int opencl_dev_num = hm_device[i].devid;
2790
2791 if ((opencl_bus_num == bus_num) && (opencl_dev_num == dev_num))
2792 {
2793 idx = i;
2794
2795 break;
2796 }
2797 }
2798
2799 if (idx >= DEVICES_MAX) return -1;
2800
2801 return idx;
2802 }
2803
2804 void hm_get_opencl_busid_devid (hm_attrs_t *hm_device, uint opencl_num_devices, cl_device_id *devices)
2805 {
2806 for (uint i = 0; i < opencl_num_devices; i++)
2807 {
2808 cl_device_topology_amd device_topology;
2809
2810 hc_clGetDeviceInfo (devices[i], CL_DEVICE_TOPOLOGY_AMD, sizeof (device_topology), &device_topology, NULL);
2811
2812 hm_device[i].busid = device_topology.pcie.bus;
2813 hm_device[i].devid = device_topology.pcie.device;
2814 }
2815 }
2816 */
2817
2818 void hm_sort_adl_adapters_by_busid_devid (u32 *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2819 {
2820 // basically bubble sort
2821
2822 for (int i = 0; i < num_adl_adapters; i++)
2823 {
2824 for (int j = 0; j < num_adl_adapters - 1; j++)
2825 {
2826 // get info of adapter [x]
2827
2828 u32 adapter_index_x = valid_adl_device_list[j];
2829 AdapterInfo info_x = lpAdapterInfo[adapter_index_x];
2830
2831 u32 bus_num_x = info_x.iBusNumber;
2832 u32 dev_num_x = info_x.iDeviceNumber;
2833
2834 // get info of adapter [y]
2835
2836 u32 adapter_index_y = valid_adl_device_list[j + 1];
2837 AdapterInfo info_y = lpAdapterInfo[adapter_index_y];
2838
2839 u32 bus_num_y = info_y.iBusNumber;
2840 u32 dev_num_y = info_y.iDeviceNumber;
2841
2842 uint need_swap = 0;
2843
2844 if (bus_num_y < bus_num_x)
2845 {
2846 need_swap = 1;
2847 }
2848 else if (bus_num_y == bus_num_x)
2849 {
2850 if (dev_num_y < dev_num_x)
2851 {
2852 need_swap = 1;
2853 }
2854 }
2855
2856 if (need_swap == 1)
2857 {
2858 u32 temp = valid_adl_device_list[j + 1];
2859
2860 valid_adl_device_list[j + 1] = valid_adl_device_list[j];
2861 valid_adl_device_list[j + 0] = temp;
2862 }
2863 }
2864 }
2865 }
2866
2867 u32 *hm_get_list_valid_adl_adapters (int iNumberAdapters, int *num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2868 {
2869 *num_adl_adapters = 0;
2870
2871 u32 *adl_adapters = NULL;
2872
2873 int *bus_numbers = NULL;
2874 int *device_numbers = NULL;
2875
2876 for (int i = 0; i < iNumberAdapters; i++)
2877 {
2878 AdapterInfo info = lpAdapterInfo[i];
2879
2880 if (strlen (info.strUDID) < 1) continue;
2881
2882 #ifdef WIN
2883 if (info.iVendorID != 1002) continue;
2884 #else
2885 if (info.iVendorID != 0x1002) continue;
2886 #endif
2887
2888 if (info.iBusNumber < 0) continue;
2889 if (info.iDeviceNumber < 0) continue;
2890
2891 int found = 0;
2892
2893 for (int pos = 0; pos < *num_adl_adapters; pos++)
2894 {
2895 if ((bus_numbers[pos] == info.iBusNumber) && (device_numbers[pos] == info.iDeviceNumber))
2896 {
2897 found = 1;
2898 break;
2899 }
2900 }
2901
2902 if (found) continue;
2903
2904 // add it to the list
2905
2906 adl_adapters = (u32 *) myrealloc (adl_adapters, (*num_adl_adapters) * sizeof (int), sizeof (int));
2907
2908 adl_adapters[*num_adl_adapters] = i;
2909
2910 // rest is just bookkeeping
2911
2912 bus_numbers = (int*) myrealloc (bus_numbers, (*num_adl_adapters) * sizeof (int), sizeof (int));
2913 device_numbers = (int*) myrealloc (device_numbers, (*num_adl_adapters) * sizeof (int), sizeof (int));
2914
2915 bus_numbers[*num_adl_adapters] = info.iBusNumber;
2916 device_numbers[*num_adl_adapters] = info.iDeviceNumber;
2917
2918 (*num_adl_adapters)++;
2919 }
2920
2921 myfree (bus_numbers);
2922 myfree (device_numbers);
2923
2924 // sort the list by increasing bus id, device id number
2925
2926 hm_sort_adl_adapters_by_busid_devid (adl_adapters, *num_adl_adapters, lpAdapterInfo);
2927
2928 return adl_adapters;
2929 }
2930
2931 int hm_check_fanspeed_control (void *adl, hm_attrs_t *hm_device, u32 *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2932 {
2933 // loop through all valid devices
2934
2935 for (int i = 0; i < num_adl_adapters; i++)
2936 {
2937 u32 adapter_index = valid_adl_device_list[i];
2938
2939 // get AdapterInfo
2940
2941 AdapterInfo info = lpAdapterInfo[adapter_index];
2942
2943 // unfortunately this doesn't work since bus id and dev id are not unique
2944 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
2945 // if (opencl_device_index == -1) continue;
2946
2947 int opencl_device_index = i;
2948
2949 // if (hm_show_performance_level (adl, info.iAdapterIndex) != 0) return -1;
2950
2951 // get fanspeed info
2952
2953 if (hm_device[opencl_device_index].od_version == 5)
2954 {
2955 ADLFanSpeedInfo FanSpeedInfo;
2956
2957 memset (&FanSpeedInfo, 0, sizeof (ADLFanSpeedInfo));
2958
2959 FanSpeedInfo.iSize = sizeof (ADLFanSpeedInfo);
2960
2961 if (hm_ADL_Overdrive5_FanSpeedInfo_Get (adl, info.iAdapterIndex, 0, &FanSpeedInfo) != ADL_OK) return -1;
2962
2963 // check read and write capability in fanspeedinfo
2964
2965 if ((FanSpeedInfo.iFlags & ADL_DL_FANCTRL_SUPPORTS_PERCENT_READ) &&
2966 (FanSpeedInfo.iFlags & ADL_DL_FANCTRL_SUPPORTS_PERCENT_WRITE))
2967 {
2968 hm_device[opencl_device_index].fan_get_supported = 1;
2969 }
2970 else
2971 {
2972 hm_device[opencl_device_index].fan_get_supported = 0;
2973 }
2974 }
2975 else // od_version == 6
2976 {
2977 ADLOD6FanSpeedInfo faninfo;
2978
2979 memset (&faninfo, 0, sizeof (faninfo));
2980
2981 if (hm_ADL_Overdrive6_FanSpeed_Get (adl, info.iAdapterIndex, &faninfo) != ADL_OK) return -1;
2982
2983 // check read capability in fanspeedinfo
2984
2985 if (faninfo.iSpeedType & ADL_OD6_FANSPEED_TYPE_PERCENT)
2986 {
2987 hm_device[opencl_device_index].fan_get_supported = 1;
2988 }
2989 else
2990 {
2991 hm_device[opencl_device_index].fan_get_supported = 0;
2992 }
2993 }
2994 }
2995
2996 return 0;
2997 }
2998
2999 int hm_get_overdrive_version (void *adl, hm_attrs_t *hm_device, u32 *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
3000 {
3001 for (int i = 0; i < num_adl_adapters; i++)
3002 {
3003 u32 adapter_index = valid_adl_device_list[i];
3004
3005 // get AdapterInfo
3006
3007 AdapterInfo info = lpAdapterInfo[adapter_index];
3008
3009 // get overdrive version
3010
3011 int od_supported = 0;
3012 int od_enabled = 0;
3013 int od_version = 0;
3014
3015 if (hm_ADL_Overdrive_Caps (adl, info.iAdapterIndex, &od_supported, &od_enabled, &od_version) != ADL_OK) return -1;
3016
3017 // store the overdrive version in hm_device
3018
3019 // unfortunately this doesn't work since bus id and dev id are not unique
3020 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
3021 // if (opencl_device_index == -1) continue;
3022
3023 int opencl_device_index = i;
3024
3025 hm_device[opencl_device_index].od_version = od_version;
3026 }
3027
3028 return 0;
3029 }
3030
3031 int hm_get_adapter_index_adl (hm_attrs_t *hm_device, u32 *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
3032 {
3033 for (int i = 0; i < num_adl_adapters; i++)
3034 {
3035 u32 adapter_index = valid_adl_device_list[i];
3036
3037 // get AdapterInfo
3038
3039 AdapterInfo info = lpAdapterInfo[adapter_index];
3040
3041 // store the iAdapterIndex in hm_device
3042
3043 // unfortunately this doesn't work since bus id and dev id are not unique
3044 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
3045 // if (opencl_device_index == -1) continue;
3046
3047 int opencl_device_index = i;
3048
3049 hm_device[opencl_device_index].adl = info.iAdapterIndex;
3050 }
3051
3052 return num_adl_adapters;
3053 }
3054
3055 int hm_get_threshold_slowdown_with_device_id (const uint device_id)
3056 {
3057 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3058
3059 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_AMD)
3060 {
3061 if (data.hm_adl)
3062 {
3063 if (data.hm_device[device_id].od_version == 5)
3064 {
3065
3066 }
3067 else if (data.hm_device[device_id].od_version == 6)
3068 {
3069 int CurrentValue = 0;
3070 int DefaultValue = 0;
3071
3072 if (hm_ADL_Overdrive6_TargetTemperatureData_Get (data.hm_adl, data.hm_device[device_id].adl, &CurrentValue, &DefaultValue) != ADL_OK) return -1;
3073
3074 // the return value has never been tested since hm_ADL_Overdrive6_TargetTemperatureData_Get() never worked on any system. expect problems.
3075
3076 return DefaultValue;
3077 }
3078 }
3079 }
3080
3081 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_NV)
3082 {
3083 int target = 0;
3084
3085 if (hm_NVML_nvmlDeviceGetTemperatureThreshold (data.hm_nvml, 1, data.hm_device[device_id].nvml, NVML_TEMPERATURE_THRESHOLD_SLOWDOWN, (unsigned int *) &target) != NVML_SUCCESS) return -1;
3086
3087 return target;
3088 }
3089
3090 return -1;
3091 }
3092
3093 int hm_get_threshold_shutdown_with_device_id (const uint device_id)
3094 {
3095 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3096
3097 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_AMD)
3098 {
3099 if (data.hm_adl)
3100 {
3101 if (data.hm_device[device_id].od_version == 5)
3102 {
3103
3104 }
3105 else if (data.hm_device[device_id].od_version == 6)
3106 {
3107
3108 }
3109 }
3110 }
3111
3112 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_NV)
3113 {
3114 int target = 0;
3115
3116 if (hm_NVML_nvmlDeviceGetTemperatureThreshold (data.hm_nvml, 1, data.hm_device[device_id].nvml, NVML_TEMPERATURE_THRESHOLD_SHUTDOWN, (unsigned int *) &target) != NVML_SUCCESS) return -1;
3117
3118 return target;
3119 }
3120
3121 return -1;
3122 }
3123
3124 int hm_get_temperature_with_device_id (const uint device_id)
3125 {
3126 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3127
3128 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_AMD)
3129 {
3130 if (data.hm_adl)
3131 {
3132 if (data.hm_device[device_id].od_version == 5)
3133 {
3134 ADLTemperature Temperature;
3135
3136 Temperature.iSize = sizeof (ADLTemperature);
3137
3138 if (hm_ADL_Overdrive5_Temperature_Get (data.hm_adl, data.hm_device[device_id].adl, 0, &Temperature) != ADL_OK) return -1;
3139
3140 return Temperature.iTemperature / 1000;
3141 }
3142 else if (data.hm_device[device_id].od_version == 6)
3143 {
3144 int Temperature = 0;
3145
3146 if (hm_ADL_Overdrive6_Temperature_Get (data.hm_adl, data.hm_device[device_id].adl, &Temperature) != ADL_OK) return -1;
3147
3148 return Temperature / 1000;
3149 }
3150 }
3151 }
3152
3153 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_NV)
3154 {
3155 int temperature = 0;
3156
3157 if (hm_NVML_nvmlDeviceGetTemperature (data.hm_nvml, 1, data.hm_device[device_id].nvml, NVML_TEMPERATURE_GPU, (uint *) &temperature) != NVML_SUCCESS) return -1;
3158
3159 return temperature;
3160 }
3161
3162 return -1;
3163 }
3164
3165 int hm_get_fanpolicy_with_device_id (const uint device_id)
3166 {
3167 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3168
3169 if (data.hm_device[device_id].fan_get_supported == 1)
3170 {
3171 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_AMD)
3172 {
3173 if (data.hm_adl)
3174 {
3175 if (data.hm_device[device_id].od_version == 5)
3176 {
3177 ADLFanSpeedValue lpFanSpeedValue;
3178
3179 memset (&lpFanSpeedValue, 0, sizeof (lpFanSpeedValue));
3180
3181 lpFanSpeedValue.iSize = sizeof (lpFanSpeedValue);
3182 lpFanSpeedValue.iSpeedType = ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
3183
3184 if (hm_ADL_Overdrive5_FanSpeed_Get (data.hm_adl, data.hm_device[device_id].adl, 0, &lpFanSpeedValue) != ADL_OK) return -1;
3185
3186 return (lpFanSpeedValue.iFanSpeed & ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED) ? 0 : 1;
3187 }
3188 else // od_version == 6
3189 {
3190 return 1;
3191 }
3192 }
3193 }
3194
3195 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_NV)
3196 {
3197 return 1;
3198 }
3199 }
3200
3201 return -1;
3202 }
3203
3204 int hm_get_fanspeed_with_device_id (const uint device_id)
3205 {
3206 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3207
3208 if (data.hm_device[device_id].fan_get_supported == 1)
3209 {
3210 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_AMD)
3211 {
3212 if (data.hm_adl)
3213 {
3214 if (data.hm_device[device_id].od_version == 5)
3215 {
3216 ADLFanSpeedValue lpFanSpeedValue;
3217
3218 memset (&lpFanSpeedValue, 0, sizeof (lpFanSpeedValue));
3219
3220 lpFanSpeedValue.iSize = sizeof (lpFanSpeedValue);
3221 lpFanSpeedValue.iSpeedType = ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
3222 lpFanSpeedValue.iFlags = ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED;
3223
3224 if (hm_ADL_Overdrive5_FanSpeed_Get (data.hm_adl, data.hm_device[device_id].adl, 0, &lpFanSpeedValue) != ADL_OK) return -1;
3225
3226 return lpFanSpeedValue.iFanSpeed;
3227 }
3228 else // od_version == 6
3229 {
3230 ADLOD6FanSpeedInfo faninfo;
3231
3232 memset (&faninfo, 0, sizeof (faninfo));
3233
3234 if (hm_ADL_Overdrive6_FanSpeed_Get (data.hm_adl, data.hm_device[device_id].adl, &faninfo) != ADL_OK) return -1;
3235
3236 return faninfo.iFanSpeedPercent;
3237 }
3238 }
3239 }
3240
3241 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_NV)
3242 {
3243 int speed = 0;
3244
3245 if (hm_NVML_nvmlDeviceGetFanSpeed (data.hm_nvml, 0, data.hm_device[device_id].nvml, (uint *) &speed) != NVML_SUCCESS) return -1;
3246
3247 return speed;
3248 }
3249 }
3250
3251 return -1;
3252 }
3253
3254 int hm_get_buslanes_with_device_id (const uint device_id)
3255 {
3256 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3257
3258 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_AMD)
3259 {
3260 if (data.hm_adl)
3261 {
3262 ADLPMActivity PMActivity;
3263
3264 PMActivity.iSize = sizeof (ADLPMActivity);
3265
3266 if (hm_ADL_Overdrive_CurrentActivity_Get (data.hm_adl, data.hm_device[device_id].adl, &PMActivity) != ADL_OK) return -1;
3267
3268 return PMActivity.iCurrentBusLanes;
3269 }
3270 }
3271
3272 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_NV)
3273 {
3274 unsigned int currLinkWidth;
3275
3276 if (hm_NVML_nvmlDeviceGetCurrPcieLinkWidth (data.hm_nvml, 1, data.hm_device[device_id].nvml, &currLinkWidth) != NVML_SUCCESS) return -1;
3277
3278 return currLinkWidth;
3279 }
3280
3281 return -1;
3282 }
3283
3284 int hm_get_utilization_with_device_id (const uint device_id)
3285 {
3286 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3287
3288 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_AMD)
3289 {
3290 if (data.hm_adl)
3291 {
3292 ADLPMActivity PMActivity;
3293
3294 PMActivity.iSize = sizeof (ADLPMActivity);
3295
3296 if (hm_ADL_Overdrive_CurrentActivity_Get (data.hm_adl, data.hm_device[device_id].adl, &PMActivity) != ADL_OK) return -1;
3297
3298 return PMActivity.iActivityPercent;
3299 }
3300 }
3301
3302 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_NV)
3303 {
3304 nvmlUtilization_t utilization;
3305
3306 if (hm_NVML_nvmlDeviceGetUtilizationRates (data.hm_nvml, 1, data.hm_device[device_id].nvml, &utilization) != NVML_SUCCESS) return -1;
3307
3308 return utilization.gpu;
3309 }
3310
3311 return -1;
3312 }
3313
3314 int hm_get_memoryspeed_with_device_id (const uint device_id)
3315 {
3316 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3317
3318 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_AMD)
3319 {
3320 if (data.hm_adl)
3321 {
3322 ADLPMActivity PMActivity;
3323
3324 PMActivity.iSize = sizeof (ADLPMActivity);
3325
3326 if (hm_ADL_Overdrive_CurrentActivity_Get (data.hm_adl, data.hm_device[device_id].adl, &PMActivity) != ADL_OK) return -1;
3327
3328 return PMActivity.iMemoryClock / 100;
3329 }
3330 }
3331
3332 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_NV)
3333 {
3334 unsigned int clock;
3335
3336 if (hm_NVML_nvmlDeviceGetClockInfo (data.hm_nvml, 1, data.hm_device[device_id].nvml, NVML_CLOCK_MEM, &clock) != NVML_SUCCESS) return -1;
3337
3338 return clock;
3339 }
3340
3341 return -1;
3342 }
3343
3344 int hm_get_corespeed_with_device_id (const uint device_id)
3345 {
3346 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3347
3348 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_AMD)
3349 {
3350 if (data.hm_adl)
3351 {
3352 ADLPMActivity PMActivity;
3353
3354 PMActivity.iSize = sizeof (ADLPMActivity);
3355
3356 if (hm_ADL_Overdrive_CurrentActivity_Get (data.hm_adl, data.hm_device[device_id].adl, &PMActivity) != ADL_OK) return -1;
3357
3358 return PMActivity.iEngineClock / 100;
3359 }
3360 }
3361
3362 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_NV)
3363 {
3364 unsigned int clock;
3365
3366 if (hm_NVML_nvmlDeviceGetClockInfo (data.hm_nvml, 1, data.hm_device[device_id].nvml, NVML_CLOCK_SM, &clock) != NVML_SUCCESS) return -1;
3367
3368 return clock;
3369 }
3370
3371 return -1;
3372 }
3373
3374 int hm_get_throttle_with_device_id (const uint device_id)
3375 {
3376 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3377
3378 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_AMD)
3379 {
3380
3381 }
3382
3383 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_NV)
3384 {
3385 unsigned long long clocksThrottleReasons = 0;
3386 unsigned long long supportedThrottleReasons = 0;
3387
3388 if (hm_NVML_nvmlDeviceGetCurrentClocksThrottleReasons (data.hm_nvml, 1, data.hm_device[device_id].nvml, &clocksThrottleReasons) != NVML_SUCCESS) return -1;
3389 if (hm_NVML_nvmlDeviceGetSupportedClocksThrottleReasons (data.hm_nvml, 1, data.hm_device[device_id].nvml, &supportedThrottleReasons) != NVML_SUCCESS) return -1;
3390
3391 clocksThrottleReasons &= supportedThrottleReasons;
3392
3393 clocksThrottleReasons &= ~nvmlClocksThrottleReasonUnknown;
3394
3395 return (clocksThrottleReasons > 0);
3396 }
3397
3398 return -1;
3399 }
3400
3401 int hm_set_fanspeed_with_device_id_adl (const uint device_id, const int fanspeed, const int fanpolicy)
3402 {
3403 if (data.hm_device[device_id].fan_set_supported == 1)
3404 {
3405 if (data.hm_adl)
3406 {
3407 if (data.hm_device[device_id].od_version == 5)
3408 {
3409 ADLFanSpeedValue lpFanSpeedValue;
3410
3411 memset (&lpFanSpeedValue, 0, sizeof (lpFanSpeedValue));
3412
3413 lpFanSpeedValue.iSize = sizeof (lpFanSpeedValue);
3414 lpFanSpeedValue.iSpeedType = ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
3415 lpFanSpeedValue.iFlags = (fanpolicy == 1) ? ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED : 0;
3416 lpFanSpeedValue.iFanSpeed = fanspeed;
3417
3418 if (hm_ADL_Overdrive5_FanSpeed_Set (data.hm_adl, data.hm_device[device_id].adl, 0, &lpFanSpeedValue) != ADL_OK) return -1;
3419
3420 return 0;
3421 }
3422 else // od_version == 6
3423 {
3424 ADLOD6FanSpeedValue fan_speed_value;
3425
3426 memset (&fan_speed_value, 0, sizeof (fan_speed_value));
3427
3428 fan_speed_value.iSpeedType = ADL_OD6_FANSPEED_TYPE_PERCENT;
3429 fan_speed_value.iFanSpeed = fanspeed;
3430
3431 if (hm_ADL_Overdrive6_FanSpeed_Set (data.hm_adl, data.hm_device[device_id].adl, &fan_speed_value) != ADL_OK) return -1;
3432
3433 return 0;
3434 }
3435 }
3436 }
3437
3438 return -1;
3439 }
3440
3441 int hm_set_fanspeed_with_device_id_nvapi (const uint device_id, const int fanspeed, const int fanpolicy)
3442 {
3443 if (data.hm_device[device_id].fan_set_supported == 1)
3444 {
3445 if (data.hm_nvapi)
3446 {
3447 NV_GPU_COOLER_LEVELS CoolerLevels = { 0 };
3448
3449 CoolerLevels.Version = GPU_COOLER_LEVELS_VER | sizeof (NV_GPU_COOLER_LEVELS);
3450
3451 CoolerLevels.Levels[0].Level = fanspeed;
3452 CoolerLevels.Levels[0].Policy = fanpolicy;
3453
3454 if (hm_NvAPI_GPU_SetCoolerLevels (data.hm_nvapi, data.hm_device[device_id].nvapi, 0, &CoolerLevels) != NVAPI_OK) return -1;
3455
3456 return 0;
3457 }
3458 }
3459
3460 return -1;
3461 }
3462
3463 int hm_set_fanspeed_with_device_id_xnvctrl (const uint device_id, const int fanspeed)
3464 {
3465 if (data.hm_device[device_id].fan_set_supported == 1)
3466 {
3467 if (data.hm_xnvctrl)
3468 {
3469 if (set_fan_speed_target (data.hm_xnvctrl, data.hm_device[device_id].xnvctrl, fanspeed) != 0) return -1;
3470
3471 return 0;
3472 }
3473 }
3474
3475 return -1;
3476 }
3477
3478 #endif // HAVE_HWMON
3479
3480 /**
3481 * maskprocessor
3482 */
3483
3484 void mp_css_to_uniq_tbl (uint css_cnt, cs_t *css, uint uniq_tbls[SP_PW_MAX][CHARSIZ])
3485 {
3486 /* generates a lookup table where key is the char itself for fastest possible lookup performance */
3487
3488 if (css_cnt > SP_PW_MAX)
3489 {
3490 log_error ("ERROR: mask length is too long");
3491
3492 exit (-1);
3493 }
3494
3495 for (uint css_pos = 0; css_pos < css_cnt; css_pos++)
3496 {
3497 uint *uniq_tbl = uniq_tbls[css_pos];
3498
3499 uint *cs_buf = css[css_pos].cs_buf;
3500 uint cs_len = css[css_pos].cs_len;
3501
3502 for (uint cs_pos = 0; cs_pos < cs_len; cs_pos++)
3503 {
3504 uint c = cs_buf[cs_pos] & 0xff;
3505
3506 uniq_tbl[c] = 1;
3507 }
3508 }
3509 }
3510
3511 void mp_add_cs_buf (uint *in_buf, size_t in_len, cs_t *css, int css_cnt)
3512 {
3513 cs_t *cs = &css[css_cnt];
3514
3515 size_t css_uniq_sz = CHARSIZ * sizeof (uint);
3516
3517 uint *css_uniq = (uint *) mymalloc (css_uniq_sz);
3518
3519 size_t i;
3520
3521 for (i = 0; i < cs->cs_len; i++)
3522 {
3523 const uint u = cs->cs_buf[i];
3524
3525 css_uniq[u] = 1;
3526 }
3527
3528 for (i = 0; i < in_len; i++)
3529 {
3530 uint u = in_buf[i] & 0xff;
3531
3532 if (data.opts_type & OPTS_TYPE_PT_UPPER) u = toupper (u);
3533
3534 if (css_uniq[u] == 1) continue;
3535
3536 css_uniq[u] = 1;
3537
3538 cs->cs_buf[cs->cs_len] = u;
3539
3540 cs->cs_len++;
3541 }
3542
3543 myfree (css_uniq);
3544 }
3545
3546 void mp_expand (char *in_buf, size_t in_len, cs_t *mp_sys, cs_t *mp_usr, int mp_usr_offset, int interpret)
3547 {
3548 size_t in_pos;
3549
3550 for (in_pos = 0; in_pos < in_len; in_pos++)
3551 {
3552 uint p0 = in_buf[in_pos] & 0xff;
3553
3554 if (interpret == 1 && p0 == '?')
3555 {
3556 in_pos++;
3557
3558 if (in_pos == in_len) break;
3559
3560 uint p1 = in_buf[in_pos] & 0xff;
3561
3562 switch (p1)
3563 {
3564 case 'l': mp_add_cs_buf (mp_sys[0].cs_buf, mp_sys[0].cs_len, mp_usr, mp_usr_offset);
3565 break;
3566 case 'u': mp_add_cs_buf (mp_sys[1].cs_buf, mp_sys[1].cs_len, mp_usr, mp_usr_offset);
3567 break;
3568 case 'd': mp_add_cs_buf (mp_sys[2].cs_buf, mp_sys[2].cs_len, mp_usr, mp_usr_offset);
3569 break;
3570 case 's': mp_add_cs_buf (mp_sys[3].cs_buf, mp_sys[3].cs_len, mp_usr, mp_usr_offset);
3571 break;
3572 case 'a': mp_add_cs_buf (mp_sys[4].cs_buf, mp_sys[4].cs_len, mp_usr, mp_usr_offset);
3573 break;
3574 case 'b': mp_add_cs_buf (mp_sys[5].cs_buf, mp_sys[5].cs_len, mp_usr, mp_usr_offset);
3575 break;
3576 case '1': if (mp_usr[0].cs_len == 0) { log_error ("ERROR: Custom-charset 1 is undefined\n"); exit (-1); }
3577 mp_add_cs_buf (mp_usr[0].cs_buf, mp_usr[0].cs_len, mp_usr, mp_usr_offset);
3578 break;
3579 case '2': if (mp_usr[1].cs_len == 0) { log_error ("ERROR: Custom-charset 2 is undefined\n"); exit (-1); }
3580 mp_add_cs_buf (mp_usr[1].cs_buf, mp_usr[1].cs_len, mp_usr, mp_usr_offset);
3581 break;
3582 case '3': if (mp_usr[2].cs_len == 0) { log_error ("ERROR: Custom-charset 3 is undefined\n"); exit (-1); }
3583 mp_add_cs_buf (mp_usr[2].cs_buf, mp_usr[2].cs_len, mp_usr, mp_usr_offset);
3584 break;
3585 case '4': if (mp_usr[3].cs_len == 0) { log_error ("ERROR: Custom-charset 4 is undefined\n"); exit (-1); }
3586 mp_add_cs_buf (mp_usr[3].cs_buf, mp_usr[3].cs_len, mp_usr, mp_usr_offset);
3587 break;
3588 case '?': mp_add_cs_buf (&p0, 1, mp_usr, mp_usr_offset);
3589 break;
3590 default: log_error ("Syntax error: %s", in_buf);
3591 exit (-1);
3592 }
3593 }
3594 else
3595 {
3596 if (data.hex_charset)
3597 {
3598 in_pos++;
3599
3600 if (in_pos == in_len)
3601 {
3602 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", in_buf);
3603
3604 exit (-1);
3605 }
3606
3607 uint p1 = in_buf[in_pos] & 0xff;
3608
3609 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3610 {
3611 log_error ("ERROR: invalid hex character detected in mask %s", in_buf);
3612
3613 exit (-1);
3614 }
3615
3616 uint chr = 0;
3617
3618 chr = hex_convert (p1) << 0;
3619 chr |= hex_convert (p0) << 4;
3620
3621 mp_add_cs_buf (&chr, 1, mp_usr, mp_usr_offset);
3622 }
3623 else
3624 {
3625 uint chr = p0;
3626
3627 mp_add_cs_buf (&chr, 1, mp_usr, mp_usr_offset);
3628 }
3629 }
3630 }
3631 }
3632
3633 u64 mp_get_sum (uint css_cnt, cs_t *css)
3634 {
3635 u64 sum = 1;
3636
3637 for (uint css_pos = 0; css_pos < css_cnt; css_pos++)
3638 {
3639 sum *= css[css_pos].cs_len;
3640 }
3641
3642 return (sum);
3643 }
3644
3645 cs_t *mp_gen_css (char *mask_buf, size_t mask_len, cs_t *mp_sys, cs_t *mp_usr, uint *css_cnt)
3646 {
3647 cs_t *css = (cs_t *) mycalloc (256, sizeof (cs_t));
3648
3649 uint mask_pos;
3650 uint css_pos;
3651
3652 for (mask_pos = 0, css_pos = 0; mask_pos < mask_len; mask_pos++, css_pos++)
3653 {
3654 char p0 = mask_buf[mask_pos];
3655
3656 if (p0 == '?')
3657 {
3658 mask_pos++;
3659
3660 if (mask_pos == mask_len) break;
3661
3662 char p1 = mask_buf[mask_pos];
3663
3664 uint chr = p1;
3665
3666 switch (p1)
3667 {
3668 case 'l': mp_add_cs_buf (mp_sys[0].cs_buf, mp_sys[0].cs_len, css, css_pos);
3669 break;
3670 case 'u': mp_add_cs_buf (mp_sys[1].cs_buf, mp_sys[1].cs_len, css, css_pos);
3671 break;
3672 case 'd': mp_add_cs_buf (mp_sys[2].cs_buf, mp_sys[2].cs_len, css, css_pos);
3673 break;
3674 case 's': mp_add_cs_buf (mp_sys[3].cs_buf, mp_sys[3].cs_len, css, css_pos);
3675 break;
3676 case 'a': mp_add_cs_buf (mp_sys[4].cs_buf, mp_sys[4].cs_len, css, css_pos);
3677 break;
3678 case 'b': mp_add_cs_buf (mp_sys[5].cs_buf, mp_sys[5].cs_len, css, css_pos);
3679 break;
3680 case '1': if (mp_usr[0].cs_len == 0) { log_error ("ERROR: Custom-charset 1 is undefined\n"); exit (-1); }
3681 mp_add_cs_buf (mp_usr[0].cs_buf, mp_usr[0].cs_len, css, css_pos);
3682 break;
3683 case '2': if (mp_usr[1].cs_len == 0) { log_error ("ERROR: Custom-charset 2 is undefined\n"); exit (-1); }
3684 mp_add_cs_buf (mp_usr[1].cs_buf, mp_usr[1].cs_len, css, css_pos);
3685 break;
3686 case '3': if (mp_usr[2].cs_len == 0) { log_error ("ERROR: Custom-charset 3 is undefined\n"); exit (-1); }
3687 mp_add_cs_buf (mp_usr[2].cs_buf, mp_usr[2].cs_len, css, css_pos);
3688 break;
3689 case '4': if (mp_usr[3].cs_len == 0) { log_error ("ERROR: Custom-charset 4 is undefined\n"); exit (-1); }
3690 mp_add_cs_buf (mp_usr[3].cs_buf, mp_usr[3].cs_len, css, css_pos);
3691 break;
3692 case '?': mp_add_cs_buf (&chr, 1, css, css_pos);
3693 break;
3694 default: log_error ("ERROR: syntax error: %s", mask_buf);
3695 exit (-1);
3696 }
3697 }
3698 else
3699 {
3700 if (data.hex_charset)
3701 {
3702 mask_pos++;
3703
3704 // if there is no 2nd hex character, show an error:
3705
3706 if (mask_pos == mask_len)
3707 {
3708 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", mask_buf);
3709
3710 exit (-1);
3711 }
3712
3713 char p1 = mask_buf[mask_pos];
3714
3715 // if they are not valid hex character, show an error:
3716
3717 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3718 {
3719 log_error ("ERROR: invalid hex character detected in mask %s", mask_buf);
3720
3721 exit (-1);
3722 }
3723
3724 uint chr = 0;
3725
3726 chr |= hex_convert (p1) << 0;
3727 chr |= hex_convert (p0) << 4;
3728
3729 mp_add_cs_buf (&chr, 1, css, css_pos);
3730 }
3731 else
3732 {
3733 uint chr = p0;
3734
3735 mp_add_cs_buf (&chr, 1, css, css_pos);
3736 }
3737 }
3738 }
3739
3740 if (css_pos == 0)
3741 {
3742 log_error ("ERROR: invalid mask length (0)");
3743
3744 exit (-1);
3745 }
3746
3747 *css_cnt = css_pos;
3748
3749 return (css);
3750 }
3751
3752 void mp_exec (u64 val, char *buf, cs_t *css, int css_cnt)
3753 {
3754 for (int i = 0; i < css_cnt; i++)
3755 {
3756 uint len = css[i].cs_len;
3757 u64 next = val / len;
3758 uint pos = val % len;
3759 buf[i] = (char) css[i].cs_buf[pos] & 0xff;
3760 val = next;
3761 }
3762 }
3763
3764 void mp_cut_at (char *mask, uint max)
3765 {
3766 uint i;
3767 uint j;
3768 uint mask_len = strlen (mask);
3769
3770 for (i = 0, j = 0; i < mask_len && j < max; i++, j++)
3771 {
3772 if (mask[i] == '?') i++;
3773 }
3774
3775 mask[i] = 0;
3776 }
3777
3778 void mp_setup_sys (cs_t *mp_sys)
3779 {
3780 uint pos;
3781 uint chr;
3782 uint donec[CHARSIZ] = { 0 };
3783
3784 for (pos = 0, chr = 'a'; chr <= 'z'; chr++) { donec[chr] = 1;
3785 mp_sys[0].cs_buf[pos++] = chr;
3786 mp_sys[0].cs_len = pos; }
3787
3788 for (pos = 0, chr = 'A'; chr <= 'Z'; chr++) { donec[chr] = 1;
3789 mp_sys[1].cs_buf[pos++] = chr;
3790 mp_sys[1].cs_len = pos; }
3791
3792 for (pos = 0, chr = '0'; chr <= '9'; chr++) { donec[chr] = 1;
3793 mp_sys[2].cs_buf[pos++] = chr;
3794 mp_sys[2].cs_len = pos; }
3795
3796 for (pos = 0, chr = 0x20; chr <= 0x7e; chr++) { if (donec[chr]) continue;
3797 mp_sys[3].cs_buf[pos++] = chr;
3798 mp_sys[3].cs_len = pos; }
3799
3800 for (pos = 0, chr = 0x20; chr <= 0x7e; chr++) { mp_sys[4].cs_buf[pos++] = chr;
3801 mp_sys[4].cs_len = pos; }
3802
3803 for (pos = 0, chr = 0x00; chr <= 0xff; chr++) { mp_sys[5].cs_buf[pos++] = chr;
3804 mp_sys[5].cs_len = pos; }
3805 }
3806
3807 void mp_setup_usr (cs_t *mp_sys, cs_t *mp_usr, char *buf, uint index)
3808 {
3809 FILE *fp = fopen (buf, "rb");
3810
3811 if (fp == NULL || feof (fp)) // feof() in case if file is empty
3812 {
3813 mp_expand (buf, strlen (buf), mp_sys, mp_usr, index, 1);
3814 }
3815 else
3816 {
3817 char mp_file[1024] = { 0 };
3818
3819 size_t len = fread (mp_file, 1, sizeof (mp_file) - 1, fp);
3820
3821 fclose (fp);
3822
3823 len = in_superchop (mp_file);
3824
3825 if (len == 0)
3826 {
3827 log_info ("WARNING: charset file corrupted");
3828
3829 mp_expand (buf, strlen (buf), mp_sys, mp_usr, index, 1);
3830 }
3831 else
3832 {
3833 mp_expand (mp_file, len, mp_sys, mp_usr, index, 0);
3834 }
3835 }
3836 }
3837
3838 void mp_reset_usr (cs_t *mp_usr, uint index)
3839 {
3840 mp_usr[index].cs_len = 0;
3841
3842 memset (mp_usr[index].cs_buf, 0, sizeof (mp_usr[index].cs_buf));
3843 }
3844
3845 char *mp_get_truncated_mask (char *mask_buf, size_t mask_len, uint len)
3846 {
3847 char *new_mask_buf = (char *) mymalloc (256);
3848
3849 uint mask_pos;
3850
3851 uint css_pos;
3852
3853 for (mask_pos = 0, css_pos = 0; mask_pos < mask_len; mask_pos++, css_pos++)
3854 {
3855 if (css_pos == len) break;
3856
3857 char p0 = mask_buf[mask_pos];
3858
3859 new_mask_buf[mask_pos] = p0;
3860
3861 if (p0 == '?')
3862 {
3863 mask_pos++;
3864
3865 if (mask_pos == mask_len) break;
3866
3867 new_mask_buf[mask_pos] = mask_buf[mask_pos];
3868 }
3869 else
3870 {
3871 if (data.hex_charset)
3872 {
3873 mask_pos++;
3874
3875 if (mask_pos == mask_len)
3876 {
3877 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", mask_buf);
3878
3879 exit (-1);
3880 }
3881
3882 char p1 = mask_buf[mask_pos];
3883
3884 // if they are not valid hex character, show an error:
3885
3886 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3887 {
3888 log_error ("ERROR: invalid hex character detected in mask: %s", mask_buf);
3889
3890 exit (-1);
3891 }
3892
3893 new_mask_buf[mask_pos] = p1;
3894 }
3895 }
3896 }
3897
3898 if (css_pos == len) return (new_mask_buf);
3899
3900 myfree (new_mask_buf);
3901
3902 return (NULL);
3903 }
3904
3905 /**
3906 * statprocessor
3907 */
3908
3909 u64 sp_get_sum (uint start, uint stop, cs_t *root_css_buf)
3910 {
3911 u64 sum = 1;
3912
3913 uint i;
3914
3915 for (i = start; i < stop; i++)
3916 {
3917 sum *= root_css_buf[i].cs_len;
3918 }
3919
3920 return (sum);
3921 }
3922
3923 void sp_exec (u64 ctx, char *pw_buf, cs_t *root_css_buf, cs_t *markov_css_buf, uint start, uint stop)
3924 {
3925 u64 v = ctx;
3926
3927 cs_t *cs = &root_css_buf[start];
3928
3929 uint i;
3930
3931 for (i = start; i < stop; i++)
3932 {
3933 const u64 m = v % cs->cs_len;
3934 const u64 d = v / cs->cs_len;
3935
3936 v = d;
3937
3938 const uint k = cs->cs_buf[m];
3939
3940 pw_buf[i - start] = (char) k;
3941
3942 cs = &markov_css_buf[(i * CHARSIZ) + k];
3943 }
3944 }
3945
3946 int sp_comp_val (const void *p1, const void *p2)
3947 {
3948 hcstat_table_t *b1 = (hcstat_table_t *) p1;
3949 hcstat_table_t *b2 = (hcstat_table_t *) p2;
3950
3951 return b2->val - b1->val;
3952 }
3953
3954 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)
3955 {
3956 uint i;
3957 uint j;
3958 uint k;
3959
3960 /**
3961 * Initialize hcstats
3962 */
3963
3964 u64 *root_stats_buf = (u64 *) mycalloc (SP_ROOT_CNT, sizeof (u64));
3965
3966 u64 *root_stats_ptr = root_stats_buf;
3967
3968 u64 *root_stats_buf_by_pos[SP_PW_MAX];
3969
3970 for (i = 0; i < SP_PW_MAX; i++)
3971 {
3972 root_stats_buf_by_pos[i] = root_stats_ptr;
3973
3974 root_stats_ptr += CHARSIZ;
3975 }
3976
3977 u64 *markov_stats_buf = (u64 *) mycalloc (SP_MARKOV_CNT, sizeof (u64));
3978
3979 u64 *markov_stats_ptr = markov_stats_buf;
3980
3981 u64 *markov_stats_buf_by_key[SP_PW_MAX][CHARSIZ];
3982
3983 for (i = 0; i < SP_PW_MAX; i++)
3984 {
3985 for (j = 0; j < CHARSIZ; j++)
3986 {
3987 markov_stats_buf_by_key[i][j] = markov_stats_ptr;
3988
3989 markov_stats_ptr += CHARSIZ;
3990 }
3991 }
3992
3993 /**
3994 * Load hcstats File
3995 */
3996
3997 if (hcstat == NULL)
3998 {
3999 char hcstat_tmp[256] = { 0 };
4000
4001 snprintf (hcstat_tmp, sizeof (hcstat_tmp) - 1, "%s/%s", shared_dir, SP_HCSTAT);
4002
4003 hcstat = hcstat_tmp;
4004 }
4005
4006 FILE *fd = fopen (hcstat, "rb");
4007
4008 if (fd == NULL)
4009 {
4010 log_error ("%s: %s", hcstat, strerror (errno));
4011
4012 exit (-1);
4013 }
4014
4015 if (fread (root_stats_buf, sizeof (u64), SP_ROOT_CNT, fd) != SP_ROOT_CNT)
4016 {
4017 log_error ("%s: Could not load data", hcstat);
4018
4019 fclose (fd);
4020
4021 exit (-1);
4022 }
4023
4024 if (fread (markov_stats_buf, sizeof (u64), SP_MARKOV_CNT, fd) != SP_MARKOV_CNT)
4025 {
4026 log_error ("%s: Could not load data", hcstat);
4027
4028 fclose (fd);
4029
4030 exit (-1);
4031 }
4032
4033 fclose (fd);
4034
4035 /**
4036 * Markov modifier of hcstat_table on user request
4037 */
4038
4039 if (disable)
4040 {
4041 memset (root_stats_buf, 0, SP_ROOT_CNT * sizeof (u64));
4042 memset (markov_stats_buf, 0, SP_MARKOV_CNT * sizeof (u64));
4043 }
4044
4045 if (classic)
4046 {
4047 /* Add all stats to first position */
4048
4049 for (i = 1; i < SP_PW_MAX; i++)
4050 {
4051 u64 *out = root_stats_buf_by_pos[0];
4052 u64 *in = root_stats_buf_by_pos[i];
4053
4054 for (j = 0; j < CHARSIZ; j++)
4055 {
4056 *out++ += *in++;
4057 }
4058 }
4059
4060 for (i = 1; i < SP_PW_MAX; i++)
4061 {
4062 u64 *out = markov_stats_buf_by_key[0][0];
4063 u64 *in = markov_stats_buf_by_key[i][0];
4064
4065 for (j = 0; j < CHARSIZ; j++)
4066 {
4067 for (k = 0; k < CHARSIZ; k++)
4068 {
4069 *out++ += *in++;
4070 }
4071 }
4072 }
4073
4074 /* copy them to all pw_positions */
4075
4076 for (i = 1; i < SP_PW_MAX; i++)
4077 {
4078 memcpy (root_stats_buf_by_pos[i], root_stats_buf_by_pos[0], CHARSIZ * sizeof (u64));
4079 }
4080
4081 for (i = 1; i < SP_PW_MAX; i++)
4082 {
4083 memcpy (markov_stats_buf_by_key[i][0], markov_stats_buf_by_key[0][0], CHARSIZ * CHARSIZ * sizeof (u64));
4084 }
4085 }
4086
4087 /**
4088 * Initialize tables
4089 */
4090
4091 hcstat_table_t *root_table_ptr = root_table_buf;
4092
4093 hcstat_table_t *root_table_buf_by_pos[SP_PW_MAX];
4094
4095 for (i = 0; i < SP_PW_MAX; i++)
4096 {
4097 root_table_buf_by_pos[i] = root_table_ptr;
4098
4099 root_table_ptr += CHARSIZ;
4100 }
4101
4102 hcstat_table_t *markov_table_ptr = markov_table_buf;
4103
4104 hcstat_table_t *markov_table_buf_by_key[SP_PW_MAX][CHARSIZ];
4105
4106 for (i = 0; i < SP_PW_MAX; i++)
4107 {
4108 for (j = 0; j < CHARSIZ; j++)
4109 {
4110 markov_table_buf_by_key[i][j] = markov_table_ptr;
4111
4112 markov_table_ptr += CHARSIZ;
4113 }
4114 }
4115
4116 /**
4117 * Convert hcstat to tables
4118 */
4119
4120 for (i = 0; i < SP_ROOT_CNT; i++)
4121 {
4122 uint key = i % CHARSIZ;
4123
4124 root_table_buf[i].key = key;
4125 root_table_buf[i].val = root_stats_buf[i];
4126 }
4127
4128 for (i = 0; i < SP_MARKOV_CNT; i++)
4129 {
4130 uint key = i % CHARSIZ;
4131
4132 markov_table_buf[i].key = key;
4133 markov_table_buf[i].val = markov_stats_buf[i];
4134 }
4135
4136 myfree (root_stats_buf);
4137 myfree (markov_stats_buf);
4138
4139 /**
4140 * Finally sort them
4141 */
4142
4143 for (i = 0; i < SP_PW_MAX; i++)
4144 {
4145 qsort (root_table_buf_by_pos[i], CHARSIZ, sizeof (hcstat_table_t), sp_comp_val);
4146 }
4147
4148 for (i = 0; i < SP_PW_MAX; i++)
4149 {
4150 for (j = 0; j < CHARSIZ; j++)
4151 {
4152 qsort (markov_table_buf_by_key[i][j], CHARSIZ, sizeof (hcstat_table_t), sp_comp_val);
4153 }
4154 }
4155 }
4156
4157 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])
4158 {
4159 /**
4160 * Convert tables to css
4161 */
4162
4163 for (uint i = 0; i < SP_ROOT_CNT; i++)
4164 {
4165 uint pw_pos = i / CHARSIZ;
4166
4167 cs_t *cs = &root_css_buf[pw_pos];
4168
4169 if (cs->cs_len == threshold) continue;
4170
4171 uint key = root_table_buf[i].key;
4172
4173 if (uniq_tbls[pw_pos][key] == 0) continue;
4174
4175 cs->cs_buf[cs->cs_len] = key;
4176
4177 cs->cs_len++;
4178 }
4179
4180 /**
4181 * Convert table to css
4182 */
4183
4184 for (uint i = 0; i < SP_MARKOV_CNT; i++)
4185 {
4186 uint c = i / CHARSIZ;
4187
4188 cs_t *cs = &markov_css_buf[c];
4189
4190 if (cs->cs_len == threshold) continue;
4191
4192 uint pw_pos = c / CHARSIZ;
4193
4194 uint key = markov_table_buf[i].key;
4195
4196 if ((pw_pos + 1) < SP_PW_MAX) if (uniq_tbls[pw_pos + 1][key] == 0) continue;
4197
4198 cs->cs_buf[cs->cs_len] = key;
4199
4200 cs->cs_len++;
4201 }
4202
4203 /*
4204 for (uint i = 0; i < 8; i++)
4205 {
4206 for (uint j = 0x20; j < 0x80; j++)
4207 {
4208 cs_t *ptr = &markov_css_buf[(i * CHARSIZ) + j];
4209
4210 printf ("pos:%u key:%u len:%u\n", i, j, ptr->cs_len);
4211
4212 for (uint k = 0; k < 10; k++)
4213 {
4214 printf (" %u\n", ptr->cs_buf[k]);
4215 }
4216 }
4217 }
4218 */
4219 }
4220
4221 void sp_stretch_root (hcstat_table_t *in, hcstat_table_t *out)
4222 {
4223 for (uint i = 0; i < SP_PW_MAX; i += 2)
4224 {
4225 memcpy (out, in, CHARSIZ * sizeof (hcstat_table_t));
4226
4227 out += CHARSIZ;
4228 in += CHARSIZ;
4229
4230 out->key = 0;
4231 out->val = 1;
4232
4233 out++;
4234
4235 for (uint j = 1; j < CHARSIZ; j++)
4236 {
4237 out->key = j;
4238 out->val = 0;
4239
4240 out++;
4241 }
4242 }
4243 }
4244
4245 void sp_stretch_markov (hcstat_table_t *in, hcstat_table_t *out)
4246 {
4247 for (uint i = 0; i < SP_PW_MAX; i += 2)
4248 {
4249 memcpy (out, in, CHARSIZ * CHARSIZ * sizeof (hcstat_table_t));
4250
4251 out += CHARSIZ * CHARSIZ;
4252 in += CHARSIZ * CHARSIZ;
4253
4254 for (uint j = 0; j < CHARSIZ; j++)
4255 {
4256 out->key = 0;
4257 out->val = 1;
4258
4259 out++;
4260
4261 for (uint k = 1; k < CHARSIZ; k++)
4262 {
4263 out->key = k;
4264 out->val = 0;
4265
4266 out++;
4267 }
4268 }
4269 }
4270 }
4271
4272 /**
4273 * mixed shared functions
4274 */
4275
4276 void dump_hex (const u8 *s, const int sz)
4277 {
4278 for (int i = 0; i < sz; i++)
4279 {
4280 log_info_nn ("%02x ", s[i]);
4281 }
4282
4283 log_info ("");
4284 }
4285
4286 void usage_mini_print (const char *progname)
4287 {
4288 for (uint i = 0; USAGE_MINI[i] != NULL; i++) log_info (USAGE_MINI[i], progname);
4289 }
4290
4291 void usage_big_print (const char *progname)
4292 {
4293 for (uint i = 0; USAGE_BIG[i] != NULL; i++) log_info (USAGE_BIG[i], progname);
4294 }
4295
4296 char *get_exec_path ()
4297 {
4298 int exec_path_len = 1024;
4299
4300 char *exec_path = (char *) mymalloc (exec_path_len);
4301
4302 #ifdef LINUX
4303
4304 char tmp[32] = { 0 };
4305
4306 snprintf (tmp, sizeof (tmp) - 1, "/proc/%d/exe", getpid ());
4307
4308 const int len = readlink (tmp, exec_path, exec_path_len - 1);
4309
4310 #elif WIN
4311
4312 const int len = GetModuleFileName (NULL, exec_path, exec_path_len - 1);
4313
4314 #elif OSX
4315
4316 uint size = exec_path_len;
4317
4318 if (_NSGetExecutablePath (exec_path, &size) != 0)
4319 {
4320 log_error("! executable path buffer too small\n");
4321
4322 exit (-1);
4323 }
4324
4325 const int len = strlen (exec_path);
4326
4327 #else
4328 #error Your Operating System is not supported or detected
4329 #endif
4330
4331 exec_path[len] = 0;
4332
4333 return exec_path;
4334 }
4335
4336 char *get_install_dir (const char *progname)
4337 {
4338 char *install_dir = mystrdup (progname);
4339 char *last_slash = NULL;
4340
4341 if ((last_slash = strrchr (install_dir, '/')) != NULL)
4342 {
4343 *last_slash = 0;
4344 }
4345 else if ((last_slash = strrchr (install_dir, '\\')) != NULL)
4346 {
4347 *last_slash = 0;
4348 }
4349 else
4350 {
4351 install_dir[0] = '.';
4352 install_dir[1] = 0;
4353 }
4354
4355 return (install_dir);
4356 }
4357
4358 char *get_profile_dir (const char *homedir)
4359 {
4360 #define DOT_HASHCAT ".hashcat"
4361
4362 size_t len = strlen (homedir) + 1 + strlen (DOT_HASHCAT) + 1;
4363
4364 char *profile_dir = (char *) mymalloc (len + 1);
4365
4366 snprintf (profile_dir, len, "%s/%s", homedir, DOT_HASHCAT);
4367
4368 return profile_dir;
4369 }
4370
4371 char *get_session_dir (const char *profile_dir)
4372 {
4373 #define SESSIONS_FOLDER "sessions"
4374
4375 size_t len = strlen (profile_dir) + 1 + strlen (SESSIONS_FOLDER) + 1;
4376
4377 char *session_dir = (char *) mymalloc (len + 1);
4378
4379 snprintf (session_dir, len, "%s/%s", profile_dir, SESSIONS_FOLDER);
4380
4381 return session_dir;
4382 }
4383
4384 uint count_lines (FILE *fd)
4385 {
4386 uint cnt = 0;
4387
4388 char *buf = (char *) mymalloc (HCBUFSIZ + 1);
4389
4390 char prev = '\n';
4391
4392 while (!feof (fd))
4393 {
4394 size_t nread = fread (buf, sizeof (char), HCBUFSIZ, fd);
4395
4396 if (nread < 1) continue;
4397
4398 size_t i;
4399
4400 for (i = 0; i < nread; i++)
4401 {
4402 if (prev == '\n') cnt++;
4403
4404 prev = buf[i];
4405 }
4406 }
4407
4408 myfree (buf);
4409
4410 return cnt;
4411 }
4412
4413 void truecrypt_crc32 (const char *filename, u8 keytab[64])
4414 {
4415 uint crc = ~0;
4416
4417 FILE *fd = fopen (filename, "rb");
4418
4419 if (fd == NULL)
4420 {
4421 log_error ("%s: %s", filename, strerror (errno));
4422
4423 exit (-1);
4424 }
4425
4426 #define MAX_KEY_SIZE (1024 * 1024)
4427
4428 u8 *buf = (u8 *) mymalloc (MAX_KEY_SIZE + 1);
4429
4430 int nread = fread (buf, sizeof (u8), MAX_KEY_SIZE, fd);
4431
4432 fclose (fd);
4433
4434 int kpos = 0;
4435
4436 for (int fpos = 0; fpos < nread; fpos++)
4437 {
4438 crc = crc32tab[(crc ^ buf[fpos]) & 0xff] ^ (crc >> 8);
4439
4440 keytab[kpos++] += (crc >> 24) & 0xff;
4441 keytab[kpos++] += (crc >> 16) & 0xff;
4442 keytab[kpos++] += (crc >> 8) & 0xff;
4443 keytab[kpos++] += (crc >> 0) & 0xff;
4444
4445 if (kpos >= 64) kpos = 0;
4446 }
4447
4448 myfree (buf);
4449 }
4450
4451 #ifdef OSX
4452 int pthread_setaffinity_np (pthread_t thread, size_t cpu_size, cpu_set_t *cpu_set)
4453 {
4454 int core;
4455
4456 for (core = 0; core < (8 * (int)cpu_size); core++)
4457 if (CPU_ISSET(core, cpu_set)) break;
4458
4459 thread_affinity_policy_data_t policy = { core };
4460
4461 const int rc = thread_policy_set (pthread_mach_thread_np (thread), THREAD_AFFINITY_POLICY, (thread_policy_t) &policy, 1);
4462
4463 if (data.quiet == 0)
4464 {
4465 if (rc != KERN_SUCCESS)
4466 {
4467 log_error ("ERROR: %s : %d", "thread_policy_set()", rc);
4468 }
4469 }
4470
4471 return rc;
4472 }
4473 #endif
4474
4475 void set_cpu_affinity (char *cpu_affinity)
4476 {
4477 #ifdef WIN
4478 DWORD_PTR aff_mask = 0;
4479 #elif _POSIX
4480 cpu_set_t cpuset;
4481 CPU_ZERO (&cpuset);
4482 #endif
4483
4484 if (cpu_affinity)
4485 {
4486 char *devices = strdup (cpu_affinity);
4487
4488 char *next = strtok (devices, ",");
4489
4490 do
4491 {
4492 uint cpu_id = atoi (next);
4493
4494 if (cpu_id == 0)
4495 {
4496 #ifdef WIN
4497 aff_mask = 0;
4498 #elif _POSIX
4499 CPU_ZERO (&cpuset);
4500 #endif
4501
4502 break;
4503 }
4504
4505 if (cpu_id > 32)
4506 {
4507 log_error ("ERROR: invalid cpu_id %u specified", cpu_id);
4508
4509 exit (-1);
4510 }
4511
4512 #ifdef WIN
4513 aff_mask |= 1 << (cpu_id - 1);
4514 #elif _POSIX
4515 CPU_SET ((cpu_id - 1), &cpuset);
4516 #endif
4517
4518 } while ((next = strtok (NULL, ",")) != NULL);
4519
4520 free (devices);
4521 }
4522
4523 #ifdef WIN
4524 SetProcessAffinityMask (GetCurrentProcess (), aff_mask);
4525 SetThreadAffinityMask (GetCurrentThread (), aff_mask);
4526 #elif _POSIX
4527 pthread_t thread = pthread_self ();
4528 pthread_setaffinity_np (thread, sizeof (cpu_set_t), &cpuset);
4529 #endif
4530 }
4531
4532 void *rulefind (const void *key, void *base, int nmemb, size_t size, int (*compar) (const void *, const void *))
4533 {
4534 char *element, *end;
4535
4536 end = (char *) base + nmemb * size;
4537
4538 for (element = (char *) base; element < end; element += size)
4539 if (!compar (element, key))
4540 return element;
4541
4542 return NULL;
4543 }
4544
4545 int sort_by_u32 (const void *v1, const void *v2)
4546 {
4547 const u32 *s1 = (const u32 *) v1;
4548 const u32 *s2 = (const u32 *) v2;
4549
4550 return *s1 - *s2;
4551 }
4552
4553 int sort_by_salt (const void *v1, const void *v2)
4554 {
4555 const salt_t *s1 = (const salt_t *) v1;
4556 const salt_t *s2 = (const salt_t *) v2;
4557
4558 const int res1 = s1->salt_len - s2->salt_len;
4559
4560 if (res1 != 0) return (res1);
4561
4562 const int res2 = s1->salt_iter - s2->salt_iter;
4563
4564 if (res2 != 0) return (res2);
4565
4566 uint n;
4567
4568 n = 16;
4569
4570 while (n--)
4571 {
4572 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4573 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4574 }
4575
4576 n = 8;
4577
4578 while (n--)
4579 {
4580 if (s1->salt_buf_pc[n] > s2->salt_buf_pc[n]) return ( 1);
4581 if (s1->salt_buf_pc[n] < s2->salt_buf_pc[n]) return (-1);
4582 }
4583
4584 return (0);
4585 }
4586
4587 int sort_by_salt_buf (const void *v1, const void *v2)
4588 {
4589 const pot_t *p1 = (const pot_t *) v1;
4590 const pot_t *p2 = (const pot_t *) v2;
4591
4592 const hash_t *h1 = &p1->hash;
4593 const hash_t *h2 = &p2->hash;
4594
4595 const salt_t *s1 = h1->salt;
4596 const salt_t *s2 = h2->salt;
4597
4598 uint n = 16;
4599
4600 while (n--)
4601 {
4602 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4603 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4604 }
4605
4606 return 0;
4607 }
4608
4609 int sort_by_hash_t_salt (const void *v1, const void *v2)
4610 {
4611 const hash_t *h1 = (const hash_t *) v1;
4612 const hash_t *h2 = (const hash_t *) v2;
4613
4614 const salt_t *s1 = h1->salt;
4615 const salt_t *s2 = h2->salt;
4616
4617 // testphase: this should work
4618 uint n = 16;
4619
4620 while (n--)
4621 {
4622 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4623 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4624 }
4625
4626 /* original code, seems buggy since salt_len can be very big (had a case with 131 len)
4627 also it thinks salt_buf[x] is a char but its a uint so salt_len should be / 4
4628 if (s1->salt_len > s2->salt_len) return ( 1);
4629 if (s1->salt_len < s2->salt_len) return (-1);
4630
4631 uint n = s1->salt_len;
4632
4633 while (n--)
4634 {
4635 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4636 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4637 }
4638 */
4639
4640 return 0;
4641 }
4642
4643 int sort_by_hash_t_salt_hccap (const void *v1, const void *v2)
4644 {
4645 const hash_t *h1 = (const hash_t *) v1;
4646 const hash_t *h2 = (const hash_t *) v2;
4647
4648 const salt_t *s1 = h1->salt;
4649 const salt_t *s2 = h2->salt;
4650
4651 // 16 - 2 (since last 2 uints contain the digest)
4652 uint n = 14;
4653
4654 while (n--)
4655 {
4656 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4657 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4658 }
4659
4660 return 0;
4661 }
4662
4663 int sort_by_hash_no_salt (const void *v1, const void *v2)
4664 {
4665 const hash_t *h1 = (const hash_t *) v1;
4666 const hash_t *h2 = (const hash_t *) v2;
4667
4668 const void *d1 = h1->digest;
4669 const void *d2 = h2->digest;
4670
4671 return data.sort_by_digest (d1, d2);
4672 }
4673
4674 int sort_by_hash (const void *v1, const void *v2)
4675 {
4676 const hash_t *h1 = (const hash_t *) v1;
4677 const hash_t *h2 = (const hash_t *) v2;
4678
4679 if (data.isSalted)
4680 {
4681 const salt_t *s1 = h1->salt;
4682 const salt_t *s2 = h2->salt;
4683
4684 int res = sort_by_salt (s1, s2);
4685
4686 if (res != 0) return (res);
4687 }
4688
4689 const void *d1 = h1->digest;
4690 const void *d2 = h2->digest;
4691
4692 return data.sort_by_digest (d1, d2);
4693 }
4694
4695 int sort_by_pot (const void *v1, const void *v2)
4696 {
4697 const pot_t *p1 = (const pot_t *) v1;
4698 const pot_t *p2 = (const pot_t *) v2;
4699
4700 const hash_t *h1 = &p1->hash;
4701 const hash_t *h2 = &p2->hash;
4702
4703 return sort_by_hash (h1, h2);
4704 }
4705
4706 int sort_by_mtime (const void *p1, const void *p2)
4707 {
4708 const char **f1 = (const char **) p1;
4709 const char **f2 = (const char **) p2;
4710
4711 struct stat s1; stat (*f1, &s1);
4712 struct stat s2; stat (*f2, &s2);
4713
4714 return s2.st_mtime - s1.st_mtime;
4715 }
4716
4717 int sort_by_cpu_rule (const void *p1, const void *p2)
4718 {
4719 const cpu_rule_t *r1 = (const cpu_rule_t *) p1;
4720 const cpu_rule_t *r2 = (const cpu_rule_t *) p2;
4721
4722 return memcmp (r1, r2, sizeof (cpu_rule_t));
4723 }
4724
4725 int sort_by_kernel_rule (const void *p1, const void *p2)
4726 {
4727 const kernel_rule_t *r1 = (const kernel_rule_t *) p1;
4728 const kernel_rule_t *r2 = (const kernel_rule_t *) p2;
4729
4730 return memcmp (r1, r2, sizeof (kernel_rule_t));
4731 }
4732
4733 int sort_by_stringptr (const void *p1, const void *p2)
4734 {
4735 const char **s1 = (const char **) p1;
4736 const char **s2 = (const char **) p2;
4737
4738 return strcmp (*s1, *s2);
4739 }
4740
4741 int sort_by_dictstat (const void *s1, const void *s2)
4742 {
4743 dictstat_t *d1 = (dictstat_t *) s1;
4744 dictstat_t *d2 = (dictstat_t *) s2;
4745
4746 #ifdef LINUX
4747 d2->stat.st_atim = d1->stat.st_atim;
4748 #else
4749 d2->stat.st_atime = d1->stat.st_atime;
4750 #endif
4751
4752 return memcmp (&d1->stat, &d2->stat, sizeof (struct stat));
4753 }
4754
4755 int sort_by_bitmap (const void *p1, const void *p2)
4756 {
4757 const bitmap_result_t *b1 = (const bitmap_result_t *) p1;
4758 const bitmap_result_t *b2 = (const bitmap_result_t *) p2;
4759
4760 return b1->collisions - b2->collisions;
4761 }
4762
4763 int sort_by_digest_4_2 (const void *v1, const void *v2)
4764 {
4765 const u32 *d1 = (const u32 *) v1;
4766 const u32 *d2 = (const u32 *) v2;
4767
4768 uint n = 2;
4769
4770 while (n--)
4771 {
4772 if (d1[n] > d2[n]) return ( 1);
4773 if (d1[n] < d2[n]) return (-1);
4774 }
4775
4776 return (0);
4777 }
4778
4779 int sort_by_digest_4_4 (const void *v1, const void *v2)
4780 {
4781 const u32 *d1 = (const u32 *) v1;
4782 const u32 *d2 = (const u32 *) v2;
4783
4784 uint n = 4;
4785
4786 while (n--)
4787 {
4788 if (d1[n] > d2[n]) return ( 1);
4789 if (d1[n] < d2[n]) return (-1);
4790 }
4791
4792 return (0);
4793 }
4794
4795 int sort_by_digest_4_5 (const void *v1, const void *v2)
4796 {
4797 const u32 *d1 = (const u32 *) v1;
4798 const u32 *d2 = (const u32 *) v2;
4799
4800 uint n = 5;
4801
4802 while (n--)
4803 {
4804 if (d1[n] > d2[n]) return ( 1);
4805 if (d1[n] < d2[n]) return (-1);
4806 }
4807
4808 return (0);
4809 }
4810
4811 int sort_by_digest_4_6 (const void *v1, const void *v2)
4812 {
4813 const u32 *d1 = (const u32 *) v1;
4814 const u32 *d2 = (const u32 *) v2;
4815
4816 uint n = 6;
4817
4818 while (n--)
4819 {
4820 if (d1[n] > d2[n]) return ( 1);
4821 if (d1[n] < d2[n]) return (-1);
4822 }
4823
4824 return (0);
4825 }
4826
4827 int sort_by_digest_4_8 (const void *v1, const void *v2)
4828 {
4829 const u32 *d1 = (const u32 *) v1;
4830 const u32 *d2 = (const u32 *) v2;
4831
4832 uint n = 8;
4833
4834 while (n--)
4835 {
4836 if (d1[n] > d2[n]) return ( 1);
4837 if (d1[n] < d2[n]) return (-1);
4838 }
4839
4840 return (0);
4841 }
4842
4843 int sort_by_digest_4_16 (const void *v1, const void *v2)
4844 {
4845 const u32 *d1 = (const u32 *) v1;
4846 const u32 *d2 = (const u32 *) v2;
4847
4848 uint n = 16;
4849
4850 while (n--)
4851 {
4852 if (d1[n] > d2[n]) return ( 1);
4853 if (d1[n] < d2[n]) return (-1);
4854 }
4855
4856 return (0);
4857 }
4858
4859 int sort_by_digest_4_32 (const void *v1, const void *v2)
4860 {
4861 const u32 *d1 = (const u32 *) v1;
4862 const u32 *d2 = (const u32 *) v2;
4863
4864 uint n = 32;
4865
4866 while (n--)
4867 {
4868 if (d1[n] > d2[n]) return ( 1);
4869 if (d1[n] < d2[n]) return (-1);
4870 }
4871
4872 return (0);
4873 }
4874
4875 int sort_by_digest_4_64 (const void *v1, const void *v2)
4876 {
4877 const u32 *d1 = (const u32 *) v1;
4878 const u32 *d2 = (const u32 *) v2;
4879
4880 uint n = 64;
4881
4882 while (n--)
4883 {
4884 if (d1[n] > d2[n]) return ( 1);
4885 if (d1[n] < d2[n]) return (-1);
4886 }
4887
4888 return (0);
4889 }
4890
4891 int sort_by_digest_8_8 (const void *v1, const void *v2)
4892 {
4893 const u64 *d1 = (const u64 *) v1;
4894 const u64 *d2 = (const u64 *) v2;
4895
4896 uint n = 8;
4897
4898 while (n--)
4899 {
4900 if (d1[n] > d2[n]) return ( 1);
4901 if (d1[n] < d2[n]) return (-1);
4902 }
4903
4904 return (0);
4905 }
4906
4907 int sort_by_digest_8_16 (const void *v1, const void *v2)
4908 {
4909 const u64 *d1 = (const u64 *) v1;
4910 const u64 *d2 = (const u64 *) v2;
4911
4912 uint n = 16;
4913
4914 while (n--)
4915 {
4916 if (d1[n] > d2[n]) return ( 1);
4917 if (d1[n] < d2[n]) return (-1);
4918 }
4919
4920 return (0);
4921 }
4922
4923 int sort_by_digest_8_25 (const void *v1, const void *v2)
4924 {
4925 const u64 *d1 = (const u64 *) v1;
4926 const u64 *d2 = (const u64 *) v2;
4927
4928 uint n = 25;
4929
4930 while (n--)
4931 {
4932 if (d1[n] > d2[n]) return ( 1);
4933 if (d1[n] < d2[n]) return (-1);
4934 }
4935
4936 return (0);
4937 }
4938
4939 int sort_by_digest_p0p1 (const void *v1, const void *v2)
4940 {
4941 const u32 *d1 = (const u32 *) v1;
4942 const u32 *d2 = (const u32 *) v2;
4943
4944 const uint dgst_pos0 = data.dgst_pos0;
4945 const uint dgst_pos1 = data.dgst_pos1;
4946 const uint dgst_pos2 = data.dgst_pos2;
4947 const uint dgst_pos3 = data.dgst_pos3;
4948
4949 if (d1[dgst_pos3] > d2[dgst_pos3]) return ( 1);
4950 if (d1[dgst_pos3] < d2[dgst_pos3]) return (-1);
4951 if (d1[dgst_pos2] > d2[dgst_pos2]) return ( 1);
4952 if (d1[dgst_pos2] < d2[dgst_pos2]) return (-1);
4953 if (d1[dgst_pos1] > d2[dgst_pos1]) return ( 1);
4954 if (d1[dgst_pos1] < d2[dgst_pos1]) return (-1);
4955 if (d1[dgst_pos0] > d2[dgst_pos0]) return ( 1);
4956 if (d1[dgst_pos0] < d2[dgst_pos0]) return (-1);
4957
4958 return (0);
4959 }
4960
4961 int sort_by_tuning_db_alias (const void *v1, const void *v2)
4962 {
4963 const tuning_db_alias_t *t1 = (const tuning_db_alias_t *) v1;
4964 const tuning_db_alias_t *t2 = (const tuning_db_alias_t *) v2;
4965
4966 const int res1 = strcmp (t1->device_name, t2->device_name);
4967
4968 if (res1 != 0) return (res1);
4969
4970 return 0;
4971 }
4972
4973 int sort_by_tuning_db_entry (const void *v1, const void *v2)
4974 {
4975 const tuning_db_entry_t *t1 = (const tuning_db_entry_t *) v1;
4976 const tuning_db_entry_t *t2 = (const tuning_db_entry_t *) v2;
4977
4978 const int res1 = strcmp (t1->device_name, t2->device_name);
4979
4980 if (res1 != 0) return (res1);
4981
4982 const int res2 = t1->attack_mode
4983 - t2->attack_mode;
4984
4985 if (res2 != 0) return (res2);
4986
4987 const int res3 = t1->hash_type
4988 - t2->hash_type;
4989
4990 if (res3 != 0) return (res3);
4991
4992 return 0;
4993 }
4994
4995 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)
4996 {
4997 uint outfile_autohex = data.outfile_autohex;
4998
4999 unsigned char *rule_ptr = (unsigned char *) rule_buf;
5000
5001 FILE *debug_fp = NULL;
5002
5003 if (debug_file != NULL)
5004 {
5005 debug_fp = fopen (debug_file, "ab");
5006
5007 lock_file (debug_fp);
5008 }
5009 else
5010 {
5011 debug_fp = stderr;
5012 }
5013
5014 if (debug_fp == NULL)
5015 {
5016 log_info ("WARNING: Could not open debug-file for writing");
5017 }
5018 else
5019 {
5020 if ((debug_mode == 2) || (debug_mode == 3) || (debug_mode == 4))
5021 {
5022 format_plain (debug_fp, orig_plain_ptr, orig_plain_len, outfile_autohex);
5023
5024 if ((debug_mode == 3) || (debug_mode == 4)) fputc (':', debug_fp);
5025 }
5026
5027 fwrite (rule_ptr, rule_len, 1, debug_fp);
5028
5029 if (debug_mode == 4)
5030 {
5031 fputc (':', debug_fp);
5032
5033 format_plain (debug_fp, mod_plain_ptr, mod_plain_len, outfile_autohex);
5034 }
5035
5036 fputc ('\n', debug_fp);
5037
5038 if (debug_file != NULL) fclose (debug_fp);
5039 }
5040 }
5041
5042 void format_plain (FILE *fp, unsigned char *plain_ptr, uint plain_len, uint outfile_autohex)
5043 {
5044 int needs_hexify = 0;
5045
5046 if (outfile_autohex == 1)
5047 {
5048 for (uint i = 0; i < plain_len; i++)
5049 {
5050 if (plain_ptr[i] < 0x20)
5051 {
5052 needs_hexify = 1;
5053
5054 break;
5055 }
5056
5057 if (plain_ptr[i] > 0x7f)
5058 {
5059 needs_hexify = 1;
5060
5061 break;
5062 }
5063 }
5064 }
5065
5066 if (needs_hexify == 1)
5067 {
5068 fprintf (fp, "$HEX[");
5069
5070 for (uint i = 0; i < plain_len; i++)
5071 {
5072 fprintf (fp, "%02x", plain_ptr[i]);
5073 }
5074
5075 fprintf (fp, "]");
5076 }
5077 else
5078 {
5079 fwrite (plain_ptr, plain_len, 1, fp);
5080 }
5081 }
5082
5083 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)
5084 {
5085 uint outfile_format = data.outfile_format;
5086
5087 char separator = data.separator;
5088
5089 if (outfile_format & OUTFILE_FMT_HASH)
5090 {
5091 fprintf (out_fp, "%s", out_buf);
5092
5093 if (outfile_format & (OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
5094 {
5095 fputc (separator, out_fp);
5096 }
5097 }
5098 else if (data.username)
5099 {
5100 if (username != NULL)
5101 {
5102 for (uint i = 0; i < user_len; i++)
5103 {
5104 fprintf (out_fp, "%c", username[i]);
5105 }
5106
5107 if (outfile_format & (OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
5108 {
5109 fputc (separator, out_fp);
5110 }
5111 }
5112 }
5113
5114 if (outfile_format & OUTFILE_FMT_PLAIN)
5115 {
5116 format_plain (out_fp, plain_ptr, plain_len, data.outfile_autohex);
5117
5118 if (outfile_format & (OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
5119 {
5120 fputc (separator, out_fp);
5121 }
5122 }
5123
5124 if (outfile_format & OUTFILE_FMT_HEXPLAIN)
5125 {
5126 for (uint i = 0; i < plain_len; i++)
5127 {
5128 fprintf (out_fp, "%02x", plain_ptr[i]);
5129 }
5130
5131 if (outfile_format & (OUTFILE_FMT_CRACKPOS))
5132 {
5133 fputc (separator, out_fp);
5134 }
5135 }
5136
5137 if (outfile_format & OUTFILE_FMT_CRACKPOS)
5138 {
5139 #ifdef _WIN
5140 __mingw_fprintf (out_fp, "%llu", crackpos);
5141 #endif
5142
5143 #ifdef _POSIX
5144 #ifdef __x86_64__
5145 fprintf (out_fp, "%lu", (unsigned long) crackpos);
5146 #else
5147 fprintf (out_fp, "%llu", crackpos);
5148 #endif
5149 #endif
5150 }
5151
5152 fputc ('\n', out_fp);
5153 }
5154
5155 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)
5156 {
5157 pot_t pot_key;
5158
5159 pot_key.hash.salt = hashes_buf->salt;
5160 pot_key.hash.digest = hashes_buf->digest;
5161
5162 pot_t *pot_ptr = (pot_t *) bsearch (&pot_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5163
5164 if (pot_ptr)
5165 {
5166 log_info_nn ("");
5167
5168 input_buf[input_len] = 0;
5169
5170 // user
5171 unsigned char *username = NULL;
5172 uint user_len = 0;
5173
5174 if (data.username)
5175 {
5176 user_t *user = hashes_buf->hash_info->user;
5177
5178 if (user)
5179 {
5180 username = (unsigned char *) (user->user_name);
5181
5182 user_len = user->user_len;
5183 }
5184 }
5185
5186 // do output the line
5187 format_output (out_fp, input_buf, (unsigned char *) pot_ptr->plain_buf, pot_ptr->plain_len, 0, username, user_len);
5188 }
5189 }
5190
5191 #define LM_WEAK_HASH "\x4e\xcf\x0d\x0c\x0a\xe2\xfb\xc1"
5192 #define LM_MASKED_PLAIN "[notfound]"
5193
5194 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)
5195 {
5196 // left
5197
5198 pot_t pot_left_key;
5199
5200 pot_left_key.hash.salt = hash_left->salt;
5201 pot_left_key.hash.digest = hash_left->digest;
5202
5203 pot_t *pot_left_ptr = (pot_t *) bsearch (&pot_left_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5204
5205 // right
5206
5207 uint weak_hash_found = 0;
5208
5209 pot_t pot_right_key;
5210
5211 pot_right_key.hash.salt = hash_right->salt;
5212 pot_right_key.hash.digest = hash_right->digest;
5213
5214 pot_t *pot_right_ptr = (pot_t *) bsearch (&pot_right_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5215
5216 if (pot_right_ptr == NULL)
5217 {
5218 // special case, if "weak hash"
5219
5220 if (memcmp (hash_right->digest, LM_WEAK_HASH, 8) == 0)
5221 {
5222 weak_hash_found = 1;
5223
5224 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5225
5226 // in theory this is not needed, but we are paranoia:
5227
5228 memset (pot_right_ptr->plain_buf, 0, sizeof (pot_right_ptr->plain_buf));
5229 pot_right_ptr->plain_len = 0;
5230 }
5231 }
5232
5233 if ((pot_left_ptr == NULL) && (pot_right_ptr == NULL))
5234 {
5235 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
5236
5237 return;
5238 }
5239
5240 // at least one half was found:
5241
5242 log_info_nn ("");
5243
5244 input_buf[input_len] = 0;
5245
5246 // user
5247
5248 unsigned char *username = NULL;
5249 uint user_len = 0;
5250
5251 if (data.username)
5252 {
5253 user_t *user = hash_left->hash_info->user;
5254
5255 if (user)
5256 {
5257 username = (unsigned char *) (user->user_name);
5258
5259 user_len = user->user_len;
5260 }
5261 }
5262
5263 // mask the part which was not found
5264
5265 uint left_part_masked = 0;
5266 uint right_part_masked = 0;
5267
5268 uint mask_plain_len = strlen (LM_MASKED_PLAIN);
5269
5270 if (pot_left_ptr == NULL)
5271 {
5272 left_part_masked = 1;
5273
5274 pot_left_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5275
5276 memset (pot_left_ptr->plain_buf, 0, sizeof (pot_left_ptr->plain_buf));
5277
5278 memcpy (pot_left_ptr->plain_buf, LM_MASKED_PLAIN, mask_plain_len);
5279 pot_left_ptr->plain_len = mask_plain_len;
5280 }
5281
5282 if (pot_right_ptr == NULL)
5283 {
5284 right_part_masked = 1;
5285
5286 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5287
5288 memset (pot_right_ptr->plain_buf, 0, sizeof (pot_right_ptr->plain_buf));
5289
5290 memcpy (pot_right_ptr->plain_buf, LM_MASKED_PLAIN, mask_plain_len);
5291 pot_right_ptr->plain_len = mask_plain_len;
5292 }
5293
5294 // create the pot_ptr out of pot_left_ptr and pot_right_ptr
5295
5296 pot_t pot_ptr;
5297
5298 pot_ptr.plain_len = pot_left_ptr->plain_len + pot_right_ptr->plain_len;
5299
5300 memcpy (pot_ptr.plain_buf, pot_left_ptr->plain_buf, pot_left_ptr->plain_len);
5301
5302 memcpy (pot_ptr.plain_buf + pot_left_ptr->plain_len, pot_right_ptr->plain_buf, pot_right_ptr->plain_len);
5303
5304 // do output the line
5305
5306 format_output (out_fp, input_buf, (unsigned char *) pot_ptr.plain_buf, pot_ptr.plain_len, 0, username, user_len);
5307
5308 if (weak_hash_found == 1) myfree (pot_right_ptr);
5309
5310 if (left_part_masked == 1) myfree (pot_left_ptr);
5311 if (right_part_masked == 1) myfree (pot_right_ptr);
5312 }
5313
5314 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)
5315 {
5316 pot_t pot_key;
5317
5318 memcpy (&pot_key.hash, hashes_buf, sizeof (hash_t));
5319
5320 pot_t *pot_ptr = (pot_t *) bsearch (&pot_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5321
5322 if (pot_ptr == NULL)
5323 {
5324 log_info_nn ("");
5325
5326 input_buf[input_len] = 0;
5327
5328 format_output (out_fp, input_buf, NULL, 0, 0, NULL, 0);
5329 }
5330 }
5331
5332 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)
5333 {
5334 // left
5335
5336 pot_t pot_left_key;
5337
5338 memcpy (&pot_left_key.hash, hash_left, sizeof (hash_t));
5339
5340 pot_t *pot_left_ptr = (pot_t *) bsearch (&pot_left_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5341
5342 // right
5343
5344 pot_t pot_right_key;
5345
5346 memcpy (&pot_right_key.hash, hash_right, sizeof (hash_t));
5347
5348 pot_t *pot_right_ptr = (pot_t *) bsearch (&pot_right_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5349
5350 uint weak_hash_found = 0;
5351
5352 if (pot_right_ptr == NULL)
5353 {
5354 // special case, if "weak hash"
5355
5356 if (memcmp (hash_right->digest, LM_WEAK_HASH, 8) == 0)
5357 {
5358 weak_hash_found = 1;
5359
5360 // we just need that pot_right_ptr is not a NULL pointer
5361
5362 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5363 }
5364 }
5365
5366 if ((pot_left_ptr != NULL) && (pot_right_ptr != NULL))
5367 {
5368 if (weak_hash_found == 1) myfree (pot_right_ptr);
5369
5370 return;
5371 }
5372
5373 // ... at least one part was not cracked
5374
5375 log_info_nn ("");
5376
5377 input_buf[input_len] = 0;
5378
5379 // only show the hash part which is still not cracked
5380
5381 uint user_len = input_len - 32;
5382
5383 char *hash_output = (char *) mymalloc (33);
5384
5385 memcpy (hash_output, input_buf, input_len);
5386
5387 if (pot_left_ptr != NULL)
5388 {
5389 // only show right part (because left part was already found)
5390
5391 memcpy (hash_output + user_len, input_buf + user_len + 16, 16);
5392
5393 hash_output[user_len + 16] = 0;
5394 }
5395
5396 if (pot_right_ptr != NULL)
5397 {
5398 // only show left part (because right part was already found)
5399
5400 memcpy (hash_output + user_len, input_buf + user_len, 16);
5401
5402 hash_output[user_len + 16] = 0;
5403 }
5404
5405 format_output (out_fp, hash_output, NULL, 0, 0, NULL, 0);
5406
5407 myfree (hash_output);
5408
5409 if (weak_hash_found == 1) myfree (pot_right_ptr);
5410 }
5411
5412 uint setup_opencl_platforms_filter (char *opencl_platforms)
5413 {
5414 uint opencl_platforms_filter = 0;
5415
5416 if (opencl_platforms)
5417 {
5418 char *platforms = strdup (opencl_platforms);
5419
5420 char *next = strtok (platforms, ",");
5421
5422 do
5423 {
5424 int platform = atoi (next);
5425
5426 if (platform < 1 || platform > 32)
5427 {
5428 log_error ("ERROR: invalid OpenCL platform %u specified", platform);
5429
5430 exit (-1);
5431 }
5432
5433 opencl_platforms_filter |= 1 << (platform - 1);
5434
5435 } while ((next = strtok (NULL, ",")) != NULL);
5436
5437 free (platforms);
5438 }
5439 else
5440 {
5441 opencl_platforms_filter = -1;
5442 }
5443
5444 return opencl_platforms_filter;
5445 }
5446
5447 u32 setup_devices_filter (char *opencl_devices)
5448 {
5449 u32 devices_filter = 0;
5450
5451 if (opencl_devices)
5452 {
5453 char *devices = strdup (opencl_devices);
5454
5455 char *next = strtok (devices, ",");
5456
5457 do
5458 {
5459 int device_id = atoi (next);
5460
5461 if (device_id < 1 || device_id > 32)
5462 {
5463 log_error ("ERROR: invalid device_id %u specified", device_id);
5464
5465 exit (-1);
5466 }
5467
5468 devices_filter |= 1 << (device_id - 1);
5469
5470 } while ((next = strtok (NULL, ",")) != NULL);
5471
5472 free (devices);
5473 }
5474 else
5475 {
5476 devices_filter = -1;
5477 }
5478
5479 return devices_filter;
5480 }
5481
5482 cl_device_type setup_device_types_filter (char *opencl_device_types)
5483 {
5484 cl_device_type device_types_filter = 0;
5485
5486 if (opencl_device_types)
5487 {
5488 char *device_types = strdup (opencl_device_types);
5489
5490 char *next = strtok (device_types, ",");
5491
5492 do
5493 {
5494 int device_type = atoi (next);
5495
5496 if (device_type < 1 || device_type > 3)
5497 {
5498 log_error ("ERROR: invalid device_type %u specified", device_type);
5499
5500 exit (-1);
5501 }
5502
5503 device_types_filter |= 1 << device_type;
5504
5505 } while ((next = strtok (NULL, ",")) != NULL);
5506
5507 free (device_types);
5508 }
5509 else
5510 {
5511 // Do not use CPU by default, this often reduces GPU performance because
5512 // the CPU is too busy to handle GPU synchronization
5513
5514 device_types_filter = CL_DEVICE_TYPE_ALL & ~CL_DEVICE_TYPE_CPU;
5515 }
5516
5517 return device_types_filter;
5518 }
5519
5520 u32 get_random_num (const u32 min, const u32 max)
5521 {
5522 if (min == max) return (min);
5523
5524 return ((rand () % (max - min)) + min);
5525 }
5526
5527 u32 mydivc32 (const u32 dividend, const u32 divisor)
5528 {
5529 u32 quotient = dividend / divisor;
5530
5531 if (dividend % divisor) quotient++;
5532
5533 return quotient;
5534 }
5535
5536 u64 mydivc64 (const u64 dividend, const u64 divisor)
5537 {
5538 u64 quotient = dividend / divisor;
5539
5540 if (dividend % divisor) quotient++;
5541
5542 return quotient;
5543 }
5544
5545 void format_timer_display (struct tm *tm, char *buf, size_t len)
5546 {
5547 const char *time_entities_s[] = { "year", "day", "hour", "min", "sec" };
5548 const char *time_entities_m[] = { "years", "days", "hours", "mins", "secs" };
5549
5550 if (tm->tm_year - 70)
5551 {
5552 char *time_entity1 = ((tm->tm_year - 70) == 1) ? (char *) time_entities_s[0] : (char *) time_entities_m[0];
5553 char *time_entity2 = ( tm->tm_yday == 1) ? (char *) time_entities_s[1] : (char *) time_entities_m[1];
5554
5555 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_year - 70, time_entity1, tm->tm_yday, time_entity2);
5556 }
5557 else if (tm->tm_yday)
5558 {
5559 char *time_entity1 = (tm->tm_yday == 1) ? (char *) time_entities_s[1] : (char *) time_entities_m[1];
5560 char *time_entity2 = (tm->tm_hour == 1) ? (char *) time_entities_s[2] : (char *) time_entities_m[2];
5561
5562 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_yday, time_entity1, tm->tm_hour, time_entity2);
5563 }
5564 else if (tm->tm_hour)
5565 {
5566 char *time_entity1 = (tm->tm_hour == 1) ? (char *) time_entities_s[2] : (char *) time_entities_m[2];
5567 char *time_entity2 = (tm->tm_min == 1) ? (char *) time_entities_s[3] : (char *) time_entities_m[3];
5568
5569 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_hour, time_entity1, tm->tm_min, time_entity2);
5570 }
5571 else if (tm->tm_min)
5572 {
5573 char *time_entity1 = (tm->tm_min == 1) ? (char *) time_entities_s[3] : (char *) time_entities_m[3];
5574 char *time_entity2 = (tm->tm_sec == 1) ? (char *) time_entities_s[4] : (char *) time_entities_m[4];
5575
5576 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_min, time_entity1, tm->tm_sec, time_entity2);
5577 }
5578 else
5579 {
5580 char *time_entity1 = (tm->tm_sec == 1) ? (char *) time_entities_s[4] : (char *) time_entities_m[4];
5581
5582 snprintf (buf, len - 1, "%d %s", tm->tm_sec, time_entity1);
5583 }
5584 }
5585
5586 void format_speed_display (float val, char *buf, size_t len)
5587 {
5588 if (val <= 0)
5589 {
5590 buf[0] = '0';
5591 buf[1] = ' ';
5592 buf[2] = 0;
5593
5594 return;
5595 }
5596
5597 char units[7] = { ' ', 'k', 'M', 'G', 'T', 'P', 'E' };
5598
5599 uint level = 0;
5600
5601 while (val > 99999)
5602 {
5603 val /= 1000;
5604
5605 level++;
5606 }
5607
5608 /* generate output */
5609
5610 if (level == 0)
5611 {
5612 snprintf (buf, len - 1, "%.0f ", val);
5613 }
5614 else
5615 {
5616 snprintf (buf, len - 1, "%.1f %c", val, units[level]);
5617 }
5618 }
5619
5620 void lowercase (u8 *buf, int len)
5621 {
5622 for (int i = 0; i < len; i++) buf[i] = tolower (buf[i]);
5623 }
5624
5625 void uppercase (u8 *buf, int len)
5626 {
5627 for (int i = 0; i < len; i++) buf[i] = toupper (buf[i]);
5628 }
5629
5630 int fgetl (FILE *fp, char *line_buf)
5631 {
5632 int line_len = 0;
5633
5634 while (!feof (fp))
5635 {
5636 const int c = fgetc (fp);
5637
5638 if (c == EOF) break;
5639
5640 line_buf[line_len] = (char) c;
5641
5642 line_len++;
5643
5644 if (line_len == HCBUFSIZ) line_len--;
5645
5646 if (c == '\n') break;
5647 }
5648
5649 if (line_len == 0) return 0;
5650
5651 if (line_buf[line_len - 1] == '\n')
5652 {
5653 line_len--;
5654
5655 line_buf[line_len] = 0;
5656 }
5657
5658 if (line_len == 0) return 0;
5659
5660 if (line_buf[line_len - 1] == '\r')
5661 {
5662 line_len--;
5663
5664 line_buf[line_len] = 0;
5665 }
5666
5667 return (line_len);
5668 }
5669
5670 int in_superchop (char *buf)
5671 {
5672 int len = strlen (buf);
5673
5674 while (len)
5675 {
5676 if (buf[len - 1] == '\n')
5677 {
5678 len--;
5679
5680 continue;
5681 }
5682
5683 if (buf[len - 1] == '\r')
5684 {
5685 len--;
5686
5687 continue;
5688 }
5689
5690 break;
5691 }
5692
5693 buf[len] = 0;
5694
5695 return len;
5696 }
5697
5698 char **scan_directory (const char *path)
5699 {
5700 char *tmp_path = mystrdup (path);
5701
5702 size_t tmp_path_len = strlen (tmp_path);
5703
5704 while (tmp_path[tmp_path_len - 1] == '/' || tmp_path[tmp_path_len - 1] == '\\')
5705 {
5706 tmp_path[tmp_path_len - 1] = 0;
5707
5708 tmp_path_len = strlen (tmp_path);
5709 }
5710
5711 char **files = NULL;
5712
5713 int num_files = 0;
5714
5715 DIR *d = NULL;
5716
5717 if ((d = opendir (tmp_path)) != NULL)
5718 {
5719 #ifdef OSX
5720 struct dirent e;
5721
5722 for (;;) {
5723 memset (&e, 0, sizeof (e));
5724 struct dirent *de = NULL;
5725
5726 if (readdir_r (d, &e, &de) != 0)
5727 {
5728 log_error ("ERROR: readdir_r() failed");
5729
5730 break;
5731 }
5732
5733 if (de == NULL) break;
5734 #else
5735 struct dirent *de;
5736
5737 while ((de = readdir (d)) != NULL)
5738 {
5739 #endif
5740 if ((strcmp (de->d_name, ".") == 0) || (strcmp (de->d_name, "..") == 0)) continue;
5741
5742 int path_size = strlen (tmp_path) + 1 + strlen (de->d_name);
5743
5744 char *path_file = (char *) mymalloc (path_size + 1);
5745
5746 snprintf (path_file, path_size + 1, "%s/%s", tmp_path, de->d_name);
5747
5748 path_file[path_size] = 0;
5749
5750 DIR *d_test;
5751
5752 if ((d_test = opendir (path_file)) != NULL)
5753 {
5754 closedir (d_test);
5755
5756 myfree (path_file);
5757 }
5758 else
5759 {
5760 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5761
5762 num_files++;
5763
5764 files[num_files - 1] = path_file;
5765 }
5766 }
5767
5768 closedir (d);
5769 }
5770 else if (errno == ENOTDIR)
5771 {
5772 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5773
5774 num_files++;
5775
5776 files[num_files - 1] = mystrdup (path);
5777 }
5778
5779 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5780
5781 num_files++;
5782
5783 files[num_files - 1] = NULL;
5784
5785 myfree (tmp_path);
5786
5787 return (files);
5788 }
5789
5790 int count_dictionaries (char **dictionary_files)
5791 {
5792 if (dictionary_files == NULL) return 0;
5793
5794 int cnt = 0;
5795
5796 for (int d = 0; dictionary_files[d] != NULL; d++)
5797 {
5798 cnt++;
5799 }
5800
5801 return (cnt);
5802 }
5803
5804 char *stroptitype (const uint opti_type)
5805 {
5806 switch (opti_type)
5807 {
5808 case OPTI_TYPE_ZERO_BYTE: return ((char *) OPTI_STR_ZERO_BYTE); break;
5809 case OPTI_TYPE_PRECOMPUTE_INIT: return ((char *) OPTI_STR_PRECOMPUTE_INIT); break;
5810 case OPTI_TYPE_PRECOMPUTE_MERKLE: return ((char *) OPTI_STR_PRECOMPUTE_MERKLE); break;
5811 case OPTI_TYPE_PRECOMPUTE_PERMUT: return ((char *) OPTI_STR_PRECOMPUTE_PERMUT); break;
5812 case OPTI_TYPE_MEET_IN_MIDDLE: return ((char *) OPTI_STR_MEET_IN_MIDDLE); break;
5813 case OPTI_TYPE_EARLY_SKIP: return ((char *) OPTI_STR_EARLY_SKIP); break;
5814 case OPTI_TYPE_NOT_SALTED: return ((char *) OPTI_STR_NOT_SALTED); break;
5815 case OPTI_TYPE_NOT_ITERATED: return ((char *) OPTI_STR_NOT_ITERATED); break;
5816 case OPTI_TYPE_PREPENDED_SALT: return ((char *) OPTI_STR_PREPENDED_SALT); break;
5817 case OPTI_TYPE_APPENDED_SALT: return ((char *) OPTI_STR_APPENDED_SALT); break;
5818 case OPTI_TYPE_SINGLE_HASH: return ((char *) OPTI_STR_SINGLE_HASH); break;
5819 case OPTI_TYPE_SINGLE_SALT: return ((char *) OPTI_STR_SINGLE_SALT); break;
5820 case OPTI_TYPE_BRUTE_FORCE: return ((char *) OPTI_STR_BRUTE_FORCE); break;
5821 case OPTI_TYPE_RAW_HASH: return ((char *) OPTI_STR_RAW_HASH); break;
5822 case OPTI_TYPE_SLOW_HASH_SIMD: return ((char *) OPTI_STR_SLOW_HASH_SIMD); break;
5823 case OPTI_TYPE_USES_BITS_8: return ((char *) OPTI_STR_USES_BITS_8); break;
5824 case OPTI_TYPE_USES_BITS_16: return ((char *) OPTI_STR_USES_BITS_16); break;
5825 case OPTI_TYPE_USES_BITS_32: return ((char *) OPTI_STR_USES_BITS_32); break;
5826 case OPTI_TYPE_USES_BITS_64: return ((char *) OPTI_STR_USES_BITS_64); break;
5827 }
5828
5829 return (NULL);
5830 }
5831
5832 char *strparser (const uint parser_status)
5833 {
5834 switch (parser_status)
5835 {
5836 case PARSER_OK: return ((char *) PA_000); break;
5837 case PARSER_COMMENT: return ((char *) PA_001); break;
5838 case PARSER_GLOBAL_ZERO: return ((char *) PA_002); break;
5839 case PARSER_GLOBAL_LENGTH: return ((char *) PA_003); break;
5840 case PARSER_HASH_LENGTH: return ((char *) PA_004); break;
5841 case PARSER_HASH_VALUE: return ((char *) PA_005); break;
5842 case PARSER_SALT_LENGTH: return ((char *) PA_006); break;
5843 case PARSER_SALT_VALUE: return ((char *) PA_007); break;
5844 case PARSER_SALT_ITERATION: return ((char *) PA_008); break;
5845 case PARSER_SEPARATOR_UNMATCHED: return ((char *) PA_009); break;
5846 case PARSER_SIGNATURE_UNMATCHED: return ((char *) PA_010); break;
5847 case PARSER_HCCAP_FILE_SIZE: return ((char *) PA_011); break;
5848 case PARSER_HCCAP_EAPOL_SIZE: return ((char *) PA_012); break;
5849 case PARSER_PSAFE2_FILE_SIZE: return ((char *) PA_013); break;
5850 case PARSER_PSAFE3_FILE_SIZE: return ((char *) PA_014); break;
5851 case PARSER_TC_FILE_SIZE: return ((char *) PA_015); break;
5852 case PARSER_SIP_AUTH_DIRECTIVE: return ((char *) PA_016); break;
5853 }
5854
5855 return ((char *) PA_255);
5856 }
5857
5858 char *strhashtype (const uint hash_mode)
5859 {
5860 switch (hash_mode)
5861 {
5862 case 0: return ((char *) HT_00000); break;
5863 case 10: return ((char *) HT_00010); break;
5864 case 11: return ((char *) HT_00011); break;
5865 case 12: return ((char *) HT_00012); break;
5866 case 20: return ((char *) HT_00020); break;
5867 case 21: return ((char *) HT_00021); break;
5868 case 22: return ((char *) HT_00022); break;
5869 case 23: return ((char *) HT_00023); break;
5870 case 30: return ((char *) HT_00030); break;
5871 case 40: return ((char *) HT_00040); break;
5872 case 50: return ((char *) HT_00050); break;
5873 case 60: return ((char *) HT_00060); break;
5874 case 100: return ((char *) HT_00100); break;
5875 case 101: return ((char *) HT_00101); break;
5876 case 110: return ((char *) HT_00110); break;
5877 case 111: return ((char *) HT_00111); break;
5878 case 112: return ((char *) HT_00112); break;
5879 case 120: return ((char *) HT_00120); break;
5880 case 121: return ((char *) HT_00121); break;
5881 case 122: return ((char *) HT_00122); break;
5882 case 124: return ((char *) HT_00124); break;
5883 case 125: return ((char *) HT_00125); break;
5884 case 130: return ((char *) HT_00130); break;
5885 case 131: return ((char *) HT_00131); break;
5886 case 132: return ((char *) HT_00132); break;
5887 case 133: return ((char *) HT_00133); break;
5888 case 140: return ((char *) HT_00140); break;
5889 case 141: return ((char *) HT_00141); break;
5890 case 150: return ((char *) HT_00150); break;
5891 case 160: return ((char *) HT_00160); break;
5892 case 190: return ((char *) HT_00190); break;
5893 case 200: return ((char *) HT_00200); break;
5894 case 300: return ((char *) HT_00300); break;
5895 case 400: return ((char *) HT_00400); break;
5896 case 500: return ((char *) HT_00500); break;
5897 case 501: return ((char *) HT_00501); break;
5898 case 900: return ((char *) HT_00900); break;
5899 case 910: return ((char *) HT_00910); break;
5900 case 1000: return ((char *) HT_01000); break;
5901 case 1100: return ((char *) HT_01100); break;
5902 case 1400: return ((char *) HT_01400); break;
5903 case 1410: return ((char *) HT_01410); break;
5904 case 1420: return ((char *) HT_01420); break;
5905 case 1421: return ((char *) HT_01421); break;
5906 case 1430: return ((char *) HT_01430); break;
5907 case 1440: return ((char *) HT_01440); break;
5908 case 1441: return ((char *) HT_01441); break;
5909 case 1450: return ((char *) HT_01450); break;
5910 case 1460: return ((char *) HT_01460); break;
5911 case 1500: return ((char *) HT_01500); break;
5912 case 1600: return ((char *) HT_01600); break;
5913 case 1700: return ((char *) HT_01700); break;
5914 case 1710: return ((char *) HT_01710); break;
5915 case 1711: return ((char *) HT_01711); break;
5916 case 1720: return ((char *) HT_01720); break;
5917 case 1722: return ((char *) HT_01722); break;
5918 case 1730: return ((char *) HT_01730); break;
5919 case 1731: return ((char *) HT_01731); break;
5920 case 1740: return ((char *) HT_01740); break;
5921 case 1750: return ((char *) HT_01750); break;
5922 case 1760: return ((char *) HT_01760); break;
5923 case 1800: return ((char *) HT_01800); break;
5924 case 2100: return ((char *) HT_02100); break;
5925 case 2400: return ((char *) HT_02400); break;
5926 case 2410: return ((char *) HT_02410); break;
5927 case 2500: return ((char *) HT_02500); break;
5928 case 2600: return ((char *) HT_02600); break;
5929 case 2611: return ((char *) HT_02611); break;
5930 case 2612: return ((char *) HT_02612); break;
5931 case 2711: return ((char *) HT_02711); break;
5932 case 2811: return ((char *) HT_02811); break;
5933 case 3000: return ((char *) HT_03000); break;
5934 case 3100: return ((char *) HT_03100); break;
5935 case 3200: return ((char *) HT_03200); break;
5936 case 3710: return ((char *) HT_03710); break;
5937 case 3711: return ((char *) HT_03711); break;
5938 case 3800: return ((char *) HT_03800); break;
5939 case 4300: return ((char *) HT_04300); break;
5940 case 4400: return ((char *) HT_04400); break;
5941 case 4500: return ((char *) HT_04500); break;
5942 case 4700: return ((char *) HT_04700); break;
5943 case 4800: return ((char *) HT_04800); break;
5944 case 4900: return ((char *) HT_04900); break;
5945 case 5000: return ((char *) HT_05000); break;
5946 case 5100: return ((char *) HT_05100); break;
5947 case 5200: return ((char *) HT_05200); break;
5948 case 5300: return ((char *) HT_05300); break;
5949 case 5400: return ((char *) HT_05400); break;
5950 case 5500: return ((char *) HT_05500); break;
5951 case 5600: return ((char *) HT_05600); break;
5952 case 5700: return ((char *) HT_05700); break;
5953 case 5800: return ((char *) HT_05800); break;
5954 case 6000: return ((char *) HT_06000); break;
5955 case 6100: return ((char *) HT_06100); break;
5956 case 6211: return ((char *) HT_06211); break;
5957 case 6212: return ((char *) HT_06212); break;
5958 case 6213: return ((char *) HT_06213); break;
5959 case 6221: return ((char *) HT_06221); break;
5960 case 6222: return ((char *) HT_06222); break;
5961 case 6223: return ((char *) HT_06223); break;
5962 case 6231: return ((char *) HT_06231); break;
5963 case 6232: return ((char *) HT_06232); break;
5964 case 6233: return ((char *) HT_06233); break;
5965 case 6241: return ((char *) HT_06241); break;
5966 case 6242: return ((char *) HT_06242); break;
5967 case 6243: return ((char *) HT_06243); break;
5968 case 6300: return ((char *) HT_06300); break;
5969 case 6400: return ((char *) HT_06400); break;
5970 case 6500: return ((char *) HT_06500); break;
5971 case 6600: return ((char *) HT_06600); break;
5972 case 6700: return ((char *) HT_06700); break;
5973 case 6800: return ((char *) HT_06800); break;
5974 case 6900: return ((char *) HT_06900); break;
5975 case 7100: return ((char *) HT_07100); break;
5976 case 7200: return ((char *) HT_07200); break;
5977 case 7300: return ((char *) HT_07300); break;
5978 case 7400: return ((char *) HT_07400); break;
5979 case 7500: return ((char *) HT_07500); break;
5980 case 7600: return ((char *) HT_07600); break;
5981 case 7700: return ((char *) HT_07700); break;
5982 case 7800: return ((char *) HT_07800); break;
5983 case 7900: return ((char *) HT_07900); break;
5984 case 8000: return ((char *) HT_08000); break;
5985 case 8100: return ((char *) HT_08100); break;
5986 case 8200: return ((char *) HT_08200); break;
5987 case 8300: return ((char *) HT_08300); break;
5988 case 8400: return ((char *) HT_08400); break;
5989 case 8500: return ((char *) HT_08500); break;
5990 case 8600: return ((char *) HT_08600); break;
5991 case 8700: return ((char *) HT_08700); break;
5992 case 8800: return ((char *) HT_08800); break;
5993 case 8900: return ((char *) HT_08900); break;
5994 case 9000: return ((char *) HT_09000); break;
5995 case 9100: return ((char *) HT_09100); break;
5996 case 9200: return ((char *) HT_09200); break;
5997 case 9300: return ((char *) HT_09300); break;
5998 case 9400: return ((char *) HT_09400); break;
5999 case 9500: return ((char *) HT_09500); break;
6000 case 9600: return ((char *) HT_09600); break;
6001 case 9700: return ((char *) HT_09700); break;
6002 case 9710: return ((char *) HT_09710); break;
6003 case 9720: return ((char *) HT_09720); break;
6004 case 9800: return ((char *) HT_09800); break;
6005 case 9810: return ((char *) HT_09810); break;
6006 case 9820: return ((char *) HT_09820); break;
6007 case 9900: return ((char *) HT_09900); break;
6008 case 10000: return ((char *) HT_10000); break;
6009 case 10100: return ((char *) HT_10100); break;
6010 case 10200: return ((char *) HT_10200); break;
6011 case 10300: return ((char *) HT_10300); break;
6012 case 10400: return ((char *) HT_10400); break;
6013 case 10410: return ((char *) HT_10410); break;
6014 case 10420: return ((char *) HT_10420); break;
6015 case 10500: return ((char *) HT_10500); break;
6016 case 10600: return ((char *) HT_10600); break;
6017 case 10700: return ((char *) HT_10700); break;
6018 case 10800: return ((char *) HT_10800); break;
6019 case 10900: return ((char *) HT_10900); break;
6020 case 11000: return ((char *) HT_11000); break;
6021 case 11100: return ((char *) HT_11100); break;
6022 case 11200: return ((char *) HT_11200); break;
6023 case 11300: return ((char *) HT_11300); break;
6024 case 11400: return ((char *) HT_11400); break;
6025 case 11500: return ((char *) HT_11500); break;
6026 case 11600: return ((char *) HT_11600); break;
6027 case 11700: return ((char *) HT_11700); break;
6028 case 11800: return ((char *) HT_11800); break;
6029 case 11900: return ((char *) HT_11900); break;
6030 case 12000: return ((char *) HT_12000); break;
6031 case 12100: return ((char *) HT_12100); break;
6032 case 12200: return ((char *) HT_12200); break;
6033 case 12300: return ((char *) HT_12300); break;
6034 case 12400: return ((char *) HT_12400); break;
6035 case 12500: return ((char *) HT_12500); break;
6036 case 12600: return ((char *) HT_12600); break;
6037 case 12700: return ((char *) HT_12700); break;
6038 case 12800: return ((char *) HT_12800); break;
6039 case 12900: return ((char *) HT_12900); break;
6040 case 13000: return ((char *) HT_13000); break;
6041 case 13100: return ((char *) HT_13100); break;
6042 case 13200: return ((char *) HT_13200); break;
6043 case 13300: return ((char *) HT_13300); break;
6044 case 13400: return ((char *) HT_13400); break;
6045 case 13500: return ((char *) HT_13500); break;
6046 case 13600: return ((char *) HT_13600); break;
6047 case 13711: return ((char *) HT_13711); break;
6048 case 13712: return ((char *) HT_13712); break;
6049 case 13713: return ((char *) HT_13713); break;
6050 case 13721: return ((char *) HT_13721); break;
6051 case 13722: return ((char *) HT_13722); break;
6052 case 13723: return ((char *) HT_13723); break;
6053 case 13731: return ((char *) HT_13731); break;
6054 case 13732: return ((char *) HT_13732); break;
6055 case 13733: return ((char *) HT_13733); break;
6056 case 13741: return ((char *) HT_13741); break;
6057 case 13742: return ((char *) HT_13742); break;
6058 case 13743: return ((char *) HT_13743); break;
6059 case 13751: return ((char *) HT_13751); break;
6060 case 13752: return ((char *) HT_13752); break;
6061 case 13753: return ((char *) HT_13753); break;
6062 case 13761: return ((char *) HT_13761); break;
6063 case 13762: return ((char *) HT_13762); break;
6064 case 13763: return ((char *) HT_13763); break;
6065 case 13800: return ((char *) HT_13800); break;
6066 }
6067
6068 return ((char *) "Unknown");
6069 }
6070
6071 char *strstatus (const uint devices_status)
6072 {
6073 switch (devices_status)
6074 {
6075 case STATUS_INIT: return ((char *) ST_0000); break;
6076 case STATUS_STARTING: return ((char *) ST_0001); break;
6077 case STATUS_RUNNING: return ((char *) ST_0002); break;
6078 case STATUS_PAUSED: return ((char *) ST_0003); break;
6079 case STATUS_EXHAUSTED: return ((char *) ST_0004); break;
6080 case STATUS_CRACKED: return ((char *) ST_0005); break;
6081 case STATUS_ABORTED: return ((char *) ST_0006); break;
6082 case STATUS_QUIT: return ((char *) ST_0007); break;
6083 case STATUS_BYPASS: return ((char *) ST_0008); break;
6084 case STATUS_STOP_AT_CHECKPOINT: return ((char *) ST_0009); break;
6085 case STATUS_AUTOTUNE: return ((char *) ST_0010); break;
6086 }
6087
6088 return ((char *) "Unknown");
6089 }
6090
6091 void ascii_digest (char *out_buf, uint salt_pos, uint digest_pos)
6092 {
6093 uint hash_type = data.hash_type;
6094 uint hash_mode = data.hash_mode;
6095 uint salt_type = data.salt_type;
6096 uint opts_type = data.opts_type;
6097 uint opti_type = data.opti_type;
6098 uint dgst_size = data.dgst_size;
6099
6100 char *hashfile = data.hashfile;
6101
6102 uint len = 4096;
6103
6104 uint digest_buf[64] = { 0 };
6105
6106 u64 *digest_buf64 = (u64 *) digest_buf;
6107
6108 char *digests_buf_ptr = (char *) data.digests_buf;
6109
6110 memcpy (digest_buf, digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size), dgst_size);
6111
6112 if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT)
6113 {
6114 uint tt;
6115
6116 switch (hash_type)
6117 {
6118 case HASH_TYPE_DESCRYPT:
6119 FP (digest_buf[1], digest_buf[0], tt);
6120 break;
6121
6122 case HASH_TYPE_DESRACF:
6123 digest_buf[0] = rotl32 (digest_buf[0], 29);
6124 digest_buf[1] = rotl32 (digest_buf[1], 29);
6125
6126 FP (digest_buf[1], digest_buf[0], tt);
6127 break;
6128
6129 case HASH_TYPE_LM:
6130 FP (digest_buf[1], digest_buf[0], tt);
6131 break;
6132
6133 case HASH_TYPE_NETNTLM:
6134 digest_buf[0] = rotl32 (digest_buf[0], 29);
6135 digest_buf[1] = rotl32 (digest_buf[1], 29);
6136 digest_buf[2] = rotl32 (digest_buf[2], 29);
6137 digest_buf[3] = rotl32 (digest_buf[3], 29);
6138
6139 FP (digest_buf[1], digest_buf[0], tt);
6140 FP (digest_buf[3], digest_buf[2], tt);
6141 break;
6142
6143 case HASH_TYPE_BSDICRYPT:
6144 digest_buf[0] = rotl32 (digest_buf[0], 31);
6145 digest_buf[1] = rotl32 (digest_buf[1], 31);
6146
6147 FP (digest_buf[1], digest_buf[0], tt);
6148 break;
6149 }
6150 }
6151
6152 if (opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE)
6153 {
6154 switch (hash_type)
6155 {
6156 case HASH_TYPE_MD4:
6157 digest_buf[0] += MD4M_A;
6158 digest_buf[1] += MD4M_B;
6159 digest_buf[2] += MD4M_C;
6160 digest_buf[3] += MD4M_D;
6161 break;
6162
6163 case HASH_TYPE_MD5:
6164 digest_buf[0] += MD5M_A;
6165 digest_buf[1] += MD5M_B;
6166 digest_buf[2] += MD5M_C;
6167 digest_buf[3] += MD5M_D;
6168 break;
6169
6170 case HASH_TYPE_SHA1:
6171 digest_buf[0] += SHA1M_A;
6172 digest_buf[1] += SHA1M_B;
6173 digest_buf[2] += SHA1M_C;
6174 digest_buf[3] += SHA1M_D;
6175 digest_buf[4] += SHA1M_E;
6176 break;
6177
6178 case HASH_TYPE_SHA256:
6179 digest_buf[0] += SHA256M_A;
6180 digest_buf[1] += SHA256M_B;
6181 digest_buf[2] += SHA256M_C;
6182 digest_buf[3] += SHA256M_D;
6183 digest_buf[4] += SHA256M_E;
6184 digest_buf[5] += SHA256M_F;
6185 digest_buf[6] += SHA256M_G;
6186 digest_buf[7] += SHA256M_H;
6187 break;
6188
6189 case HASH_TYPE_SHA384:
6190 digest_buf64[0] += SHA384M_A;
6191 digest_buf64[1] += SHA384M_B;
6192 digest_buf64[2] += SHA384M_C;
6193 digest_buf64[3] += SHA384M_D;
6194 digest_buf64[4] += SHA384M_E;
6195 digest_buf64[5] += SHA384M_F;
6196 digest_buf64[6] += 0;
6197 digest_buf64[7] += 0;
6198 break;
6199
6200 case HASH_TYPE_SHA512:
6201 digest_buf64[0] += SHA512M_A;
6202 digest_buf64[1] += SHA512M_B;
6203 digest_buf64[2] += SHA512M_C;
6204 digest_buf64[3] += SHA512M_D;
6205 digest_buf64[4] += SHA512M_E;
6206 digest_buf64[5] += SHA512M_F;
6207 digest_buf64[6] += SHA512M_G;
6208 digest_buf64[7] += SHA512M_H;
6209 break;
6210 }
6211 }
6212
6213 if (opts_type & OPTS_TYPE_PT_GENERATE_LE)
6214 {
6215 if (dgst_size == DGST_SIZE_4_2)
6216 {
6217 for (int i = 0; i < 2; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6218 }
6219 else if (dgst_size == DGST_SIZE_4_4)
6220 {
6221 for (int i = 0; i < 4; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6222 }
6223 else if (dgst_size == DGST_SIZE_4_5)
6224 {
6225 for (int i = 0; i < 5; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6226 }
6227 else if (dgst_size == DGST_SIZE_4_6)
6228 {
6229 for (int i = 0; i < 6; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6230 }
6231 else if (dgst_size == DGST_SIZE_4_8)
6232 {
6233 for (int i = 0; i < 8; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6234 }
6235 else if ((dgst_size == DGST_SIZE_4_16) || (dgst_size == DGST_SIZE_8_8)) // same size, same result :)
6236 {
6237 if (hash_type == HASH_TYPE_WHIRLPOOL)
6238 {
6239 for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6240 }
6241 else if (hash_type == HASH_TYPE_SHA384)
6242 {
6243 for (int i = 0; i < 8; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
6244 }
6245 else if (hash_type == HASH_TYPE_SHA512)
6246 {
6247 for (int i = 0; i < 8; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
6248 }
6249 else if (hash_type == HASH_TYPE_GOST)
6250 {
6251 for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6252 }
6253 }
6254 else if (dgst_size == DGST_SIZE_4_64)
6255 {
6256 for (int i = 0; i < 64; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6257 }
6258 else if (dgst_size == DGST_SIZE_8_25)
6259 {
6260 for (int i = 0; i < 25; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
6261 }
6262 }
6263
6264 uint isSalted = ((data.salt_type == SALT_TYPE_INTERN)
6265 | (data.salt_type == SALT_TYPE_EXTERN)
6266 | (data.salt_type == SALT_TYPE_EMBEDDED));
6267
6268 salt_t salt;
6269
6270 if (isSalted)
6271 {
6272 memset (&salt, 0, sizeof (salt_t));
6273
6274 memcpy (&salt, &data.salts_buf[salt_pos], sizeof (salt_t));
6275
6276 char *ptr = (char *) salt.salt_buf;
6277
6278 uint len = salt.salt_len;
6279
6280 if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT)
6281 {
6282 uint tt;
6283
6284 switch (hash_type)
6285 {
6286 case HASH_TYPE_NETNTLM:
6287
6288 salt.salt_buf[0] = rotr32 (salt.salt_buf[0], 3);
6289 salt.salt_buf[1] = rotr32 (salt.salt_buf[1], 3);
6290
6291 FP (salt.salt_buf[1], salt.salt_buf[0], tt);
6292
6293 break;
6294 }
6295 }
6296
6297 if (opts_type & OPTS_TYPE_ST_UNICODE)
6298 {
6299 for (uint i = 0, j = 0; i < len; i += 1, j += 2)
6300 {
6301 ptr[i] = ptr[j];
6302 }
6303
6304 len = len / 2;
6305 }
6306
6307 if (opts_type & OPTS_TYPE_ST_GENERATE_LE)
6308 {
6309 uint max = salt.salt_len / 4;
6310
6311 if (len % 4) max++;
6312
6313 for (uint i = 0; i < max; i++)
6314 {
6315 salt.salt_buf[i] = byte_swap_32 (salt.salt_buf[i]);
6316 }
6317 }
6318
6319 if (opts_type & OPTS_TYPE_ST_HEX)
6320 {
6321 char tmp[64] = { 0 };
6322
6323 for (uint i = 0, j = 0; i < len; i += 1, j += 2)
6324 {
6325 sprintf (tmp + j, "%02x", (unsigned char) ptr[i]);
6326 }
6327
6328 len = len * 2;
6329
6330 memcpy (ptr, tmp, len);
6331 }
6332
6333 uint memset_size = ((48 - (int) len) > 0) ? (48 - len) : 0;
6334
6335 memset (ptr + len, 0, memset_size);
6336
6337 salt.salt_len = len;
6338 }
6339
6340 //
6341 // some modes require special encoding
6342 //
6343
6344 uint out_buf_plain[256] = { 0 };
6345 uint out_buf_salt[256] = { 0 };
6346
6347 char tmp_buf[1024] = { 0 };
6348
6349 char *ptr_plain = (char *) out_buf_plain;
6350 char *ptr_salt = (char *) out_buf_salt;
6351
6352 if (hash_mode == 22)
6353 {
6354 char username[30] = { 0 };
6355
6356 memcpy (username, salt.salt_buf, salt.salt_len - 22);
6357
6358 char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' };
6359
6360 u16 *ptr = (u16 *) digest_buf;
6361
6362 tmp_buf[ 0] = sig[0];
6363 tmp_buf[ 1] = int_to_base64 (((ptr[1]) >> 12) & 0x3f);
6364 tmp_buf[ 2] = int_to_base64 (((ptr[1]) >> 6) & 0x3f);
6365 tmp_buf[ 3] = int_to_base64 (((ptr[1]) >> 0) & 0x3f);
6366 tmp_buf[ 4] = int_to_base64 (((ptr[0]) >> 12) & 0x3f);
6367 tmp_buf[ 5] = int_to_base64 (((ptr[0]) >> 6) & 0x3f);
6368 tmp_buf[ 6] = sig[1];
6369 tmp_buf[ 7] = int_to_base64 (((ptr[0]) >> 0) & 0x3f);
6370 tmp_buf[ 8] = int_to_base64 (((ptr[3]) >> 12) & 0x3f);
6371 tmp_buf[ 9] = int_to_base64 (((ptr[3]) >> 6) & 0x3f);
6372 tmp_buf[10] = int_to_base64 (((ptr[3]) >> 0) & 0x3f);
6373 tmp_buf[11] = int_to_base64 (((ptr[2]) >> 12) & 0x3f);
6374 tmp_buf[12] = sig[2];
6375 tmp_buf[13] = int_to_base64 (((ptr[2]) >> 6) & 0x3f);
6376 tmp_buf[14] = int_to_base64 (((ptr[2]) >> 0) & 0x3f);
6377 tmp_buf[15] = int_to_base64 (((ptr[5]) >> 12) & 0x3f);
6378 tmp_buf[16] = int_to_base64 (((ptr[5]) >> 6) & 0x3f);
6379 tmp_buf[17] = sig[3];
6380 tmp_buf[18] = int_to_base64 (((ptr[5]) >> 0) & 0x3f);
6381 tmp_buf[19] = int_to_base64 (((ptr[4]) >> 12) & 0x3f);
6382 tmp_buf[20] = int_to_base64 (((ptr[4]) >> 6) & 0x3f);
6383 tmp_buf[21] = int_to_base64 (((ptr[4]) >> 0) & 0x3f);
6384 tmp_buf[22] = int_to_base64 (((ptr[7]) >> 12) & 0x3f);
6385 tmp_buf[23] = sig[4];
6386 tmp_buf[24] = int_to_base64 (((ptr[7]) >> 6) & 0x3f);
6387 tmp_buf[25] = int_to_base64 (((ptr[7]) >> 0) & 0x3f);
6388 tmp_buf[26] = int_to_base64 (((ptr[6]) >> 12) & 0x3f);
6389 tmp_buf[27] = int_to_base64 (((ptr[6]) >> 6) & 0x3f);
6390 tmp_buf[28] = int_to_base64 (((ptr[6]) >> 0) & 0x3f);
6391 tmp_buf[29] = sig[5];
6392
6393 snprintf (out_buf, len-1, "%s:%s",
6394 tmp_buf,
6395 username);
6396 }
6397 else if (hash_mode == 23)
6398 {
6399 // do not show the skyper part in output
6400
6401 char *salt_buf_ptr = (char *) salt.salt_buf;
6402
6403 salt_buf_ptr[salt.salt_len - 8] = 0;
6404
6405 snprintf (out_buf, len-1, "%08x%08x%08x%08x:%s",
6406 digest_buf[0],
6407 digest_buf[1],
6408 digest_buf[2],
6409 digest_buf[3],
6410 salt_buf_ptr);
6411 }
6412 else if (hash_mode == 101)
6413 {
6414 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6415
6416 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6417 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6418 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6419 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6420 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6421
6422 memcpy (tmp_buf, digest_buf, 20);
6423
6424 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6425
6426 snprintf (out_buf, len-1, "{SHA}%s", ptr_plain);
6427 }
6428 else if (hash_mode == 111)
6429 {
6430 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6431
6432 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6433 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6434 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6435 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6436 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6437
6438 memcpy (tmp_buf, digest_buf, 20);
6439 memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len);
6440
6441 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20 + salt.salt_len, (u8 *) ptr_plain);
6442
6443 snprintf (out_buf, len-1, "{SSHA}%s", ptr_plain);
6444 }
6445 else if ((hash_mode == 122) || (hash_mode == 125))
6446 {
6447 snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x",
6448 (char *) salt.salt_buf,
6449 digest_buf[0],
6450 digest_buf[1],
6451 digest_buf[2],
6452 digest_buf[3],
6453 digest_buf[4]);
6454 }
6455 else if (hash_mode == 124)
6456 {
6457 snprintf (out_buf, len-1, "sha1$%s$%08x%08x%08x%08x%08x",
6458 (char *) salt.salt_buf,
6459 digest_buf[0],
6460 digest_buf[1],
6461 digest_buf[2],
6462 digest_buf[3],
6463 digest_buf[4]);
6464 }
6465 else if (hash_mode == 131)
6466 {
6467 snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6468 (char *) salt.salt_buf,
6469 0, 0, 0, 0, 0,
6470 digest_buf[0],
6471 digest_buf[1],
6472 digest_buf[2],
6473 digest_buf[3],
6474 digest_buf[4]);
6475 }
6476 else if (hash_mode == 132)
6477 {
6478 snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x",
6479 (char *) salt.salt_buf,
6480 digest_buf[0],
6481 digest_buf[1],
6482 digest_buf[2],
6483 digest_buf[3],
6484 digest_buf[4]);
6485 }
6486 else if (hash_mode == 133)
6487 {
6488 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6489
6490 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6491 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6492 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6493 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6494 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6495
6496 memcpy (tmp_buf, digest_buf, 20);
6497
6498 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6499
6500 snprintf (out_buf, len-1, "%s", ptr_plain);
6501 }
6502 else if (hash_mode == 141)
6503 {
6504 memcpy (tmp_buf, salt.salt_buf, salt.salt_len);
6505
6506 base64_encode (int_to_base64, (const u8 *) tmp_buf, salt.salt_len, (u8 *) ptr_salt);
6507
6508 memset (tmp_buf, 0, sizeof (tmp_buf));
6509
6510 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6511
6512 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6513 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6514 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6515 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6516 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6517
6518 memcpy (tmp_buf, digest_buf, 20);
6519
6520 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6521
6522 ptr_plain[27] = 0;
6523
6524 snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER, ptr_salt, ptr_plain);
6525 }
6526 else if (hash_mode == 400)
6527 {
6528 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6529
6530 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6531 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6532 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6533 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6534
6535 phpass_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6536
6537 snprintf (out_buf, len-1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, (char *) ptr_plain);
6538 }
6539 else if (hash_mode == 500)
6540 {
6541 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6542
6543 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6544 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6545 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6546 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6547
6548 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6549
6550 if (salt.salt_iter == ROUNDS_MD5CRYPT)
6551 {
6552 snprintf (out_buf, len-1, "$1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6553 }
6554 else
6555 {
6556 snprintf (out_buf, len-1, "$1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6557 }
6558 }
6559 else if (hash_mode == 501)
6560 {
6561 uint digest_idx = salt.digests_offset + digest_pos;
6562
6563 hashinfo_t **hashinfo_ptr = data.hash_info;
6564 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
6565
6566 snprintf (out_buf, len-1, "%s", hash_buf);
6567 }
6568 else if (hash_mode == 1421)
6569 {
6570 u8 *salt_ptr = (u8 *) salt.salt_buf;
6571
6572 snprintf (out_buf, len-1, "%c%c%c%c%c%c%08x%08x%08x%08x%08x%08x%08x%08x",
6573 salt_ptr[0],
6574 salt_ptr[1],
6575 salt_ptr[2],
6576 salt_ptr[3],
6577 salt_ptr[4],
6578 salt_ptr[5],
6579 digest_buf[0],
6580 digest_buf[1],
6581 digest_buf[2],
6582 digest_buf[3],
6583 digest_buf[4],
6584 digest_buf[5],
6585 digest_buf[6],
6586 digest_buf[7]);
6587 }
6588 else if (hash_mode == 1441)
6589 {
6590 memcpy (tmp_buf, salt.salt_buf, salt.salt_len);
6591
6592 base64_encode (int_to_base64, (const u8 *) tmp_buf, salt.salt_len, (u8 *) ptr_salt);
6593
6594 memset (tmp_buf, 0, sizeof (tmp_buf));
6595
6596 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6597
6598 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6599 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6600 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6601 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6602 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6603 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6604 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6605 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6606
6607 memcpy (tmp_buf, digest_buf, 32);
6608
6609 base64_encode (int_to_base64, (const u8 *) tmp_buf, 32, (u8 *) ptr_plain);
6610
6611 ptr_plain[43] = 0;
6612
6613 snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER4, ptr_salt, ptr_plain);
6614 }
6615 else if (hash_mode == 1500)
6616 {
6617 out_buf[0] = salt.salt_sign[0] & 0xff;
6618 out_buf[1] = salt.salt_sign[1] & 0xff;
6619 //original method, but changed because of this ticket: https://hashcat.net/trac/ticket/269
6620 //out_buf[0] = int_to_itoa64 ((salt.salt_buf[0] >> 0) & 0x3f);
6621 //out_buf[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f);
6622
6623 memset (tmp_buf, 0, sizeof (tmp_buf));
6624
6625 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6626
6627 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6628 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6629
6630 memcpy (tmp_buf, digest_buf, 8);
6631
6632 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 8, (u8 *) ptr_plain);
6633
6634 snprintf (out_buf + 2, len-1-2, "%s", ptr_plain);
6635
6636 out_buf[13] = 0;
6637 }
6638 else if (hash_mode == 1600)
6639 {
6640 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6641
6642 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6643 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6644 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6645 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6646
6647 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6648
6649 if (salt.salt_iter == ROUNDS_MD5CRYPT)
6650 {
6651 snprintf (out_buf, len-1, "$apr1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6652 }
6653 else
6654 {
6655 snprintf (out_buf, len-1, "$apr1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6656 }
6657 }
6658 else if (hash_mode == 1711)
6659 {
6660 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6661
6662 digest_buf64[0] = byte_swap_64 (digest_buf64[0]);
6663 digest_buf64[1] = byte_swap_64 (digest_buf64[1]);
6664 digest_buf64[2] = byte_swap_64 (digest_buf64[2]);
6665 digest_buf64[3] = byte_swap_64 (digest_buf64[3]);
6666 digest_buf64[4] = byte_swap_64 (digest_buf64[4]);
6667 digest_buf64[5] = byte_swap_64 (digest_buf64[5]);
6668 digest_buf64[6] = byte_swap_64 (digest_buf64[6]);
6669 digest_buf64[7] = byte_swap_64 (digest_buf64[7]);
6670
6671 memcpy (tmp_buf, digest_buf, 64);
6672 memcpy (tmp_buf + 64, salt.salt_buf, salt.salt_len);
6673
6674 base64_encode (int_to_base64, (const u8 *) tmp_buf, 64 + salt.salt_len, (u8 *) ptr_plain);
6675
6676 snprintf (out_buf, len-1, "%s%s", SIGNATURE_SHA512B64S, ptr_plain);
6677 }
6678 else if (hash_mode == 1722)
6679 {
6680 uint *ptr = digest_buf;
6681
6682 snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6683 (unsigned char *) salt.salt_buf,
6684 ptr[ 1], ptr[ 0],
6685 ptr[ 3], ptr[ 2],
6686 ptr[ 5], ptr[ 4],
6687 ptr[ 7], ptr[ 6],
6688 ptr[ 9], ptr[ 8],
6689 ptr[11], ptr[10],
6690 ptr[13], ptr[12],
6691 ptr[15], ptr[14]);
6692 }
6693 else if (hash_mode == 1731)
6694 {
6695 uint *ptr = digest_buf;
6696
6697 snprintf (out_buf, len-1, "0x0200%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6698 (unsigned char *) salt.salt_buf,
6699 ptr[ 1], ptr[ 0],
6700 ptr[ 3], ptr[ 2],
6701 ptr[ 5], ptr[ 4],
6702 ptr[ 7], ptr[ 6],
6703 ptr[ 9], ptr[ 8],
6704 ptr[11], ptr[10],
6705 ptr[13], ptr[12],
6706 ptr[15], ptr[14]);
6707 }
6708 else if (hash_mode == 1800)
6709 {
6710 // temp workaround
6711
6712 digest_buf64[0] = byte_swap_64 (digest_buf64[0]);
6713 digest_buf64[1] = byte_swap_64 (digest_buf64[1]);
6714 digest_buf64[2] = byte_swap_64 (digest_buf64[2]);
6715 digest_buf64[3] = byte_swap_64 (digest_buf64[3]);
6716 digest_buf64[4] = byte_swap_64 (digest_buf64[4]);
6717 digest_buf64[5] = byte_swap_64 (digest_buf64[5]);
6718 digest_buf64[6] = byte_swap_64 (digest_buf64[6]);
6719 digest_buf64[7] = byte_swap_64 (digest_buf64[7]);
6720
6721 sha512crypt_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
6722
6723 if (salt.salt_iter == ROUNDS_SHA512CRYPT)
6724 {
6725 snprintf (out_buf, len-1, "$6$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6726 }
6727 else
6728 {
6729 snprintf (out_buf, len-1, "$6$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6730 }
6731 }
6732 else if (hash_mode == 2100)
6733 {
6734 uint pos = 0;
6735
6736 snprintf (out_buf + pos, len-1, "%s%i#",
6737 SIGNATURE_DCC2,
6738 salt.salt_iter + 1);
6739
6740 uint signature_len = strlen (out_buf);
6741
6742 pos += signature_len;
6743 len -= signature_len;
6744
6745 char *salt_ptr = (char *) salt.salt_buf;
6746
6747 for (uint i = 0; i < salt.salt_len; i++, pos++, len--) snprintf (out_buf + pos, len-1, "%c", salt_ptr[i]);
6748
6749 snprintf (out_buf + pos, len-1, "#%08x%08x%08x%08x",
6750 byte_swap_32 (digest_buf[0]),
6751 byte_swap_32 (digest_buf[1]),
6752 byte_swap_32 (digest_buf[2]),
6753 byte_swap_32 (digest_buf[3]));
6754 }
6755 else if ((hash_mode == 2400) || (hash_mode == 2410))
6756 {
6757 memcpy (tmp_buf, digest_buf, 16);
6758
6759 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6760
6761 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6762 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6763 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6764 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6765
6766 out_buf[ 0] = int_to_itoa64 ((digest_buf[0] >> 0) & 0x3f);
6767 out_buf[ 1] = int_to_itoa64 ((digest_buf[0] >> 6) & 0x3f);
6768 out_buf[ 2] = int_to_itoa64 ((digest_buf[0] >> 12) & 0x3f);
6769 out_buf[ 3] = int_to_itoa64 ((digest_buf[0] >> 18) & 0x3f);
6770
6771 out_buf[ 4] = int_to_itoa64 ((digest_buf[1] >> 0) & 0x3f);
6772 out_buf[ 5] = int_to_itoa64 ((digest_buf[1] >> 6) & 0x3f);
6773 out_buf[ 6] = int_to_itoa64 ((digest_buf[1] >> 12) & 0x3f);
6774 out_buf[ 7] = int_to_itoa64 ((digest_buf[1] >> 18) & 0x3f);
6775
6776 out_buf[ 8] = int_to_itoa64 ((digest_buf[2] >> 0) & 0x3f);
6777 out_buf[ 9] = int_to_itoa64 ((digest_buf[2] >> 6) & 0x3f);
6778 out_buf[10] = int_to_itoa64 ((digest_buf[2] >> 12) & 0x3f);
6779 out_buf[11] = int_to_itoa64 ((digest_buf[2] >> 18) & 0x3f);
6780
6781 out_buf[12] = int_to_itoa64 ((digest_buf[3] >> 0) & 0x3f);
6782 out_buf[13] = int_to_itoa64 ((digest_buf[3] >> 6) & 0x3f);
6783 out_buf[14] = int_to_itoa64 ((digest_buf[3] >> 12) & 0x3f);
6784 out_buf[15] = int_to_itoa64 ((digest_buf[3] >> 18) & 0x3f);
6785
6786 out_buf[16] = 0;
6787 }
6788 else if (hash_mode == 2500)
6789 {
6790 wpa_t *wpas = (wpa_t *) data.esalts_buf;
6791
6792 wpa_t *wpa = &wpas[salt_pos];
6793
6794 snprintf (out_buf, len-1, "%s:%02x%02x%02x%02x%02x%02x:%02x%02x%02x%02x%02x%02x",
6795 (char *) salt.salt_buf,
6796 wpa->orig_mac1[0],
6797 wpa->orig_mac1[1],
6798 wpa->orig_mac1[2],
6799 wpa->orig_mac1[3],
6800 wpa->orig_mac1[4],
6801 wpa->orig_mac1[5],
6802 wpa->orig_mac2[0],
6803 wpa->orig_mac2[1],
6804 wpa->orig_mac2[2],
6805 wpa->orig_mac2[3],
6806 wpa->orig_mac2[4],
6807 wpa->orig_mac2[5]);
6808 }
6809 else if (hash_mode == 4400)
6810 {
6811 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
6812 byte_swap_32 (digest_buf[0]),
6813 byte_swap_32 (digest_buf[1]),
6814 byte_swap_32 (digest_buf[2]),
6815 byte_swap_32 (digest_buf[3]));
6816 }
6817 else if (hash_mode == 4700)
6818 {
6819 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6820 byte_swap_32 (digest_buf[0]),
6821 byte_swap_32 (digest_buf[1]),
6822 byte_swap_32 (digest_buf[2]),
6823 byte_swap_32 (digest_buf[3]),
6824 byte_swap_32 (digest_buf[4]));
6825 }
6826 else if (hash_mode == 4800)
6827 {
6828 u8 chap_id_byte = (u8) salt.salt_buf[4];
6829
6830 snprintf (out_buf, len-1, "%08x%08x%08x%08x:%08x%08x%08x%08x:%02x",
6831 digest_buf[0],
6832 digest_buf[1],
6833 digest_buf[2],
6834 digest_buf[3],
6835 byte_swap_32 (salt.salt_buf[0]),
6836 byte_swap_32 (salt.salt_buf[1]),
6837 byte_swap_32 (salt.salt_buf[2]),
6838 byte_swap_32 (salt.salt_buf[3]),
6839 chap_id_byte);
6840 }
6841 else if (hash_mode == 4900)
6842 {
6843 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6844 byte_swap_32 (digest_buf[0]),
6845 byte_swap_32 (digest_buf[1]),
6846 byte_swap_32 (digest_buf[2]),
6847 byte_swap_32 (digest_buf[3]),
6848 byte_swap_32 (digest_buf[4]));
6849 }
6850 else if (hash_mode == 5100)
6851 {
6852 snprintf (out_buf, len-1, "%08x%08x",
6853 digest_buf[0],
6854 digest_buf[1]);
6855 }
6856 else if (hash_mode == 5200)
6857 {
6858 snprintf (out_buf, len-1, "%s", hashfile);
6859 }
6860 else if (hash_mode == 5300)
6861 {
6862 ikepsk_t *ikepsks = (ikepsk_t *) data.esalts_buf;
6863
6864 ikepsk_t *ikepsk = &ikepsks[salt_pos];
6865
6866 int buf_len = len -1;
6867
6868 // msg_buf
6869
6870 uint ikepsk_msg_len = ikepsk->msg_len / 4;
6871
6872 for (uint i = 0; i < ikepsk_msg_len; i++)
6873 {
6874 if ((i == 32) || (i == 64) || (i == 66) || (i == 68) || (i == 108))
6875 {
6876 snprintf (out_buf, buf_len, ":");
6877
6878 buf_len--;
6879 out_buf++;
6880 }
6881
6882 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->msg_buf[i]));
6883
6884 buf_len -= 8;
6885 out_buf += 8;
6886 }
6887
6888 // nr_buf
6889
6890 uint ikepsk_nr_len = ikepsk->nr_len / 4;
6891
6892 for (uint i = 0; i < ikepsk_nr_len; i++)
6893 {
6894 if ((i == 0) || (i == 5))
6895 {
6896 snprintf (out_buf, buf_len, ":");
6897
6898 buf_len--;
6899 out_buf++;
6900 }
6901
6902 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->nr_buf[i]));
6903
6904 buf_len -= 8;
6905 out_buf += 8;
6906 }
6907
6908 // digest_buf
6909
6910 for (uint i = 0; i < 4; i++)
6911 {
6912 if (i == 0)
6913 {
6914 snprintf (out_buf, buf_len, ":");
6915
6916 buf_len--;
6917 out_buf++;
6918 }
6919
6920 snprintf (out_buf, buf_len, "%08x", digest_buf[i]);
6921
6922 buf_len -= 8;
6923 out_buf += 8;
6924 }
6925 }
6926 else if (hash_mode == 5400)
6927 {
6928 ikepsk_t *ikepsks = (ikepsk_t *) data.esalts_buf;
6929
6930 ikepsk_t *ikepsk = &ikepsks[salt_pos];
6931
6932 int buf_len = len -1;
6933
6934 // msg_buf
6935
6936 uint ikepsk_msg_len = ikepsk->msg_len / 4;
6937
6938 for (uint i = 0; i < ikepsk_msg_len; i++)
6939 {
6940 if ((i == 32) || (i == 64) || (i == 66) || (i == 68) || (i == 108))
6941 {
6942 snprintf (out_buf, buf_len, ":");
6943
6944 buf_len--;
6945 out_buf++;
6946 }
6947
6948 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->msg_buf[i]));
6949
6950 buf_len -= 8;
6951 out_buf += 8;
6952 }
6953
6954 // nr_buf
6955
6956 uint ikepsk_nr_len = ikepsk->nr_len / 4;
6957
6958 for (uint i = 0; i < ikepsk_nr_len; i++)
6959 {
6960 if ((i == 0) || (i == 5))
6961 {
6962 snprintf (out_buf, buf_len, ":");
6963
6964 buf_len--;
6965 out_buf++;
6966 }
6967
6968 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->nr_buf[i]));
6969
6970 buf_len -= 8;
6971 out_buf += 8;
6972 }
6973
6974 // digest_buf
6975
6976 for (uint i = 0; i < 5; i++)
6977 {
6978 if (i == 0)
6979 {
6980 snprintf (out_buf, buf_len, ":");
6981
6982 buf_len--;
6983 out_buf++;
6984 }
6985
6986 snprintf (out_buf, buf_len, "%08x", digest_buf[i]);
6987
6988 buf_len -= 8;
6989 out_buf += 8;
6990 }
6991 }
6992 else if (hash_mode == 5500)
6993 {
6994 netntlm_t *netntlms = (netntlm_t *) data.esalts_buf;
6995
6996 netntlm_t *netntlm = &netntlms[salt_pos];
6997
6998 char user_buf[64] = { 0 };
6999 char domain_buf[64] = { 0 };
7000 char srvchall_buf[1024] = { 0 };
7001 char clichall_buf[1024] = { 0 };
7002
7003 for (uint i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2)
7004 {
7005 char *ptr = (char *) netntlm->userdomain_buf;
7006
7007 user_buf[i] = ptr[j];
7008 }
7009
7010 for (uint i = 0, j = 0; j < netntlm->domain_len; i += 1, j += 2)
7011 {
7012 char *ptr = (char *) netntlm->userdomain_buf;
7013
7014 domain_buf[i] = ptr[netntlm->user_len + j];
7015 }
7016
7017 for (uint i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2)
7018 {
7019 u8 *ptr = (u8 *) netntlm->chall_buf;
7020
7021 sprintf (srvchall_buf + j, "%02x", ptr[i]);
7022 }
7023
7024 for (uint i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2)
7025 {
7026 u8 *ptr = (u8 *) netntlm->chall_buf;
7027
7028 sprintf (clichall_buf + j, "%02x", ptr[netntlm->srvchall_len + i]);
7029 }
7030
7031 snprintf (out_buf, len-1, "%s::%s:%s:%08x%08x%08x%08x%08x%08x:%s",
7032 user_buf,
7033 domain_buf,
7034 srvchall_buf,
7035 digest_buf[0],
7036 digest_buf[1],
7037 digest_buf[2],
7038 digest_buf[3],
7039 byte_swap_32 (salt.salt_buf_pc[0]),
7040 byte_swap_32 (salt.salt_buf_pc[1]),
7041 clichall_buf);
7042 }
7043 else if (hash_mode == 5600)
7044 {
7045 netntlm_t *netntlms = (netntlm_t *) data.esalts_buf;
7046
7047 netntlm_t *netntlm = &netntlms[salt_pos];
7048
7049 char user_buf[64] = { 0 };
7050 char domain_buf[64] = { 0 };
7051 char srvchall_buf[1024] = { 0 };
7052 char clichall_buf[1024] = { 0 };
7053
7054 for (uint i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2)
7055 {
7056 char *ptr = (char *) netntlm->userdomain_buf;
7057
7058 user_buf[i] = ptr[j];
7059 }
7060
7061 for (uint i = 0, j = 0; j < netntlm->domain_len; i += 1, j += 2)
7062 {
7063 char *ptr = (char *) netntlm->userdomain_buf;
7064
7065 domain_buf[i] = ptr[netntlm->user_len + j];
7066 }
7067
7068 for (uint i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2)
7069 {
7070 u8 *ptr = (u8 *) netntlm->chall_buf;
7071
7072 sprintf (srvchall_buf + j, "%02x", ptr[i]);
7073 }
7074
7075 for (uint i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2)
7076 {
7077 u8 *ptr = (u8 *) netntlm->chall_buf;
7078
7079 sprintf (clichall_buf + j, "%02x", ptr[netntlm->srvchall_len + i]);
7080 }
7081
7082 snprintf (out_buf, len-1, "%s::%s:%s:%08x%08x%08x%08x:%s",
7083 user_buf,
7084 domain_buf,
7085 srvchall_buf,
7086 digest_buf[0],
7087 digest_buf[1],
7088 digest_buf[2],
7089 digest_buf[3],
7090 clichall_buf);
7091 }
7092 else if (hash_mode == 5700)
7093 {
7094 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
7095
7096 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7097 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7098 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7099 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7100 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7101 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7102 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7103 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7104
7105 memcpy (tmp_buf, digest_buf, 32);
7106
7107 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 32, (u8 *) ptr_plain);
7108
7109 ptr_plain[43] = 0;
7110
7111 snprintf (out_buf, len-1, "%s", ptr_plain);
7112 }
7113 else if (hash_mode == 5800)
7114 {
7115 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7116 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7117 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7118 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7119 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7120
7121 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
7122 digest_buf[0],
7123 digest_buf[1],
7124 digest_buf[2],
7125 digest_buf[3],
7126 digest_buf[4]);
7127 }
7128 else if ((hash_mode >= 6200) && (hash_mode <= 6299))
7129 {
7130 snprintf (out_buf, len-1, "%s", hashfile);
7131 }
7132 else if (hash_mode == 6300)
7133 {
7134 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
7135
7136 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7137 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7138 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7139 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7140
7141 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
7142
7143 snprintf (out_buf, len-1, "{smd5}%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
7144 }
7145 else if (hash_mode == 6400)
7146 {
7147 sha256aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
7148
7149 snprintf (out_buf, len-1, "{ssha256}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
7150 }
7151 else if (hash_mode == 6500)
7152 {
7153 sha512aix_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
7154
7155 snprintf (out_buf, len-1, "{ssha512}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
7156 }
7157 else if (hash_mode == 6600)
7158 {
7159 agilekey_t *agilekeys = (agilekey_t *) data.esalts_buf;
7160
7161 agilekey_t *agilekey = &agilekeys[salt_pos];
7162
7163 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
7164 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
7165
7166 uint buf_len = len - 1;
7167
7168 uint off = snprintf (out_buf, buf_len, "%d:%08x%08x:", salt.salt_iter + 1, salt.salt_buf[0], salt.salt_buf[1]);
7169 buf_len -= 22;
7170
7171 for (uint i = 0, j = off; i < 1040; i++, j += 2)
7172 {
7173 snprintf (out_buf + j, buf_len, "%02x", agilekey->cipher[i]);
7174
7175 buf_len -= 2;
7176 }
7177 }
7178 else if (hash_mode == 6700)
7179 {
7180 sha1aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
7181
7182 snprintf (out_buf, len-1, "{ssha1}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
7183 }
7184 else if (hash_mode == 6800)
7185 {
7186 snprintf (out_buf, len-1, "%s", (char *) salt.salt_buf);
7187 }
7188 else if (hash_mode == 7100)
7189 {
7190 uint *ptr = digest_buf;
7191
7192 pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) data.esalts_buf;
7193
7194 pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[salt_pos];
7195
7196 uint esalt[8] = { 0 };
7197
7198 esalt[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]);
7199 esalt[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]);
7200 esalt[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]);
7201 esalt[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]);
7202 esalt[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]);
7203 esalt[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]);
7204 esalt[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]);
7205 esalt[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]);
7206
7207 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",
7208 SIGNATURE_SHA512OSX,
7209 salt.salt_iter + 1,
7210 esalt[ 0], esalt[ 1],
7211 esalt[ 2], esalt[ 3],
7212 esalt[ 4], esalt[ 5],
7213 esalt[ 6], esalt[ 7],
7214 ptr [ 1], ptr [ 0],
7215 ptr [ 3], ptr [ 2],
7216 ptr [ 5], ptr [ 4],
7217 ptr [ 7], ptr [ 6],
7218 ptr [ 9], ptr [ 8],
7219 ptr [11], ptr [10],
7220 ptr [13], ptr [12],
7221 ptr [15], ptr [14]);
7222 }
7223 else if (hash_mode == 7200)
7224 {
7225 uint *ptr = digest_buf;
7226
7227 pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) data.esalts_buf;
7228
7229 pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[salt_pos];
7230
7231 uint len_used = 0;
7232
7233 snprintf (out_buf + len_used, len - len_used - 1, "%s%i.", SIGNATURE_SHA512GRUB, salt.salt_iter + 1);
7234
7235 len_used = strlen (out_buf);
7236
7237 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha512->salt_buf;
7238
7239 for (uint i = 0; i < salt.salt_len; i++, len_used += 2)
7240 {
7241 snprintf (out_buf + len_used, len - len_used - 1, "%02x", salt_buf_ptr[i]);
7242 }
7243
7244 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",
7245 ptr [ 1], ptr [ 0],
7246 ptr [ 3], ptr [ 2],
7247 ptr [ 5], ptr [ 4],
7248 ptr [ 7], ptr [ 6],
7249 ptr [ 9], ptr [ 8],
7250 ptr [11], ptr [10],
7251 ptr [13], ptr [12],
7252 ptr [15], ptr [14]);
7253 }
7254 else if (hash_mode == 7300)
7255 {
7256 rakp_t *rakps = (rakp_t *) data.esalts_buf;
7257
7258 rakp_t *rakp = &rakps[salt_pos];
7259
7260 for (uint i = 0, j = 0; (i * 4) < rakp->salt_len; i += 1, j += 8)
7261 {
7262 sprintf (out_buf + j, "%08x", rakp->salt_buf[i]);
7263 }
7264
7265 snprintf (out_buf + rakp->salt_len * 2, len - 1, ":%08x%08x%08x%08x%08x",
7266 digest_buf[0],
7267 digest_buf[1],
7268 digest_buf[2],
7269 digest_buf[3],
7270 digest_buf[4]);
7271 }
7272 else if (hash_mode == 7400)
7273 {
7274 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
7275
7276 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7277 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7278 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7279 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7280 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7281 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7282 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7283 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7284
7285 sha256crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
7286
7287 if (salt.salt_iter == ROUNDS_SHA256CRYPT)
7288 {
7289 snprintf (out_buf, len-1, "$5$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
7290 }
7291 else
7292 {
7293 snprintf (out_buf, len-1, "$5$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
7294 }
7295 }
7296 else if (hash_mode == 7500)
7297 {
7298 krb5pa_t *krb5pas = (krb5pa_t *) data.esalts_buf;
7299
7300 krb5pa_t *krb5pa = &krb5pas[salt_pos];
7301
7302 u8 *ptr_timestamp = (u8 *) krb5pa->timestamp;
7303 u8 *ptr_checksum = (u8 *) krb5pa->checksum;
7304
7305 char data[128] = { 0 };
7306
7307 char *ptr_data = data;
7308
7309 for (uint i = 0; i < 36; i++, ptr_data += 2)
7310 {
7311 sprintf (ptr_data, "%02x", ptr_timestamp[i]);
7312 }
7313
7314 for (uint i = 0; i < 16; i++, ptr_data += 2)
7315 {
7316 sprintf (ptr_data, "%02x", ptr_checksum[i]);
7317 }
7318
7319 *ptr_data = 0;
7320
7321 snprintf (out_buf, len-1, "%s$%s$%s$%s$%s",
7322 SIGNATURE_KRB5PA,
7323 (char *) krb5pa->user,
7324 (char *) krb5pa->realm,
7325 (char *) krb5pa->salt,
7326 data);
7327 }
7328 else if (hash_mode == 7700)
7329 {
7330 snprintf (out_buf, len-1, "%s$%08X%08X",
7331 (char *) salt.salt_buf,
7332 digest_buf[0],
7333 digest_buf[1]);
7334 }
7335 else if (hash_mode == 7800)
7336 {
7337 snprintf (out_buf, len-1, "%s$%08X%08X%08X%08X%08X",
7338 (char *) salt.salt_buf,
7339 digest_buf[0],
7340 digest_buf[1],
7341 digest_buf[2],
7342 digest_buf[3],
7343 digest_buf[4]);
7344 }
7345 else if (hash_mode == 7900)
7346 {
7347 drupal7_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
7348
7349 // ugly hack start
7350
7351 char *tmp = (char *) salt.salt_buf_pc;
7352
7353 ptr_plain[42] = tmp[0];
7354
7355 // ugly hack end
7356
7357 ptr_plain[43] = 0;
7358
7359 snprintf (out_buf, len-1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, (char *) ptr_plain);
7360 }
7361 else if (hash_mode == 8000)
7362 {
7363 snprintf (out_buf, len-1, "0xc007%s%08x%08x%08x%08x%08x%08x%08x%08x",
7364 (unsigned char *) salt.salt_buf,
7365 digest_buf[0],
7366 digest_buf[1],
7367 digest_buf[2],
7368 digest_buf[3],
7369 digest_buf[4],
7370 digest_buf[5],
7371 digest_buf[6],
7372 digest_buf[7]);
7373 }
7374 else if (hash_mode == 8100)
7375 {
7376 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
7377 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
7378
7379 snprintf (out_buf, len-1, "1%s%08x%08x%08x%08x%08x",
7380 (unsigned char *) salt.salt_buf,
7381 digest_buf[0],
7382 digest_buf[1],
7383 digest_buf[2],
7384 digest_buf[3],
7385 digest_buf[4]);
7386 }
7387 else if (hash_mode == 8200)
7388 {
7389 cloudkey_t *cloudkeys = (cloudkey_t *) data.esalts_buf;
7390
7391 cloudkey_t *cloudkey = &cloudkeys[salt_pos];
7392
7393 char data_buf[4096] = { 0 };
7394
7395 for (int i = 0, j = 0; i < 512; i += 1, j += 8)
7396 {
7397 sprintf (data_buf + j, "%08x", cloudkey->data_buf[i]);
7398 }
7399
7400 data_buf[cloudkey->data_len * 2] = 0;
7401
7402 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7403 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7404 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7405 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7406 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7407 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7408 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7409 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7410
7411 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
7412 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
7413 salt.salt_buf[2] = byte_swap_32 (salt.salt_buf[2]);
7414 salt.salt_buf[3] = byte_swap_32 (salt.salt_buf[3]);
7415
7416 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x:%08x%08x%08x%08x:%u:%s",
7417 digest_buf[0],
7418 digest_buf[1],
7419 digest_buf[2],
7420 digest_buf[3],
7421 digest_buf[4],
7422 digest_buf[5],
7423 digest_buf[6],
7424 digest_buf[7],
7425 salt.salt_buf[0],
7426 salt.salt_buf[1],
7427 salt.salt_buf[2],
7428 salt.salt_buf[3],
7429 salt.salt_iter + 1,
7430 data_buf);
7431 }
7432 else if (hash_mode == 8300)
7433 {
7434 char digest_buf_c[34] = { 0 };
7435
7436 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7437 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7438 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7439 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7440 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7441
7442 base32_encode (int_to_itoa32, (const u8 *) digest_buf, 20, (u8 *) digest_buf_c);
7443
7444 digest_buf_c[32] = 0;
7445
7446 // domain
7447
7448 const uint salt_pc_len = salt.salt_buf_pc[7]; // what a hack
7449
7450 char domain_buf_c[33] = { 0 };
7451
7452 memcpy (domain_buf_c, (char *) salt.salt_buf_pc, salt_pc_len);
7453
7454 for (uint i = 0; i < salt_pc_len; i++)
7455 {
7456 const char next = domain_buf_c[i];
7457
7458 domain_buf_c[i] = '.';
7459
7460 i += next;
7461 }
7462
7463 domain_buf_c[salt_pc_len] = 0;
7464
7465 // final
7466
7467 snprintf (out_buf, len-1, "%s:%s:%s:%u", digest_buf_c, domain_buf_c, (char *) salt.salt_buf, salt.salt_iter);
7468 }
7469 else if (hash_mode == 8500)
7470 {
7471 snprintf (out_buf, len-1, "%s*%s*%08X%08X", SIGNATURE_RACF, (char *) salt.salt_buf, digest_buf[0], digest_buf[1]);
7472 }
7473 else if (hash_mode == 2612)
7474 {
7475 snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x",
7476 SIGNATURE_PHPS,
7477 (char *) salt.salt_buf,
7478 digest_buf[0],
7479 digest_buf[1],
7480 digest_buf[2],
7481 digest_buf[3]);
7482 }
7483 else if (hash_mode == 3711)
7484 {
7485 char *salt_ptr = (char *) salt.salt_buf;
7486
7487 salt_ptr[salt.salt_len - 1] = 0;
7488
7489 snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x",
7490 SIGNATURE_MEDIAWIKI_B,
7491 salt_ptr,
7492 digest_buf[0],
7493 digest_buf[1],
7494 digest_buf[2],
7495 digest_buf[3]);
7496 }
7497 else if (hash_mode == 8800)
7498 {
7499 androidfde_t *androidfdes = (androidfde_t *) data.esalts_buf;
7500
7501 androidfde_t *androidfde = &androidfdes[salt_pos];
7502
7503 char tmp[3073] = { 0 };
7504
7505 for (uint i = 0, j = 0; i < 384; i += 1, j += 8)
7506 {
7507 sprintf (tmp + j, "%08x", androidfde->data[i]);
7508 }
7509
7510 tmp[3072] = 0;
7511
7512 snprintf (out_buf, len-1, "%s16$%08x%08x%08x%08x$16$%08x%08x%08x%08x$%s",
7513 SIGNATURE_ANDROIDFDE,
7514 byte_swap_32 (salt.salt_buf[0]),
7515 byte_swap_32 (salt.salt_buf[1]),
7516 byte_swap_32 (salt.salt_buf[2]),
7517 byte_swap_32 (salt.salt_buf[3]),
7518 byte_swap_32 (digest_buf[0]),
7519 byte_swap_32 (digest_buf[1]),
7520 byte_swap_32 (digest_buf[2]),
7521 byte_swap_32 (digest_buf[3]),
7522 tmp);
7523 }
7524 else if (hash_mode == 8900)
7525 {
7526 uint N = salt.scrypt_N;
7527 uint r = salt.scrypt_r;
7528 uint p = salt.scrypt_p;
7529
7530 char base64_salt[32] = { 0 };
7531
7532 base64_encode (int_to_base64, (const u8 *) salt.salt_buf, salt.salt_len, (u8 *) base64_salt);
7533
7534 memset (tmp_buf, 0, 46);
7535
7536 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7537 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7538 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7539 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7540 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7541 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7542 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7543 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7544 digest_buf[8] = 0; // needed for base64_encode ()
7545
7546 base64_encode (int_to_base64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7547
7548 snprintf (out_buf, len-1, "%s:%i:%i:%i:%s:%s",
7549 SIGNATURE_SCRYPT,
7550 N,
7551 r,
7552 p,
7553 base64_salt,
7554 tmp_buf);
7555 }
7556 else if (hash_mode == 9000)
7557 {
7558 snprintf (out_buf, len-1, "%s", hashfile);
7559 }
7560 else if (hash_mode == 9200)
7561 {
7562 // salt
7563
7564 pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) data.esalts_buf;
7565
7566 pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[salt_pos];
7567
7568 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf;
7569
7570 // hash
7571
7572 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7573 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7574 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7575 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7576 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7577 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7578 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7579 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7580 digest_buf[8] = 0; // needed for base64_encode ()
7581
7582 char tmp_buf[64] = { 0 };
7583
7584 base64_encode (int_to_itoa64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7585 tmp_buf[43] = 0; // cut it here
7586
7587 // output
7588
7589 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO8, salt_buf_ptr, tmp_buf);
7590 }
7591 else if (hash_mode == 9300)
7592 {
7593 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7594 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7595 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7596 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7597 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7598 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7599 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7600 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7601 digest_buf[8] = 0; // needed for base64_encode ()
7602
7603 char tmp_buf[64] = { 0 };
7604
7605 base64_encode (int_to_itoa64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7606 tmp_buf[43] = 0; // cut it here
7607
7608 unsigned char *salt_buf_ptr = (unsigned char *) salt.salt_buf;
7609
7610 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO9, salt_buf_ptr, tmp_buf);
7611 }
7612 else if (hash_mode == 9400)
7613 {
7614 office2007_t *office2007s = (office2007_t *) data.esalts_buf;
7615
7616 office2007_t *office2007 = &office2007s[salt_pos];
7617
7618 snprintf (out_buf, len-1, "%s*%u*%u*%u*%u*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7619 SIGNATURE_OFFICE2007,
7620 2007,
7621 20,
7622 office2007->keySize,
7623 16,
7624 salt.salt_buf[0],
7625 salt.salt_buf[1],
7626 salt.salt_buf[2],
7627 salt.salt_buf[3],
7628 office2007->encryptedVerifier[0],
7629 office2007->encryptedVerifier[1],
7630 office2007->encryptedVerifier[2],
7631 office2007->encryptedVerifier[3],
7632 office2007->encryptedVerifierHash[0],
7633 office2007->encryptedVerifierHash[1],
7634 office2007->encryptedVerifierHash[2],
7635 office2007->encryptedVerifierHash[3],
7636 office2007->encryptedVerifierHash[4]);
7637 }
7638 else if (hash_mode == 9500)
7639 {
7640 office2010_t *office2010s = (office2010_t *) data.esalts_buf;
7641
7642 office2010_t *office2010 = &office2010s[salt_pos];
7643
7644 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,
7645
7646 salt.salt_buf[0],
7647 salt.salt_buf[1],
7648 salt.salt_buf[2],
7649 salt.salt_buf[3],
7650 office2010->encryptedVerifier[0],
7651 office2010->encryptedVerifier[1],
7652 office2010->encryptedVerifier[2],
7653 office2010->encryptedVerifier[3],
7654 office2010->encryptedVerifierHash[0],
7655 office2010->encryptedVerifierHash[1],
7656 office2010->encryptedVerifierHash[2],
7657 office2010->encryptedVerifierHash[3],
7658 office2010->encryptedVerifierHash[4],
7659 office2010->encryptedVerifierHash[5],
7660 office2010->encryptedVerifierHash[6],
7661 office2010->encryptedVerifierHash[7]);
7662 }
7663 else if (hash_mode == 9600)
7664 {
7665 office2013_t *office2013s = (office2013_t *) data.esalts_buf;
7666
7667 office2013_t *office2013 = &office2013s[salt_pos];
7668
7669 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,
7670
7671 salt.salt_buf[0],
7672 salt.salt_buf[1],
7673 salt.salt_buf[2],
7674 salt.salt_buf[3],
7675 office2013->encryptedVerifier[0],
7676 office2013->encryptedVerifier[1],
7677 office2013->encryptedVerifier[2],
7678 office2013->encryptedVerifier[3],
7679 office2013->encryptedVerifierHash[0],
7680 office2013->encryptedVerifierHash[1],
7681 office2013->encryptedVerifierHash[2],
7682 office2013->encryptedVerifierHash[3],
7683 office2013->encryptedVerifierHash[4],
7684 office2013->encryptedVerifierHash[5],
7685 office2013->encryptedVerifierHash[6],
7686 office2013->encryptedVerifierHash[7]);
7687 }
7688 else if (hash_mode == 9700)
7689 {
7690 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7691
7692 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7693
7694 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7695 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7696 byte_swap_32 (salt.salt_buf[0]),
7697 byte_swap_32 (salt.salt_buf[1]),
7698 byte_swap_32 (salt.salt_buf[2]),
7699 byte_swap_32 (salt.salt_buf[3]),
7700 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7701 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7702 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7703 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7704 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7705 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7706 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7707 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]));
7708 }
7709 else if (hash_mode == 9710)
7710 {
7711 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7712
7713 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7714
7715 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7716 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7717 byte_swap_32 (salt.salt_buf[0]),
7718 byte_swap_32 (salt.salt_buf[1]),
7719 byte_swap_32 (salt.salt_buf[2]),
7720 byte_swap_32 (salt.salt_buf[3]),
7721 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7722 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7723 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7724 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7725 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7726 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7727 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7728 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]));
7729 }
7730 else if (hash_mode == 9720)
7731 {
7732 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7733
7734 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7735
7736 u8 *rc4key = (u8 *) oldoffice01->rc4key;
7737
7738 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7739 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7740 byte_swap_32 (salt.salt_buf[0]),
7741 byte_swap_32 (salt.salt_buf[1]),
7742 byte_swap_32 (salt.salt_buf[2]),
7743 byte_swap_32 (salt.salt_buf[3]),
7744 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7745 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7746 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7747 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7748 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7749 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7750 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7751 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]),
7752 rc4key[0],
7753 rc4key[1],
7754 rc4key[2],
7755 rc4key[3],
7756 rc4key[4]);
7757 }
7758 else if (hash_mode == 9800)
7759 {
7760 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7761
7762 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7763
7764 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7765 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7766 salt.salt_buf[0],
7767 salt.salt_buf[1],
7768 salt.salt_buf[2],
7769 salt.salt_buf[3],
7770 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7771 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7772 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7773 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7774 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7775 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7776 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7777 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7778 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]));
7779 }
7780 else if (hash_mode == 9810)
7781 {
7782 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7783
7784 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7785
7786 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7787 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7788 salt.salt_buf[0],
7789 salt.salt_buf[1],
7790 salt.salt_buf[2],
7791 salt.salt_buf[3],
7792 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7793 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7794 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7795 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7796 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7797 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7798 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7799 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7800 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]));
7801 }
7802 else if (hash_mode == 9820)
7803 {
7804 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7805
7806 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7807
7808 u8 *rc4key = (u8 *) oldoffice34->rc4key;
7809
7810 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7811 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7812 salt.salt_buf[0],
7813 salt.salt_buf[1],
7814 salt.salt_buf[2],
7815 salt.salt_buf[3],
7816 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7817 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7818 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7819 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7820 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7821 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7822 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7823 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7824 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]),
7825 rc4key[0],
7826 rc4key[1],
7827 rc4key[2],
7828 rc4key[3],
7829 rc4key[4]);
7830 }
7831 else if (hash_mode == 10000)
7832 {
7833 // salt
7834
7835 pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) data.esalts_buf;
7836
7837 pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[salt_pos];
7838
7839 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf;
7840
7841 // hash
7842
7843 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7844 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7845 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7846 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7847 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7848 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7849 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7850 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7851 digest_buf[8] = 0; // needed for base64_encode ()
7852
7853 char tmp_buf[64] = { 0 };
7854
7855 base64_encode (int_to_base64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7856
7857 // output
7858
7859 snprintf (out_buf, len-1, "%s%i$%s$%s", SIGNATURE_DJANGOPBKDF2, salt.salt_iter + 1, salt_buf_ptr, tmp_buf);
7860 }
7861 else if (hash_mode == 10100)
7862 {
7863 snprintf (out_buf, len-1, "%08x%08x:%u:%u:%08x%08x%08x%08x",
7864 digest_buf[0],
7865 digest_buf[1],
7866 2,
7867 4,
7868 byte_swap_32 (salt.salt_buf[0]),
7869 byte_swap_32 (salt.salt_buf[1]),
7870 byte_swap_32 (salt.salt_buf[2]),
7871 byte_swap_32 (salt.salt_buf[3]));
7872 }
7873 else if (hash_mode == 10200)
7874 {
7875 cram_md5_t *cram_md5s = (cram_md5_t *) data.esalts_buf;
7876
7877 cram_md5_t *cram_md5 = &cram_md5s[salt_pos];
7878
7879 // challenge
7880
7881 char challenge[100] = { 0 };
7882
7883 base64_encode (int_to_base64, (const u8 *) salt.salt_buf, salt.salt_len, (u8 *) challenge);
7884
7885 // response
7886
7887 char tmp_buf[100] = { 0 };
7888
7889 uint tmp_len = snprintf (tmp_buf, 100, "%s %08x%08x%08x%08x",
7890 (char *) cram_md5->user,
7891 digest_buf[0],
7892 digest_buf[1],
7893 digest_buf[2],
7894 digest_buf[3]);
7895
7896 char response[100] = { 0 };
7897
7898 base64_encode (int_to_base64, (const u8 *) tmp_buf, tmp_len, (u8 *) response);
7899
7900 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CRAM_MD5, challenge, response);
7901 }
7902 else if (hash_mode == 10300)
7903 {
7904 char tmp_buf[100] = { 0 };
7905
7906 memcpy (tmp_buf + 0, digest_buf, 20);
7907 memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len);
7908
7909 uint tmp_len = 20 + salt.salt_len;
7910
7911 // base64 encode it
7912
7913 char base64_encoded[100] = { 0 };
7914
7915 base64_encode (int_to_base64, (const u8 *) tmp_buf, tmp_len, (u8 *) base64_encoded);
7916
7917 snprintf (out_buf, len-1, "%s%i}%s", SIGNATURE_SAPH_SHA1, salt.salt_iter + 1, base64_encoded);
7918 }
7919 else if (hash_mode == 10400)
7920 {
7921 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7922
7923 pdf_t *pdf = &pdfs[salt_pos];
7924
7925 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",
7926
7927 pdf->V,
7928 pdf->R,
7929 40,
7930 pdf->P,
7931 pdf->enc_md,
7932 pdf->id_len,
7933 byte_swap_32 (pdf->id_buf[0]),
7934 byte_swap_32 (pdf->id_buf[1]),
7935 byte_swap_32 (pdf->id_buf[2]),
7936 byte_swap_32 (pdf->id_buf[3]),
7937 pdf->u_len,
7938 byte_swap_32 (pdf->u_buf[0]),
7939 byte_swap_32 (pdf->u_buf[1]),
7940 byte_swap_32 (pdf->u_buf[2]),
7941 byte_swap_32 (pdf->u_buf[3]),
7942 byte_swap_32 (pdf->u_buf[4]),
7943 byte_swap_32 (pdf->u_buf[5]),
7944 byte_swap_32 (pdf->u_buf[6]),
7945 byte_swap_32 (pdf->u_buf[7]),
7946 pdf->o_len,
7947 byte_swap_32 (pdf->o_buf[0]),
7948 byte_swap_32 (pdf->o_buf[1]),
7949 byte_swap_32 (pdf->o_buf[2]),
7950 byte_swap_32 (pdf->o_buf[3]),
7951 byte_swap_32 (pdf->o_buf[4]),
7952 byte_swap_32 (pdf->o_buf[5]),
7953 byte_swap_32 (pdf->o_buf[6]),
7954 byte_swap_32 (pdf->o_buf[7])
7955 );
7956 }
7957 else if (hash_mode == 10410)
7958 {
7959 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7960
7961 pdf_t *pdf = &pdfs[salt_pos];
7962
7963 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",
7964
7965 pdf->V,
7966 pdf->R,
7967 40,
7968 pdf->P,
7969 pdf->enc_md,
7970 pdf->id_len,
7971 byte_swap_32 (pdf->id_buf[0]),
7972 byte_swap_32 (pdf->id_buf[1]),
7973 byte_swap_32 (pdf->id_buf[2]),
7974 byte_swap_32 (pdf->id_buf[3]),
7975 pdf->u_len,
7976 byte_swap_32 (pdf->u_buf[0]),
7977 byte_swap_32 (pdf->u_buf[1]),
7978 byte_swap_32 (pdf->u_buf[2]),
7979 byte_swap_32 (pdf->u_buf[3]),
7980 byte_swap_32 (pdf->u_buf[4]),
7981 byte_swap_32 (pdf->u_buf[5]),
7982 byte_swap_32 (pdf->u_buf[6]),
7983 byte_swap_32 (pdf->u_buf[7]),
7984 pdf->o_len,
7985 byte_swap_32 (pdf->o_buf[0]),
7986 byte_swap_32 (pdf->o_buf[1]),
7987 byte_swap_32 (pdf->o_buf[2]),
7988 byte_swap_32 (pdf->o_buf[3]),
7989 byte_swap_32 (pdf->o_buf[4]),
7990 byte_swap_32 (pdf->o_buf[5]),
7991 byte_swap_32 (pdf->o_buf[6]),
7992 byte_swap_32 (pdf->o_buf[7])
7993 );
7994 }
7995 else if (hash_mode == 10420)
7996 {
7997 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7998
7999 pdf_t *pdf = &pdfs[salt_pos];
8000
8001 u8 *rc4key = (u8 *) pdf->rc4key;
8002
8003 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",
8004
8005 pdf->V,
8006 pdf->R,
8007 40,
8008 pdf->P,
8009 pdf->enc_md,
8010 pdf->id_len,
8011 byte_swap_32 (pdf->id_buf[0]),
8012 byte_swap_32 (pdf->id_buf[1]),
8013 byte_swap_32 (pdf->id_buf[2]),
8014 byte_swap_32 (pdf->id_buf[3]),
8015 pdf->u_len,
8016 byte_swap_32 (pdf->u_buf[0]),
8017 byte_swap_32 (pdf->u_buf[1]),
8018 byte_swap_32 (pdf->u_buf[2]),
8019 byte_swap_32 (pdf->u_buf[3]),
8020 byte_swap_32 (pdf->u_buf[4]),
8021 byte_swap_32 (pdf->u_buf[5]),
8022 byte_swap_32 (pdf->u_buf[6]),
8023 byte_swap_32 (pdf->u_buf[7]),
8024 pdf->o_len,
8025 byte_swap_32 (pdf->o_buf[0]),
8026 byte_swap_32 (pdf->o_buf[1]),
8027 byte_swap_32 (pdf->o_buf[2]),
8028 byte_swap_32 (pdf->o_buf[3]),
8029 byte_swap_32 (pdf->o_buf[4]),
8030 byte_swap_32 (pdf->o_buf[5]),
8031 byte_swap_32 (pdf->o_buf[6]),
8032 byte_swap_32 (pdf->o_buf[7]),
8033 rc4key[0],
8034 rc4key[1],
8035 rc4key[2],
8036 rc4key[3],
8037 rc4key[4]
8038 );
8039 }
8040 else if (hash_mode == 10500)
8041 {
8042 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
8043
8044 pdf_t *pdf = &pdfs[salt_pos];
8045
8046 if (pdf->id_len == 32)
8047 {
8048 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",
8049
8050 pdf->V,
8051 pdf->R,
8052 128,
8053 pdf->P,
8054 pdf->enc_md,
8055 pdf->id_len,
8056 byte_swap_32 (pdf->id_buf[0]),
8057 byte_swap_32 (pdf->id_buf[1]),
8058 byte_swap_32 (pdf->id_buf[2]),
8059 byte_swap_32 (pdf->id_buf[3]),
8060 byte_swap_32 (pdf->id_buf[4]),
8061 byte_swap_32 (pdf->id_buf[5]),
8062 byte_swap_32 (pdf->id_buf[6]),
8063 byte_swap_32 (pdf->id_buf[7]),
8064 pdf->u_len,
8065 byte_swap_32 (pdf->u_buf[0]),
8066 byte_swap_32 (pdf->u_buf[1]),
8067 byte_swap_32 (pdf->u_buf[2]),
8068 byte_swap_32 (pdf->u_buf[3]),
8069 byte_swap_32 (pdf->u_buf[4]),
8070 byte_swap_32 (pdf->u_buf[5]),
8071 byte_swap_32 (pdf->u_buf[6]),
8072 byte_swap_32 (pdf->u_buf[7]),
8073 pdf->o_len,
8074 byte_swap_32 (pdf->o_buf[0]),
8075 byte_swap_32 (pdf->o_buf[1]),
8076 byte_swap_32 (pdf->o_buf[2]),
8077 byte_swap_32 (pdf->o_buf[3]),
8078 byte_swap_32 (pdf->o_buf[4]),
8079 byte_swap_32 (pdf->o_buf[5]),
8080 byte_swap_32 (pdf->o_buf[6]),
8081 byte_swap_32 (pdf->o_buf[7])
8082 );
8083 }
8084 else
8085 {
8086 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",
8087
8088 pdf->V,
8089 pdf->R,
8090 128,
8091 pdf->P,
8092 pdf->enc_md,
8093 pdf->id_len,
8094 byte_swap_32 (pdf->id_buf[0]),
8095 byte_swap_32 (pdf->id_buf[1]),
8096 byte_swap_32 (pdf->id_buf[2]),
8097 byte_swap_32 (pdf->id_buf[3]),
8098 pdf->u_len,
8099 byte_swap_32 (pdf->u_buf[0]),
8100 byte_swap_32 (pdf->u_buf[1]),
8101 byte_swap_32 (pdf->u_buf[2]),
8102 byte_swap_32 (pdf->u_buf[3]),
8103 byte_swap_32 (pdf->u_buf[4]),
8104 byte_swap_32 (pdf->u_buf[5]),
8105 byte_swap_32 (pdf->u_buf[6]),
8106 byte_swap_32 (pdf->u_buf[7]),
8107 pdf->o_len,
8108 byte_swap_32 (pdf->o_buf[0]),
8109 byte_swap_32 (pdf->o_buf[1]),
8110 byte_swap_32 (pdf->o_buf[2]),
8111 byte_swap_32 (pdf->o_buf[3]),
8112 byte_swap_32 (pdf->o_buf[4]),
8113 byte_swap_32 (pdf->o_buf[5]),
8114 byte_swap_32 (pdf->o_buf[6]),
8115 byte_swap_32 (pdf->o_buf[7])
8116 );
8117 }
8118 }
8119 else if (hash_mode == 10600)
8120 {
8121 uint digest_idx = salt.digests_offset + digest_pos;
8122
8123 hashinfo_t **hashinfo_ptr = data.hash_info;
8124 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8125
8126 snprintf (out_buf, len-1, "%s", hash_buf);
8127 }
8128 else if (hash_mode == 10700)
8129 {
8130 uint digest_idx = salt.digests_offset + digest_pos;
8131
8132 hashinfo_t **hashinfo_ptr = data.hash_info;
8133 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8134
8135 snprintf (out_buf, len-1, "%s", hash_buf);
8136 }
8137 else if (hash_mode == 10900)
8138 {
8139 uint digest_idx = salt.digests_offset + digest_pos;
8140
8141 hashinfo_t **hashinfo_ptr = data.hash_info;
8142 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8143
8144 snprintf (out_buf, len-1, "%s", hash_buf);
8145 }
8146 else if (hash_mode == 11100)
8147 {
8148 u32 salt_challenge = salt.salt_buf[0];
8149
8150 salt_challenge = byte_swap_32 (salt_challenge);
8151
8152 unsigned char *user_name = (unsigned char *) (salt.salt_buf + 1);
8153
8154 snprintf (out_buf, len-1, "%s%s*%08x*%08x%08x%08x%08x",
8155 SIGNATURE_POSTGRESQL_AUTH,
8156 user_name,
8157 salt_challenge,
8158 digest_buf[0],
8159 digest_buf[1],
8160 digest_buf[2],
8161 digest_buf[3]);
8162 }
8163 else if (hash_mode == 11200)
8164 {
8165 snprintf (out_buf, len-1, "%s%s*%08x%08x%08x%08x%08x",
8166 SIGNATURE_MYSQL_AUTH,
8167 (unsigned char *) salt.salt_buf,
8168 digest_buf[0],
8169 digest_buf[1],
8170 digest_buf[2],
8171 digest_buf[3],
8172 digest_buf[4]);
8173 }
8174 else if (hash_mode == 11300)
8175 {
8176 bitcoin_wallet_t *bitcoin_wallets = (bitcoin_wallet_t *) data.esalts_buf;
8177
8178 bitcoin_wallet_t *bitcoin_wallet = &bitcoin_wallets[salt_pos];
8179
8180 const uint cry_master_len = bitcoin_wallet->cry_master_len;
8181 const uint ckey_len = bitcoin_wallet->ckey_len;
8182 const uint public_key_len = bitcoin_wallet->public_key_len;
8183
8184 char *cry_master_buf = (char *) mymalloc ((cry_master_len * 2) + 1);
8185 char *ckey_buf = (char *) mymalloc ((ckey_len * 2) + 1);
8186 char *public_key_buf = (char *) mymalloc ((public_key_len * 2) + 1);
8187
8188 for (uint i = 0, j = 0; i < cry_master_len; i += 1, j += 2)
8189 {
8190 const u8 *ptr = (const u8 *) bitcoin_wallet->cry_master_buf;
8191
8192 sprintf (cry_master_buf + j, "%02x", ptr[i]);
8193 }
8194
8195 for (uint i = 0, j = 0; i < ckey_len; i += 1, j += 2)
8196 {
8197 const u8 *ptr = (const u8 *) bitcoin_wallet->ckey_buf;
8198
8199 sprintf (ckey_buf + j, "%02x", ptr[i]);
8200 }
8201
8202 for (uint i = 0, j = 0; i < public_key_len; i += 1, j += 2)
8203 {
8204 const u8 *ptr = (const u8 *) bitcoin_wallet->public_key_buf;
8205
8206 sprintf (public_key_buf + j, "%02x", ptr[i]);
8207 }
8208
8209 snprintf (out_buf, len-1, "%s%d$%s$%d$%s$%d$%d$%s$%d$%s",
8210 SIGNATURE_BITCOIN_WALLET,
8211 cry_master_len * 2,
8212 cry_master_buf,
8213 salt.salt_len,
8214 (unsigned char *) salt.salt_buf,
8215 salt.salt_iter + 1,
8216 ckey_len * 2,
8217 ckey_buf,
8218 public_key_len * 2,
8219 public_key_buf
8220 );
8221
8222 free (cry_master_buf);
8223 free (ckey_buf);
8224 free (public_key_buf);
8225 }
8226 else if (hash_mode == 11400)
8227 {
8228 uint digest_idx = salt.digests_offset + digest_pos;
8229
8230 hashinfo_t **hashinfo_ptr = data.hash_info;
8231 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8232
8233 snprintf (out_buf, len-1, "%s", hash_buf);
8234 }
8235 else if (hash_mode == 11600)
8236 {
8237 seven_zip_t *seven_zips = (seven_zip_t *) data.esalts_buf;
8238
8239 seven_zip_t *seven_zip = &seven_zips[salt_pos];
8240
8241 const uint data_len = seven_zip->data_len;
8242
8243 char *data_buf = (char *) mymalloc ((data_len * 2) + 1);
8244
8245 for (uint i = 0, j = 0; i < data_len; i += 1, j += 2)
8246 {
8247 const u8 *ptr = (const u8 *) seven_zip->data_buf;
8248
8249 sprintf (data_buf + j, "%02x", ptr[i]);
8250 }
8251
8252 snprintf (out_buf, len-1, "%s%u$%u$%u$%s$%u$%08x%08x%08x%08x$%u$%u$%u$%s",
8253 SIGNATURE_SEVEN_ZIP,
8254 0,
8255 salt.salt_sign[0],
8256 0,
8257 (char *) seven_zip->salt_buf,
8258 seven_zip->iv_len,
8259 seven_zip->iv_buf[0],
8260 seven_zip->iv_buf[1],
8261 seven_zip->iv_buf[2],
8262 seven_zip->iv_buf[3],
8263 seven_zip->crc,
8264 seven_zip->data_len,
8265 seven_zip->unpack_size,
8266 data_buf);
8267
8268 free (data_buf);
8269 }
8270 else if (hash_mode == 11700)
8271 {
8272 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8273 digest_buf[0],
8274 digest_buf[1],
8275 digest_buf[2],
8276 digest_buf[3],
8277 digest_buf[4],
8278 digest_buf[5],
8279 digest_buf[6],
8280 digest_buf[7]);
8281 }
8282 else if (hash_mode == 11800)
8283 {
8284 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8285 digest_buf[ 0],
8286 digest_buf[ 1],
8287 digest_buf[ 2],
8288 digest_buf[ 3],
8289 digest_buf[ 4],
8290 digest_buf[ 5],
8291 digest_buf[ 6],
8292 digest_buf[ 7],
8293 digest_buf[ 8],
8294 digest_buf[ 9],
8295 digest_buf[10],
8296 digest_buf[11],
8297 digest_buf[12],
8298 digest_buf[13],
8299 digest_buf[14],
8300 digest_buf[15]);
8301 }
8302 else if (hash_mode == 11900)
8303 {
8304 uint digest_idx = salt.digests_offset + digest_pos;
8305
8306 hashinfo_t **hashinfo_ptr = data.hash_info;
8307 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8308
8309 snprintf (out_buf, len-1, "%s", hash_buf);
8310 }
8311 else if (hash_mode == 12000)
8312 {
8313 uint digest_idx = salt.digests_offset + digest_pos;
8314
8315 hashinfo_t **hashinfo_ptr = data.hash_info;
8316 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8317
8318 snprintf (out_buf, len-1, "%s", hash_buf);
8319 }
8320 else if (hash_mode == 12100)
8321 {
8322 uint digest_idx = salt.digests_offset + digest_pos;
8323
8324 hashinfo_t **hashinfo_ptr = data.hash_info;
8325 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8326
8327 snprintf (out_buf, len-1, "%s", hash_buf);
8328 }
8329 else if (hash_mode == 12200)
8330 {
8331 uint *ptr_digest = digest_buf;
8332 uint *ptr_salt = salt.salt_buf;
8333
8334 snprintf (out_buf, len-1, "%s0$1$%08x%08x$%08x%08x",
8335 SIGNATURE_ECRYPTFS,
8336 ptr_salt[0],
8337 ptr_salt[1],
8338 ptr_digest[0],
8339 ptr_digest[1]);
8340 }
8341 else if (hash_mode == 12300)
8342 {
8343 uint *ptr_digest = digest_buf;
8344 uint *ptr_salt = salt.salt_buf;
8345
8346 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",
8347 ptr_digest[ 0], ptr_digest[ 1],
8348 ptr_digest[ 2], ptr_digest[ 3],
8349 ptr_digest[ 4], ptr_digest[ 5],
8350 ptr_digest[ 6], ptr_digest[ 7],
8351 ptr_digest[ 8], ptr_digest[ 9],
8352 ptr_digest[10], ptr_digest[11],
8353 ptr_digest[12], ptr_digest[13],
8354 ptr_digest[14], ptr_digest[15],
8355 ptr_salt[0],
8356 ptr_salt[1],
8357 ptr_salt[2],
8358 ptr_salt[3]);
8359 }
8360 else if (hash_mode == 12400)
8361 {
8362 // encode iteration count
8363
8364 char salt_iter[5] = { 0 };
8365
8366 salt_iter[0] = int_to_itoa64 ((salt.salt_iter ) & 0x3f);
8367 salt_iter[1] = int_to_itoa64 ((salt.salt_iter >> 6) & 0x3f);
8368 salt_iter[2] = int_to_itoa64 ((salt.salt_iter >> 12) & 0x3f);
8369 salt_iter[3] = int_to_itoa64 ((salt.salt_iter >> 18) & 0x3f);
8370 salt_iter[4] = 0;
8371
8372 // encode salt
8373
8374 ptr_salt[0] = int_to_itoa64 ((salt.salt_buf[0] ) & 0x3f);
8375 ptr_salt[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f);
8376 ptr_salt[2] = int_to_itoa64 ((salt.salt_buf[0] >> 12) & 0x3f);
8377 ptr_salt[3] = int_to_itoa64 ((salt.salt_buf[0] >> 18) & 0x3f);
8378 ptr_salt[4] = 0;
8379
8380 // encode digest
8381
8382 memset (tmp_buf, 0, sizeof (tmp_buf));
8383
8384 digest_buf[0] = byte_swap_32 (digest_buf[0]);
8385 digest_buf[1] = byte_swap_32 (digest_buf[1]);
8386
8387 memcpy (tmp_buf, digest_buf, 8);
8388
8389 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 8, (u8 *) ptr_plain);
8390
8391 ptr_plain[11] = 0;
8392
8393 // fill the resulting buffer
8394
8395 snprintf (out_buf, len - 1, "_%s%s%s", salt_iter, ptr_salt, ptr_plain);
8396 }
8397 else if (hash_mode == 12500)
8398 {
8399 snprintf (out_buf, len - 1, "%s*0*%08x%08x*%08x%08x%08x%08x",
8400 SIGNATURE_RAR3,
8401 byte_swap_32 (salt.salt_buf[0]),
8402 byte_swap_32 (salt.salt_buf[1]),
8403 salt.salt_buf[2],
8404 salt.salt_buf[3],
8405 salt.salt_buf[4],
8406 salt.salt_buf[5]);
8407 }
8408 else if (hash_mode == 12600)
8409 {
8410 snprintf (out_buf, len - 1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8411 digest_buf[0] + salt.salt_buf_pc[0],
8412 digest_buf[1] + salt.salt_buf_pc[1],
8413 digest_buf[2] + salt.salt_buf_pc[2],
8414 digest_buf[3] + salt.salt_buf_pc[3],
8415 digest_buf[4] + salt.salt_buf_pc[4],
8416 digest_buf[5] + salt.salt_buf_pc[5],
8417 digest_buf[6] + salt.salt_buf_pc[6],
8418 digest_buf[7] + salt.salt_buf_pc[7]);
8419 }
8420 else if (hash_mode == 12700)
8421 {
8422 uint digest_idx = salt.digests_offset + digest_pos;
8423
8424 hashinfo_t **hashinfo_ptr = data.hash_info;
8425 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8426
8427 snprintf (out_buf, len-1, "%s", hash_buf);
8428 }
8429 else if (hash_mode == 12800)
8430 {
8431 const u8 *ptr = (const u8 *) salt.salt_buf;
8432
8433 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",
8434 SIGNATURE_MS_DRSR,
8435 ptr[0],
8436 ptr[1],
8437 ptr[2],
8438 ptr[3],
8439 ptr[4],
8440 ptr[5],
8441 ptr[6],
8442 ptr[7],
8443 ptr[8],
8444 ptr[9],
8445 salt.salt_iter + 1,
8446 byte_swap_32 (digest_buf[0]),
8447 byte_swap_32 (digest_buf[1]),
8448 byte_swap_32 (digest_buf[2]),
8449 byte_swap_32 (digest_buf[3]),
8450 byte_swap_32 (digest_buf[4]),
8451 byte_swap_32 (digest_buf[5]),
8452 byte_swap_32 (digest_buf[6]),
8453 byte_swap_32 (digest_buf[7])
8454 );
8455 }
8456 else if (hash_mode == 12900)
8457 {
8458 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",
8459 salt.salt_buf[ 4],
8460 salt.salt_buf[ 5],
8461 salt.salt_buf[ 6],
8462 salt.salt_buf[ 7],
8463 salt.salt_buf[ 8],
8464 salt.salt_buf[ 9],
8465 salt.salt_buf[10],
8466 salt.salt_buf[11],
8467 byte_swap_32 (digest_buf[0]),
8468 byte_swap_32 (digest_buf[1]),
8469 byte_swap_32 (digest_buf[2]),
8470 byte_swap_32 (digest_buf[3]),
8471 byte_swap_32 (digest_buf[4]),
8472 byte_swap_32 (digest_buf[5]),
8473 byte_swap_32 (digest_buf[6]),
8474 byte_swap_32 (digest_buf[7]),
8475 salt.salt_buf[ 0],
8476 salt.salt_buf[ 1],
8477 salt.salt_buf[ 2],
8478 salt.salt_buf[ 3]
8479 );
8480 }
8481 else if (hash_mode == 13000)
8482 {
8483 rar5_t *rar5s = (rar5_t *) data.esalts_buf;
8484
8485 rar5_t *rar5 = &rar5s[salt_pos];
8486
8487 snprintf (out_buf, len-1, "$rar5$16$%08x%08x%08x%08x$%u$%08x%08x%08x%08x$8$%08x%08x",
8488 salt.salt_buf[0],
8489 salt.salt_buf[1],
8490 salt.salt_buf[2],
8491 salt.salt_buf[3],
8492 salt.salt_sign[0],
8493 rar5->iv[0],
8494 rar5->iv[1],
8495 rar5->iv[2],
8496 rar5->iv[3],
8497 byte_swap_32 (digest_buf[0]),
8498 byte_swap_32 (digest_buf[1])
8499 );
8500 }
8501 else if (hash_mode == 13100)
8502 {
8503 krb5tgs_t *krb5tgss = (krb5tgs_t *) data.esalts_buf;
8504
8505 krb5tgs_t *krb5tgs = &krb5tgss[salt_pos];
8506
8507 u8 *ptr_checksum = (u8 *) krb5tgs->checksum;
8508 u8 *ptr_edata2 = (u8 *) krb5tgs->edata2;
8509
8510 char data[2560 * 4 * 2] = { 0 };
8511
8512 char *ptr_data = data;
8513
8514 for (uint i = 0; i < 16; i++, ptr_data += 2)
8515 sprintf (ptr_data, "%02x", ptr_checksum[i]);
8516
8517 /* skip '$' */
8518 ptr_data++;
8519
8520 for (uint i = 0; i < krb5tgs->edata2_len; i++, ptr_data += 2)
8521 sprintf (ptr_data, "%02x", ptr_edata2[i]);
8522
8523 snprintf (out_buf, len-1, "%s$%s$%s$%s",
8524 SIGNATURE_KRB5TGS,
8525 (char *) krb5tgs->account_info,
8526 data,
8527 data + 33);
8528 }
8529 else if (hash_mode == 13200)
8530 {
8531 snprintf (out_buf, len-1, "%s*%d*%08x%08x%08x%08x*%08x%08x%08x%08x%08x%08x",
8532 SIGNATURE_AXCRYPT,
8533 salt.salt_iter,
8534 salt.salt_buf[0],
8535 salt.salt_buf[1],
8536 salt.salt_buf[2],
8537 salt.salt_buf[3],
8538 salt.salt_buf[4],
8539 salt.salt_buf[5],
8540 salt.salt_buf[6],
8541 salt.salt_buf[7],
8542 salt.salt_buf[8],
8543 salt.salt_buf[9]);
8544 }
8545 else if (hash_mode == 13300)
8546 {
8547 snprintf (out_buf, len-1, "%s$%08x%08x%08x%08x",
8548 SIGNATURE_AXCRYPT_SHA1,
8549 digest_buf[0],
8550 digest_buf[1],
8551 digest_buf[2],
8552 digest_buf[3]);
8553 }
8554 else if (hash_mode == 13400)
8555 {
8556 keepass_t *keepasss = (keepass_t *) data.esalts_buf;
8557
8558 keepass_t *keepass = &keepasss[salt_pos];
8559
8560 u32 version = (u32) keepass->version;
8561 u32 rounds = salt.salt_iter;
8562 u32 algorithm = (u32) keepass->algorithm;
8563 u32 keyfile_len = (u32) keepass->keyfile_len;
8564
8565 u32 *ptr_final_random_seed = (u32 *) keepass->final_random_seed ;
8566 u32 *ptr_transf_random_seed = (u32 *) keepass->transf_random_seed ;
8567 u32 *ptr_enc_iv = (u32 *) keepass->enc_iv ;
8568 u32 *ptr_contents_hash = (u32 *) keepass->contents_hash ;
8569 u32 *ptr_keyfile = (u32 *) keepass->keyfile ;
8570
8571 /* specific to version 1 */
8572 u32 contents_len;
8573 u32 *ptr_contents;
8574
8575 /* specific to version 2 */
8576 u32 expected_bytes_len;
8577 u32 *ptr_expected_bytes;
8578
8579 u32 final_random_seed_len;
8580 u32 transf_random_seed_len;
8581 u32 enc_iv_len;
8582 u32 contents_hash_len;
8583
8584 transf_random_seed_len = 8;
8585 enc_iv_len = 4;
8586 contents_hash_len = 8;
8587 final_random_seed_len = 8;
8588
8589 if (version == 1)
8590 final_random_seed_len = 4;
8591
8592 snprintf (out_buf, len-1, "%s*%d*%d*%d",
8593 SIGNATURE_KEEPASS,
8594 version,
8595 rounds,
8596 algorithm);
8597
8598 char *ptr_data = out_buf;
8599
8600 ptr_data += strlen(out_buf);
8601
8602 *ptr_data = '*';
8603 ptr_data++;
8604
8605 for (uint i = 0; i < final_random_seed_len; i++, ptr_data += 8)
8606 sprintf (ptr_data, "%08x", ptr_final_random_seed[i]);
8607
8608 *ptr_data = '*';
8609 ptr_data++;
8610
8611 for (uint i = 0; i < transf_random_seed_len; i++, ptr_data += 8)
8612 sprintf (ptr_data, "%08x", ptr_transf_random_seed[i]);
8613
8614 *ptr_data = '*';
8615 ptr_data++;
8616
8617 for (uint i = 0; i < enc_iv_len; i++, ptr_data += 8)
8618 sprintf (ptr_data, "%08x", ptr_enc_iv[i]);
8619
8620 *ptr_data = '*';
8621 ptr_data++;
8622
8623 if (version == 1)
8624 {
8625 contents_len = (u32) keepass->contents_len;
8626 ptr_contents = (u32 *) keepass->contents;
8627
8628 for (uint i = 0; i < contents_hash_len; i++, ptr_data += 8)
8629 sprintf (ptr_data, "%08x", ptr_contents_hash[i]);
8630
8631 *ptr_data = '*';
8632 ptr_data++;
8633
8634 /* inline flag */
8635 *ptr_data = '1';
8636 ptr_data++;
8637
8638 *ptr_data = '*';
8639 ptr_data++;
8640
8641 char ptr_contents_len[10] = { 0 };
8642
8643 sprintf ((char*) ptr_contents_len, "%d", contents_len);
8644
8645 sprintf (ptr_data, "%d", contents_len);
8646
8647 ptr_data += strlen(ptr_contents_len);
8648
8649 *ptr_data = '*';
8650 ptr_data++;
8651
8652 for (uint i = 0; i < contents_len / 4; i++, ptr_data += 8)
8653 sprintf (ptr_data, "%08x", ptr_contents[i]);
8654 }
8655 else if (version == 2)
8656 {
8657 expected_bytes_len = 8;
8658 ptr_expected_bytes = (u32 *) keepass->expected_bytes ;
8659
8660 for (uint i = 0; i < expected_bytes_len; i++, ptr_data += 8)
8661 sprintf (ptr_data, "%08x", ptr_expected_bytes[i]);
8662
8663 *ptr_data = '*';
8664 ptr_data++;
8665
8666 for (uint i = 0; i < contents_hash_len; i++, ptr_data += 8)
8667 sprintf (ptr_data, "%08x", ptr_contents_hash[i]);
8668 }
8669 if (keyfile_len)
8670 {
8671 *ptr_data = '*';
8672 ptr_data++;
8673
8674 /* inline flag */
8675 *ptr_data = '1';
8676 ptr_data++;
8677
8678 *ptr_data = '*';
8679 ptr_data++;
8680
8681 sprintf (ptr_data, "%d", keyfile_len);
8682
8683 ptr_data += 2;
8684
8685 *ptr_data = '*';
8686 ptr_data++;
8687
8688 for (uint i = 0; i < 8; i++, ptr_data += 8)
8689 sprintf (ptr_data, "%08x", ptr_keyfile[i]);
8690 }
8691 }
8692 else if (hash_mode == 13500)
8693 {
8694 pstoken_t *pstokens = (pstoken_t *) data.esalts_buf;
8695
8696 pstoken_t *pstoken = &pstokens[salt_pos];
8697
8698 const u32 salt_len = (pstoken->salt_len > 512) ? 512 : pstoken->salt_len;
8699
8700 char pstoken_tmp[1024 + 1] = { 0 };
8701
8702 for (uint i = 0, j = 0; i < salt_len; i += 1, j += 2)
8703 {
8704 const u8 *ptr = (const u8 *) pstoken->salt_buf;
8705
8706 sprintf (pstoken_tmp + j, "%02x", ptr[i]);
8707 }
8708
8709 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x:%s",
8710 digest_buf[0],
8711 digest_buf[1],
8712 digest_buf[2],
8713 digest_buf[3],
8714 digest_buf[4],
8715 pstoken_tmp);
8716 }
8717 else if (hash_mode == 13600)
8718 {
8719 zip2_t *zip2s = (zip2_t *) data.esalts_buf;
8720
8721 zip2_t *zip2 = &zip2s[salt_pos];
8722
8723 const u32 salt_len = zip2->salt_len;
8724
8725 char salt_tmp[32 + 1] = { 0 };
8726
8727 for (uint i = 0, j = 0; i < salt_len; i += 1, j += 2)
8728 {
8729 const u8 *ptr = (const u8 *) zip2->salt_buf;
8730
8731 sprintf (salt_tmp + j, "%02x", ptr[i]);
8732 }
8733
8734 const u32 data_len = zip2->data_len;
8735
8736 char data_tmp[8192 + 1] = { 0 };
8737
8738 for (uint i = 0, j = 0; i < data_len; i += 1, j += 2)
8739 {
8740 const u8 *ptr = (const u8 *) zip2->data_buf;
8741
8742 sprintf (data_tmp + j, "%02x", ptr[i]);
8743 }
8744
8745 const u32 auth_len = zip2->auth_len;
8746
8747 char auth_tmp[20 + 1] = { 0 };
8748
8749 for (uint i = 0, j = 0; i < auth_len; i += 1, j += 2)
8750 {
8751 const u8 *ptr = (const u8 *) zip2->auth_buf;
8752
8753 sprintf (auth_tmp + j, "%02x", ptr[i]);
8754 }
8755
8756 snprintf (out_buf, 255, "%s*%u*%u*%u*%s*%x*%u*%s*%s*%s",
8757 SIGNATURE_ZIP2_START,
8758 zip2->type,
8759 zip2->mode,
8760 zip2->magic,
8761 salt_tmp,
8762 zip2->verify_bytes,
8763 zip2->compress_length,
8764 data_tmp,
8765 auth_tmp,
8766 SIGNATURE_ZIP2_STOP);
8767 }
8768 else if ((hash_mode >= 13700) && (hash_mode <= 13799))
8769 {
8770 snprintf (out_buf, len-1, "%s", hashfile);
8771 }
8772 else if (hash_mode == 13800)
8773 {
8774 win8phone_t *esalts = (win8phone_t *) data.esalts_buf;
8775
8776 win8phone_t *esalt = &esalts[salt_pos];
8777
8778 char buf[256 + 1] = { 0 };
8779
8780 for (int i = 0, j = 0; i < 32; i += 1, j += 8)
8781 {
8782 sprintf (buf + j, "%08x", esalt->salt_buf[i]);
8783 }
8784
8785 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x:%s",
8786 digest_buf[0],
8787 digest_buf[1],
8788 digest_buf[2],
8789 digest_buf[3],
8790 digest_buf[4],
8791 digest_buf[5],
8792 digest_buf[6],
8793 digest_buf[7],
8794 buf);
8795 }
8796 else
8797 {
8798 if (hash_type == HASH_TYPE_MD4)
8799 {
8800 snprintf (out_buf, 255, "%08x%08x%08x%08x",
8801 digest_buf[0],
8802 digest_buf[1],
8803 digest_buf[2],
8804 digest_buf[3]);
8805 }
8806 else if (hash_type == HASH_TYPE_MD5)
8807 {
8808 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
8809 digest_buf[0],
8810 digest_buf[1],
8811 digest_buf[2],
8812 digest_buf[3]);
8813 }
8814 else if (hash_type == HASH_TYPE_SHA1)
8815 {
8816 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
8817 digest_buf[0],
8818 digest_buf[1],
8819 digest_buf[2],
8820 digest_buf[3],
8821 digest_buf[4]);
8822 }
8823 else if (hash_type == HASH_TYPE_SHA256)
8824 {
8825 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8826 digest_buf[0],
8827 digest_buf[1],
8828 digest_buf[2],
8829 digest_buf[3],
8830 digest_buf[4],
8831 digest_buf[5],
8832 digest_buf[6],
8833 digest_buf[7]);
8834 }
8835 else if (hash_type == HASH_TYPE_SHA384)
8836 {
8837 uint *ptr = digest_buf;
8838
8839 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8840 ptr[ 1], ptr[ 0],
8841 ptr[ 3], ptr[ 2],
8842 ptr[ 5], ptr[ 4],
8843 ptr[ 7], ptr[ 6],
8844 ptr[ 9], ptr[ 8],
8845 ptr[11], ptr[10]);
8846 }
8847 else if (hash_type == HASH_TYPE_SHA512)
8848 {
8849 uint *ptr = digest_buf;
8850
8851 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8852 ptr[ 1], ptr[ 0],
8853 ptr[ 3], ptr[ 2],
8854 ptr[ 5], ptr[ 4],
8855 ptr[ 7], ptr[ 6],
8856 ptr[ 9], ptr[ 8],
8857 ptr[11], ptr[10],
8858 ptr[13], ptr[12],
8859 ptr[15], ptr[14]);
8860 }
8861 else if (hash_type == HASH_TYPE_LM)
8862 {
8863 snprintf (out_buf, len-1, "%08x%08x",
8864 digest_buf[0],
8865 digest_buf[1]);
8866 }
8867 else if (hash_type == HASH_TYPE_ORACLEH)
8868 {
8869 snprintf (out_buf, len-1, "%08X%08X",
8870 digest_buf[0],
8871 digest_buf[1]);
8872 }
8873 else if (hash_type == HASH_TYPE_BCRYPT)
8874 {
8875 base64_encode (int_to_bf64, (const u8 *) salt.salt_buf, 16, (u8 *) tmp_buf + 0);
8876 base64_encode (int_to_bf64, (const u8 *) digest_buf, 23, (u8 *) tmp_buf + 22);
8877
8878 tmp_buf[22 + 31] = 0; // base64_encode wants to pad
8879
8880 snprintf (out_buf, len-1, "%s$%s", (char *) salt.salt_sign, tmp_buf);
8881 }
8882 else if (hash_type == HASH_TYPE_KECCAK)
8883 {
8884 uint *ptr = digest_buf;
8885
8886 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",
8887 ptr[ 1], ptr[ 0],
8888 ptr[ 3], ptr[ 2],
8889 ptr[ 5], ptr[ 4],
8890 ptr[ 7], ptr[ 6],
8891 ptr[ 9], ptr[ 8],
8892 ptr[11], ptr[10],
8893 ptr[13], ptr[12],
8894 ptr[15], ptr[14],
8895 ptr[17], ptr[16],
8896 ptr[19], ptr[18],
8897 ptr[21], ptr[20],
8898 ptr[23], ptr[22],
8899 ptr[25], ptr[24],
8900 ptr[27], ptr[26],
8901 ptr[29], ptr[28],
8902 ptr[31], ptr[30],
8903 ptr[33], ptr[32],
8904 ptr[35], ptr[34],
8905 ptr[37], ptr[36],
8906 ptr[39], ptr[38],
8907 ptr[41], ptr[30],
8908 ptr[43], ptr[42],
8909 ptr[45], ptr[44],
8910 ptr[47], ptr[46],
8911 ptr[49], ptr[48]
8912 );
8913
8914 out_buf[salt.keccak_mdlen * 2] = 0;
8915 }
8916 else if (hash_type == HASH_TYPE_RIPEMD160)
8917 {
8918 snprintf (out_buf, 255, "%08x%08x%08x%08x%08x",
8919 digest_buf[0],
8920 digest_buf[1],
8921 digest_buf[2],
8922 digest_buf[3],
8923 digest_buf[4]);
8924 }
8925 else if (hash_type == HASH_TYPE_WHIRLPOOL)
8926 {
8927 digest_buf[ 0] = digest_buf[ 0];
8928 digest_buf[ 1] = digest_buf[ 1];
8929 digest_buf[ 2] = digest_buf[ 2];
8930 digest_buf[ 3] = digest_buf[ 3];
8931 digest_buf[ 4] = digest_buf[ 4];
8932 digest_buf[ 5] = digest_buf[ 5];
8933 digest_buf[ 6] = digest_buf[ 6];
8934 digest_buf[ 7] = digest_buf[ 7];
8935 digest_buf[ 8] = digest_buf[ 8];
8936 digest_buf[ 9] = digest_buf[ 9];
8937 digest_buf[10] = digest_buf[10];
8938 digest_buf[11] = digest_buf[11];
8939 digest_buf[12] = digest_buf[12];
8940 digest_buf[13] = digest_buf[13];
8941 digest_buf[14] = digest_buf[14];
8942 digest_buf[15] = digest_buf[15];
8943
8944 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8945 digest_buf[ 0],
8946 digest_buf[ 1],
8947 digest_buf[ 2],
8948 digest_buf[ 3],
8949 digest_buf[ 4],
8950 digest_buf[ 5],
8951 digest_buf[ 6],
8952 digest_buf[ 7],
8953 digest_buf[ 8],
8954 digest_buf[ 9],
8955 digest_buf[10],
8956 digest_buf[11],
8957 digest_buf[12],
8958 digest_buf[13],
8959 digest_buf[14],
8960 digest_buf[15]);
8961 }
8962 else if (hash_type == HASH_TYPE_GOST)
8963 {
8964 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8965 digest_buf[0],
8966 digest_buf[1],
8967 digest_buf[2],
8968 digest_buf[3],
8969 digest_buf[4],
8970 digest_buf[5],
8971 digest_buf[6],
8972 digest_buf[7]);
8973 }
8974 else if (hash_type == HASH_TYPE_MYSQL)
8975 {
8976 snprintf (out_buf, len-1, "%08x%08x",
8977 digest_buf[0],
8978 digest_buf[1]);
8979 }
8980 else if (hash_type == HASH_TYPE_LOTUS5)
8981 {
8982 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
8983 digest_buf[0],
8984 digest_buf[1],
8985 digest_buf[2],
8986 digest_buf[3]);
8987 }
8988 else if (hash_type == HASH_TYPE_LOTUS6)
8989 {
8990 digest_buf[ 0] = byte_swap_32 (digest_buf[ 0]);
8991 digest_buf[ 1] = byte_swap_32 (digest_buf[ 1]);
8992 digest_buf[ 2] = byte_swap_32 (digest_buf[ 2]);
8993 digest_buf[ 3] = byte_swap_32 (digest_buf[ 3]);
8994
8995 char buf[16] = { 0 };
8996
8997 memcpy (buf + 0, salt.salt_buf, 5);
8998 memcpy (buf + 5, digest_buf, 9);
8999
9000 buf[3] -= -4;
9001
9002 base64_encode (int_to_lotus64, (const u8 *) buf, 14, (u8 *) tmp_buf);
9003
9004 tmp_buf[18] = salt.salt_buf_pc[7];
9005 tmp_buf[19] = 0;
9006
9007 snprintf (out_buf, len-1, "(G%s)", tmp_buf);
9008 }
9009 else if (hash_type == HASH_TYPE_LOTUS8)
9010 {
9011 char buf[52] = { 0 };
9012
9013 // salt
9014
9015 memcpy (buf + 0, salt.salt_buf, 16);
9016
9017 buf[3] -= -4;
9018
9019 // iteration
9020
9021 snprintf (buf + 16, 11, "%010i", salt.salt_iter + 1);
9022
9023 // chars
9024
9025 buf[26] = salt.salt_buf_pc[0];
9026 buf[27] = salt.salt_buf_pc[1];
9027
9028 // digest
9029
9030 memcpy (buf + 28, digest_buf, 8);
9031
9032 base64_encode (int_to_lotus64, (const u8 *) buf, 36, (u8 *) tmp_buf);
9033
9034 tmp_buf[49] = 0;
9035
9036 snprintf (out_buf, len-1, "(H%s)", tmp_buf);
9037 }
9038 else if (hash_type == HASH_TYPE_CRC32)
9039 {
9040 snprintf (out_buf, len-1, "%08x", byte_swap_32 (digest_buf[0]));
9041 }
9042 }
9043
9044 if (salt_type == SALT_TYPE_INTERN)
9045 {
9046 size_t pos = strlen (out_buf);
9047
9048 out_buf[pos] = data.separator;
9049
9050 char *ptr = (char *) salt.salt_buf;
9051
9052 memcpy (out_buf + pos + 1, ptr, salt.salt_len);
9053
9054 out_buf[pos + 1 + salt.salt_len] = 0;
9055 }
9056 }
9057
9058 void to_hccap_t (hccap_t *hccap, uint salt_pos, uint digest_pos)
9059 {
9060 memset (hccap, 0, sizeof (hccap_t));
9061
9062 salt_t *salt = &data.salts_buf[salt_pos];
9063
9064 memcpy (hccap->essid, salt->salt_buf, salt->salt_len);
9065
9066 wpa_t *wpas = (wpa_t *) data.esalts_buf;
9067 wpa_t *wpa = &wpas[salt_pos];
9068
9069 hccap->keyver = wpa->keyver;
9070
9071 hccap->eapol_size = wpa->eapol_size;
9072
9073 if (wpa->keyver != 1)
9074 {
9075 uint eapol_tmp[64] = { 0 };
9076
9077 for (uint i = 0; i < 64; i++)
9078 {
9079 eapol_tmp[i] = byte_swap_32 (wpa->eapol[i]);
9080 }
9081
9082 memcpy (hccap->eapol, eapol_tmp, wpa->eapol_size);
9083 }
9084 else
9085 {
9086 memcpy (hccap->eapol, wpa->eapol, wpa->eapol_size);
9087 }
9088
9089 memcpy (hccap->mac1, wpa->orig_mac1, 6);
9090 memcpy (hccap->mac2, wpa->orig_mac2, 6);
9091 memcpy (hccap->nonce1, wpa->orig_nonce1, 32);
9092 memcpy (hccap->nonce2, wpa->orig_nonce2, 32);
9093
9094 char *digests_buf_ptr = (char *) data.digests_buf;
9095
9096 uint dgst_size = data.dgst_size;
9097
9098 uint *digest_ptr = (uint *) (digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size));
9099
9100 if (wpa->keyver != 1)
9101 {
9102 uint digest_tmp[4] = { 0 };
9103
9104 digest_tmp[0] = byte_swap_32 (digest_ptr[0]);
9105 digest_tmp[1] = byte_swap_32 (digest_ptr[1]);
9106 digest_tmp[2] = byte_swap_32 (digest_ptr[2]);
9107 digest_tmp[3] = byte_swap_32 (digest_ptr[3]);
9108
9109 memcpy (hccap->keymic, digest_tmp, 16);
9110 }
9111 else
9112 {
9113 memcpy (hccap->keymic, digest_ptr, 16);
9114 }
9115 }
9116
9117 void SuspendThreads ()
9118 {
9119 if (data.devices_status == STATUS_RUNNING)
9120 {
9121 hc_timer_set (&data.timer_paused);
9122
9123 data.devices_status = STATUS_PAUSED;
9124
9125 log_info ("Paused");
9126 }
9127 }
9128
9129 void ResumeThreads ()
9130 {
9131 if (data.devices_status == STATUS_PAUSED)
9132 {
9133 double ms_paused;
9134
9135 hc_timer_get (data.timer_paused, ms_paused);
9136
9137 data.ms_paused += ms_paused;
9138
9139 data.devices_status = STATUS_RUNNING;
9140
9141 log_info ("Resumed");
9142 }
9143 }
9144
9145 void bypass ()
9146 {
9147 if (data.devices_status != STATUS_RUNNING) return;
9148
9149 data.devices_status = STATUS_BYPASS;
9150
9151 log_info ("Next dictionary / mask in queue selected, bypassing current one");
9152 }
9153
9154 void stop_at_checkpoint ()
9155 {
9156 if (data.devices_status != STATUS_STOP_AT_CHECKPOINT)
9157 {
9158 if (data.devices_status != STATUS_RUNNING) return;
9159 }
9160
9161 // this feature only makes sense if --restore-disable was not specified
9162
9163 if (data.restore_disable == 1)
9164 {
9165 log_info ("WARNING: this feature is disabled when --restore-disable was specified");
9166
9167 return;
9168 }
9169
9170 // check if monitoring of Restore Point updates should be enabled or disabled
9171
9172 if (data.devices_status != STATUS_STOP_AT_CHECKPOINT)
9173 {
9174 data.devices_status = STATUS_STOP_AT_CHECKPOINT;
9175
9176 // save the current restore point value
9177
9178 data.checkpoint_cur_words = get_lowest_words_done ();
9179
9180 log_info ("Checkpoint enabled: will quit at next Restore Point update");
9181 }
9182 else
9183 {
9184 data.devices_status = STATUS_RUNNING;
9185
9186 // reset the global value for checkpoint checks
9187
9188 data.checkpoint_cur_words = 0;
9189
9190 log_info ("Checkpoint disabled: Restore Point updates will no longer be monitored");
9191 }
9192 }
9193
9194 void myabort ()
9195 {
9196 if (data.devices_status == STATUS_INIT) return;
9197 if (data.devices_status == STATUS_STARTING) return;
9198
9199 data.devices_status = STATUS_ABORTED;
9200 }
9201
9202 void myquit ()
9203 {
9204 if (data.devices_status == STATUS_INIT) return;
9205 if (data.devices_status == STATUS_STARTING) return;
9206
9207 data.devices_status = STATUS_QUIT;
9208 }
9209
9210 void load_kernel (const char *kernel_file, int num_devices, size_t *kernel_lengths, const u8 **kernel_sources)
9211 {
9212 FILE *fp = fopen (kernel_file, "rb");
9213
9214 if (fp != NULL)
9215 {
9216 struct stat st;
9217
9218 memset (&st, 0, sizeof (st));
9219
9220 stat (kernel_file, &st);
9221
9222 u8 *buf = (u8 *) mymalloc (st.st_size + 1);
9223
9224 size_t num_read = fread (buf, sizeof (u8), st.st_size, fp);
9225
9226 if (num_read != (size_t) st.st_size)
9227 {
9228 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
9229
9230 exit (-1);
9231 }
9232
9233 fclose (fp);
9234
9235 buf[st.st_size] = 0;
9236
9237 for (int i = 0; i < num_devices; i++)
9238 {
9239 kernel_lengths[i] = (size_t) st.st_size;
9240
9241 kernel_sources[i] = buf;
9242 }
9243 }
9244 else
9245 {
9246 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
9247
9248 exit (-1);
9249 }
9250
9251 return;
9252 }
9253
9254 void writeProgramBin (char *dst, u8 *binary, size_t binary_size)
9255 {
9256 if (binary_size > 0)
9257 {
9258 FILE *fp = fopen (dst, "wb");
9259
9260 lock_file (fp);
9261 fwrite (binary, sizeof (u8), binary_size, fp);
9262
9263 fflush (fp);
9264 fclose (fp);
9265 }
9266 }
9267
9268 /**
9269 * restore
9270 */
9271
9272 restore_data_t *init_restore (int argc, char **argv)
9273 {
9274 restore_data_t *rd = (restore_data_t *) mymalloc (sizeof (restore_data_t));
9275
9276 if (data.restore_disable == 0)
9277 {
9278 FILE *fp = fopen (data.eff_restore_file, "rb");
9279
9280 if (fp)
9281 {
9282 size_t nread = fread (rd, sizeof (restore_data_t), 1, fp);
9283
9284 if (nread != 1)
9285 {
9286 log_error ("ERROR: cannot read %s", data.eff_restore_file);
9287
9288 exit (-1);
9289 }
9290
9291 fclose (fp);
9292
9293 if (rd->pid)
9294 {
9295 char *pidbin = (char *) mymalloc (HCBUFSIZ);
9296
9297 int pidbin_len = -1;
9298
9299 #ifdef _POSIX
9300 snprintf (pidbin, HCBUFSIZ - 1, "/proc/%d/cmdline", rd->pid);
9301
9302 FILE *fd = fopen (pidbin, "rb");
9303
9304 if (fd)
9305 {
9306 pidbin_len = fread (pidbin, 1, HCBUFSIZ, fd);
9307
9308 pidbin[pidbin_len] = 0;
9309
9310 fclose (fd);
9311
9312 char *argv0_r = strrchr (argv[0], '/');
9313
9314 char *pidbin_r = strrchr (pidbin, '/');
9315
9316 if (argv0_r == NULL) argv0_r = argv[0];
9317
9318 if (pidbin_r == NULL) pidbin_r = pidbin;
9319
9320 if (strcmp (argv0_r, pidbin_r) == 0)
9321 {
9322 log_error ("ERROR: already an instance %s running on pid %d", pidbin, rd->pid);
9323
9324 exit (-1);
9325 }
9326 }
9327
9328 #elif _WIN
9329 HANDLE hProcess = OpenProcess (PROCESS_ALL_ACCESS, FALSE, rd->pid);
9330
9331 char *pidbin2 = (char *) mymalloc (HCBUFSIZ);
9332
9333 int pidbin2_len = -1;
9334
9335 pidbin_len = GetModuleFileName (NULL, pidbin, HCBUFSIZ);
9336 pidbin2_len = GetModuleFileNameEx (hProcess, NULL, pidbin2, HCBUFSIZ);
9337
9338 pidbin[pidbin_len] = 0;
9339 pidbin2[pidbin2_len] = 0;
9340
9341 if (pidbin2_len)
9342 {
9343 if (strcmp (pidbin, pidbin2) == 0)
9344 {
9345 log_error ("ERROR: already an instance %s running on pid %d", pidbin2, rd->pid);
9346
9347 exit (-1);
9348 }
9349 }
9350
9351 myfree (pidbin2);
9352
9353 #endif
9354
9355 myfree (pidbin);
9356 }
9357
9358 if (rd->version_bin < RESTORE_MIN)
9359 {
9360 log_error ("ERROR: cannot use outdated %s. Please remove it.", data.eff_restore_file);
9361
9362 exit (-1);
9363 }
9364 }
9365 }
9366
9367 memset (rd, 0, sizeof (restore_data_t));
9368
9369 rd->version_bin = VERSION_BIN;
9370
9371 #ifdef _POSIX
9372 rd->pid = getpid ();
9373 #elif _WIN
9374 rd->pid = GetCurrentProcessId ();
9375 #endif
9376
9377 if (getcwd (rd->cwd, 255) == NULL)
9378 {
9379 myfree (rd);
9380
9381 return (NULL);
9382 }
9383
9384 rd->argc = argc;
9385 rd->argv = argv;
9386
9387 return (rd);
9388 }
9389
9390 void read_restore (const char *eff_restore_file, restore_data_t *rd)
9391 {
9392 FILE *fp = fopen (eff_restore_file, "rb");
9393
9394 if (fp == NULL)
9395 {
9396 log_error ("ERROR: restore file '%s': %s", eff_restore_file, strerror (errno));
9397
9398 exit (-1);
9399 }
9400
9401 if (fread (rd, sizeof (restore_data_t), 1, fp) != 1)
9402 {
9403 log_error ("ERROR: cannot read %s", eff_restore_file);
9404
9405 exit (-1);
9406 }
9407
9408 rd->argv = (char **) mycalloc (rd->argc, sizeof (char *));
9409
9410 char *buf = (char *) mymalloc (HCBUFSIZ);
9411
9412 for (uint i = 0; i < rd->argc; i++)
9413 {
9414 if (fgets (buf, HCBUFSIZ - 1, fp) == NULL)
9415 {
9416 log_error ("ERROR: cannot read %s", eff_restore_file);
9417
9418 exit (-1);
9419 }
9420
9421 size_t len = strlen (buf);
9422
9423 if (len) buf[len - 1] = 0;
9424
9425 rd->argv[i] = mystrdup (buf);
9426 }
9427
9428 myfree (buf);
9429
9430 fclose (fp);
9431
9432 log_info ("INFO: Changing current working directory to the path found within the .restore file: '%s'", rd->cwd);
9433
9434 if (chdir (rd->cwd))
9435 {
9436 log_error ("ERROR: The directory '%s' does not exist. It is needed to restore (--restore) the session.\n"
9437 " You could either create this directory (or link it) or update the .restore file using e.g. the analyze_hc_restore.pl tool:\n"
9438 " https://github.com/philsmd/analyze_hc_restore\n"
9439 " The directory must be relative to (or contain) all files/folders mentioned within the command line.", rd->cwd);
9440
9441 exit (-1);
9442 }
9443 }
9444
9445 u64 get_lowest_words_done ()
9446 {
9447 u64 words_cur = -1;
9448
9449 for (uint device_id = 0; device_id < data.devices_cnt; device_id++)
9450 {
9451 hc_device_param_t *device_param = &data.devices_param[device_id];
9452
9453 if (device_param->skipped) continue;
9454
9455 const u64 words_done = device_param->words_done;
9456
9457 if (words_done < words_cur) words_cur = words_done;
9458 }
9459
9460 // It's possible that a device's workload isn't finished right after a restore-case.
9461 // In that case, this function would return 0 and overwrite the real restore point
9462 // There's also data.words_cur which is set to rd->words_cur but it changes while
9463 // the attack is running therefore we should stick to rd->words_cur.
9464 // Note that -s influences rd->words_cur we should keep a close look on that.
9465
9466 if (words_cur < data.rd->words_cur) words_cur = data.rd->words_cur;
9467
9468 return words_cur;
9469 }
9470
9471 void write_restore (const char *new_restore_file, restore_data_t *rd)
9472 {
9473 u64 words_cur = get_lowest_words_done ();
9474
9475 rd->words_cur = words_cur;
9476
9477 FILE *fp = fopen (new_restore_file, "wb");
9478
9479 if (fp == NULL)
9480 {
9481 log_error ("ERROR: %s: %s", new_restore_file, strerror (errno));
9482
9483 exit (-1);
9484 }
9485
9486 if (setvbuf (fp, NULL, _IONBF, 0))
9487 {
9488 log_error ("ERROR: setvbuf file '%s': %s", new_restore_file, strerror (errno));
9489
9490 exit (-1);
9491 }
9492
9493 fwrite (rd, sizeof (restore_data_t), 1, fp);
9494
9495 for (uint i = 0; i < rd->argc; i++)
9496 {
9497 fprintf (fp, "%s", rd->argv[i]);
9498 fputc ('\n', fp);
9499 }
9500
9501 fflush (fp);
9502
9503 fsync (fileno (fp));
9504
9505 fclose (fp);
9506 }
9507
9508 void cycle_restore ()
9509 {
9510 const char *eff_restore_file = data.eff_restore_file;
9511 const char *new_restore_file = data.new_restore_file;
9512
9513 restore_data_t *rd = data.rd;
9514
9515 write_restore (new_restore_file, rd);
9516
9517 struct stat st;
9518
9519 memset (&st, 0, sizeof(st));
9520
9521 if (stat (eff_restore_file, &st) == 0)
9522 {
9523 if (unlink (eff_restore_file))
9524 {
9525 log_info ("WARN: unlink file '%s': %s", eff_restore_file, strerror (errno));
9526 }
9527 }
9528
9529 if (rename (new_restore_file, eff_restore_file))
9530 {
9531 log_info ("WARN: rename file '%s' to '%s': %s", new_restore_file, eff_restore_file, strerror (errno));
9532 }
9533 }
9534
9535 void check_checkpoint ()
9536 {
9537 // if (data.restore_disable == 1) break; (this is already implied by previous checks)
9538
9539 u64 words_cur = get_lowest_words_done ();
9540
9541 if (words_cur != data.checkpoint_cur_words)
9542 {
9543 myabort ();
9544 }
9545 }
9546
9547 /**
9548 * tuning db
9549 */
9550
9551 void tuning_db_destroy (tuning_db_t *tuning_db)
9552 {
9553 int i;
9554
9555 for (i = 0; i < tuning_db->alias_cnt; i++)
9556 {
9557 tuning_db_alias_t *alias = &tuning_db->alias_buf[i];
9558
9559 myfree (alias->device_name);
9560 myfree (alias->alias_name);
9561 }
9562
9563 for (i = 0; i < tuning_db->entry_cnt; i++)
9564 {
9565 tuning_db_entry_t *entry = &tuning_db->entry_buf[i];
9566
9567 myfree (entry->device_name);
9568 }
9569
9570 myfree (tuning_db->alias_buf);
9571 myfree (tuning_db->entry_buf);
9572
9573 myfree (tuning_db);
9574 }
9575
9576 tuning_db_t *tuning_db_alloc (FILE *fp)
9577 {
9578 tuning_db_t *tuning_db = (tuning_db_t *) mymalloc (sizeof (tuning_db_t));
9579
9580 int num_lines = count_lines (fp);
9581
9582 // a bit over-allocated
9583
9584 tuning_db->alias_buf = (tuning_db_alias_t *) mycalloc (num_lines + 1, sizeof (tuning_db_alias_t));
9585 tuning_db->alias_cnt = 0;
9586
9587 tuning_db->entry_buf = (tuning_db_entry_t *) mycalloc (num_lines + 1, sizeof (tuning_db_entry_t));
9588 tuning_db->entry_cnt = 0;
9589
9590 return tuning_db;
9591 }
9592
9593 tuning_db_t *tuning_db_init (const char *tuning_db_file)
9594 {
9595 FILE *fp = fopen (tuning_db_file, "rb");
9596
9597 if (fp == NULL)
9598 {
9599 log_error ("%s: %s", tuning_db_file, strerror (errno));
9600
9601 exit (-1);
9602 }
9603
9604 tuning_db_t *tuning_db = tuning_db_alloc (fp);
9605
9606 rewind (fp);
9607
9608 int line_num = 0;
9609
9610 char *buf = (char *) mymalloc (HCBUFSIZ);
9611
9612 while (!feof (fp))
9613 {
9614 char *line_buf = fgets (buf, HCBUFSIZ - 1, fp);
9615
9616 if (line_buf == NULL) break;
9617
9618 line_num++;
9619
9620 const int line_len = in_superchop (line_buf);
9621
9622 if (line_len == 0) continue;
9623
9624 if (line_buf[0] == '#') continue;
9625
9626 // start processing
9627
9628 char *token_ptr[7] = { NULL };
9629
9630 int token_cnt = 0;
9631
9632 char *next = strtok (line_buf, "\t ");
9633
9634 token_ptr[token_cnt] = next;
9635
9636 token_cnt++;
9637
9638 while ((next = strtok (NULL, "\t ")) != NULL)
9639 {
9640 token_ptr[token_cnt] = next;
9641
9642 token_cnt++;
9643 }
9644
9645 if (token_cnt == 2)
9646 {
9647 char *device_name = token_ptr[0];
9648 char *alias_name = token_ptr[1];
9649
9650 tuning_db_alias_t *alias = &tuning_db->alias_buf[tuning_db->alias_cnt];
9651
9652 alias->device_name = mystrdup (device_name);
9653 alias->alias_name = mystrdup (alias_name);
9654
9655 tuning_db->alias_cnt++;
9656 }
9657 else if (token_cnt == 6)
9658 {
9659 if ((token_ptr[1][0] != '0') &&
9660 (token_ptr[1][0] != '1') &&
9661 (token_ptr[1][0] != '3') &&
9662 (token_ptr[1][0] != '*'))
9663 {
9664 log_info ("WARNING: Tuning-db: Invalid attack_mode '%c' in Line '%u'", token_ptr[1][0], line_num);
9665
9666 continue;
9667 }
9668
9669 if ((token_ptr[3][0] != '1') &&
9670 (token_ptr[3][0] != '2') &&
9671 (token_ptr[3][0] != '4') &&
9672 (token_ptr[3][0] != '8') &&
9673 (token_ptr[3][0] != 'N'))
9674 {
9675 log_info ("WARNING: Tuning-db: Invalid vector_width '%c' in Line '%u'", token_ptr[3][0], line_num);
9676
9677 continue;
9678 }
9679
9680 char *device_name = token_ptr[0];
9681
9682 int attack_mode = -1;
9683 int hash_type = -1;
9684 int vector_width = -1;
9685 int kernel_accel = -1;
9686 int kernel_loops = -1;
9687
9688 if (token_ptr[1][0] != '*') attack_mode = atoi (token_ptr[1]);
9689 if (token_ptr[2][0] != '*') hash_type = atoi (token_ptr[2]);
9690 if (token_ptr[3][0] != 'N') vector_width = atoi (token_ptr[3]);
9691
9692 if (token_ptr[4][0] != 'A')
9693 {
9694 kernel_accel = atoi (token_ptr[4]);
9695
9696 if ((kernel_accel < 1) || (kernel_accel > 1024))
9697 {
9698 log_info ("WARNING: Tuning-db: Invalid kernel_accel '%d' in Line '%u'", kernel_accel, line_num);
9699
9700 continue;
9701 }
9702 }
9703 else
9704 {
9705 kernel_accel = 0;
9706 }
9707
9708 if (token_ptr[5][0] != 'A')
9709 {
9710 kernel_loops = atoi (token_ptr[5]);
9711
9712 if ((kernel_loops < 1) || (kernel_loops > 1024))
9713 {
9714 log_info ("WARNING: Tuning-db: Invalid kernel_loops '%d' in Line '%u'", kernel_loops, line_num);
9715
9716 continue;
9717 }
9718 }
9719 else
9720 {
9721 kernel_loops = 0;
9722 }
9723
9724 tuning_db_entry_t *entry = &tuning_db->entry_buf[tuning_db->entry_cnt];
9725
9726 entry->device_name = mystrdup (device_name);
9727 entry->attack_mode = attack_mode;
9728 entry->hash_type = hash_type;
9729 entry->vector_width = vector_width;
9730 entry->kernel_accel = kernel_accel;
9731 entry->kernel_loops = kernel_loops;
9732
9733 tuning_db->entry_cnt++;
9734 }
9735 else
9736 {
9737 log_info ("WARNING: Tuning-db: Invalid number of token in Line '%u'", line_num);
9738
9739 continue;
9740 }
9741 }
9742
9743 myfree (buf);
9744
9745 fclose (fp);
9746
9747 // todo: print loaded 'cnt' message
9748
9749 // sort the database
9750
9751 qsort (tuning_db->alias_buf, tuning_db->alias_cnt, sizeof (tuning_db_alias_t), sort_by_tuning_db_alias);
9752 qsort (tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry);
9753
9754 return tuning_db;
9755 }
9756
9757 tuning_db_entry_t *tuning_db_search (tuning_db_t *tuning_db, hc_device_param_t *device_param, int attack_mode, int hash_type)
9758 {
9759 static tuning_db_entry_t s;
9760
9761 // first we need to convert all spaces in the device_name to underscore
9762
9763 char *device_name_nospace = strdup (device_param->device_name);
9764
9765 int device_name_length = strlen (device_name_nospace);
9766
9767 int i;
9768
9769 for (i = 0; i < device_name_length; i++)
9770 {
9771 if (device_name_nospace[i] == ' ') device_name_nospace[i] = '_';
9772 }
9773
9774 // find out if there's an alias configured
9775
9776 tuning_db_alias_t a;
9777
9778 a.device_name = device_name_nospace;
9779
9780 tuning_db_alias_t *alias = bsearch (&a, tuning_db->alias_buf, tuning_db->alias_cnt, sizeof (tuning_db_alias_t), sort_by_tuning_db_alias);
9781
9782 char *alias_name = (alias == NULL) ? NULL : alias->alias_name;
9783
9784 // attack-mode 6 and 7 are attack-mode 1 basically
9785
9786 if (attack_mode == 6) attack_mode = 1;
9787 if (attack_mode == 7) attack_mode = 1;
9788
9789 // bsearch is not ideal but fast enough
9790
9791 s.device_name = device_name_nospace;
9792 s.attack_mode = attack_mode;
9793 s.hash_type = hash_type;
9794
9795 tuning_db_entry_t *entry = NULL;
9796
9797 // this will produce all 2^3 combinations required
9798
9799 for (i = 0; i < 8; i++)
9800 {
9801 s.device_name = (i & 1) ? "*" : device_name_nospace;
9802 s.attack_mode = (i & 2) ? -1 : attack_mode;
9803 s.hash_type = (i & 4) ? -1 : hash_type;
9804
9805 entry = bsearch (&s, tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry);
9806
9807 if (entry != NULL) break;
9808
9809 // in non-wildcard mode do some additional checks:
9810
9811 if ((i & 1) == 0)
9812 {
9813 // in case we have an alias-name
9814
9815 if (alias_name != NULL)
9816 {
9817 s.device_name = alias_name;
9818
9819 entry = bsearch (&s, tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry);
9820
9821 if (entry != NULL) break;
9822 }
9823
9824 // or by device type
9825
9826 if (device_param->device_type & CL_DEVICE_TYPE_CPU)
9827 {
9828 s.device_name = "DEVICE_TYPE_CPU";
9829 }
9830 else if (device_param->device_type & CL_DEVICE_TYPE_GPU)
9831 {
9832 s.device_name = "DEVICE_TYPE_GPU";
9833 }
9834 else if (device_param->device_type & CL_DEVICE_TYPE_ACCELERATOR)
9835 {
9836 s.device_name = "DEVICE_TYPE_ACCELERATOR";
9837 }
9838
9839 entry = bsearch (&s, tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry);
9840
9841 if (entry != NULL) break;
9842 }
9843 }
9844
9845 // free converted device_name
9846
9847 myfree (device_name_nospace);
9848
9849 return entry;
9850 }
9851
9852 /**
9853 * parser
9854 */
9855
9856 uint parse_and_store_salt (char *out, char *in, uint salt_len)
9857 {
9858 u8 tmp[256] = { 0 };
9859
9860 if (salt_len > sizeof (tmp))
9861 {
9862 return UINT_MAX;
9863 }
9864
9865 memcpy (tmp, in, salt_len);
9866
9867 if (data.opts_type & OPTS_TYPE_ST_HEX)
9868 {
9869 if ((salt_len % 2) == 0)
9870 {
9871 u32 new_salt_len = salt_len / 2;
9872
9873 for (uint i = 0, j = 0; i < new_salt_len; i += 1, j += 2)
9874 {
9875 u8 p0 = tmp[j + 0];
9876 u8 p1 = tmp[j + 1];
9877
9878 tmp[i] = hex_convert (p1) << 0;
9879 tmp[i] |= hex_convert (p0) << 4;
9880 }
9881
9882 salt_len = new_salt_len;
9883 }
9884 else
9885 {
9886 return UINT_MAX;
9887 }
9888 }
9889 else if (data.opts_type & OPTS_TYPE_ST_BASE64)
9890 {
9891 salt_len = base64_decode (base64_to_int, (const u8 *) in, salt_len, (u8 *) tmp);
9892 }
9893
9894 memset (tmp + salt_len, 0, sizeof (tmp) - salt_len);
9895
9896 if (data.opts_type & OPTS_TYPE_ST_UNICODE)
9897 {
9898 if (salt_len < 20)
9899 {
9900 u32 *tmp_uint = (u32 *) tmp;
9901
9902 tmp_uint[9] = ((tmp_uint[4] >> 8) & 0x00FF0000) | ((tmp_uint[4] >> 16) & 0x000000FF);
9903 tmp_uint[8] = ((tmp_uint[4] << 8) & 0x00FF0000) | ((tmp_uint[4] >> 0) & 0x000000FF);
9904 tmp_uint[7] = ((tmp_uint[3] >> 8) & 0x00FF0000) | ((tmp_uint[3] >> 16) & 0x000000FF);
9905 tmp_uint[6] = ((tmp_uint[3] << 8) & 0x00FF0000) | ((tmp_uint[3] >> 0) & 0x000000FF);
9906 tmp_uint[5] = ((tmp_uint[2] >> 8) & 0x00FF0000) | ((tmp_uint[2] >> 16) & 0x000000FF);
9907 tmp_uint[4] = ((tmp_uint[2] << 8) & 0x00FF0000) | ((tmp_uint[2] >> 0) & 0x000000FF);
9908 tmp_uint[3] = ((tmp_uint[1] >> 8) & 0x00FF0000) | ((tmp_uint[1] >> 16) & 0x000000FF);
9909 tmp_uint[2] = ((tmp_uint[1] << 8) & 0x00FF0000) | ((tmp_uint[1] >> 0) & 0x000000FF);
9910 tmp_uint[1] = ((tmp_uint[0] >> 8) & 0x00FF0000) | ((tmp_uint[0] >> 16) & 0x000000FF);
9911 tmp_uint[0] = ((tmp_uint[0] << 8) & 0x00FF0000) | ((tmp_uint[0] >> 0) & 0x000000FF);
9912
9913 salt_len = salt_len * 2;
9914 }
9915 else
9916 {
9917 return UINT_MAX;
9918 }
9919 }
9920
9921 if (data.opts_type & OPTS_TYPE_ST_LOWER)
9922 {
9923 lowercase (tmp, salt_len);
9924 }
9925
9926 if (data.opts_type & OPTS_TYPE_ST_UPPER)
9927 {
9928 uppercase (tmp, salt_len);
9929 }
9930
9931 u32 len = salt_len;
9932
9933 if (data.opts_type & OPTS_TYPE_ST_ADD80)
9934 {
9935 tmp[len++] = 0x80;
9936 }
9937
9938 if (data.opts_type & OPTS_TYPE_ST_ADD01)
9939 {
9940 tmp[len++] = 0x01;
9941 }
9942
9943 if (data.opts_type & OPTS_TYPE_ST_GENERATE_LE)
9944 {
9945 u32 *tmp_uint = (uint *) tmp;
9946
9947 u32 max = len / 4;
9948
9949 if (len % 4) max++;
9950
9951 for (u32 i = 0; i < max; i++)
9952 {
9953 tmp_uint[i] = byte_swap_32 (tmp_uint[i]);
9954 }
9955
9956 // Important: we may need to increase the length of memcpy since
9957 // we don't want to "loose" some swapped bytes (could happen if
9958 // they do not perfectly fit in the 4-byte blocks)
9959 // Memcpy does always copy the bytes in the BE order, but since
9960 // we swapped them, some important bytes could be in positions
9961 // we normally skip with the original len
9962
9963 if (len % 4) len += 4 - (len % 4);
9964 }
9965
9966 memcpy (out, tmp, len);
9967
9968 return (salt_len);
9969 }
9970
9971 int bcrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9972 {
9973 if ((input_len < DISPLAY_LEN_MIN_3200) || (input_len > DISPLAY_LEN_MAX_3200)) return (PARSER_GLOBAL_LENGTH);
9974
9975 if ((memcmp (SIGNATURE_BCRYPT1, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT2, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT3, input_buf, 4))) return (PARSER_SIGNATURE_UNMATCHED);
9976
9977 u32 *digest = (u32 *) hash_buf->digest;
9978
9979 salt_t *salt = hash_buf->salt;
9980
9981 memcpy ((char *) salt->salt_sign, input_buf, 6);
9982
9983 char *iter_pos = input_buf + 4;
9984
9985 salt->salt_iter = 1 << atoi (iter_pos);
9986
9987 char *salt_pos = strchr (iter_pos, '$');
9988
9989 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9990
9991 salt_pos++;
9992
9993 uint salt_len = 16;
9994
9995 salt->salt_len = salt_len;
9996
9997 u8 tmp_buf[100] = { 0 };
9998
9999 base64_decode (bf64_to_int, (const u8 *) salt_pos, 22, tmp_buf);
10000
10001 char *salt_buf_ptr = (char *) salt->salt_buf;
10002
10003 memcpy (salt_buf_ptr, tmp_buf, 16);
10004
10005 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
10006 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
10007 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
10008 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
10009
10010 char *hash_pos = salt_pos + 22;
10011
10012 memset (tmp_buf, 0, sizeof (tmp_buf));
10013
10014 base64_decode (bf64_to_int, (const u8 *) hash_pos, 31, tmp_buf);
10015
10016 memcpy (digest, tmp_buf, 24);
10017
10018 digest[0] = byte_swap_32 (digest[0]);
10019 digest[1] = byte_swap_32 (digest[1]);
10020 digest[2] = byte_swap_32 (digest[2]);
10021 digest[3] = byte_swap_32 (digest[3]);
10022 digest[4] = byte_swap_32 (digest[4]);
10023 digest[5] = byte_swap_32 (digest[5]);
10024
10025 digest[5] &= ~0xff; // its just 23 not 24 !
10026
10027 return (PARSER_OK);
10028 }
10029
10030 int cisco4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10031 {
10032 if ((input_len < DISPLAY_LEN_MIN_5700) || (input_len > DISPLAY_LEN_MAX_5700)) return (PARSER_GLOBAL_LENGTH);
10033
10034 u32 *digest = (u32 *) hash_buf->digest;
10035
10036 u8 tmp_buf[100] = { 0 };
10037
10038 base64_decode (itoa64_to_int, (const u8 *) input_buf, 43, tmp_buf);
10039
10040 memcpy (digest, tmp_buf, 32);
10041
10042 digest[0] = byte_swap_32 (digest[0]);
10043 digest[1] = byte_swap_32 (digest[1]);
10044 digest[2] = byte_swap_32 (digest[2]);
10045 digest[3] = byte_swap_32 (digest[3]);
10046 digest[4] = byte_swap_32 (digest[4]);
10047 digest[5] = byte_swap_32 (digest[5]);
10048 digest[6] = byte_swap_32 (digest[6]);
10049 digest[7] = byte_swap_32 (digest[7]);
10050
10051 digest[0] -= SHA256M_A;
10052 digest[1] -= SHA256M_B;
10053 digest[2] -= SHA256M_C;
10054 digest[3] -= SHA256M_D;
10055 digest[4] -= SHA256M_E;
10056 digest[5] -= SHA256M_F;
10057 digest[6] -= SHA256M_G;
10058 digest[7] -= SHA256M_H;
10059
10060 return (PARSER_OK);
10061 }
10062
10063 int lm_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10064 {
10065 if ((input_len < DISPLAY_LEN_MIN_3000) || (input_len > DISPLAY_LEN_MAX_3000)) return (PARSER_GLOBAL_LENGTH);
10066
10067 u32 *digest = (u32 *) hash_buf->digest;
10068
10069 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10070 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10071
10072 digest[0] = byte_swap_32 (digest[0]);
10073 digest[1] = byte_swap_32 (digest[1]);
10074
10075 uint tt;
10076
10077 IP (digest[0], digest[1], tt);
10078
10079 digest[0] = digest[0];
10080 digest[1] = digest[1];
10081 digest[2] = 0;
10082 digest[3] = 0;
10083
10084 return (PARSER_OK);
10085 }
10086
10087 int arubaos_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10088 {
10089 if ((input_len < DISPLAY_LEN_MIN_125) || (input_len > DISPLAY_LEN_MAX_125)) return (PARSER_GLOBAL_LENGTH);
10090
10091 if ((input_buf[8] != '0') || (input_buf[9] != '1')) return (PARSER_SIGNATURE_UNMATCHED);
10092
10093 u32 *digest = (u32 *) hash_buf->digest;
10094
10095 salt_t *salt = hash_buf->salt;
10096
10097 char *hash_pos = input_buf + 10;
10098
10099 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
10100 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
10101 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
10102 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
10103 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
10104
10105 digest[0] -= SHA1M_A;
10106 digest[1] -= SHA1M_B;
10107 digest[2] -= SHA1M_C;
10108 digest[3] -= SHA1M_D;
10109 digest[4] -= SHA1M_E;
10110
10111 uint salt_len = 10;
10112
10113 char *salt_buf_ptr = (char *) salt->salt_buf;
10114
10115 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
10116
10117 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10118
10119 salt->salt_len = salt_len;
10120
10121 return (PARSER_OK);
10122 }
10123
10124 int osx1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10125 {
10126 if ((input_len < DISPLAY_LEN_MIN_122) || (input_len > DISPLAY_LEN_MAX_122)) return (PARSER_GLOBAL_LENGTH);
10127
10128 u32 *digest = (u32 *) hash_buf->digest;
10129
10130 salt_t *salt = hash_buf->salt;
10131
10132 char *hash_pos = input_buf + 8;
10133
10134 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
10135 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
10136 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
10137 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
10138 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
10139
10140 digest[0] -= SHA1M_A;
10141 digest[1] -= SHA1M_B;
10142 digest[2] -= SHA1M_C;
10143 digest[3] -= SHA1M_D;
10144 digest[4] -= SHA1M_E;
10145
10146 uint salt_len = 8;
10147
10148 char *salt_buf_ptr = (char *) salt->salt_buf;
10149
10150 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
10151
10152 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10153
10154 salt->salt_len = salt_len;
10155
10156 return (PARSER_OK);
10157 }
10158
10159 int osx512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10160 {
10161 if ((input_len < DISPLAY_LEN_MIN_1722) || (input_len > DISPLAY_LEN_MAX_1722)) return (PARSER_GLOBAL_LENGTH);
10162
10163 u64 *digest = (u64 *) hash_buf->digest;
10164
10165 salt_t *salt = hash_buf->salt;
10166
10167 char *hash_pos = input_buf + 8;
10168
10169 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
10170 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
10171 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
10172 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
10173 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
10174 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
10175 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
10176 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
10177
10178 digest[0] -= SHA512M_A;
10179 digest[1] -= SHA512M_B;
10180 digest[2] -= SHA512M_C;
10181 digest[3] -= SHA512M_D;
10182 digest[4] -= SHA512M_E;
10183 digest[5] -= SHA512M_F;
10184 digest[6] -= SHA512M_G;
10185 digest[7] -= SHA512M_H;
10186
10187 uint salt_len = 8;
10188
10189 char *salt_buf_ptr = (char *) salt->salt_buf;
10190
10191 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
10192
10193 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10194
10195 salt->salt_len = salt_len;
10196
10197 return (PARSER_OK);
10198 }
10199
10200 int osc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10201 {
10202 if (data.opts_type & OPTS_TYPE_ST_HEX)
10203 {
10204 if ((input_len < DISPLAY_LEN_MIN_21H) || (input_len > DISPLAY_LEN_MAX_21H)) return (PARSER_GLOBAL_LENGTH);
10205 }
10206 else
10207 {
10208 if ((input_len < DISPLAY_LEN_MIN_21) || (input_len > DISPLAY_LEN_MAX_21)) return (PARSER_GLOBAL_LENGTH);
10209 }
10210
10211 u32 *digest = (u32 *) hash_buf->digest;
10212
10213 salt_t *salt = hash_buf->salt;
10214
10215 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10216 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10217 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10218 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10219
10220 digest[0] = byte_swap_32 (digest[0]);
10221 digest[1] = byte_swap_32 (digest[1]);
10222 digest[2] = byte_swap_32 (digest[2]);
10223 digest[3] = byte_swap_32 (digest[3]);
10224
10225 digest[0] -= MD5M_A;
10226 digest[1] -= MD5M_B;
10227 digest[2] -= MD5M_C;
10228 digest[3] -= MD5M_D;
10229
10230 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10231
10232 uint salt_len = input_len - 32 - 1;
10233
10234 char *salt_buf = input_buf + 32 + 1;
10235
10236 char *salt_buf_ptr = (char *) salt->salt_buf;
10237
10238 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10239
10240 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10241
10242 salt->salt_len = salt_len;
10243
10244 return (PARSER_OK);
10245 }
10246
10247 int netscreen_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10248 {
10249 if (data.opts_type & OPTS_TYPE_ST_HEX)
10250 {
10251 if ((input_len < DISPLAY_LEN_MIN_22H) || (input_len > DISPLAY_LEN_MAX_22H)) return (PARSER_GLOBAL_LENGTH);
10252 }
10253 else
10254 {
10255 if ((input_len < DISPLAY_LEN_MIN_22) || (input_len > DISPLAY_LEN_MAX_22)) return (PARSER_GLOBAL_LENGTH);
10256 }
10257
10258 // unscramble
10259
10260 char clean_input_buf[32] = { 0 };
10261
10262 char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' };
10263 int pos[6] = { 0, 6, 12, 17, 23, 29 };
10264
10265 for (int i = 0, j = 0, k = 0; i < 30; i++)
10266 {
10267 if (i == pos[j])
10268 {
10269 if (sig[j] != input_buf[i]) return (PARSER_SIGNATURE_UNMATCHED);
10270
10271 j++;
10272 }
10273 else
10274 {
10275 clean_input_buf[k] = input_buf[i];
10276
10277 k++;
10278 }
10279 }
10280
10281 // base64 decode
10282
10283 u32 *digest = (u32 *) hash_buf->digest;
10284
10285 salt_t *salt = hash_buf->salt;
10286
10287 u32 a, b, c, d, e, f;
10288
10289 a = base64_to_int (clean_input_buf[ 0] & 0x7f);
10290 b = base64_to_int (clean_input_buf[ 1] & 0x7f);
10291 c = base64_to_int (clean_input_buf[ 2] & 0x7f);
10292 d = base64_to_int (clean_input_buf[ 3] & 0x7f);
10293 e = base64_to_int (clean_input_buf[ 4] & 0x7f);
10294 f = base64_to_int (clean_input_buf[ 5] & 0x7f);
10295
10296 digest[0] = (((a << 12) | (b << 6) | (c)) << 16)
10297 | (((d << 12) | (e << 6) | (f)) << 0);
10298
10299 a = base64_to_int (clean_input_buf[ 6] & 0x7f);
10300 b = base64_to_int (clean_input_buf[ 7] & 0x7f);
10301 c = base64_to_int (clean_input_buf[ 8] & 0x7f);
10302 d = base64_to_int (clean_input_buf[ 9] & 0x7f);
10303 e = base64_to_int (clean_input_buf[10] & 0x7f);
10304 f = base64_to_int (clean_input_buf[11] & 0x7f);
10305
10306 digest[1] = (((a << 12) | (b << 6) | (c)) << 16)
10307 | (((d << 12) | (e << 6) | (f)) << 0);
10308
10309 a = base64_to_int (clean_input_buf[12] & 0x7f);
10310 b = base64_to_int (clean_input_buf[13] & 0x7f);
10311 c = base64_to_int (clean_input_buf[14] & 0x7f);
10312 d = base64_to_int (clean_input_buf[15] & 0x7f);
10313 e = base64_to_int (clean_input_buf[16] & 0x7f);
10314 f = base64_to_int (clean_input_buf[17] & 0x7f);
10315
10316 digest[2] = (((a << 12) | (b << 6) | (c)) << 16)
10317 | (((d << 12) | (e << 6) | (f)) << 0);
10318
10319 a = base64_to_int (clean_input_buf[18] & 0x7f);
10320 b = base64_to_int (clean_input_buf[19] & 0x7f);
10321 c = base64_to_int (clean_input_buf[20] & 0x7f);
10322 d = base64_to_int (clean_input_buf[21] & 0x7f);
10323 e = base64_to_int (clean_input_buf[22] & 0x7f);
10324 f = base64_to_int (clean_input_buf[23] & 0x7f);
10325
10326 digest[3] = (((a << 12) | (b << 6) | (c)) << 16)
10327 | (((d << 12) | (e << 6) | (f)) << 0);
10328
10329 digest[0] = byte_swap_32 (digest[0]);
10330 digest[1] = byte_swap_32 (digest[1]);
10331 digest[2] = byte_swap_32 (digest[2]);
10332 digest[3] = byte_swap_32 (digest[3]);
10333
10334 digest[0] -= MD5M_A;
10335 digest[1] -= MD5M_B;
10336 digest[2] -= MD5M_C;
10337 digest[3] -= MD5M_D;
10338
10339 if (input_buf[30] != ':') return (PARSER_SEPARATOR_UNMATCHED);
10340
10341 uint salt_len = input_len - 30 - 1;
10342
10343 char *salt_buf = input_buf + 30 + 1;
10344
10345 char *salt_buf_ptr = (char *) salt->salt_buf;
10346
10347 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10348
10349 // max. salt length: 55 (max for MD5) - 22 (":Administration Tools:") - 1 (0x80) = 32
10350 // 32 - 4 bytes (to fit w0lr for all attack modes) = 28
10351
10352 if (salt_len > 28) return (PARSER_SALT_LENGTH);
10353
10354 salt->salt_len = salt_len;
10355
10356 memcpy (salt_buf_ptr + salt_len, ":Administration Tools:", 22);
10357
10358 salt->salt_len += 22;
10359
10360 return (PARSER_OK);
10361 }
10362
10363 int smf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10364 {
10365 if (data.opts_type & OPTS_TYPE_ST_HEX)
10366 {
10367 if ((input_len < DISPLAY_LEN_MIN_121H) || (input_len > DISPLAY_LEN_MAX_121H)) return (PARSER_GLOBAL_LENGTH);
10368 }
10369 else
10370 {
10371 if ((input_len < DISPLAY_LEN_MIN_121) || (input_len > DISPLAY_LEN_MAX_121)) return (PARSER_GLOBAL_LENGTH);
10372 }
10373
10374 u32 *digest = (u32 *) hash_buf->digest;
10375
10376 salt_t *salt = hash_buf->salt;
10377
10378 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10379 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10380 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10381 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10382 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
10383
10384 digest[0] -= SHA1M_A;
10385 digest[1] -= SHA1M_B;
10386 digest[2] -= SHA1M_C;
10387 digest[3] -= SHA1M_D;
10388 digest[4] -= SHA1M_E;
10389
10390 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10391
10392 uint salt_len = input_len - 40 - 1;
10393
10394 char *salt_buf = input_buf + 40 + 1;
10395
10396 char *salt_buf_ptr = (char *) salt->salt_buf;
10397
10398 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10399
10400 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10401
10402 salt->salt_len = salt_len;
10403
10404 return (PARSER_OK);
10405 }
10406
10407 int dcc2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10408 {
10409 if (data.opts_type & OPTS_TYPE_ST_HEX)
10410 {
10411 if ((input_len < DISPLAY_LEN_MIN_2100H) || (input_len > DISPLAY_LEN_MAX_2100H)) return (PARSER_GLOBAL_LENGTH);
10412 }
10413 else
10414 {
10415 if ((input_len < DISPLAY_LEN_MIN_2100) || (input_len > DISPLAY_LEN_MAX_2100)) return (PARSER_GLOBAL_LENGTH);
10416 }
10417
10418 if (memcmp (SIGNATURE_DCC2, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
10419
10420 char *iter_pos = input_buf + 6;
10421
10422 salt_t *salt = hash_buf->salt;
10423
10424 uint iter = atoi (iter_pos);
10425
10426 if (iter < 1)
10427 {
10428 iter = ROUNDS_DCC2;
10429 }
10430
10431 salt->salt_iter = iter - 1;
10432
10433 char *salt_pos = strchr (iter_pos, '#');
10434
10435 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10436
10437 salt_pos++;
10438
10439 char *digest_pos = strchr (salt_pos, '#');
10440
10441 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10442
10443 digest_pos++;
10444
10445 uint salt_len = digest_pos - salt_pos - 1;
10446
10447 u32 *digest = (u32 *) hash_buf->digest;
10448
10449 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
10450 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
10451 digest[2] = hex_to_u32 ((const u8 *) &digest_pos[16]);
10452 digest[3] = hex_to_u32 ((const u8 *) &digest_pos[24]);
10453
10454 char *salt_buf_ptr = (char *) salt->salt_buf;
10455
10456 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
10457
10458 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10459
10460 salt->salt_len = salt_len;
10461
10462 return (PARSER_OK);
10463 }
10464
10465 int wpa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10466 {
10467 u32 *digest = (u32 *) hash_buf->digest;
10468
10469 salt_t *salt = hash_buf->salt;
10470
10471 wpa_t *wpa = (wpa_t *) hash_buf->esalt;
10472
10473 hccap_t in;
10474
10475 memcpy (&in, input_buf, input_len);
10476
10477 if (in.eapol_size < 1 || in.eapol_size > 255) return (PARSER_HCCAP_EAPOL_SIZE);
10478
10479 memcpy (digest, in.keymic, 16);
10480
10481 /*
10482 http://www.one-net.eu/jsw/j_sec/m_ptype.html
10483 The phrase "Pairwise key expansion"
10484 Access Point Address (referred to as Authenticator Address AA)
10485 Supplicant Address (referred to as Supplicant Address SA)
10486 Access Point Nonce (referred to as Authenticator Anonce)
10487 Wireless Device Nonce (referred to as Supplicant Nonce Snonce)
10488 */
10489
10490 uint salt_len = strlen (in.essid);
10491
10492 if (salt_len > 36)
10493 {
10494 log_info ("WARNING: the length of the ESSID is too long. The hccap file may be invalid or corrupted");
10495
10496 return (PARSER_SALT_LENGTH);
10497 }
10498
10499 memcpy (salt->salt_buf, in.essid, salt_len);
10500
10501 salt->salt_len = salt_len;
10502
10503 salt->salt_iter = ROUNDS_WPA2 - 1;
10504
10505 unsigned char *pke_ptr = (unsigned char *) wpa->pke;
10506
10507 memcpy (pke_ptr, "Pairwise key expansion", 23);
10508
10509 if (memcmp (in.mac1, in.mac2, 6) < 0)
10510 {
10511 memcpy (pke_ptr + 23, in.mac1, 6);
10512 memcpy (pke_ptr + 29, in.mac2, 6);
10513 }
10514 else
10515 {
10516 memcpy (pke_ptr + 23, in.mac2, 6);
10517 memcpy (pke_ptr + 29, in.mac1, 6);
10518 }
10519
10520 if (memcmp (in.nonce1, in.nonce2, 32) < 0)
10521 {
10522 memcpy (pke_ptr + 35, in.nonce1, 32);
10523 memcpy (pke_ptr + 67, in.nonce2, 32);
10524 }
10525 else
10526 {
10527 memcpy (pke_ptr + 35, in.nonce2, 32);
10528 memcpy (pke_ptr + 67, in.nonce1, 32);
10529 }
10530
10531 for (int i = 0; i < 25; i++)
10532 {
10533 wpa->pke[i] = byte_swap_32 (wpa->pke[i]);
10534 }
10535
10536 memcpy (wpa->orig_mac1, in.mac1, 6);
10537 memcpy (wpa->orig_mac2, in.mac2, 6);
10538 memcpy (wpa->orig_nonce1, in.nonce1, 32);
10539 memcpy (wpa->orig_nonce2, in.nonce2, 32);
10540
10541 wpa->keyver = in.keyver;
10542
10543 if (wpa->keyver > 255)
10544 {
10545 log_info ("ATTENTION!");
10546 log_info (" The WPA/WPA2 key version in your .hccap file is invalid!");
10547 log_info (" This could be due to a recent aircrack-ng bug.");
10548 log_info (" The key version was automatically reset to a reasonable value.");
10549 log_info ("");
10550
10551 wpa->keyver &= 0xff;
10552 }
10553
10554 wpa->eapol_size = in.eapol_size;
10555
10556 unsigned char *eapol_ptr = (unsigned char *) wpa->eapol;
10557
10558 memcpy (eapol_ptr, in.eapol, wpa->eapol_size);
10559
10560 memset (eapol_ptr + wpa->eapol_size, 0, 256 - wpa->eapol_size);
10561
10562 eapol_ptr[wpa->eapol_size] = (unsigned char) 0x80;
10563
10564 if (wpa->keyver == 1)
10565 {
10566 // nothing to do
10567 }
10568 else
10569 {
10570 digest[0] = byte_swap_32 (digest[0]);
10571 digest[1] = byte_swap_32 (digest[1]);
10572 digest[2] = byte_swap_32 (digest[2]);
10573 digest[3] = byte_swap_32 (digest[3]);
10574
10575 for (int i = 0; i < 64; i++)
10576 {
10577 wpa->eapol[i] = byte_swap_32 (wpa->eapol[i]);
10578 }
10579 }
10580
10581 uint32_t *p0 = (uint32_t *) in.essid;
10582 uint32_t c0 = 0;
10583 uint32_t c1 = 0;
10584
10585 for (uint i = 0; i < sizeof (in.essid) / sizeof (uint32_t); i++) c0 ^= *p0++;
10586 for (uint i = 0; i < sizeof (wpa->pke) / sizeof (wpa->pke[0]); i++) c1 ^= wpa->pke[i];
10587
10588 salt->salt_buf[10] = c0;
10589 salt->salt_buf[11] = c1;
10590
10591 return (PARSER_OK);
10592 }
10593
10594 int psafe2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10595 {
10596 u32 *digest = (u32 *) hash_buf->digest;
10597
10598 salt_t *salt = hash_buf->salt;
10599
10600 if (input_len == 0)
10601 {
10602 log_error ("Password Safe v2 container not specified");
10603
10604 exit (-1);
10605 }
10606
10607 FILE *fp = fopen (input_buf, "rb");
10608
10609 if (fp == NULL)
10610 {
10611 log_error ("%s: %s", input_buf, strerror (errno));
10612
10613 exit (-1);
10614 }
10615
10616 psafe2_hdr buf;
10617
10618 memset (&buf, 0, sizeof (psafe2_hdr));
10619
10620 int n = fread (&buf, sizeof (psafe2_hdr), 1, fp);
10621
10622 fclose (fp);
10623
10624 if (n != 1) return (PARSER_PSAFE2_FILE_SIZE);
10625
10626 salt->salt_buf[0] = buf.random[0];
10627 salt->salt_buf[1] = buf.random[1];
10628
10629 salt->salt_len = 8;
10630 salt->salt_iter = 1000;
10631
10632 digest[0] = byte_swap_32 (buf.hash[0]);
10633 digest[1] = byte_swap_32 (buf.hash[1]);
10634 digest[2] = byte_swap_32 (buf.hash[2]);
10635 digest[3] = byte_swap_32 (buf.hash[3]);
10636 digest[4] = byte_swap_32 (buf.hash[4]);
10637
10638 return (PARSER_OK);
10639 }
10640
10641 int psafe3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10642 {
10643 u32 *digest = (u32 *) hash_buf->digest;
10644
10645 salt_t *salt = hash_buf->salt;
10646
10647 if (input_len == 0)
10648 {
10649 log_error (".psafe3 not specified");
10650
10651 exit (-1);
10652 }
10653
10654 FILE *fp = fopen (input_buf, "rb");
10655
10656 if (fp == NULL)
10657 {
10658 log_error ("%s: %s", input_buf, strerror (errno));
10659
10660 exit (-1);
10661 }
10662
10663 psafe3_t in;
10664
10665 int n = fread (&in, sizeof (psafe3_t), 1, fp);
10666
10667 fclose (fp);
10668
10669 data.hashfile = input_buf; // we will need this in case it gets cracked
10670
10671 if (memcmp (SIGNATURE_PSAFE3, in.signature, 4)) return (PARSER_SIGNATURE_UNMATCHED);
10672
10673 if (n != 1) return (PARSER_PSAFE3_FILE_SIZE);
10674
10675 salt->salt_iter = in.iterations + 1;
10676
10677 salt->salt_buf[0] = in.salt_buf[0];
10678 salt->salt_buf[1] = in.salt_buf[1];
10679 salt->salt_buf[2] = in.salt_buf[2];
10680 salt->salt_buf[3] = in.salt_buf[3];
10681 salt->salt_buf[4] = in.salt_buf[4];
10682 salt->salt_buf[5] = in.salt_buf[5];
10683 salt->salt_buf[6] = in.salt_buf[6];
10684 salt->salt_buf[7] = in.salt_buf[7];
10685
10686 salt->salt_len = 32;
10687
10688 digest[0] = in.hash_buf[0];
10689 digest[1] = in.hash_buf[1];
10690 digest[2] = in.hash_buf[2];
10691 digest[3] = in.hash_buf[3];
10692 digest[4] = in.hash_buf[4];
10693 digest[5] = in.hash_buf[5];
10694 digest[6] = in.hash_buf[6];
10695 digest[7] = in.hash_buf[7];
10696
10697 digest[0] = byte_swap_32 (digest[0]);
10698 digest[1] = byte_swap_32 (digest[1]);
10699 digest[2] = byte_swap_32 (digest[2]);
10700 digest[3] = byte_swap_32 (digest[3]);
10701 digest[4] = byte_swap_32 (digest[4]);
10702 digest[5] = byte_swap_32 (digest[5]);
10703 digest[6] = byte_swap_32 (digest[6]);
10704 digest[7] = byte_swap_32 (digest[7]);
10705
10706 return (PARSER_OK);
10707 }
10708
10709 int phpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10710 {
10711 if ((input_len < DISPLAY_LEN_MIN_400) || (input_len > DISPLAY_LEN_MAX_400)) return (PARSER_GLOBAL_LENGTH);
10712
10713 if ((memcmp (SIGNATURE_PHPASS1, input_buf, 3)) && (memcmp (SIGNATURE_PHPASS2, input_buf, 3))) return (PARSER_SIGNATURE_UNMATCHED);
10714
10715 u32 *digest = (u32 *) hash_buf->digest;
10716
10717 salt_t *salt = hash_buf->salt;
10718
10719 char *iter_pos = input_buf + 3;
10720
10721 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
10722
10723 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
10724
10725 memcpy ((char *) salt->salt_sign, input_buf, 4);
10726
10727 salt->salt_iter = salt_iter;
10728
10729 char *salt_pos = iter_pos + 1;
10730
10731 uint salt_len = 8;
10732
10733 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10734
10735 salt->salt_len = salt_len;
10736
10737 char *hash_pos = salt_pos + salt_len;
10738
10739 phpass_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10740
10741 return (PARSER_OK);
10742 }
10743
10744 int md5crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10745 {
10746 if (input_len < DISPLAY_LEN_MIN_500) return (PARSER_GLOBAL_LENGTH);
10747
10748 if (memcmp (SIGNATURE_MD5CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
10749
10750 u32 *digest = (u32 *) hash_buf->digest;
10751
10752 salt_t *salt = hash_buf->salt;
10753
10754 char *salt_pos = input_buf + 3;
10755
10756 uint iterations_len = 0;
10757
10758 if (memcmp (salt_pos, "rounds=", 7) == 0)
10759 {
10760 salt_pos += 7;
10761
10762 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10763
10764 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10765 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10766
10767 salt_pos[0] = 0x0;
10768
10769 salt->salt_iter = atoi (salt_pos - iterations_len);
10770
10771 salt_pos += 1;
10772
10773 iterations_len += 8;
10774 }
10775 else
10776 {
10777 salt->salt_iter = ROUNDS_MD5CRYPT;
10778 }
10779
10780 if (input_len > (DISPLAY_LEN_MAX_500 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
10781
10782 char *hash_pos = strchr (salt_pos, '$');
10783
10784 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10785
10786 uint salt_len = hash_pos - salt_pos;
10787
10788 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10789
10790 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10791
10792 salt->salt_len = salt_len;
10793
10794 hash_pos++;
10795
10796 uint hash_len = input_len - 3 - iterations_len - salt_len - 1;
10797
10798 if (hash_len != 22) return (PARSER_HASH_LENGTH);
10799
10800 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10801
10802 return (PARSER_OK);
10803 }
10804
10805 int md5apr1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10806 {
10807 if (memcmp (SIGNATURE_MD5APR1, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
10808
10809 u32 *digest = (u32 *) hash_buf->digest;
10810
10811 salt_t *salt = hash_buf->salt;
10812
10813 char *salt_pos = input_buf + 6;
10814
10815 uint iterations_len = 0;
10816
10817 if (memcmp (salt_pos, "rounds=", 7) == 0)
10818 {
10819 salt_pos += 7;
10820
10821 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10822
10823 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10824 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10825
10826 salt_pos[0] = 0x0;
10827
10828 salt->salt_iter = atoi (salt_pos - iterations_len);
10829
10830 salt_pos += 1;
10831
10832 iterations_len += 8;
10833 }
10834 else
10835 {
10836 salt->salt_iter = ROUNDS_MD5CRYPT;
10837 }
10838
10839 if ((input_len < DISPLAY_LEN_MIN_1600) || (input_len > DISPLAY_LEN_MAX_1600 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
10840
10841 char *hash_pos = strchr (salt_pos, '$');
10842
10843 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10844
10845 uint salt_len = hash_pos - salt_pos;
10846
10847 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10848
10849 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10850
10851 salt->salt_len = salt_len;
10852
10853 hash_pos++;
10854
10855 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10856
10857 return (PARSER_OK);
10858 }
10859
10860 int episerver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10861 {
10862 if ((input_len < DISPLAY_LEN_MIN_141) || (input_len > DISPLAY_LEN_MAX_141)) return (PARSER_GLOBAL_LENGTH);
10863
10864 if (memcmp (SIGNATURE_EPISERVER, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
10865
10866 u32 *digest = (u32 *) hash_buf->digest;
10867
10868 salt_t *salt = hash_buf->salt;
10869
10870 char *salt_pos = input_buf + 14;
10871
10872 char *hash_pos = strchr (salt_pos, '*');
10873
10874 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10875
10876 hash_pos++;
10877
10878 uint salt_len = hash_pos - salt_pos - 1;
10879
10880 char *salt_buf_ptr = (char *) salt->salt_buf;
10881
10882 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
10883
10884 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10885
10886 salt->salt_len = salt_len;
10887
10888 u8 tmp_buf[100] = { 0 };
10889
10890 base64_decode (base64_to_int, (const u8 *) hash_pos, 27, tmp_buf);
10891
10892 memcpy (digest, tmp_buf, 20);
10893
10894 digest[0] = byte_swap_32 (digest[0]);
10895 digest[1] = byte_swap_32 (digest[1]);
10896 digest[2] = byte_swap_32 (digest[2]);
10897 digest[3] = byte_swap_32 (digest[3]);
10898 digest[4] = byte_swap_32 (digest[4]);
10899
10900 digest[0] -= SHA1M_A;
10901 digest[1] -= SHA1M_B;
10902 digest[2] -= SHA1M_C;
10903 digest[3] -= SHA1M_D;
10904 digest[4] -= SHA1M_E;
10905
10906 return (PARSER_OK);
10907 }
10908
10909 int descrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10910 {
10911 if ((input_len < DISPLAY_LEN_MIN_1500) || (input_len > DISPLAY_LEN_MAX_1500)) return (PARSER_GLOBAL_LENGTH);
10912
10913 unsigned char c12 = itoa64_to_int (input_buf[12]);
10914
10915 if (c12 & 3) return (PARSER_HASH_VALUE);
10916
10917 u32 *digest = (u32 *) hash_buf->digest;
10918
10919 salt_t *salt = hash_buf->salt;
10920
10921 // for ascii_digest
10922 salt->salt_sign[0] = input_buf[0];
10923 salt->salt_sign[1] = input_buf[1];
10924
10925 salt->salt_buf[0] = itoa64_to_int (input_buf[0])
10926 | itoa64_to_int (input_buf[1]) << 6;
10927
10928 salt->salt_len = 2;
10929
10930 u8 tmp_buf[100] = { 0 };
10931
10932 base64_decode (itoa64_to_int, (const u8 *) input_buf + 2, 11, tmp_buf);
10933
10934 memcpy (digest, tmp_buf, 8);
10935
10936 uint tt;
10937
10938 IP (digest[0], digest[1], tt);
10939
10940 digest[2] = 0;
10941 digest[3] = 0;
10942
10943 return (PARSER_OK);
10944 }
10945
10946 int md4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10947 {
10948 if ((input_len < DISPLAY_LEN_MIN_900) || (input_len > DISPLAY_LEN_MAX_900)) return (PARSER_GLOBAL_LENGTH);
10949
10950 u32 *digest = (u32 *) hash_buf->digest;
10951
10952 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10953 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10954 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10955 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10956
10957 digest[0] = byte_swap_32 (digest[0]);
10958 digest[1] = byte_swap_32 (digest[1]);
10959 digest[2] = byte_swap_32 (digest[2]);
10960 digest[3] = byte_swap_32 (digest[3]);
10961
10962 digest[0] -= MD4M_A;
10963 digest[1] -= MD4M_B;
10964 digest[2] -= MD4M_C;
10965 digest[3] -= MD4M_D;
10966
10967 return (PARSER_OK);
10968 }
10969
10970 int md4s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10971 {
10972 if (data.opts_type & OPTS_TYPE_ST_HEX)
10973 {
10974 if ((input_len < DISPLAY_LEN_MIN_910H) || (input_len > DISPLAY_LEN_MAX_910H)) return (PARSER_GLOBAL_LENGTH);
10975 }
10976 else
10977 {
10978 if ((input_len < DISPLAY_LEN_MIN_910) || (input_len > DISPLAY_LEN_MAX_910)) return (PARSER_GLOBAL_LENGTH);
10979 }
10980
10981 u32 *digest = (u32 *) hash_buf->digest;
10982
10983 salt_t *salt = hash_buf->salt;
10984
10985 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10986 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10987 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10988 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10989
10990 digest[0] = byte_swap_32 (digest[0]);
10991 digest[1] = byte_swap_32 (digest[1]);
10992 digest[2] = byte_swap_32 (digest[2]);
10993 digest[3] = byte_swap_32 (digest[3]);
10994
10995 digest[0] -= MD4M_A;
10996 digest[1] -= MD4M_B;
10997 digest[2] -= MD4M_C;
10998 digest[3] -= MD4M_D;
10999
11000 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11001
11002 uint salt_len = input_len - 32 - 1;
11003
11004 char *salt_buf = input_buf + 32 + 1;
11005
11006 char *salt_buf_ptr = (char *) salt->salt_buf;
11007
11008 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11009
11010 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11011
11012 salt->salt_len = salt_len;
11013
11014 return (PARSER_OK);
11015 }
11016
11017 int md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11018 {
11019 if ((input_len < DISPLAY_LEN_MIN_0) || (input_len > DISPLAY_LEN_MAX_0)) return (PARSER_GLOBAL_LENGTH);
11020
11021 u32 *digest = (u32 *) hash_buf->digest;
11022
11023 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11024 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11025 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11026 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11027
11028 digest[0] = byte_swap_32 (digest[0]);
11029 digest[1] = byte_swap_32 (digest[1]);
11030 digest[2] = byte_swap_32 (digest[2]);
11031 digest[3] = byte_swap_32 (digest[3]);
11032
11033 digest[0] -= MD5M_A;
11034 digest[1] -= MD5M_B;
11035 digest[2] -= MD5M_C;
11036 digest[3] -= MD5M_D;
11037
11038 return (PARSER_OK);
11039 }
11040
11041 int md5half_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11042 {
11043 if ((input_len < DISPLAY_LEN_MIN_5100) || (input_len > DISPLAY_LEN_MAX_5100)) return (PARSER_GLOBAL_LENGTH);
11044
11045 u32 *digest = (u32 *) hash_buf->digest;
11046
11047 digest[0] = hex_to_u32 ((const u8 *) &input_buf[0]);
11048 digest[1] = hex_to_u32 ((const u8 *) &input_buf[8]);
11049 digest[2] = 0;
11050 digest[3] = 0;
11051
11052 digest[0] = byte_swap_32 (digest[0]);
11053 digest[1] = byte_swap_32 (digest[1]);
11054
11055 return (PARSER_OK);
11056 }
11057
11058 int md5s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11059 {
11060 if (data.opts_type & OPTS_TYPE_ST_HEX)
11061 {
11062 if ((input_len < DISPLAY_LEN_MIN_10H) || (input_len > DISPLAY_LEN_MAX_10H)) return (PARSER_GLOBAL_LENGTH);
11063 }
11064 else
11065 {
11066 if ((input_len < DISPLAY_LEN_MIN_10) || (input_len > DISPLAY_LEN_MAX_10)) return (PARSER_GLOBAL_LENGTH);
11067 }
11068
11069 u32 *digest = (u32 *) hash_buf->digest;
11070
11071 salt_t *salt = hash_buf->salt;
11072
11073 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11074 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11075 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11076 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11077
11078 digest[0] = byte_swap_32 (digest[0]);
11079 digest[1] = byte_swap_32 (digest[1]);
11080 digest[2] = byte_swap_32 (digest[2]);
11081 digest[3] = byte_swap_32 (digest[3]);
11082
11083 digest[0] -= MD5M_A;
11084 digest[1] -= MD5M_B;
11085 digest[2] -= MD5M_C;
11086 digest[3] -= MD5M_D;
11087
11088 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11089
11090 uint salt_len = input_len - 32 - 1;
11091
11092 char *salt_buf = input_buf + 32 + 1;
11093
11094 char *salt_buf_ptr = (char *) salt->salt_buf;
11095
11096 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11097
11098 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11099
11100 salt->salt_len = salt_len;
11101
11102 return (PARSER_OK);
11103 }
11104
11105 int md5pix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11106 {
11107 if ((input_len < DISPLAY_LEN_MIN_2400) || (input_len > DISPLAY_LEN_MAX_2400)) return (PARSER_GLOBAL_LENGTH);
11108
11109 u32 *digest = (u32 *) hash_buf->digest;
11110
11111 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
11112 | itoa64_to_int (input_buf[ 1]) << 6
11113 | itoa64_to_int (input_buf[ 2]) << 12
11114 | itoa64_to_int (input_buf[ 3]) << 18;
11115 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
11116 | itoa64_to_int (input_buf[ 5]) << 6
11117 | itoa64_to_int (input_buf[ 6]) << 12
11118 | itoa64_to_int (input_buf[ 7]) << 18;
11119 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
11120 | itoa64_to_int (input_buf[ 9]) << 6
11121 | itoa64_to_int (input_buf[10]) << 12
11122 | itoa64_to_int (input_buf[11]) << 18;
11123 digest[3] = itoa64_to_int (input_buf[12]) << 0
11124 | itoa64_to_int (input_buf[13]) << 6
11125 | itoa64_to_int (input_buf[14]) << 12
11126 | itoa64_to_int (input_buf[15]) << 18;
11127
11128 digest[0] -= MD5M_A;
11129 digest[1] -= MD5M_B;
11130 digest[2] -= MD5M_C;
11131 digest[3] -= MD5M_D;
11132
11133 digest[0] &= 0x00ffffff;
11134 digest[1] &= 0x00ffffff;
11135 digest[2] &= 0x00ffffff;
11136 digest[3] &= 0x00ffffff;
11137
11138 return (PARSER_OK);
11139 }
11140
11141 int md5asa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11142 {
11143 if (data.opts_type & OPTS_TYPE_ST_HEX)
11144 {
11145 if ((input_len < DISPLAY_LEN_MIN_2410H) || (input_len > DISPLAY_LEN_MAX_2410H)) return (PARSER_GLOBAL_LENGTH);
11146 }
11147 else
11148 {
11149 if ((input_len < DISPLAY_LEN_MIN_2410) || (input_len > DISPLAY_LEN_MAX_2410)) return (PARSER_GLOBAL_LENGTH);
11150 }
11151
11152 u32 *digest = (u32 *) hash_buf->digest;
11153
11154 salt_t *salt = hash_buf->salt;
11155
11156 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
11157 | itoa64_to_int (input_buf[ 1]) << 6
11158 | itoa64_to_int (input_buf[ 2]) << 12
11159 | itoa64_to_int (input_buf[ 3]) << 18;
11160 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
11161 | itoa64_to_int (input_buf[ 5]) << 6
11162 | itoa64_to_int (input_buf[ 6]) << 12
11163 | itoa64_to_int (input_buf[ 7]) << 18;
11164 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
11165 | itoa64_to_int (input_buf[ 9]) << 6
11166 | itoa64_to_int (input_buf[10]) << 12
11167 | itoa64_to_int (input_buf[11]) << 18;
11168 digest[3] = itoa64_to_int (input_buf[12]) << 0
11169 | itoa64_to_int (input_buf[13]) << 6
11170 | itoa64_to_int (input_buf[14]) << 12
11171 | itoa64_to_int (input_buf[15]) << 18;
11172
11173 digest[0] -= MD5M_A;
11174 digest[1] -= MD5M_B;
11175 digest[2] -= MD5M_C;
11176 digest[3] -= MD5M_D;
11177
11178 digest[0] &= 0x00ffffff;
11179 digest[1] &= 0x00ffffff;
11180 digest[2] &= 0x00ffffff;
11181 digest[3] &= 0x00ffffff;
11182
11183 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11184
11185 uint salt_len = input_len - 16 - 1;
11186
11187 char *salt_buf = input_buf + 16 + 1;
11188
11189 char *salt_buf_ptr = (char *) salt->salt_buf;
11190
11191 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11192
11193 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11194
11195 salt->salt_len = salt_len;
11196
11197 return (PARSER_OK);
11198 }
11199
11200 void transform_netntlmv1_key (const u8 *nthash, u8 *key)
11201 {
11202 key[0] = (nthash[0] >> 0);
11203 key[1] = (nthash[0] << 7) | (nthash[1] >> 1);
11204 key[2] = (nthash[1] << 6) | (nthash[2] >> 2);
11205 key[3] = (nthash[2] << 5) | (nthash[3] >> 3);
11206 key[4] = (nthash[3] << 4) | (nthash[4] >> 4);
11207 key[5] = (nthash[4] << 3) | (nthash[5] >> 5);
11208 key[6] = (nthash[5] << 2) | (nthash[6] >> 6);
11209 key[7] = (nthash[6] << 1);
11210
11211 key[0] |= 0x01;
11212 key[1] |= 0x01;
11213 key[2] |= 0x01;
11214 key[3] |= 0x01;
11215 key[4] |= 0x01;
11216 key[5] |= 0x01;
11217 key[6] |= 0x01;
11218 key[7] |= 0x01;
11219 }
11220
11221 int netntlmv1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11222 {
11223 if ((input_len < DISPLAY_LEN_MIN_5500) || (input_len > DISPLAY_LEN_MAX_5500)) return (PARSER_GLOBAL_LENGTH);
11224
11225 u32 *digest = (u32 *) hash_buf->digest;
11226
11227 salt_t *salt = hash_buf->salt;
11228
11229 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
11230
11231 /**
11232 * parse line
11233 */
11234
11235 char *user_pos = input_buf;
11236
11237 char *unused_pos = strchr (user_pos, ':');
11238
11239 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11240
11241 uint user_len = unused_pos - user_pos;
11242
11243 if (user_len > 60) return (PARSER_SALT_LENGTH);
11244
11245 unused_pos++;
11246
11247 char *domain_pos = strchr (unused_pos, ':');
11248
11249 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11250
11251 uint unused_len = domain_pos - unused_pos;
11252
11253 if (unused_len != 0) return (PARSER_SALT_LENGTH);
11254
11255 domain_pos++;
11256
11257 char *srvchall_pos = strchr (domain_pos, ':');
11258
11259 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11260
11261 uint domain_len = srvchall_pos - domain_pos;
11262
11263 if (domain_len > 45) return (PARSER_SALT_LENGTH);
11264
11265 srvchall_pos++;
11266
11267 char *hash_pos = strchr (srvchall_pos, ':');
11268
11269 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11270
11271 uint srvchall_len = hash_pos - srvchall_pos;
11272
11273 // if (srvchall_len != 0) return (PARSER_SALT_LENGTH);
11274
11275 hash_pos++;
11276
11277 char *clichall_pos = strchr (hash_pos, ':');
11278
11279 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11280
11281 uint hash_len = clichall_pos - hash_pos;
11282
11283 if (hash_len != 48) return (PARSER_HASH_LENGTH);
11284
11285 clichall_pos++;
11286
11287 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
11288
11289 if (clichall_len != 16) return (PARSER_SALT_LENGTH);
11290
11291 /**
11292 * store some data for later use
11293 */
11294
11295 netntlm->user_len = user_len * 2;
11296 netntlm->domain_len = domain_len * 2;
11297 netntlm->srvchall_len = srvchall_len / 2;
11298 netntlm->clichall_len = clichall_len / 2;
11299
11300 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
11301 char *chall_ptr = (char *) netntlm->chall_buf;
11302
11303 /**
11304 * handle username and domainname
11305 */
11306
11307 for (uint i = 0; i < user_len; i++)
11308 {
11309 *userdomain_ptr++ = user_pos[i];
11310 *userdomain_ptr++ = 0;
11311 }
11312
11313 for (uint i = 0; i < domain_len; i++)
11314 {
11315 *userdomain_ptr++ = domain_pos[i];
11316 *userdomain_ptr++ = 0;
11317 }
11318
11319 /**
11320 * handle server challenge encoding
11321 */
11322
11323 for (uint i = 0; i < srvchall_len; i += 2)
11324 {
11325 const char p0 = srvchall_pos[i + 0];
11326 const char p1 = srvchall_pos[i + 1];
11327
11328 *chall_ptr++ = hex_convert (p1) << 0
11329 | hex_convert (p0) << 4;
11330 }
11331
11332 /**
11333 * handle client challenge encoding
11334 */
11335
11336 for (uint i = 0; i < clichall_len; i += 2)
11337 {
11338 const char p0 = clichall_pos[i + 0];
11339 const char p1 = clichall_pos[i + 1];
11340
11341 *chall_ptr++ = hex_convert (p1) << 0
11342 | hex_convert (p0) << 4;
11343 }
11344
11345 /**
11346 * store data
11347 */
11348
11349 char *salt_buf_ptr = (char *) salt->salt_buf;
11350
11351 uint salt_len = parse_and_store_salt (salt_buf_ptr, clichall_pos, clichall_len);
11352
11353 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11354
11355 salt->salt_len = salt_len;
11356
11357 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11358 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11359 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11360 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11361
11362 digest[0] = byte_swap_32 (digest[0]);
11363 digest[1] = byte_swap_32 (digest[1]);
11364 digest[2] = byte_swap_32 (digest[2]);
11365 digest[3] = byte_swap_32 (digest[3]);
11366
11367 /* special case, last 8 byte do not need to be checked since they are brute-forced next */
11368
11369 uint digest_tmp[2] = { 0 };
11370
11371 digest_tmp[0] = hex_to_u32 ((const u8 *) &hash_pos[32]);
11372 digest_tmp[1] = hex_to_u32 ((const u8 *) &hash_pos[40]);
11373
11374 digest_tmp[0] = byte_swap_32 (digest_tmp[0]);
11375 digest_tmp[1] = byte_swap_32 (digest_tmp[1]);
11376
11377 /* special case 2: ESS */
11378
11379 if (srvchall_len == 48)
11380 {
11381 if ((netntlm->chall_buf[2] == 0) && (netntlm->chall_buf[3] == 0) && (netntlm->chall_buf[4] == 0) && (netntlm->chall_buf[5] == 0))
11382 {
11383 uint w[16] = { 0 };
11384
11385 w[ 0] = netntlm->chall_buf[6];
11386 w[ 1] = netntlm->chall_buf[7];
11387 w[ 2] = netntlm->chall_buf[0];
11388 w[ 3] = netntlm->chall_buf[1];
11389 w[ 4] = 0x80;
11390 w[14] = 16 * 8;
11391
11392 uint dgst[4] = { 0 };
11393
11394 dgst[0] = MAGIC_A;
11395 dgst[1] = MAGIC_B;
11396 dgst[2] = MAGIC_C;
11397 dgst[3] = MAGIC_D;
11398
11399 md5_64 (w, dgst);
11400
11401 salt->salt_buf[0] = dgst[0];
11402 salt->salt_buf[1] = dgst[1];
11403 }
11404 }
11405
11406 /* precompute netntlmv1 exploit start */
11407
11408 for (uint i = 0; i < 0x10000; i++)
11409 {
11410 uint key_md4[2] = { i, 0 };
11411 uint key_des[2] = { 0, 0 };
11412
11413 transform_netntlmv1_key ((u8 *) key_md4, (u8 *) key_des);
11414
11415 uint Kc[16] = { 0 };
11416 uint Kd[16] = { 0 };
11417
11418 _des_keysetup (key_des, Kc, Kd, c_skb);
11419
11420 uint data3[2] = { salt->salt_buf[0], salt->salt_buf[1] };
11421
11422 _des_encrypt (data3, Kc, Kd, c_SPtrans);
11423
11424 if (data3[0] != digest_tmp[0]) continue;
11425 if (data3[1] != digest_tmp[1]) continue;
11426
11427 salt->salt_buf[2] = i;
11428
11429 salt->salt_len = 24;
11430
11431 break;
11432 }
11433
11434 salt->salt_buf_pc[0] = digest_tmp[0];
11435 salt->salt_buf_pc[1] = digest_tmp[1];
11436
11437 /* precompute netntlmv1 exploit stop */
11438
11439 u32 tt;
11440
11441 IP (digest[0], digest[1], tt);
11442 IP (digest[2], digest[3], tt);
11443
11444 digest[0] = rotr32 (digest[0], 29);
11445 digest[1] = rotr32 (digest[1], 29);
11446 digest[2] = rotr32 (digest[2], 29);
11447 digest[3] = rotr32 (digest[3], 29);
11448
11449 IP (salt->salt_buf[0], salt->salt_buf[1], tt);
11450
11451 salt->salt_buf[0] = rotl32 (salt->salt_buf[0], 3);
11452 salt->salt_buf[1] = rotl32 (salt->salt_buf[1], 3);
11453
11454 return (PARSER_OK);
11455 }
11456
11457 int netntlmv2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11458 {
11459 if ((input_len < DISPLAY_LEN_MIN_5600) || (input_len > DISPLAY_LEN_MAX_5600)) return (PARSER_GLOBAL_LENGTH);
11460
11461 u32 *digest = (u32 *) hash_buf->digest;
11462
11463 salt_t *salt = hash_buf->salt;
11464
11465 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
11466
11467 /**
11468 * parse line
11469 */
11470
11471 char *user_pos = input_buf;
11472
11473 char *unused_pos = strchr (user_pos, ':');
11474
11475 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11476
11477 uint user_len = unused_pos - user_pos;
11478
11479 if (user_len > 60) return (PARSER_SALT_LENGTH);
11480
11481 unused_pos++;
11482
11483 char *domain_pos = strchr (unused_pos, ':');
11484
11485 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11486
11487 uint unused_len = domain_pos - unused_pos;
11488
11489 if (unused_len != 0) return (PARSER_SALT_LENGTH);
11490
11491 domain_pos++;
11492
11493 char *srvchall_pos = strchr (domain_pos, ':');
11494
11495 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11496
11497 uint domain_len = srvchall_pos - domain_pos;
11498
11499 if (domain_len > 45) return (PARSER_SALT_LENGTH);
11500
11501 srvchall_pos++;
11502
11503 char *hash_pos = strchr (srvchall_pos, ':');
11504
11505 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11506
11507 uint srvchall_len = hash_pos - srvchall_pos;
11508
11509 if (srvchall_len != 16) return (PARSER_SALT_LENGTH);
11510
11511 hash_pos++;
11512
11513 char *clichall_pos = strchr (hash_pos, ':');
11514
11515 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11516
11517 uint hash_len = clichall_pos - hash_pos;
11518
11519 if (hash_len != 32) return (PARSER_HASH_LENGTH);
11520
11521 clichall_pos++;
11522
11523 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
11524
11525 if (clichall_len > 1024) return (PARSER_SALT_LENGTH);
11526
11527 if (clichall_len % 2) return (PARSER_SALT_VALUE);
11528
11529 /**
11530 * store some data for later use
11531 */
11532
11533 netntlm->user_len = user_len * 2;
11534 netntlm->domain_len = domain_len * 2;
11535 netntlm->srvchall_len = srvchall_len / 2;
11536 netntlm->clichall_len = clichall_len / 2;
11537
11538 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
11539 char *chall_ptr = (char *) netntlm->chall_buf;
11540
11541 /**
11542 * handle username and domainname
11543 */
11544
11545 for (uint i = 0; i < user_len; i++)
11546 {
11547 *userdomain_ptr++ = toupper (user_pos[i]);
11548 *userdomain_ptr++ = 0;
11549 }
11550
11551 for (uint i = 0; i < domain_len; i++)
11552 {
11553 *userdomain_ptr++ = domain_pos[i];
11554 *userdomain_ptr++ = 0;
11555 }
11556
11557 *userdomain_ptr++ = 0x80;
11558
11559 /**
11560 * handle server challenge encoding
11561 */
11562
11563 for (uint i = 0; i < srvchall_len; i += 2)
11564 {
11565 const char p0 = srvchall_pos[i + 0];
11566 const char p1 = srvchall_pos[i + 1];
11567
11568 *chall_ptr++ = hex_convert (p1) << 0
11569 | hex_convert (p0) << 4;
11570 }
11571
11572 /**
11573 * handle client challenge encoding
11574 */
11575
11576 for (uint i = 0; i < clichall_len; i += 2)
11577 {
11578 const char p0 = clichall_pos[i + 0];
11579 const char p1 = clichall_pos[i + 1];
11580
11581 *chall_ptr++ = hex_convert (p1) << 0
11582 | hex_convert (p0) << 4;
11583 }
11584
11585 *chall_ptr++ = 0x80;
11586
11587 /**
11588 * handle hash itself
11589 */
11590
11591 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11592 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11593 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11594 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11595
11596 digest[0] = byte_swap_32 (digest[0]);
11597 digest[1] = byte_swap_32 (digest[1]);
11598 digest[2] = byte_swap_32 (digest[2]);
11599 digest[3] = byte_swap_32 (digest[3]);
11600
11601 /**
11602 * reuse challange data as salt_buf, its the buffer that is most likely unique
11603 */
11604
11605 salt->salt_buf[0] = 0;
11606 salt->salt_buf[1] = 0;
11607 salt->salt_buf[2] = 0;
11608 salt->salt_buf[3] = 0;
11609 salt->salt_buf[4] = 0;
11610 salt->salt_buf[5] = 0;
11611 salt->salt_buf[6] = 0;
11612 salt->salt_buf[7] = 0;
11613
11614 uint *uptr;
11615
11616 uptr = (uint *) netntlm->userdomain_buf;
11617
11618 for (uint i = 0; i < 16; i += 16)
11619 {
11620 md5_64 (uptr, salt->salt_buf);
11621 }
11622
11623 uptr = (uint *) netntlm->chall_buf;
11624
11625 for (uint i = 0; i < 256; i += 16)
11626 {
11627 md5_64 (uptr, salt->salt_buf);
11628 }
11629
11630 salt->salt_len = 16;
11631
11632 return (PARSER_OK);
11633 }
11634
11635 int joomla_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11636 {
11637 if (data.opts_type & OPTS_TYPE_ST_HEX)
11638 {
11639 if ((input_len < DISPLAY_LEN_MIN_11H) || (input_len > DISPLAY_LEN_MAX_11H)) return (PARSER_GLOBAL_LENGTH);
11640 }
11641 else
11642 {
11643 if ((input_len < DISPLAY_LEN_MIN_11) || (input_len > DISPLAY_LEN_MAX_11)) return (PARSER_GLOBAL_LENGTH);
11644 }
11645
11646 u32 *digest = (u32 *) hash_buf->digest;
11647
11648 salt_t *salt = hash_buf->salt;
11649
11650 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11651 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11652 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11653 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11654
11655 digest[0] = byte_swap_32 (digest[0]);
11656 digest[1] = byte_swap_32 (digest[1]);
11657 digest[2] = byte_swap_32 (digest[2]);
11658 digest[3] = byte_swap_32 (digest[3]);
11659
11660 digest[0] -= MD5M_A;
11661 digest[1] -= MD5M_B;
11662 digest[2] -= MD5M_C;
11663 digest[3] -= MD5M_D;
11664
11665 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11666
11667 uint salt_len = input_len - 32 - 1;
11668
11669 char *salt_buf = input_buf + 32 + 1;
11670
11671 char *salt_buf_ptr = (char *) salt->salt_buf;
11672
11673 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11674
11675 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11676
11677 salt->salt_len = salt_len;
11678
11679 return (PARSER_OK);
11680 }
11681
11682 int postgresql_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11683 {
11684 if (data.opts_type & OPTS_TYPE_ST_HEX)
11685 {
11686 if ((input_len < DISPLAY_LEN_MIN_12H) || (input_len > DISPLAY_LEN_MAX_12H)) return (PARSER_GLOBAL_LENGTH);
11687 }
11688 else
11689 {
11690 if ((input_len < DISPLAY_LEN_MIN_12) || (input_len > DISPLAY_LEN_MAX_12)) return (PARSER_GLOBAL_LENGTH);
11691 }
11692
11693 u32 *digest = (u32 *) hash_buf->digest;
11694
11695 salt_t *salt = hash_buf->salt;
11696
11697 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11698 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11699 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11700 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11701
11702 digest[0] = byte_swap_32 (digest[0]);
11703 digest[1] = byte_swap_32 (digest[1]);
11704 digest[2] = byte_swap_32 (digest[2]);
11705 digest[3] = byte_swap_32 (digest[3]);
11706
11707 digest[0] -= MD5M_A;
11708 digest[1] -= MD5M_B;
11709 digest[2] -= MD5M_C;
11710 digest[3] -= MD5M_D;
11711
11712 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11713
11714 uint salt_len = input_len - 32 - 1;
11715
11716 char *salt_buf = input_buf + 32 + 1;
11717
11718 char *salt_buf_ptr = (char *) salt->salt_buf;
11719
11720 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11721
11722 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11723
11724 salt->salt_len = salt_len;
11725
11726 return (PARSER_OK);
11727 }
11728
11729 int md5md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11730 {
11731 if ((input_len < DISPLAY_LEN_MIN_2600) || (input_len > DISPLAY_LEN_MAX_2600)) return (PARSER_GLOBAL_LENGTH);
11732
11733 u32 *digest = (u32 *) hash_buf->digest;
11734
11735 salt_t *salt = hash_buf->salt;
11736
11737 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11738 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11739 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11740 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11741
11742 digest[0] = byte_swap_32 (digest[0]);
11743 digest[1] = byte_swap_32 (digest[1]);
11744 digest[2] = byte_swap_32 (digest[2]);
11745 digest[3] = byte_swap_32 (digest[3]);
11746
11747 digest[0] -= MD5M_A;
11748 digest[1] -= MD5M_B;
11749 digest[2] -= MD5M_C;
11750 digest[3] -= MD5M_D;
11751
11752 /**
11753 * This is a virtual salt. While the algorithm is basically not salted
11754 * we can exploit the salt buffer to set the 0x80 and the w[14] value.
11755 * This way we can save a special md5md5 kernel and reuse the one from vbull.
11756 */
11757
11758 char *salt_buf_ptr = (char *) salt->salt_buf;
11759
11760 uint salt_len = parse_and_store_salt (salt_buf_ptr, (char *) "", 0);
11761
11762 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11763
11764 salt->salt_len = salt_len;
11765
11766 return (PARSER_OK);
11767 }
11768
11769 int vb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11770 {
11771 if (data.opts_type & OPTS_TYPE_ST_HEX)
11772 {
11773 if ((input_len < DISPLAY_LEN_MIN_2611H) || (input_len > DISPLAY_LEN_MAX_2611H)) return (PARSER_GLOBAL_LENGTH);
11774 }
11775 else
11776 {
11777 if ((input_len < DISPLAY_LEN_MIN_2611) || (input_len > DISPLAY_LEN_MAX_2611)) return (PARSER_GLOBAL_LENGTH);
11778 }
11779
11780 u32 *digest = (u32 *) hash_buf->digest;
11781
11782 salt_t *salt = hash_buf->salt;
11783
11784 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11785 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11786 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11787 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11788
11789 digest[0] = byte_swap_32 (digest[0]);
11790 digest[1] = byte_swap_32 (digest[1]);
11791 digest[2] = byte_swap_32 (digest[2]);
11792 digest[3] = byte_swap_32 (digest[3]);
11793
11794 digest[0] -= MD5M_A;
11795 digest[1] -= MD5M_B;
11796 digest[2] -= MD5M_C;
11797 digest[3] -= MD5M_D;
11798
11799 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11800
11801 uint salt_len = input_len - 32 - 1;
11802
11803 char *salt_buf = input_buf + 32 + 1;
11804
11805 char *salt_buf_ptr = (char *) salt->salt_buf;
11806
11807 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11808
11809 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11810
11811 salt->salt_len = salt_len;
11812
11813 return (PARSER_OK);
11814 }
11815
11816 int vb30_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11817 {
11818 if (data.opts_type & OPTS_TYPE_ST_HEX)
11819 {
11820 if ((input_len < DISPLAY_LEN_MIN_2711H) || (input_len > DISPLAY_LEN_MAX_2711H)) return (PARSER_GLOBAL_LENGTH);
11821 }
11822 else
11823 {
11824 if ((input_len < DISPLAY_LEN_MIN_2711) || (input_len > DISPLAY_LEN_MAX_2711)) return (PARSER_GLOBAL_LENGTH);
11825 }
11826
11827 u32 *digest = (u32 *) hash_buf->digest;
11828
11829 salt_t *salt = hash_buf->salt;
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
11836 digest[0] = byte_swap_32 (digest[0]);
11837 digest[1] = byte_swap_32 (digest[1]);
11838 digest[2] = byte_swap_32 (digest[2]);
11839 digest[3] = byte_swap_32 (digest[3]);
11840
11841 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11842
11843 uint salt_len = input_len - 32 - 1;
11844
11845 char *salt_buf = input_buf + 32 + 1;
11846
11847 char *salt_buf_ptr = (char *) salt->salt_buf;
11848
11849 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11850
11851 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11852
11853 salt->salt_len = salt_len;
11854
11855 return (PARSER_OK);
11856 }
11857
11858 int dcc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11859 {
11860 if (data.opts_type & OPTS_TYPE_ST_HEX)
11861 {
11862 if ((input_len < DISPLAY_LEN_MIN_1100H) || (input_len > DISPLAY_LEN_MAX_1100H)) return (PARSER_GLOBAL_LENGTH);
11863 }
11864 else
11865 {
11866 if ((input_len < DISPLAY_LEN_MIN_1100) || (input_len > DISPLAY_LEN_MAX_1100)) return (PARSER_GLOBAL_LENGTH);
11867 }
11868
11869 u32 *digest = (u32 *) hash_buf->digest;
11870
11871 salt_t *salt = hash_buf->salt;
11872
11873 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11874 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11875 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11876 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11877
11878 digest[0] = byte_swap_32 (digest[0]);
11879 digest[1] = byte_swap_32 (digest[1]);
11880 digest[2] = byte_swap_32 (digest[2]);
11881 digest[3] = byte_swap_32 (digest[3]);
11882
11883 digest[0] -= MD4M_A;
11884 digest[1] -= MD4M_B;
11885 digest[2] -= MD4M_C;
11886 digest[3] -= MD4M_D;
11887
11888 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11889
11890 uint salt_len = input_len - 32 - 1;
11891
11892 char *salt_buf = input_buf + 32 + 1;
11893
11894 char *salt_buf_ptr = (char *) salt->salt_buf;
11895
11896 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11897
11898 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11899
11900 salt->salt_len = salt_len;
11901
11902 return (PARSER_OK);
11903 }
11904
11905 int ipb2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11906 {
11907 if (data.opts_type & OPTS_TYPE_ST_HEX)
11908 {
11909 if ((input_len < DISPLAY_LEN_MIN_2811H) || (input_len > DISPLAY_LEN_MAX_2811H)) return (PARSER_GLOBAL_LENGTH);
11910 }
11911 else
11912 {
11913 if ((input_len < DISPLAY_LEN_MIN_2811) || (input_len > DISPLAY_LEN_MAX_2811)) return (PARSER_GLOBAL_LENGTH);
11914 }
11915
11916 u32 *digest = (u32 *) hash_buf->digest;
11917
11918 salt_t *salt = hash_buf->salt;
11919
11920 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11921 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11922 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11923 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11924
11925 digest[0] = byte_swap_32 (digest[0]);
11926 digest[1] = byte_swap_32 (digest[1]);
11927 digest[2] = byte_swap_32 (digest[2]);
11928 digest[3] = byte_swap_32 (digest[3]);
11929
11930 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11931
11932 uint salt_len = input_len - 32 - 1;
11933
11934 char *salt_buf = input_buf + 32 + 1;
11935
11936 uint salt_pc_block[16] = { 0 };
11937
11938 char *salt_pc_block_ptr = (char *) salt_pc_block;
11939
11940 salt_len = parse_and_store_salt (salt_pc_block_ptr, salt_buf, salt_len);
11941
11942 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11943
11944 salt_pc_block_ptr[salt_len] = (unsigned char) 0x80;
11945
11946 salt_pc_block[14] = salt_len * 8;
11947
11948 uint salt_pc_digest[4] = { MAGIC_A, MAGIC_B, MAGIC_C, MAGIC_D };
11949
11950 md5_64 (salt_pc_block, salt_pc_digest);
11951
11952 salt_pc_digest[0] = byte_swap_32 (salt_pc_digest[0]);
11953 salt_pc_digest[1] = byte_swap_32 (salt_pc_digest[1]);
11954 salt_pc_digest[2] = byte_swap_32 (salt_pc_digest[2]);
11955 salt_pc_digest[3] = byte_swap_32 (salt_pc_digest[3]);
11956
11957 u8 *salt_buf_ptr = (u8 *) salt->salt_buf;
11958
11959 memcpy (salt_buf_ptr, salt_buf, salt_len);
11960
11961 u8 *salt_buf_pc_ptr = (u8 *) salt->salt_buf_pc;
11962
11963 bin_to_hex_lower (salt_pc_digest[0], salt_buf_pc_ptr + 0);
11964 bin_to_hex_lower (salt_pc_digest[1], salt_buf_pc_ptr + 8);
11965 bin_to_hex_lower (salt_pc_digest[2], salt_buf_pc_ptr + 16);
11966 bin_to_hex_lower (salt_pc_digest[3], salt_buf_pc_ptr + 24);
11967
11968 salt->salt_len = 32; // changed, was salt_len before -- was a bug? 32 should be correct
11969
11970 return (PARSER_OK);
11971 }
11972
11973 int sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11974 {
11975 if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH);
11976
11977 u32 *digest = (u32 *) hash_buf->digest;
11978
11979 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11980 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11981 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11982 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11983 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11984
11985 digest[0] -= SHA1M_A;
11986 digest[1] -= SHA1M_B;
11987 digest[2] -= SHA1M_C;
11988 digest[3] -= SHA1M_D;
11989 digest[4] -= SHA1M_E;
11990
11991 return (PARSER_OK);
11992 }
11993
11994 int sha1linkedin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11995 {
11996 if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH);
11997
11998 u32 *digest = (u32 *) hash_buf->digest;
11999
12000 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12001 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12002 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12003 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12004 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12005
12006 return (PARSER_OK);
12007 }
12008
12009 int sha1axcrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12010 {
12011 if ((input_len < DISPLAY_LEN_MIN_13300) || (input_len > DISPLAY_LEN_MAX_13300)) return (PARSER_GLOBAL_LENGTH);
12012
12013 if (memcmp (SIGNATURE_AXCRYPT_SHA1, input_buf, 13)) return (PARSER_SIGNATURE_UNMATCHED);
12014
12015 u32 *digest = (u32 *) hash_buf->digest;
12016
12017 input_buf += 14;
12018
12019 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12020 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12021 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12022 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12023 digest[4] = 0;
12024
12025 return (PARSER_OK);
12026 }
12027
12028 int sha1s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12029 {
12030 if (data.opts_type & OPTS_TYPE_ST_HEX)
12031 {
12032 if ((input_len < DISPLAY_LEN_MIN_110H) || (input_len > DISPLAY_LEN_MAX_110H)) return (PARSER_GLOBAL_LENGTH);
12033 }
12034 else
12035 {
12036 if ((input_len < DISPLAY_LEN_MIN_110) || (input_len > DISPLAY_LEN_MAX_110)) return (PARSER_GLOBAL_LENGTH);
12037 }
12038
12039 u32 *digest = (u32 *) hash_buf->digest;
12040
12041 salt_t *salt = hash_buf->salt;
12042
12043 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12044 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12045 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12046 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12047 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12048
12049 digest[0] -= SHA1M_A;
12050 digest[1] -= SHA1M_B;
12051 digest[2] -= SHA1M_C;
12052 digest[3] -= SHA1M_D;
12053 digest[4] -= SHA1M_E;
12054
12055 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12056
12057 uint salt_len = input_len - 40 - 1;
12058
12059 char *salt_buf = input_buf + 40 + 1;
12060
12061 char *salt_buf_ptr = (char *) salt->salt_buf;
12062
12063 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12064
12065 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12066
12067 salt->salt_len = salt_len;
12068
12069 return (PARSER_OK);
12070 }
12071
12072 int pstoken_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12073 {
12074 if ((input_len < DISPLAY_LEN_MIN_13500) || (input_len > DISPLAY_LEN_MAX_13500)) return (PARSER_GLOBAL_LENGTH);
12075
12076 u32 *digest = (u32 *) hash_buf->digest;
12077
12078 salt_t *salt = hash_buf->salt;
12079
12080 pstoken_t *pstoken = (pstoken_t *) hash_buf->esalt;
12081
12082 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12083 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12084 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12085 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12086 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12087
12088 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12089
12090 uint salt_len = input_len - 40 - 1;
12091
12092 char *salt_buf = input_buf + 40 + 1;
12093
12094 if (salt_len == UINT_MAX || salt_len % 2 != 0) return (PARSER_SALT_LENGTH);
12095
12096 u8 *pstoken_ptr = (u8 *) pstoken->salt_buf;
12097
12098 for (uint i = 0, j = 0; i < salt_len; i += 2, j += 1)
12099 {
12100 pstoken_ptr[j] = hex_to_u8 ((const u8 *) &salt_buf[i]);
12101 }
12102
12103 pstoken->salt_len = salt_len / 2;
12104
12105 /* some fake salt for the sorting mechanisms */
12106
12107 salt->salt_buf[0] = pstoken->salt_buf[0];
12108 salt->salt_buf[1] = pstoken->salt_buf[1];
12109 salt->salt_buf[2] = pstoken->salt_buf[2];
12110 salt->salt_buf[3] = pstoken->salt_buf[3];
12111 salt->salt_buf[4] = pstoken->salt_buf[4];
12112 salt->salt_buf[5] = pstoken->salt_buf[5];
12113 salt->salt_buf[6] = pstoken->salt_buf[6];
12114 salt->salt_buf[7] = pstoken->salt_buf[7];
12115
12116 salt->salt_len = 32;
12117
12118 /* we need to check if we can precompute some of the data --
12119 this is possible since the scheme is badly designed */
12120
12121 pstoken->pc_digest[0] = SHA1M_A;
12122 pstoken->pc_digest[1] = SHA1M_B;
12123 pstoken->pc_digest[2] = SHA1M_C;
12124 pstoken->pc_digest[3] = SHA1M_D;
12125 pstoken->pc_digest[4] = SHA1M_E;
12126
12127 pstoken->pc_offset = 0;
12128
12129 for (int i = 0; i < (int) pstoken->salt_len - 63; i += 64)
12130 {
12131 uint w[16];
12132
12133 w[ 0] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 0]);
12134 w[ 1] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 1]);
12135 w[ 2] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 2]);
12136 w[ 3] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 3]);
12137 w[ 4] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 4]);
12138 w[ 5] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 5]);
12139 w[ 6] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 6]);
12140 w[ 7] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 7]);
12141 w[ 8] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 8]);
12142 w[ 9] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 9]);
12143 w[10] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 10]);
12144 w[11] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 11]);
12145 w[12] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 12]);
12146 w[13] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 13]);
12147 w[14] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 14]);
12148 w[15] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 15]);
12149
12150 sha1_64 (w, pstoken->pc_digest);
12151
12152 pstoken->pc_offset += 16;
12153 }
12154
12155 return (PARSER_OK);
12156 }
12157
12158 int sha1b64_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12159 {
12160 if ((input_len < DISPLAY_LEN_MIN_101) || (input_len > DISPLAY_LEN_MAX_101)) return (PARSER_GLOBAL_LENGTH);
12161
12162 if (memcmp (SIGNATURE_SHA1B64, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
12163
12164 u32 *digest = (u32 *) hash_buf->digest;
12165
12166 u8 tmp_buf[100] = { 0 };
12167
12168 base64_decode (base64_to_int, (const u8 *) input_buf + 5, input_len - 5, tmp_buf);
12169
12170 memcpy (digest, tmp_buf, 20);
12171
12172 digest[0] = byte_swap_32 (digest[0]);
12173 digest[1] = byte_swap_32 (digest[1]);
12174 digest[2] = byte_swap_32 (digest[2]);
12175 digest[3] = byte_swap_32 (digest[3]);
12176 digest[4] = byte_swap_32 (digest[4]);
12177
12178 digest[0] -= SHA1M_A;
12179 digest[1] -= SHA1M_B;
12180 digest[2] -= SHA1M_C;
12181 digest[3] -= SHA1M_D;
12182 digest[4] -= SHA1M_E;
12183
12184 return (PARSER_OK);
12185 }
12186
12187 int sha1b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12188 {
12189 if ((input_len < DISPLAY_LEN_MIN_111) || (input_len > DISPLAY_LEN_MAX_111)) return (PARSER_GLOBAL_LENGTH);
12190
12191 if (memcmp (SIGNATURE_SSHA1B64_lower, input_buf, 6) && memcmp (SIGNATURE_SSHA1B64_upper, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
12192
12193 u32 *digest = (u32 *) hash_buf->digest;
12194
12195 salt_t *salt = hash_buf->salt;
12196
12197 u8 tmp_buf[100] = { 0 };
12198
12199 int tmp_len = base64_decode (base64_to_int, (const u8 *) input_buf + 6, input_len - 6, tmp_buf);
12200
12201 if (tmp_len < 20) return (PARSER_HASH_LENGTH);
12202
12203 memcpy (digest, tmp_buf, 20);
12204
12205 int salt_len = tmp_len - 20;
12206
12207 if (salt_len < 0) return (PARSER_SALT_LENGTH);
12208
12209 salt->salt_len = salt_len;
12210
12211 memcpy (salt->salt_buf, tmp_buf + 20, salt->salt_len);
12212
12213 if (data.opts_type & OPTS_TYPE_ST_ADD80)
12214 {
12215 char *ptr = (char *) salt->salt_buf;
12216
12217 ptr[salt->salt_len] = 0x80;
12218 }
12219
12220 digest[0] = byte_swap_32 (digest[0]);
12221 digest[1] = byte_swap_32 (digest[1]);
12222 digest[2] = byte_swap_32 (digest[2]);
12223 digest[3] = byte_swap_32 (digest[3]);
12224 digest[4] = byte_swap_32 (digest[4]);
12225
12226 digest[0] -= SHA1M_A;
12227 digest[1] -= SHA1M_B;
12228 digest[2] -= SHA1M_C;
12229 digest[3] -= SHA1M_D;
12230 digest[4] -= SHA1M_E;
12231
12232 return (PARSER_OK);
12233 }
12234
12235 int mssql2000_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12236 {
12237 if ((input_len < DISPLAY_LEN_MIN_131) || (input_len > DISPLAY_LEN_MAX_131)) return (PARSER_GLOBAL_LENGTH);
12238
12239 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
12240
12241 u32 *digest = (u32 *) hash_buf->digest;
12242
12243 salt_t *salt = hash_buf->salt;
12244
12245 char *salt_buf = input_buf + 6;
12246
12247 uint salt_len = 8;
12248
12249 char *salt_buf_ptr = (char *) salt->salt_buf;
12250
12251 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12252
12253 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12254
12255 salt->salt_len = salt_len;
12256
12257 char *hash_pos = input_buf + 6 + 8 + 40;
12258
12259 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
12260 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
12261 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
12262 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
12263 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
12264
12265 digest[0] -= SHA1M_A;
12266 digest[1] -= SHA1M_B;
12267 digest[2] -= SHA1M_C;
12268 digest[3] -= SHA1M_D;
12269 digest[4] -= SHA1M_E;
12270
12271 return (PARSER_OK);
12272 }
12273
12274 int mssql2005_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12275 {
12276 if ((input_len < DISPLAY_LEN_MIN_132) || (input_len > DISPLAY_LEN_MAX_132)) return (PARSER_GLOBAL_LENGTH);
12277
12278 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
12279
12280 u32 *digest = (u32 *) hash_buf->digest;
12281
12282 salt_t *salt = hash_buf->salt;
12283
12284 char *salt_buf = input_buf + 6;
12285
12286 uint salt_len = 8;
12287
12288 char *salt_buf_ptr = (char *) salt->salt_buf;
12289
12290 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12291
12292 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12293
12294 salt->salt_len = salt_len;
12295
12296 char *hash_pos = input_buf + 6 + 8;
12297
12298 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
12299 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
12300 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
12301 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
12302 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
12303
12304 digest[0] -= SHA1M_A;
12305 digest[1] -= SHA1M_B;
12306 digest[2] -= SHA1M_C;
12307 digest[3] -= SHA1M_D;
12308 digest[4] -= SHA1M_E;
12309
12310 return (PARSER_OK);
12311 }
12312
12313 int mssql2012_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12314 {
12315 if ((input_len < DISPLAY_LEN_MIN_1731) || (input_len > DISPLAY_LEN_MAX_1731)) return (PARSER_GLOBAL_LENGTH);
12316
12317 if (memcmp (SIGNATURE_MSSQL2012, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
12318
12319 u64 *digest = (u64 *) hash_buf->digest;
12320
12321 salt_t *salt = hash_buf->salt;
12322
12323 char *salt_buf = input_buf + 6;
12324
12325 uint salt_len = 8;
12326
12327 char *salt_buf_ptr = (char *) salt->salt_buf;
12328
12329 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12330
12331 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12332
12333 salt->salt_len = salt_len;
12334
12335 char *hash_pos = input_buf + 6 + 8;
12336
12337 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
12338 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
12339 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
12340 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
12341 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
12342 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
12343 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
12344 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
12345
12346 digest[0] -= SHA512M_A;
12347 digest[1] -= SHA512M_B;
12348 digest[2] -= SHA512M_C;
12349 digest[3] -= SHA512M_D;
12350 digest[4] -= SHA512M_E;
12351 digest[5] -= SHA512M_F;
12352 digest[6] -= SHA512M_G;
12353 digest[7] -= SHA512M_H;
12354
12355 return (PARSER_OK);
12356 }
12357
12358 int oracleh_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12359 {
12360 if (data.opts_type & OPTS_TYPE_ST_HEX)
12361 {
12362 if ((input_len < DISPLAY_LEN_MIN_3100H) || (input_len > DISPLAY_LEN_MAX_3100H)) return (PARSER_GLOBAL_LENGTH);
12363 }
12364 else
12365 {
12366 if ((input_len < DISPLAY_LEN_MIN_3100) || (input_len > DISPLAY_LEN_MAX_3100)) return (PARSER_GLOBAL_LENGTH);
12367 }
12368
12369 u32 *digest = (u32 *) hash_buf->digest;
12370
12371 salt_t *salt = hash_buf->salt;
12372
12373 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12374 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12375 digest[2] = 0;
12376 digest[3] = 0;
12377
12378 digest[0] = byte_swap_32 (digest[0]);
12379 digest[1] = byte_swap_32 (digest[1]);
12380
12381 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12382
12383 uint salt_len = input_len - 16 - 1;
12384
12385 char *salt_buf = input_buf + 16 + 1;
12386
12387 char *salt_buf_ptr = (char *) salt->salt_buf;
12388
12389 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12390
12391 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12392
12393 salt->salt_len = salt_len;
12394
12395 return (PARSER_OK);
12396 }
12397
12398 int oracles_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12399 {
12400 if ((input_len < DISPLAY_LEN_MIN_112) || (input_len > DISPLAY_LEN_MAX_112)) return (PARSER_GLOBAL_LENGTH);
12401
12402 u32 *digest = (u32 *) hash_buf->digest;
12403
12404 salt_t *salt = hash_buf->salt;
12405
12406 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12407 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12408 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12409 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12410 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12411
12412 digest[0] -= SHA1M_A;
12413 digest[1] -= SHA1M_B;
12414 digest[2] -= SHA1M_C;
12415 digest[3] -= SHA1M_D;
12416 digest[4] -= SHA1M_E;
12417
12418 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12419
12420 uint salt_len = input_len - 40 - 1;
12421
12422 char *salt_buf = input_buf + 40 + 1;
12423
12424 char *salt_buf_ptr = (char *) salt->salt_buf;
12425
12426 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12427
12428 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12429
12430 salt->salt_len = salt_len;
12431
12432 return (PARSER_OK);
12433 }
12434
12435 int oraclet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12436 {
12437 if ((input_len < DISPLAY_LEN_MIN_12300) || (input_len > DISPLAY_LEN_MAX_12300)) return (PARSER_GLOBAL_LENGTH);
12438
12439 u32 *digest = (u32 *) hash_buf->digest;
12440
12441 salt_t *salt = hash_buf->salt;
12442
12443 char *hash_pos = input_buf;
12444
12445 digest[ 0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
12446 digest[ 1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
12447 digest[ 2] = hex_to_u32 ((const u8 *) &hash_pos[ 16]);
12448 digest[ 3] = hex_to_u32 ((const u8 *) &hash_pos[ 24]);
12449 digest[ 4] = hex_to_u32 ((const u8 *) &hash_pos[ 32]);
12450 digest[ 5] = hex_to_u32 ((const u8 *) &hash_pos[ 40]);
12451 digest[ 6] = hex_to_u32 ((const u8 *) &hash_pos[ 48]);
12452 digest[ 7] = hex_to_u32 ((const u8 *) &hash_pos[ 56]);
12453 digest[ 8] = hex_to_u32 ((const u8 *) &hash_pos[ 64]);
12454 digest[ 9] = hex_to_u32 ((const u8 *) &hash_pos[ 72]);
12455 digest[10] = hex_to_u32 ((const u8 *) &hash_pos[ 80]);
12456 digest[11] = hex_to_u32 ((const u8 *) &hash_pos[ 88]);
12457 digest[12] = hex_to_u32 ((const u8 *) &hash_pos[ 96]);
12458 digest[13] = hex_to_u32 ((const u8 *) &hash_pos[104]);
12459 digest[14] = hex_to_u32 ((const u8 *) &hash_pos[112]);
12460 digest[15] = hex_to_u32 ((const u8 *) &hash_pos[120]);
12461
12462 char *salt_pos = input_buf + 128;
12463
12464 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
12465 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
12466 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
12467 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
12468
12469 salt->salt_iter = ROUNDS_ORACLET - 1;
12470 salt->salt_len = 16;
12471
12472 return (PARSER_OK);
12473 }
12474
12475 int sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12476 {
12477 if ((input_len < DISPLAY_LEN_MIN_1400) || (input_len > DISPLAY_LEN_MAX_1400)) return (PARSER_GLOBAL_LENGTH);
12478
12479 u32 *digest = (u32 *) hash_buf->digest;
12480
12481 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12482 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12483 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12484 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12485 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12486 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
12487 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
12488 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
12489
12490 digest[0] -= SHA256M_A;
12491 digest[1] -= SHA256M_B;
12492 digest[2] -= SHA256M_C;
12493 digest[3] -= SHA256M_D;
12494 digest[4] -= SHA256M_E;
12495 digest[5] -= SHA256M_F;
12496 digest[6] -= SHA256M_G;
12497 digest[7] -= SHA256M_H;
12498
12499 return (PARSER_OK);
12500 }
12501
12502 int sha256s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12503 {
12504 if (data.opts_type & OPTS_TYPE_ST_HEX)
12505 {
12506 if ((input_len < DISPLAY_LEN_MIN_1410H) || (input_len > DISPLAY_LEN_MAX_1410H)) return (PARSER_GLOBAL_LENGTH);
12507 }
12508 else
12509 {
12510 if ((input_len < DISPLAY_LEN_MIN_1410) || (input_len > DISPLAY_LEN_MAX_1410)) return (PARSER_GLOBAL_LENGTH);
12511 }
12512
12513 u32 *digest = (u32 *) hash_buf->digest;
12514
12515 salt_t *salt = hash_buf->salt;
12516
12517 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12518 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12519 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12520 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12521 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12522 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
12523 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
12524 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
12525
12526 digest[0] -= SHA256M_A;
12527 digest[1] -= SHA256M_B;
12528 digest[2] -= SHA256M_C;
12529 digest[3] -= SHA256M_D;
12530 digest[4] -= SHA256M_E;
12531 digest[5] -= SHA256M_F;
12532 digest[6] -= SHA256M_G;
12533 digest[7] -= SHA256M_H;
12534
12535 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12536
12537 uint salt_len = input_len - 64 - 1;
12538
12539 char *salt_buf = input_buf + 64 + 1;
12540
12541 char *salt_buf_ptr = (char *) salt->salt_buf;
12542
12543 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12544
12545 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12546
12547 salt->salt_len = salt_len;
12548
12549 return (PARSER_OK);
12550 }
12551
12552 int sha384_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12553 {
12554 if ((input_len < DISPLAY_LEN_MIN_10800) || (input_len > DISPLAY_LEN_MAX_10800)) return (PARSER_GLOBAL_LENGTH);
12555
12556 u64 *digest = (u64 *) hash_buf->digest;
12557
12558 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
12559 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
12560 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
12561 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
12562 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
12563 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
12564 digest[6] = 0;
12565 digest[7] = 0;
12566
12567 digest[0] -= SHA384M_A;
12568 digest[1] -= SHA384M_B;
12569 digest[2] -= SHA384M_C;
12570 digest[3] -= SHA384M_D;
12571 digest[4] -= SHA384M_E;
12572 digest[5] -= SHA384M_F;
12573 digest[6] -= 0;
12574 digest[7] -= 0;
12575
12576 return (PARSER_OK);
12577 }
12578
12579 int sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12580 {
12581 if ((input_len < DISPLAY_LEN_MIN_1700) || (input_len > DISPLAY_LEN_MAX_1700)) return (PARSER_GLOBAL_LENGTH);
12582
12583 u64 *digest = (u64 *) hash_buf->digest;
12584
12585 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
12586 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
12587 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
12588 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
12589 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
12590 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
12591 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
12592 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
12593
12594 digest[0] -= SHA512M_A;
12595 digest[1] -= SHA512M_B;
12596 digest[2] -= SHA512M_C;
12597 digest[3] -= SHA512M_D;
12598 digest[4] -= SHA512M_E;
12599 digest[5] -= SHA512M_F;
12600 digest[6] -= SHA512M_G;
12601 digest[7] -= SHA512M_H;
12602
12603 return (PARSER_OK);
12604 }
12605
12606 int sha512s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12607 {
12608 if (data.opts_type & OPTS_TYPE_ST_HEX)
12609 {
12610 if ((input_len < DISPLAY_LEN_MIN_1710H) || (input_len > DISPLAY_LEN_MAX_1710H)) return (PARSER_GLOBAL_LENGTH);
12611 }
12612 else
12613 {
12614 if ((input_len < DISPLAY_LEN_MIN_1710) || (input_len > DISPLAY_LEN_MAX_1710)) return (PARSER_GLOBAL_LENGTH);
12615 }
12616
12617 u64 *digest = (u64 *) hash_buf->digest;
12618
12619 salt_t *salt = hash_buf->salt;
12620
12621 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
12622 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
12623 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
12624 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
12625 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
12626 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
12627 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
12628 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
12629
12630 digest[0] -= SHA512M_A;
12631 digest[1] -= SHA512M_B;
12632 digest[2] -= SHA512M_C;
12633 digest[3] -= SHA512M_D;
12634 digest[4] -= SHA512M_E;
12635 digest[5] -= SHA512M_F;
12636 digest[6] -= SHA512M_G;
12637 digest[7] -= SHA512M_H;
12638
12639 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12640
12641 uint salt_len = input_len - 128 - 1;
12642
12643 char *salt_buf = input_buf + 128 + 1;
12644
12645 char *salt_buf_ptr = (char *) salt->salt_buf;
12646
12647 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12648
12649 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12650
12651 salt->salt_len = salt_len;
12652
12653 return (PARSER_OK);
12654 }
12655
12656 int sha512crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12657 {
12658 if (memcmp (SIGNATURE_SHA512CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
12659
12660 u64 *digest = (u64 *) hash_buf->digest;
12661
12662 salt_t *salt = hash_buf->salt;
12663
12664 char *salt_pos = input_buf + 3;
12665
12666 uint iterations_len = 0;
12667
12668 if (memcmp (salt_pos, "rounds=", 7) == 0)
12669 {
12670 salt_pos += 7;
12671
12672 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
12673
12674 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
12675 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
12676
12677 salt_pos[0] = 0x0;
12678
12679 salt->salt_iter = atoi (salt_pos - iterations_len);
12680
12681 salt_pos += 1;
12682
12683 iterations_len += 8;
12684 }
12685 else
12686 {
12687 salt->salt_iter = ROUNDS_SHA512CRYPT;
12688 }
12689
12690 if ((input_len < DISPLAY_LEN_MIN_1800) || (input_len > DISPLAY_LEN_MAX_1800 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
12691
12692 char *hash_pos = strchr (salt_pos, '$');
12693
12694 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12695
12696 uint salt_len = hash_pos - salt_pos;
12697
12698 if (salt_len > 16) return (PARSER_SALT_LENGTH);
12699
12700 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12701
12702 salt->salt_len = salt_len;
12703
12704 hash_pos++;
12705
12706 sha512crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12707
12708 return (PARSER_OK);
12709 }
12710
12711 int keccak_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12712 {
12713 if ((input_len < DISPLAY_LEN_MIN_5000) || (input_len > DISPLAY_LEN_MAX_5000)) return (PARSER_GLOBAL_LENGTH);
12714
12715 if (input_len % 16) return (PARSER_GLOBAL_LENGTH);
12716
12717 u64 *digest = (u64 *) hash_buf->digest;
12718
12719 salt_t *salt = hash_buf->salt;
12720
12721 uint keccak_mdlen = input_len / 2;
12722
12723 for (uint i = 0; i < keccak_mdlen / 8; i++)
12724 {
12725 digest[i] = hex_to_u64 ((const u8 *) &input_buf[i * 16]);
12726
12727 digest[i] = byte_swap_64 (digest[i]);
12728 }
12729
12730 salt->keccak_mdlen = keccak_mdlen;
12731
12732 return (PARSER_OK);
12733 }
12734
12735 int ikepsk_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12736 {
12737 if ((input_len < DISPLAY_LEN_MIN_5300) || (input_len > DISPLAY_LEN_MAX_5300)) return (PARSER_GLOBAL_LENGTH);
12738
12739 u32 *digest = (u32 *) hash_buf->digest;
12740
12741 salt_t *salt = hash_buf->salt;
12742
12743 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
12744
12745 /**
12746 * Parse that strange long line
12747 */
12748
12749 char *in_off[9];
12750
12751 size_t in_len[9] = { 0 };
12752
12753 in_off[0] = strtok (input_buf, ":");
12754
12755 if (in_off[0] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12756
12757 in_len[0] = strlen (in_off[0]);
12758
12759 size_t i;
12760
12761 for (i = 1; i < 9; i++)
12762 {
12763 in_off[i] = strtok (NULL, ":");
12764
12765 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12766
12767 in_len[i] = strlen (in_off[i]);
12768 }
12769
12770 char *ptr = (char *) ikepsk->msg_buf;
12771
12772 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[0] + i);
12773 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[1] + i);
12774 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[2] + i);
12775 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[3] + i);
12776 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[4] + i);
12777 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[5] + i);
12778
12779 *ptr = 0x80;
12780
12781 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
12782
12783 ptr = (char *) ikepsk->nr_buf;
12784
12785 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[6] + i);
12786 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[7] + i);
12787
12788 *ptr = 0x80;
12789
12790 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
12791
12792 /**
12793 * Store to database
12794 */
12795
12796 ptr = in_off[8];
12797
12798 digest[0] = hex_to_u32 ((const u8 *) &ptr[ 0]);
12799 digest[1] = hex_to_u32 ((const u8 *) &ptr[ 8]);
12800 digest[2] = hex_to_u32 ((const u8 *) &ptr[16]);
12801 digest[3] = hex_to_u32 ((const u8 *) &ptr[24]);
12802
12803 digest[0] = byte_swap_32 (digest[0]);
12804 digest[1] = byte_swap_32 (digest[1]);
12805 digest[2] = byte_swap_32 (digest[2]);
12806 digest[3] = byte_swap_32 (digest[3]);
12807
12808 salt->salt_len = 32;
12809
12810 salt->salt_buf[0] = ikepsk->nr_buf[0];
12811 salt->salt_buf[1] = ikepsk->nr_buf[1];
12812 salt->salt_buf[2] = ikepsk->nr_buf[2];
12813 salt->salt_buf[3] = ikepsk->nr_buf[3];
12814 salt->salt_buf[4] = ikepsk->nr_buf[4];
12815 salt->salt_buf[5] = ikepsk->nr_buf[5];
12816 salt->salt_buf[6] = ikepsk->nr_buf[6];
12817 salt->salt_buf[7] = ikepsk->nr_buf[7];
12818
12819 return (PARSER_OK);
12820 }
12821
12822 int ikepsk_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12823 {
12824 if ((input_len < DISPLAY_LEN_MIN_5400) || (input_len > DISPLAY_LEN_MAX_5400)) return (PARSER_GLOBAL_LENGTH);
12825
12826 u32 *digest = (u32 *) hash_buf->digest;
12827
12828 salt_t *salt = hash_buf->salt;
12829
12830 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
12831
12832 /**
12833 * Parse that strange long line
12834 */
12835
12836 char *in_off[9];
12837
12838 size_t in_len[9] = { 0 };
12839
12840 in_off[0] = strtok (input_buf, ":");
12841
12842 if (in_off[0] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12843
12844 in_len[0] = strlen (in_off[0]);
12845
12846 size_t i;
12847
12848 for (i = 1; i < 9; i++)
12849 {
12850 in_off[i] = strtok (NULL, ":");
12851
12852 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12853
12854 in_len[i] = strlen (in_off[i]);
12855 }
12856
12857 char *ptr = (char *) ikepsk->msg_buf;
12858
12859 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[0] + i);
12860 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[1] + i);
12861 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[2] + i);
12862 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[3] + i);
12863 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[4] + i);
12864 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[5] + i);
12865
12866 *ptr = 0x80;
12867
12868 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
12869
12870 ptr = (char *) ikepsk->nr_buf;
12871
12872 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[6] + i);
12873 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[7] + i);
12874
12875 *ptr = 0x80;
12876
12877 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
12878
12879 /**
12880 * Store to database
12881 */
12882
12883 ptr = in_off[8];
12884
12885 digest[0] = hex_to_u32 ((const u8 *) &ptr[ 0]);
12886 digest[1] = hex_to_u32 ((const u8 *) &ptr[ 8]);
12887 digest[2] = hex_to_u32 ((const u8 *) &ptr[16]);
12888 digest[3] = hex_to_u32 ((const u8 *) &ptr[24]);
12889 digest[4] = hex_to_u32 ((const u8 *) &ptr[32]);
12890
12891 salt->salt_len = 32;
12892
12893 salt->salt_buf[0] = ikepsk->nr_buf[0];
12894 salt->salt_buf[1] = ikepsk->nr_buf[1];
12895 salt->salt_buf[2] = ikepsk->nr_buf[2];
12896 salt->salt_buf[3] = ikepsk->nr_buf[3];
12897 salt->salt_buf[4] = ikepsk->nr_buf[4];
12898 salt->salt_buf[5] = ikepsk->nr_buf[5];
12899 salt->salt_buf[6] = ikepsk->nr_buf[6];
12900 salt->salt_buf[7] = ikepsk->nr_buf[7];
12901
12902 return (PARSER_OK);
12903 }
12904
12905 int ripemd160_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12906 {
12907 if ((input_len < DISPLAY_LEN_MIN_6000) || (input_len > DISPLAY_LEN_MAX_6000)) return (PARSER_GLOBAL_LENGTH);
12908
12909 u32 *digest = (u32 *) hash_buf->digest;
12910
12911 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12912 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12913 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12914 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12915 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12916
12917 digest[0] = byte_swap_32 (digest[0]);
12918 digest[1] = byte_swap_32 (digest[1]);
12919 digest[2] = byte_swap_32 (digest[2]);
12920 digest[3] = byte_swap_32 (digest[3]);
12921 digest[4] = byte_swap_32 (digest[4]);
12922
12923 return (PARSER_OK);
12924 }
12925
12926 int whirlpool_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12927 {
12928 if ((input_len < DISPLAY_LEN_MIN_6100) || (input_len > DISPLAY_LEN_MAX_6100)) return (PARSER_GLOBAL_LENGTH);
12929
12930 u32 *digest = (u32 *) hash_buf->digest;
12931
12932 digest[ 0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12933 digest[ 1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12934 digest[ 2] = hex_to_u32 ((const u8 *) &input_buf[ 16]);
12935 digest[ 3] = hex_to_u32 ((const u8 *) &input_buf[ 24]);
12936 digest[ 4] = hex_to_u32 ((const u8 *) &input_buf[ 32]);
12937 digest[ 5] = hex_to_u32 ((const u8 *) &input_buf[ 40]);
12938 digest[ 6] = hex_to_u32 ((const u8 *) &input_buf[ 48]);
12939 digest[ 7] = hex_to_u32 ((const u8 *) &input_buf[ 56]);
12940 digest[ 8] = hex_to_u32 ((const u8 *) &input_buf[ 64]);
12941 digest[ 9] = hex_to_u32 ((const u8 *) &input_buf[ 72]);
12942 digest[10] = hex_to_u32 ((const u8 *) &input_buf[ 80]);
12943 digest[11] = hex_to_u32 ((const u8 *) &input_buf[ 88]);
12944 digest[12] = hex_to_u32 ((const u8 *) &input_buf[ 96]);
12945 digest[13] = hex_to_u32 ((const u8 *) &input_buf[104]);
12946 digest[14] = hex_to_u32 ((const u8 *) &input_buf[112]);
12947 digest[15] = hex_to_u32 ((const u8 *) &input_buf[120]);
12948
12949 return (PARSER_OK);
12950 }
12951
12952 int androidpin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12953 {
12954 if ((input_len < DISPLAY_LEN_MIN_5800) || (input_len > DISPLAY_LEN_MAX_5800)) return (PARSER_GLOBAL_LENGTH);
12955
12956 u32 *digest = (u32 *) hash_buf->digest;
12957
12958 salt_t *salt = hash_buf->salt;
12959
12960 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12961 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12962 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12963 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12964 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12965
12966 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12967
12968 uint salt_len = input_len - 40 - 1;
12969
12970 char *salt_buf = input_buf + 40 + 1;
12971
12972 char *salt_buf_ptr = (char *) salt->salt_buf;
12973
12974 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12975
12976 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12977
12978 salt->salt_len = salt_len;
12979
12980 salt->salt_iter = ROUNDS_ANDROIDPIN - 1;
12981
12982 return (PARSER_OK);
12983 }
12984
12985 int truecrypt_parse_hash_1k (char *input_buf, uint input_len, hash_t *hash_buf)
12986 {
12987 u32 *digest = (u32 *) hash_buf->digest;
12988
12989 salt_t *salt = hash_buf->salt;
12990
12991 tc_t *tc = (tc_t *) hash_buf->esalt;
12992
12993 if (input_len == 0)
12994 {
12995 log_error ("TrueCrypt container not specified");
12996
12997 exit (-1);
12998 }
12999
13000 FILE *fp = fopen (input_buf, "rb");
13001
13002 if (fp == NULL)
13003 {
13004 log_error ("%s: %s", input_buf, strerror (errno));
13005
13006 exit (-1);
13007 }
13008
13009 char buf[512] = { 0 };
13010
13011 int n = fread (buf, 1, sizeof (buf), fp);
13012
13013 fclose (fp);
13014
13015 if (n != 512) return (PARSER_TC_FILE_SIZE);
13016
13017 memcpy (tc->salt_buf, buf, 64);
13018
13019 memcpy (tc->data_buf, buf + 64, 512 - 64);
13020
13021 salt->salt_buf[0] = tc->salt_buf[0];
13022
13023 salt->salt_len = 4;
13024
13025 salt->salt_iter = ROUNDS_TRUECRYPT_1K - 1;
13026
13027 tc->signature = 0x45555254; // "TRUE"
13028
13029 digest[0] = tc->data_buf[0];
13030
13031 return (PARSER_OK);
13032 }
13033
13034 int truecrypt_parse_hash_2k (char *input_buf, uint input_len, hash_t *hash_buf)
13035 {
13036 u32 *digest = (u32 *) hash_buf->digest;
13037
13038 salt_t *salt = hash_buf->salt;
13039
13040 tc_t *tc = (tc_t *) hash_buf->esalt;
13041
13042 if (input_len == 0)
13043 {
13044 log_error ("TrueCrypt container not specified");
13045
13046 exit (-1);
13047 }
13048
13049 FILE *fp = fopen (input_buf, "rb");
13050
13051 if (fp == NULL)
13052 {
13053 log_error ("%s: %s", input_buf, strerror (errno));
13054
13055 exit (-1);
13056 }
13057
13058 char buf[512] = { 0 };
13059
13060 int n = fread (buf, 1, sizeof (buf), fp);
13061
13062 fclose (fp);
13063
13064 if (n != 512) return (PARSER_TC_FILE_SIZE);
13065
13066 memcpy (tc->salt_buf, buf, 64);
13067
13068 memcpy (tc->data_buf, buf + 64, 512 - 64);
13069
13070 salt->salt_buf[0] = tc->salt_buf[0];
13071
13072 salt->salt_len = 4;
13073
13074 salt->salt_iter = ROUNDS_TRUECRYPT_2K - 1;
13075
13076 tc->signature = 0x45555254; // "TRUE"
13077
13078 digest[0] = tc->data_buf[0];
13079
13080 return (PARSER_OK);
13081 }
13082
13083 int veracrypt_parse_hash_200000 (char *input_buf, uint input_len, hash_t *hash_buf)
13084 {
13085 u32 *digest = (u32 *) hash_buf->digest;
13086
13087 salt_t *salt = hash_buf->salt;
13088
13089 tc_t *tc = (tc_t *) hash_buf->esalt;
13090
13091 if (input_len == 0)
13092 {
13093 log_error ("VeraCrypt container not specified");
13094
13095 exit (-1);
13096 }
13097
13098 FILE *fp = fopen (input_buf, "rb");
13099
13100 if (fp == NULL)
13101 {
13102 log_error ("%s: %s", input_buf, strerror (errno));
13103
13104 exit (-1);
13105 }
13106
13107 char buf[512] = { 0 };
13108
13109 int n = fread (buf, 1, sizeof (buf), fp);
13110
13111 fclose (fp);
13112
13113 if (n != 512) return (PARSER_VC_FILE_SIZE);
13114
13115 memcpy (tc->salt_buf, buf, 64);
13116
13117 memcpy (tc->data_buf, buf + 64, 512 - 64);
13118
13119 salt->salt_buf[0] = tc->salt_buf[0];
13120
13121 salt->salt_len = 4;
13122
13123 salt->salt_iter = ROUNDS_VERACRYPT_200000 - 1;
13124
13125 tc->signature = 0x41524556; // "VERA"
13126
13127 digest[0] = tc->data_buf[0];
13128
13129 return (PARSER_OK);
13130 }
13131
13132 int veracrypt_parse_hash_500000 (char *input_buf, uint input_len, hash_t *hash_buf)
13133 {
13134 u32 *digest = (u32 *) hash_buf->digest;
13135
13136 salt_t *salt = hash_buf->salt;
13137
13138 tc_t *tc = (tc_t *) hash_buf->esalt;
13139
13140 if (input_len == 0)
13141 {
13142 log_error ("VeraCrypt container not specified");
13143
13144 exit (-1);
13145 }
13146
13147 FILE *fp = fopen (input_buf, "rb");
13148
13149 if (fp == NULL)
13150 {
13151 log_error ("%s: %s", input_buf, strerror (errno));
13152
13153 exit (-1);
13154 }
13155
13156 char buf[512] = { 0 };
13157
13158 int n = fread (buf, 1, sizeof (buf), fp);
13159
13160 fclose (fp);
13161
13162 if (n != 512) return (PARSER_VC_FILE_SIZE);
13163
13164 memcpy (tc->salt_buf, buf, 64);
13165
13166 memcpy (tc->data_buf, buf + 64, 512 - 64);
13167
13168 salt->salt_buf[0] = tc->salt_buf[0];
13169
13170 salt->salt_len = 4;
13171
13172 salt->salt_iter = ROUNDS_VERACRYPT_500000 - 1;
13173
13174 tc->signature = 0x41524556; // "VERA"
13175
13176 digest[0] = tc->data_buf[0];
13177
13178 return (PARSER_OK);
13179 }
13180
13181 int veracrypt_parse_hash_327661 (char *input_buf, uint input_len, hash_t *hash_buf)
13182 {
13183 u32 *digest = (u32 *) hash_buf->digest;
13184
13185 salt_t *salt = hash_buf->salt;
13186
13187 tc_t *tc = (tc_t *) hash_buf->esalt;
13188
13189 if (input_len == 0)
13190 {
13191 log_error ("VeraCrypt container not specified");
13192
13193 exit (-1);
13194 }
13195
13196 FILE *fp = fopen (input_buf, "rb");
13197
13198 if (fp == NULL)
13199 {
13200 log_error ("%s: %s", input_buf, strerror (errno));
13201
13202 exit (-1);
13203 }
13204
13205 char buf[512] = { 0 };
13206
13207 int n = fread (buf, 1, sizeof (buf), fp);
13208
13209 fclose (fp);
13210
13211 if (n != 512) return (PARSER_VC_FILE_SIZE);
13212
13213 memcpy (tc->salt_buf, buf, 64);
13214
13215 memcpy (tc->data_buf, buf + 64, 512 - 64);
13216
13217 salt->salt_buf[0] = tc->salt_buf[0];
13218
13219 salt->salt_len = 4;
13220
13221 salt->salt_iter = ROUNDS_VERACRYPT_327661 - 1;
13222
13223 tc->signature = 0x41524556; // "VERA"
13224
13225 digest[0] = tc->data_buf[0];
13226
13227 return (PARSER_OK);
13228 }
13229
13230 int veracrypt_parse_hash_655331 (char *input_buf, uint input_len, hash_t *hash_buf)
13231 {
13232 u32 *digest = (u32 *) hash_buf->digest;
13233
13234 salt_t *salt = hash_buf->salt;
13235
13236 tc_t *tc = (tc_t *) hash_buf->esalt;
13237
13238 if (input_len == 0)
13239 {
13240 log_error ("VeraCrypt container not specified");
13241
13242 exit (-1);
13243 }
13244
13245 FILE *fp = fopen (input_buf, "rb");
13246
13247 if (fp == NULL)
13248 {
13249 log_error ("%s: %s", input_buf, strerror (errno));
13250
13251 exit (-1);
13252 }
13253
13254 char buf[512] = { 0 };
13255
13256 int n = fread (buf, 1, sizeof (buf), fp);
13257
13258 fclose (fp);
13259
13260 if (n != 512) return (PARSER_VC_FILE_SIZE);
13261
13262 memcpy (tc->salt_buf, buf, 64);
13263
13264 memcpy (tc->data_buf, buf + 64, 512 - 64);
13265
13266 salt->salt_buf[0] = tc->salt_buf[0];
13267
13268 salt->salt_len = 4;
13269
13270 salt->salt_iter = ROUNDS_VERACRYPT_655331 - 1;
13271
13272 tc->signature = 0x41524556; // "VERA"
13273
13274 digest[0] = tc->data_buf[0];
13275
13276 return (PARSER_OK);
13277 }
13278
13279 int md5aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13280 {
13281 if ((input_len < DISPLAY_LEN_MIN_6300) || (input_len > DISPLAY_LEN_MAX_6300)) return (PARSER_GLOBAL_LENGTH);
13282
13283 if (memcmp (SIGNATURE_MD5AIX, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
13284
13285 u32 *digest = (u32 *) hash_buf->digest;
13286
13287 salt_t *salt = hash_buf->salt;
13288
13289 char *salt_pos = input_buf + 6;
13290
13291 char *hash_pos = strchr (salt_pos, '$');
13292
13293 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13294
13295 uint salt_len = hash_pos - salt_pos;
13296
13297 if (salt_len < 8) return (PARSER_SALT_LENGTH);
13298
13299 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13300
13301 salt->salt_len = salt_len;
13302
13303 salt->salt_iter = 1000;
13304
13305 hash_pos++;
13306
13307 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13308
13309 return (PARSER_OK);
13310 }
13311
13312 int sha1aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13313 {
13314 if ((input_len < DISPLAY_LEN_MIN_6700) || (input_len > DISPLAY_LEN_MAX_6700)) return (PARSER_GLOBAL_LENGTH);
13315
13316 if (memcmp (SIGNATURE_SHA1AIX, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
13317
13318 u32 *digest = (u32 *) hash_buf->digest;
13319
13320 salt_t *salt = hash_buf->salt;
13321
13322 char *iter_pos = input_buf + 7;
13323
13324 char *salt_pos = strchr (iter_pos, '$');
13325
13326 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13327
13328 salt_pos++;
13329
13330 char *hash_pos = strchr (salt_pos, '$');
13331
13332 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13333
13334 uint salt_len = hash_pos - salt_pos;
13335
13336 if (salt_len < 16) return (PARSER_SALT_LENGTH);
13337
13338 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13339
13340 salt->salt_len = salt_len;
13341
13342 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
13343
13344 salt->salt_sign[0] = atoi (salt_iter);
13345
13346 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
13347
13348 hash_pos++;
13349
13350 sha1aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13351
13352 digest[0] = byte_swap_32 (digest[0]);
13353 digest[1] = byte_swap_32 (digest[1]);
13354 digest[2] = byte_swap_32 (digest[2]);
13355 digest[3] = byte_swap_32 (digest[3]);
13356 digest[4] = byte_swap_32 (digest[4]);
13357
13358 return (PARSER_OK);
13359 }
13360
13361 int sha256aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13362 {
13363 if ((input_len < DISPLAY_LEN_MIN_6400) || (input_len > DISPLAY_LEN_MAX_6400)) return (PARSER_GLOBAL_LENGTH);
13364
13365 if (memcmp (SIGNATURE_SHA256AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
13366
13367 u32 *digest = (u32 *) hash_buf->digest;
13368
13369 salt_t *salt = hash_buf->salt;
13370
13371 char *iter_pos = input_buf + 9;
13372
13373 char *salt_pos = strchr (iter_pos, '$');
13374
13375 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13376
13377 salt_pos++;
13378
13379 char *hash_pos = strchr (salt_pos, '$');
13380
13381 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13382
13383 uint salt_len = hash_pos - salt_pos;
13384
13385 if (salt_len < 16) return (PARSER_SALT_LENGTH);
13386
13387 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13388
13389 salt->salt_len = salt_len;
13390
13391 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
13392
13393 salt->salt_sign[0] = atoi (salt_iter);
13394
13395 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
13396
13397 hash_pos++;
13398
13399 sha256aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13400
13401 digest[0] = byte_swap_32 (digest[0]);
13402 digest[1] = byte_swap_32 (digest[1]);
13403 digest[2] = byte_swap_32 (digest[2]);
13404 digest[3] = byte_swap_32 (digest[3]);
13405 digest[4] = byte_swap_32 (digest[4]);
13406 digest[5] = byte_swap_32 (digest[5]);
13407 digest[6] = byte_swap_32 (digest[6]);
13408 digest[7] = byte_swap_32 (digest[7]);
13409
13410 return (PARSER_OK);
13411 }
13412
13413 int sha512aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13414 {
13415 if ((input_len < DISPLAY_LEN_MIN_6500) || (input_len > DISPLAY_LEN_MAX_6500)) return (PARSER_GLOBAL_LENGTH);
13416
13417 if (memcmp (SIGNATURE_SHA512AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
13418
13419 u64 *digest = (u64 *) hash_buf->digest;
13420
13421 salt_t *salt = hash_buf->salt;
13422
13423 char *iter_pos = input_buf + 9;
13424
13425 char *salt_pos = strchr (iter_pos, '$');
13426
13427 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13428
13429 salt_pos++;
13430
13431 char *hash_pos = strchr (salt_pos, '$');
13432
13433 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13434
13435 uint salt_len = hash_pos - salt_pos;
13436
13437 if (salt_len < 16) return (PARSER_SALT_LENGTH);
13438
13439 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13440
13441 salt->salt_len = salt_len;
13442
13443 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
13444
13445 salt->salt_sign[0] = atoi (salt_iter);
13446
13447 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
13448
13449 hash_pos++;
13450
13451 sha512aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13452
13453 digest[0] = byte_swap_64 (digest[0]);
13454 digest[1] = byte_swap_64 (digest[1]);
13455 digest[2] = byte_swap_64 (digest[2]);
13456 digest[3] = byte_swap_64 (digest[3]);
13457 digest[4] = byte_swap_64 (digest[4]);
13458 digest[5] = byte_swap_64 (digest[5]);
13459 digest[6] = byte_swap_64 (digest[6]);
13460 digest[7] = byte_swap_64 (digest[7]);
13461
13462 return (PARSER_OK);
13463 }
13464
13465 int agilekey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13466 {
13467 if ((input_len < DISPLAY_LEN_MIN_6600) || (input_len > DISPLAY_LEN_MAX_6600)) return (PARSER_GLOBAL_LENGTH);
13468
13469 u32 *digest = (u32 *) hash_buf->digest;
13470
13471 salt_t *salt = hash_buf->salt;
13472
13473 agilekey_t *agilekey = (agilekey_t *) hash_buf->esalt;
13474
13475 /**
13476 * parse line
13477 */
13478
13479 char *iterations_pos = input_buf;
13480
13481 char *saltbuf_pos = strchr (iterations_pos, ':');
13482
13483 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13484
13485 uint iterations_len = saltbuf_pos - iterations_pos;
13486
13487 if (iterations_len > 6) return (PARSER_SALT_LENGTH);
13488
13489 saltbuf_pos++;
13490
13491 char *cipherbuf_pos = strchr (saltbuf_pos, ':');
13492
13493 if (cipherbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13494
13495 uint saltbuf_len = cipherbuf_pos - saltbuf_pos;
13496
13497 if (saltbuf_len != 16) return (PARSER_SALT_LENGTH);
13498
13499 uint cipherbuf_len = input_len - iterations_len - 1 - saltbuf_len - 1;
13500
13501 if (cipherbuf_len != 2080) return (PARSER_HASH_LENGTH);
13502
13503 cipherbuf_pos++;
13504
13505 /**
13506 * pbkdf2 iterations
13507 */
13508
13509 salt->salt_iter = atoi (iterations_pos) - 1;
13510
13511 /**
13512 * handle salt encoding
13513 */
13514
13515 char *saltbuf_ptr = (char *) salt->salt_buf;
13516
13517 for (uint i = 0; i < saltbuf_len; i += 2)
13518 {
13519 const char p0 = saltbuf_pos[i + 0];
13520 const char p1 = saltbuf_pos[i + 1];
13521
13522 *saltbuf_ptr++ = hex_convert (p1) << 0
13523 | hex_convert (p0) << 4;
13524 }
13525
13526 salt->salt_len = saltbuf_len / 2;
13527
13528 /**
13529 * handle cipher encoding
13530 */
13531
13532 uint *tmp = (uint *) mymalloc (32);
13533
13534 char *cipherbuf_ptr = (char *) tmp;
13535
13536 for (uint i = 2016; i < cipherbuf_len; i += 2)
13537 {
13538 const char p0 = cipherbuf_pos[i + 0];
13539 const char p1 = cipherbuf_pos[i + 1];
13540
13541 *cipherbuf_ptr++ = hex_convert (p1) << 0
13542 | hex_convert (p0) << 4;
13543 }
13544
13545 // iv is stored at salt_buf 4 (length 16)
13546 // data is stored at salt_buf 8 (length 16)
13547
13548 salt->salt_buf[ 4] = byte_swap_32 (tmp[0]);
13549 salt->salt_buf[ 5] = byte_swap_32 (tmp[1]);
13550 salt->salt_buf[ 6] = byte_swap_32 (tmp[2]);
13551 salt->salt_buf[ 7] = byte_swap_32 (tmp[3]);
13552
13553 salt->salt_buf[ 8] = byte_swap_32 (tmp[4]);
13554 salt->salt_buf[ 9] = byte_swap_32 (tmp[5]);
13555 salt->salt_buf[10] = byte_swap_32 (tmp[6]);
13556 salt->salt_buf[11] = byte_swap_32 (tmp[7]);
13557
13558 free (tmp);
13559
13560 for (uint i = 0, j = 0; i < 1040; i += 1, j += 2)
13561 {
13562 const char p0 = cipherbuf_pos[j + 0];
13563 const char p1 = cipherbuf_pos[j + 1];
13564
13565 agilekey->cipher[i] = hex_convert (p1) << 0
13566 | hex_convert (p0) << 4;
13567 }
13568
13569 /**
13570 * digest buf
13571 */
13572
13573 digest[0] = 0x10101010;
13574 digest[1] = 0x10101010;
13575 digest[2] = 0x10101010;
13576 digest[3] = 0x10101010;
13577
13578 return (PARSER_OK);
13579 }
13580
13581 int lastpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13582 {
13583 if ((input_len < DISPLAY_LEN_MIN_6800) || (input_len > DISPLAY_LEN_MAX_6800)) return (PARSER_GLOBAL_LENGTH);
13584
13585 u32 *digest = (u32 *) hash_buf->digest;
13586
13587 salt_t *salt = hash_buf->salt;
13588
13589 char *hashbuf_pos = input_buf;
13590
13591 char *iterations_pos = strchr (hashbuf_pos, ':');
13592
13593 if (iterations_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13594
13595 uint hash_len = iterations_pos - hashbuf_pos;
13596
13597 if ((hash_len != 32) && (hash_len != 64)) return (PARSER_HASH_LENGTH);
13598
13599 iterations_pos++;
13600
13601 char *saltbuf_pos = strchr (iterations_pos, ':');
13602
13603 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13604
13605 uint iterations_len = saltbuf_pos - iterations_pos;
13606
13607 saltbuf_pos++;
13608
13609 uint salt_len = input_len - hash_len - 1 - iterations_len - 1;
13610
13611 if (salt_len > 32) return (PARSER_SALT_LENGTH);
13612
13613 char *salt_buf_ptr = (char *) salt->salt_buf;
13614
13615 salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, salt_len);
13616
13617 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13618
13619 salt->salt_len = salt_len;
13620
13621 salt->salt_iter = atoi (iterations_pos) - 1;
13622
13623 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
13624 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
13625 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
13626 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
13627
13628 return (PARSER_OK);
13629 }
13630
13631 int gost_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13632 {
13633 if ((input_len < DISPLAY_LEN_MIN_6900) || (input_len > DISPLAY_LEN_MAX_6900)) return (PARSER_GLOBAL_LENGTH);
13634
13635 u32 *digest = (u32 *) hash_buf->digest;
13636
13637 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13638 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13639 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13640 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13641 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
13642 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
13643 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
13644 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
13645
13646 digest[0] = byte_swap_32 (digest[0]);
13647 digest[1] = byte_swap_32 (digest[1]);
13648 digest[2] = byte_swap_32 (digest[2]);
13649 digest[3] = byte_swap_32 (digest[3]);
13650 digest[4] = byte_swap_32 (digest[4]);
13651 digest[5] = byte_swap_32 (digest[5]);
13652 digest[6] = byte_swap_32 (digest[6]);
13653 digest[7] = byte_swap_32 (digest[7]);
13654
13655 return (PARSER_OK);
13656 }
13657
13658 int sha256crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13659 {
13660 if (memcmp (SIGNATURE_SHA256CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
13661
13662 u32 *digest = (u32 *) hash_buf->digest;
13663
13664 salt_t *salt = hash_buf->salt;
13665
13666 char *salt_pos = input_buf + 3;
13667
13668 uint iterations_len = 0;
13669
13670 if (memcmp (salt_pos, "rounds=", 7) == 0)
13671 {
13672 salt_pos += 7;
13673
13674 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
13675
13676 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
13677 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
13678
13679 salt_pos[0] = 0x0;
13680
13681 salt->salt_iter = atoi (salt_pos - iterations_len);
13682
13683 salt_pos += 1;
13684
13685 iterations_len += 8;
13686 }
13687 else
13688 {
13689 salt->salt_iter = ROUNDS_SHA256CRYPT;
13690 }
13691
13692 if ((input_len < DISPLAY_LEN_MIN_7400) || (input_len > DISPLAY_LEN_MAX_7400 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
13693
13694 char *hash_pos = strchr (salt_pos, '$');
13695
13696 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13697
13698 uint salt_len = hash_pos - salt_pos;
13699
13700 if (salt_len > 16) return (PARSER_SALT_LENGTH);
13701
13702 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13703
13704 salt->salt_len = salt_len;
13705
13706 hash_pos++;
13707
13708 sha256crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13709
13710 return (PARSER_OK);
13711 }
13712
13713 int sha512osx_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13714 {
13715 uint max_len = DISPLAY_LEN_MAX_7100 + (2 * 128);
13716
13717 if ((input_len < DISPLAY_LEN_MIN_7100) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
13718
13719 if (memcmp (SIGNATURE_SHA512OSX, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
13720
13721 u64 *digest = (u64 *) hash_buf->digest;
13722
13723 salt_t *salt = hash_buf->salt;
13724
13725 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
13726
13727 char *iter_pos = input_buf + 4;
13728
13729 char *salt_pos = strchr (iter_pos, '$');
13730
13731 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13732
13733 salt_pos++;
13734
13735 char *hash_pos = strchr (salt_pos, '$');
13736
13737 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13738
13739 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
13740
13741 hash_pos++;
13742
13743 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
13744 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
13745 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
13746 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
13747 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
13748 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
13749 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
13750 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
13751
13752 uint salt_len = hash_pos - salt_pos - 1;
13753
13754 if ((salt_len % 2) != 0) return (PARSER_SALT_LENGTH);
13755
13756 salt->salt_len = salt_len / 2;
13757
13758 pbkdf2_sha512->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
13759 pbkdf2_sha512->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
13760 pbkdf2_sha512->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
13761 pbkdf2_sha512->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
13762 pbkdf2_sha512->salt_buf[4] = hex_to_u32 ((const u8 *) &salt_pos[32]);
13763 pbkdf2_sha512->salt_buf[5] = hex_to_u32 ((const u8 *) &salt_pos[40]);
13764 pbkdf2_sha512->salt_buf[6] = hex_to_u32 ((const u8 *) &salt_pos[48]);
13765 pbkdf2_sha512->salt_buf[7] = hex_to_u32 ((const u8 *) &salt_pos[56]);
13766
13767 pbkdf2_sha512->salt_buf[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]);
13768 pbkdf2_sha512->salt_buf[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]);
13769 pbkdf2_sha512->salt_buf[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]);
13770 pbkdf2_sha512->salt_buf[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]);
13771 pbkdf2_sha512->salt_buf[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]);
13772 pbkdf2_sha512->salt_buf[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]);
13773 pbkdf2_sha512->salt_buf[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]);
13774 pbkdf2_sha512->salt_buf[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]);
13775 pbkdf2_sha512->salt_buf[8] = 0x01000000;
13776 pbkdf2_sha512->salt_buf[9] = 0x80;
13777
13778 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
13779
13780 salt->salt_iter = atoi (iter_pos) - 1;
13781
13782 return (PARSER_OK);
13783 }
13784
13785 int episerver4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13786 {
13787 if ((input_len < DISPLAY_LEN_MIN_1441) || (input_len > DISPLAY_LEN_MAX_1441)) return (PARSER_GLOBAL_LENGTH);
13788
13789 if (memcmp (SIGNATURE_EPISERVER4, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
13790
13791 u32 *digest = (u32 *) hash_buf->digest;
13792
13793 salt_t *salt = hash_buf->salt;
13794
13795 char *salt_pos = input_buf + 14;
13796
13797 char *hash_pos = strchr (salt_pos, '*');
13798
13799 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13800
13801 hash_pos++;
13802
13803 uint salt_len = hash_pos - salt_pos - 1;
13804
13805 char *salt_buf_ptr = (char *) salt->salt_buf;
13806
13807 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13808
13809 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13810
13811 salt->salt_len = salt_len;
13812
13813 u8 tmp_buf[100] = { 0 };
13814
13815 base64_decode (base64_to_int, (const u8 *) hash_pos, 43, tmp_buf);
13816
13817 memcpy (digest, tmp_buf, 32);
13818
13819 digest[0] = byte_swap_32 (digest[0]);
13820 digest[1] = byte_swap_32 (digest[1]);
13821 digest[2] = byte_swap_32 (digest[2]);
13822 digest[3] = byte_swap_32 (digest[3]);
13823 digest[4] = byte_swap_32 (digest[4]);
13824 digest[5] = byte_swap_32 (digest[5]);
13825 digest[6] = byte_swap_32 (digest[6]);
13826 digest[7] = byte_swap_32 (digest[7]);
13827
13828 digest[0] -= SHA256M_A;
13829 digest[1] -= SHA256M_B;
13830 digest[2] -= SHA256M_C;
13831 digest[3] -= SHA256M_D;
13832 digest[4] -= SHA256M_E;
13833 digest[5] -= SHA256M_F;
13834 digest[6] -= SHA256M_G;
13835 digest[7] -= SHA256M_H;
13836
13837 return (PARSER_OK);
13838 }
13839
13840 int sha512grub_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13841 {
13842 uint max_len = DISPLAY_LEN_MAX_7200 + (8 * 128);
13843
13844 if ((input_len < DISPLAY_LEN_MIN_7200) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
13845
13846 if (memcmp (SIGNATURE_SHA512GRUB, input_buf, 19)) return (PARSER_SIGNATURE_UNMATCHED);
13847
13848 u64 *digest = (u64 *) hash_buf->digest;
13849
13850 salt_t *salt = hash_buf->salt;
13851
13852 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
13853
13854 char *iter_pos = input_buf + 19;
13855
13856 char *salt_pos = strchr (iter_pos, '.');
13857
13858 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13859
13860 salt_pos++;
13861
13862 char *hash_pos = strchr (salt_pos, '.');
13863
13864 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13865
13866 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
13867
13868 hash_pos++;
13869
13870 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
13871 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
13872 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
13873 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
13874 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
13875 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
13876 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
13877 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
13878
13879 uint salt_len = hash_pos - salt_pos - 1;
13880
13881 salt_len /= 2;
13882
13883 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
13884
13885 uint i;
13886
13887 for (i = 0; i < salt_len; i++)
13888 {
13889 salt_buf_ptr[i] = hex_to_u8 ((const u8 *) &salt_pos[i * 2]);
13890 }
13891
13892 salt_buf_ptr[salt_len + 3] = 0x01;
13893 salt_buf_ptr[salt_len + 4] = 0x80;
13894
13895 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
13896
13897 salt->salt_len = salt_len;
13898
13899 salt->salt_iter = atoi (iter_pos) - 1;
13900
13901 return (PARSER_OK);
13902 }
13903
13904 int sha512b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13905 {
13906 if ((input_len < DISPLAY_LEN_MIN_1711) || (input_len > DISPLAY_LEN_MAX_1711)) return (PARSER_GLOBAL_LENGTH);
13907
13908 if (memcmp (SIGNATURE_SHA512B64S, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
13909
13910 u64 *digest = (u64 *) hash_buf->digest;
13911
13912 salt_t *salt = hash_buf->salt;
13913
13914 u8 tmp_buf[120] = { 0 };
13915
13916 int tmp_len = base64_decode (base64_to_int, (const u8 *) input_buf + 9, input_len - 9, tmp_buf);
13917
13918 if (tmp_len < 64) return (PARSER_HASH_LENGTH);
13919
13920 memcpy (digest, tmp_buf, 64);
13921
13922 digest[0] = byte_swap_64 (digest[0]);
13923 digest[1] = byte_swap_64 (digest[1]);
13924 digest[2] = byte_swap_64 (digest[2]);
13925 digest[3] = byte_swap_64 (digest[3]);
13926 digest[4] = byte_swap_64 (digest[4]);
13927 digest[5] = byte_swap_64 (digest[5]);
13928 digest[6] = byte_swap_64 (digest[6]);
13929 digest[7] = byte_swap_64 (digest[7]);
13930
13931 digest[0] -= SHA512M_A;
13932 digest[1] -= SHA512M_B;
13933 digest[2] -= SHA512M_C;
13934 digest[3] -= SHA512M_D;
13935 digest[4] -= SHA512M_E;
13936 digest[5] -= SHA512M_F;
13937 digest[6] -= SHA512M_G;
13938 digest[7] -= SHA512M_H;
13939
13940 int salt_len = tmp_len - 64;
13941
13942 if (salt_len < 0) return (PARSER_SALT_LENGTH);
13943
13944 salt->salt_len = salt_len;
13945
13946 memcpy (salt->salt_buf, tmp_buf + 64, salt->salt_len);
13947
13948 if (data.opts_type & OPTS_TYPE_ST_ADD80)
13949 {
13950 char *ptr = (char *) salt->salt_buf;
13951
13952 ptr[salt->salt_len] = 0x80;
13953 }
13954
13955 return (PARSER_OK);
13956 }
13957
13958 int hmacmd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13959 {
13960 if (data.opts_type & OPTS_TYPE_ST_HEX)
13961 {
13962 if ((input_len < DISPLAY_LEN_MIN_50H) || (input_len > DISPLAY_LEN_MAX_50H)) return (PARSER_GLOBAL_LENGTH);
13963 }
13964 else
13965 {
13966 if ((input_len < DISPLAY_LEN_MIN_50) || (input_len > DISPLAY_LEN_MAX_50)) return (PARSER_GLOBAL_LENGTH);
13967 }
13968
13969 u32 *digest = (u32 *) hash_buf->digest;
13970
13971 salt_t *salt = hash_buf->salt;
13972
13973 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13974 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13975 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13976 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13977
13978 digest[0] = byte_swap_32 (digest[0]);
13979 digest[1] = byte_swap_32 (digest[1]);
13980 digest[2] = byte_swap_32 (digest[2]);
13981 digest[3] = byte_swap_32 (digest[3]);
13982
13983 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13984
13985 uint salt_len = input_len - 32 - 1;
13986
13987 char *salt_buf = input_buf + 32 + 1;
13988
13989 char *salt_buf_ptr = (char *) salt->salt_buf;
13990
13991 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13992
13993 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13994
13995 salt->salt_len = salt_len;
13996
13997 return (PARSER_OK);
13998 }
13999
14000 int hmacsha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14001 {
14002 if (data.opts_type & OPTS_TYPE_ST_HEX)
14003 {
14004 if ((input_len < DISPLAY_LEN_MIN_150H) || (input_len > DISPLAY_LEN_MAX_150H)) return (PARSER_GLOBAL_LENGTH);
14005 }
14006 else
14007 {
14008 if ((input_len < DISPLAY_LEN_MIN_150) || (input_len > DISPLAY_LEN_MAX_150)) return (PARSER_GLOBAL_LENGTH);
14009 }
14010
14011 u32 *digest = (u32 *) hash_buf->digest;
14012
14013 salt_t *salt = hash_buf->salt;
14014
14015 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14016 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14017 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14018 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14019 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
14020
14021 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14022
14023 uint salt_len = input_len - 40 - 1;
14024
14025 char *salt_buf = input_buf + 40 + 1;
14026
14027 char *salt_buf_ptr = (char *) salt->salt_buf;
14028
14029 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14030
14031 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14032
14033 salt->salt_len = salt_len;
14034
14035 return (PARSER_OK);
14036 }
14037
14038 int hmacsha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14039 {
14040 if (data.opts_type & OPTS_TYPE_ST_HEX)
14041 {
14042 if ((input_len < DISPLAY_LEN_MIN_1450H) || (input_len > DISPLAY_LEN_MAX_1450H)) return (PARSER_GLOBAL_LENGTH);
14043 }
14044 else
14045 {
14046 if ((input_len < DISPLAY_LEN_MIN_1450) || (input_len > DISPLAY_LEN_MAX_1450)) return (PARSER_GLOBAL_LENGTH);
14047 }
14048
14049 u32 *digest = (u32 *) hash_buf->digest;
14050
14051 salt_t *salt = hash_buf->salt;
14052
14053 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14054 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14055 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14056 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14057 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
14058 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
14059 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
14060 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
14061
14062 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14063
14064 uint salt_len = input_len - 64 - 1;
14065
14066 char *salt_buf = input_buf + 64 + 1;
14067
14068 char *salt_buf_ptr = (char *) salt->salt_buf;
14069
14070 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14071
14072 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14073
14074 salt->salt_len = salt_len;
14075
14076 return (PARSER_OK);
14077 }
14078
14079 int hmacsha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14080 {
14081 if (data.opts_type & OPTS_TYPE_ST_HEX)
14082 {
14083 if ((input_len < DISPLAY_LEN_MIN_1750H) || (input_len > DISPLAY_LEN_MAX_1750H)) return (PARSER_GLOBAL_LENGTH);
14084 }
14085 else
14086 {
14087 if ((input_len < DISPLAY_LEN_MIN_1750) || (input_len > DISPLAY_LEN_MAX_1750)) return (PARSER_GLOBAL_LENGTH);
14088 }
14089
14090 u64 *digest = (u64 *) hash_buf->digest;
14091
14092 salt_t *salt = hash_buf->salt;
14093
14094 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
14095 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
14096 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
14097 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
14098 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
14099 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
14100 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
14101 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
14102
14103 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14104
14105 uint salt_len = input_len - 128 - 1;
14106
14107 char *salt_buf = input_buf + 128 + 1;
14108
14109 char *salt_buf_ptr = (char *) salt->salt_buf;
14110
14111 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14112
14113 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14114
14115 salt->salt_len = salt_len;
14116
14117 return (PARSER_OK);
14118 }
14119
14120 int krb5pa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14121 {
14122 if ((input_len < DISPLAY_LEN_MIN_7500) || (input_len > DISPLAY_LEN_MAX_7500)) return (PARSER_GLOBAL_LENGTH);
14123
14124 if (memcmp (SIGNATURE_KRB5PA, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
14125
14126 u32 *digest = (u32 *) hash_buf->digest;
14127
14128 salt_t *salt = hash_buf->salt;
14129
14130 krb5pa_t *krb5pa = (krb5pa_t *) hash_buf->esalt;
14131
14132 /**
14133 * parse line
14134 */
14135
14136 char *user_pos = input_buf + 10 + 1;
14137
14138 char *realm_pos = strchr (user_pos, '$');
14139
14140 if (realm_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14141
14142 uint user_len = realm_pos - user_pos;
14143
14144 if (user_len >= 64) return (PARSER_SALT_LENGTH);
14145
14146 realm_pos++;
14147
14148 char *salt_pos = strchr (realm_pos, '$');
14149
14150 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14151
14152 uint realm_len = salt_pos - realm_pos;
14153
14154 if (realm_len >= 64) return (PARSER_SALT_LENGTH);
14155
14156 salt_pos++;
14157
14158 char *data_pos = strchr (salt_pos, '$');
14159
14160 if (data_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14161
14162 uint salt_len = data_pos - salt_pos;
14163
14164 if (salt_len >= 128) return (PARSER_SALT_LENGTH);
14165
14166 data_pos++;
14167
14168 uint data_len = input_len - 10 - 1 - user_len - 1 - realm_len - 1 - salt_len - 1;
14169
14170 if (data_len != ((36 + 16) * 2)) return (PARSER_SALT_LENGTH);
14171
14172 /**
14173 * copy data
14174 */
14175
14176 memcpy (krb5pa->user, user_pos, user_len);
14177 memcpy (krb5pa->realm, realm_pos, realm_len);
14178 memcpy (krb5pa->salt, salt_pos, salt_len);
14179
14180 char *timestamp_ptr = (char *) krb5pa->timestamp;
14181
14182 for (uint i = 0; i < (36 * 2); i += 2)
14183 {
14184 const char p0 = data_pos[i + 0];
14185 const char p1 = data_pos[i + 1];
14186
14187 *timestamp_ptr++ = hex_convert (p1) << 0
14188 | hex_convert (p0) << 4;
14189 }
14190
14191 char *checksum_ptr = (char *) krb5pa->checksum;
14192
14193 for (uint i = (36 * 2); i < ((36 + 16) * 2); i += 2)
14194 {
14195 const char p0 = data_pos[i + 0];
14196 const char p1 = data_pos[i + 1];
14197
14198 *checksum_ptr++ = hex_convert (p1) << 0
14199 | hex_convert (p0) << 4;
14200 }
14201
14202 /**
14203 * copy some data to generic buffers to make sorting happy
14204 */
14205
14206 salt->salt_buf[0] = krb5pa->timestamp[0];
14207 salt->salt_buf[1] = krb5pa->timestamp[1];
14208 salt->salt_buf[2] = krb5pa->timestamp[2];
14209 salt->salt_buf[3] = krb5pa->timestamp[3];
14210 salt->salt_buf[4] = krb5pa->timestamp[4];
14211 salt->salt_buf[5] = krb5pa->timestamp[5];
14212 salt->salt_buf[6] = krb5pa->timestamp[6];
14213 salt->salt_buf[7] = krb5pa->timestamp[7];
14214 salt->salt_buf[8] = krb5pa->timestamp[8];
14215
14216 salt->salt_len = 36;
14217
14218 digest[0] = krb5pa->checksum[0];
14219 digest[1] = krb5pa->checksum[1];
14220 digest[2] = krb5pa->checksum[2];
14221 digest[3] = krb5pa->checksum[3];
14222
14223 return (PARSER_OK);
14224 }
14225
14226 int sapb_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14227 {
14228 if ((input_len < DISPLAY_LEN_MIN_7700) || (input_len > DISPLAY_LEN_MAX_7700)) return (PARSER_GLOBAL_LENGTH);
14229
14230 u32 *digest = (u32 *) hash_buf->digest;
14231
14232 salt_t *salt = hash_buf->salt;
14233
14234 /**
14235 * parse line
14236 */
14237
14238 char *salt_pos = input_buf;
14239
14240 char *hash_pos = strchr (salt_pos, '$');
14241
14242 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14243
14244 uint salt_len = hash_pos - salt_pos;
14245
14246 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
14247
14248 hash_pos++;
14249
14250 uint hash_len = input_len - 1 - salt_len;
14251
14252 if (hash_len != 16) return (PARSER_HASH_LENGTH);
14253
14254 /**
14255 * valid some data
14256 */
14257
14258 uint user_len = 0;
14259
14260 for (uint i = 0; i < salt_len; i++)
14261 {
14262 if (salt_pos[i] == ' ') continue;
14263
14264 user_len++;
14265 }
14266
14267 // SAP user names cannot be longer than 12 characters
14268 if (user_len > 12) return (PARSER_SALT_LENGTH);
14269
14270 // SAP user name cannot start with ! or ?
14271 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
14272
14273 /**
14274 * copy data
14275 */
14276
14277 char *salt_buf_ptr = (char *) salt->salt_buf;
14278
14279 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
14280
14281 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14282
14283 salt->salt_len = salt_len;
14284
14285 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[0]);
14286 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[8]);
14287 digest[2] = 0;
14288 digest[3] = 0;
14289
14290 digest[0] = byte_swap_32 (digest[0]);
14291 digest[1] = byte_swap_32 (digest[1]);
14292
14293 return (PARSER_OK);
14294 }
14295
14296 int sapg_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14297 {
14298 if ((input_len < DISPLAY_LEN_MIN_7800) || (input_len > DISPLAY_LEN_MAX_7800)) return (PARSER_GLOBAL_LENGTH);
14299
14300 u32 *digest = (u32 *) hash_buf->digest;
14301
14302 salt_t *salt = hash_buf->salt;
14303
14304 /**
14305 * parse line
14306 */
14307
14308 char *salt_pos = input_buf;
14309
14310 char *hash_pos = strchr (salt_pos, '$');
14311
14312 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14313
14314 uint salt_len = hash_pos - salt_pos;
14315
14316 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
14317
14318 hash_pos++;
14319
14320 uint hash_len = input_len - 1 - salt_len;
14321
14322 if (hash_len != 40) return (PARSER_HASH_LENGTH);
14323
14324 /**
14325 * valid some data
14326 */
14327
14328 uint user_len = 0;
14329
14330 for (uint i = 0; i < salt_len; i++)
14331 {
14332 if (salt_pos[i] == ' ') continue;
14333
14334 user_len++;
14335 }
14336
14337 // SAP user names cannot be longer than 12 characters
14338 // this is kinda buggy. if the username is in utf the length can be up to length 12*3
14339 // so far nobody complained so we stay with this because it helps in optimization
14340 // final string can have a max size of 32 (password) + (10 * 5) = lengthMagicArray + 12 (max salt) + 1 (the 0x80)
14341
14342 if (user_len > 12) return (PARSER_SALT_LENGTH);
14343
14344 // SAP user name cannot start with ! or ?
14345 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
14346
14347 /**
14348 * copy data
14349 */
14350
14351 char *salt_buf_ptr = (char *) salt->salt_buf;
14352
14353 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
14354
14355 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14356
14357 salt->salt_len = salt_len;
14358
14359 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
14360 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
14361 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
14362 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
14363 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
14364
14365 return (PARSER_OK);
14366 }
14367
14368 int drupal7_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14369 {
14370 if ((input_len < DISPLAY_LEN_MIN_7900) || (input_len > DISPLAY_LEN_MAX_7900)) return (PARSER_GLOBAL_LENGTH);
14371
14372 if (memcmp (SIGNATURE_DRUPAL7, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14373
14374 u64 *digest = (u64 *) hash_buf->digest;
14375
14376 salt_t *salt = hash_buf->salt;
14377
14378 char *iter_pos = input_buf + 3;
14379
14380 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
14381
14382 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
14383
14384 memcpy ((char *) salt->salt_sign, input_buf, 4);
14385
14386 salt->salt_iter = salt_iter;
14387
14388 char *salt_pos = iter_pos + 1;
14389
14390 uint salt_len = 8;
14391
14392 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
14393
14394 salt->salt_len = salt_len;
14395
14396 char *hash_pos = salt_pos + salt_len;
14397
14398 drupal7_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
14399
14400 // ugly hack start
14401
14402 char *tmp = (char *) salt->salt_buf_pc;
14403
14404 tmp[0] = hash_pos[42];
14405
14406 // ugly hack end
14407
14408 digest[ 0] = byte_swap_64 (digest[ 0]);
14409 digest[ 1] = byte_swap_64 (digest[ 1]);
14410 digest[ 2] = byte_swap_64 (digest[ 2]);
14411 digest[ 3] = byte_swap_64 (digest[ 3]);
14412 digest[ 4] = 0;
14413 digest[ 5] = 0;
14414 digest[ 6] = 0;
14415 digest[ 7] = 0;
14416
14417 return (PARSER_OK);
14418 }
14419
14420 int sybasease_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14421 {
14422 if ((input_len < DISPLAY_LEN_MIN_8000) || (input_len > DISPLAY_LEN_MAX_8000)) return (PARSER_GLOBAL_LENGTH);
14423
14424 if (memcmp (SIGNATURE_SYBASEASE, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14425
14426 u32 *digest = (u32 *) hash_buf->digest;
14427
14428 salt_t *salt = hash_buf->salt;
14429
14430 char *salt_buf = input_buf + 6;
14431
14432 uint salt_len = 16;
14433
14434 char *salt_buf_ptr = (char *) salt->salt_buf;
14435
14436 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14437
14438 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14439
14440 salt->salt_len = salt_len;
14441
14442 char *hash_pos = input_buf + 6 + 16;
14443
14444 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
14445 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
14446 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
14447 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
14448 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
14449 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
14450 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
14451 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
14452
14453 return (PARSER_OK);
14454 }
14455
14456 int mysql323_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14457 {
14458 if ((input_len < DISPLAY_LEN_MIN_200) || (input_len > DISPLAY_LEN_MAX_200)) return (PARSER_GLOBAL_LENGTH);
14459
14460 u32 *digest = (u32 *) hash_buf->digest;
14461
14462 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14463 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14464 digest[2] = 0;
14465 digest[3] = 0;
14466
14467 return (PARSER_OK);
14468 }
14469
14470 int rakp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14471 {
14472 if ((input_len < DISPLAY_LEN_MIN_7300) || (input_len > DISPLAY_LEN_MAX_7300)) return (PARSER_GLOBAL_LENGTH);
14473
14474 u32 *digest = (u32 *) hash_buf->digest;
14475
14476 salt_t *salt = hash_buf->salt;
14477
14478 rakp_t *rakp = (rakp_t *) hash_buf->esalt;
14479
14480 char *saltbuf_pos = input_buf;
14481
14482 char *hashbuf_pos = strchr (saltbuf_pos, ':');
14483
14484 if (hashbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14485
14486 uint saltbuf_len = hashbuf_pos - saltbuf_pos;
14487
14488 if (saltbuf_len < 64) return (PARSER_SALT_LENGTH);
14489 if (saltbuf_len > 512) return (PARSER_SALT_LENGTH);
14490
14491 if (saltbuf_len & 1) return (PARSER_SALT_LENGTH); // muss gerade sein wegen hex
14492
14493 hashbuf_pos++;
14494
14495 uint hashbuf_len = input_len - saltbuf_len - 1;
14496
14497 if (hashbuf_len != 40) return (PARSER_HASH_LENGTH);
14498
14499 char *salt_ptr = (char *) saltbuf_pos;
14500 char *rakp_ptr = (char *) rakp->salt_buf;
14501
14502 uint i;
14503 uint j;
14504
14505 for (i = 0, j = 0; i < saltbuf_len; i += 2, j += 1)
14506 {
14507 rakp_ptr[j] = hex_to_u8 ((const u8 *) &salt_ptr[i]);
14508 }
14509
14510 rakp_ptr[j] = 0x80;
14511
14512 rakp->salt_len = j;
14513
14514 for (i = 0; i < 64; i++)
14515 {
14516 rakp->salt_buf[i] = byte_swap_32 (rakp->salt_buf[i]);
14517 }
14518
14519 salt->salt_buf[0] = rakp->salt_buf[0];
14520 salt->salt_buf[1] = rakp->salt_buf[1];
14521 salt->salt_buf[2] = rakp->salt_buf[2];
14522 salt->salt_buf[3] = rakp->salt_buf[3];
14523 salt->salt_buf[4] = rakp->salt_buf[4];
14524 salt->salt_buf[5] = rakp->salt_buf[5];
14525 salt->salt_buf[6] = rakp->salt_buf[6];
14526 salt->salt_buf[7] = rakp->salt_buf[7];
14527
14528 salt->salt_len = 32; // muss min. 32 haben
14529
14530 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
14531 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
14532 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
14533 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
14534 digest[4] = hex_to_u32 ((const u8 *) &hashbuf_pos[32]);
14535
14536 return (PARSER_OK);
14537 }
14538
14539 int netscaler_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14540 {
14541 if ((input_len < DISPLAY_LEN_MIN_8100) || (input_len > DISPLAY_LEN_MAX_8100)) return (PARSER_GLOBAL_LENGTH);
14542
14543 u32 *digest = (u32 *) hash_buf->digest;
14544
14545 salt_t *salt = hash_buf->salt;
14546
14547 if (memcmp (SIGNATURE_NETSCALER, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
14548
14549 char *salt_pos = input_buf + 1;
14550
14551 memcpy (salt->salt_buf, salt_pos, 8);
14552
14553 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
14554 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
14555
14556 salt->salt_len = 8;
14557
14558 char *hash_pos = salt_pos + 8;
14559
14560 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
14561 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
14562 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
14563 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
14564 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
14565
14566 digest[0] -= SHA1M_A;
14567 digest[1] -= SHA1M_B;
14568 digest[2] -= SHA1M_C;
14569 digest[3] -= SHA1M_D;
14570 digest[4] -= SHA1M_E;
14571
14572 return (PARSER_OK);
14573 }
14574
14575 int chap_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14576 {
14577 if ((input_len < DISPLAY_LEN_MIN_4800) || (input_len > DISPLAY_LEN_MAX_4800)) return (PARSER_GLOBAL_LENGTH);
14578
14579 u32 *digest = (u32 *) hash_buf->digest;
14580
14581 salt_t *salt = hash_buf->salt;
14582
14583 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14584 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14585 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14586 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14587
14588 digest[0] = byte_swap_32 (digest[0]);
14589 digest[1] = byte_swap_32 (digest[1]);
14590 digest[2] = byte_swap_32 (digest[2]);
14591 digest[3] = byte_swap_32 (digest[3]);
14592
14593 digest[0] -= MD5M_A;
14594 digest[1] -= MD5M_B;
14595 digest[2] -= MD5M_C;
14596 digest[3] -= MD5M_D;
14597
14598 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14599
14600 char *salt_buf_ptr = input_buf + 32 + 1;
14601
14602 u32 *salt_buf = salt->salt_buf;
14603
14604 salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf_ptr[ 0]);
14605 salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf_ptr[ 8]);
14606 salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf_ptr[16]);
14607 salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf_ptr[24]);
14608
14609 salt_buf[0] = byte_swap_32 (salt_buf[0]);
14610 salt_buf[1] = byte_swap_32 (salt_buf[1]);
14611 salt_buf[2] = byte_swap_32 (salt_buf[2]);
14612 salt_buf[3] = byte_swap_32 (salt_buf[3]);
14613
14614 salt->salt_len = 16 + 1;
14615
14616 if (input_buf[65] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14617
14618 char *idbyte_buf_ptr = input_buf + 32 + 1 + 32 + 1;
14619
14620 salt_buf[4] = hex_to_u8 ((const u8 *) &idbyte_buf_ptr[0]) & 0xff;
14621
14622 return (PARSER_OK);
14623 }
14624
14625 int cloudkey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14626 {
14627 if ((input_len < DISPLAY_LEN_MIN_8200) || (input_len > DISPLAY_LEN_MAX_8200)) return (PARSER_GLOBAL_LENGTH);
14628
14629 u32 *digest = (u32 *) hash_buf->digest;
14630
14631 salt_t *salt = hash_buf->salt;
14632
14633 cloudkey_t *cloudkey = (cloudkey_t *) hash_buf->esalt;
14634
14635 /**
14636 * parse line
14637 */
14638
14639 char *hashbuf_pos = input_buf;
14640
14641 char *saltbuf_pos = strchr (hashbuf_pos, ':');
14642
14643 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14644
14645 const uint hashbuf_len = saltbuf_pos - hashbuf_pos;
14646
14647 if (hashbuf_len != 64) return (PARSER_HASH_LENGTH);
14648
14649 saltbuf_pos++;
14650
14651 char *iteration_pos = strchr (saltbuf_pos, ':');
14652
14653 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14654
14655 const uint saltbuf_len = iteration_pos - saltbuf_pos;
14656
14657 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
14658
14659 iteration_pos++;
14660
14661 char *databuf_pos = strchr (iteration_pos, ':');
14662
14663 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14664
14665 const uint iteration_len = databuf_pos - iteration_pos;
14666
14667 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
14668 if (iteration_len > 8) return (PARSER_SALT_ITERATION);
14669
14670 const uint databuf_len = input_len - hashbuf_len - 1 - saltbuf_len - 1 - iteration_len - 1;
14671
14672 if (databuf_len < 1) return (PARSER_SALT_LENGTH);
14673 if (databuf_len > 2048) return (PARSER_SALT_LENGTH);
14674
14675 databuf_pos++;
14676
14677 // digest
14678
14679 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
14680 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
14681 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
14682 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
14683 digest[4] = hex_to_u32 ((const u8 *) &hashbuf_pos[32]);
14684 digest[5] = hex_to_u32 ((const u8 *) &hashbuf_pos[40]);
14685 digest[6] = hex_to_u32 ((const u8 *) &hashbuf_pos[48]);
14686 digest[7] = hex_to_u32 ((const u8 *) &hashbuf_pos[56]);
14687
14688 // salt
14689
14690 char *saltbuf_ptr = (char *) salt->salt_buf;
14691
14692 for (uint i = 0; i < saltbuf_len; i += 2)
14693 {
14694 const char p0 = saltbuf_pos[i + 0];
14695 const char p1 = saltbuf_pos[i + 1];
14696
14697 *saltbuf_ptr++ = hex_convert (p1) << 0
14698 | hex_convert (p0) << 4;
14699 }
14700
14701 salt->salt_buf[4] = 0x01000000;
14702 salt->salt_buf[5] = 0x80;
14703
14704 salt->salt_len = saltbuf_len / 2;
14705
14706 // iteration
14707
14708 salt->salt_iter = atoi (iteration_pos) - 1;
14709
14710 // data
14711
14712 char *databuf_ptr = (char *) cloudkey->data_buf;
14713
14714 for (uint i = 0; i < databuf_len; i += 2)
14715 {
14716 const char p0 = databuf_pos[i + 0];
14717 const char p1 = databuf_pos[i + 1];
14718
14719 *databuf_ptr++ = hex_convert (p1) << 0
14720 | hex_convert (p0) << 4;
14721 }
14722
14723 *databuf_ptr++ = 0x80;
14724
14725 for (uint i = 0; i < 512; i++)
14726 {
14727 cloudkey->data_buf[i] = byte_swap_32 (cloudkey->data_buf[i]);
14728 }
14729
14730 cloudkey->data_len = databuf_len / 2;
14731
14732 return (PARSER_OK);
14733 }
14734
14735 int nsec3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14736 {
14737 if ((input_len < DISPLAY_LEN_MIN_8300) || (input_len > DISPLAY_LEN_MAX_8300)) return (PARSER_GLOBAL_LENGTH);
14738
14739 u32 *digest = (u32 *) hash_buf->digest;
14740
14741 salt_t *salt = hash_buf->salt;
14742
14743 /**
14744 * parse line
14745 */
14746
14747 char *hashbuf_pos = input_buf;
14748
14749 char *domainbuf_pos = strchr (hashbuf_pos, ':');
14750
14751 if (domainbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14752
14753 const uint hashbuf_len = domainbuf_pos - hashbuf_pos;
14754
14755 if (hashbuf_len != 32) return (PARSER_HASH_LENGTH);
14756
14757 domainbuf_pos++;
14758
14759 if (domainbuf_pos[0] != '.') return (PARSER_SALT_VALUE);
14760
14761 char *saltbuf_pos = strchr (domainbuf_pos, ':');
14762
14763 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14764
14765 const uint domainbuf_len = saltbuf_pos - domainbuf_pos;
14766
14767 if (domainbuf_len >= 32) return (PARSER_SALT_LENGTH);
14768
14769 saltbuf_pos++;
14770
14771 char *iteration_pos = strchr (saltbuf_pos, ':');
14772
14773 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14774
14775 const uint saltbuf_len = iteration_pos - saltbuf_pos;
14776
14777 if (saltbuf_len >= 28) return (PARSER_SALT_LENGTH); // 28 = 32 - 4; 4 = length
14778
14779 if ((domainbuf_len + saltbuf_len) >= 48) return (PARSER_SALT_LENGTH);
14780
14781 iteration_pos++;
14782
14783 const uint iteration_len = input_len - hashbuf_len - 1 - domainbuf_len - 1 - saltbuf_len - 1;
14784
14785 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
14786 if (iteration_len > 5) return (PARSER_SALT_ITERATION);
14787
14788 // ok, the plan for this algorithm is the following:
14789 // we have 2 salts here, the domain-name and a random salt
14790 // while both are used in the initial transformation,
14791 // only the random salt is used in the following iterations
14792 // so we create two buffer, one that includes domain-name (stored into salt_buf_pc[])
14793 // and one that includes only the real salt (stored into salt_buf[]).
14794 // the domain-name length is put into array position 7 of salt_buf_pc[] since there is not salt_pc_len
14795
14796 u8 tmp_buf[100] = { 0 };
14797
14798 base32_decode (itoa32_to_int, (const u8 *) hashbuf_pos, 32, tmp_buf);
14799
14800 memcpy (digest, tmp_buf, 20);
14801
14802 digest[0] = byte_swap_32 (digest[0]);
14803 digest[1] = byte_swap_32 (digest[1]);
14804 digest[2] = byte_swap_32 (digest[2]);
14805 digest[3] = byte_swap_32 (digest[3]);
14806 digest[4] = byte_swap_32 (digest[4]);
14807
14808 // domain
14809
14810 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
14811
14812 memcpy (salt_buf_pc_ptr, domainbuf_pos, domainbuf_len);
14813
14814 char *len_ptr = NULL;
14815
14816 for (uint i = 0; i < domainbuf_len; i++)
14817 {
14818 if (salt_buf_pc_ptr[i] == '.')
14819 {
14820 len_ptr = &salt_buf_pc_ptr[i];
14821
14822 *len_ptr = 0;
14823 }
14824 else
14825 {
14826 *len_ptr += 1;
14827 }
14828 }
14829
14830 salt->salt_buf_pc[7] = domainbuf_len;
14831
14832 // "real" salt
14833
14834 char *salt_buf_ptr = (char *) salt->salt_buf;
14835
14836 const uint salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, saltbuf_len);
14837
14838 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14839
14840 salt->salt_len = salt_len;
14841
14842 // iteration
14843
14844 salt->salt_iter = atoi (iteration_pos);
14845
14846 return (PARSER_OK);
14847 }
14848
14849 int wbb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14850 {
14851 if ((input_len < DISPLAY_LEN_MIN_8400) || (input_len > DISPLAY_LEN_MAX_8400)) return (PARSER_GLOBAL_LENGTH);
14852
14853 u32 *digest = (u32 *) hash_buf->digest;
14854
14855 salt_t *salt = hash_buf->salt;
14856
14857 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14858 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14859 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14860 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14861 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
14862
14863 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14864
14865 uint salt_len = input_len - 40 - 1;
14866
14867 char *salt_buf = input_buf + 40 + 1;
14868
14869 char *salt_buf_ptr = (char *) salt->salt_buf;
14870
14871 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14872
14873 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14874
14875 salt->salt_len = salt_len;
14876
14877 return (PARSER_OK);
14878 }
14879
14880 int racf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14881 {
14882 const u8 ascii_to_ebcdic[] =
14883 {
14884 0x00, 0x01, 0x02, 0x03, 0x37, 0x2d, 0x2e, 0x2f, 0x16, 0x05, 0x25, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
14885 0x10, 0x11, 0x12, 0x13, 0x3c, 0x3d, 0x32, 0x26, 0x18, 0x19, 0x3f, 0x27, 0x1c, 0x1d, 0x1e, 0x1f,
14886 0x40, 0x4f, 0x7f, 0x7b, 0x5b, 0x6c, 0x50, 0x7d, 0x4d, 0x5d, 0x5c, 0x4e, 0x6b, 0x60, 0x4b, 0x61,
14887 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0x7a, 0x5e, 0x4c, 0x7e, 0x6e, 0x6f,
14888 0x7c, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6,
14889 0xd7, 0xd8, 0xd9, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0x4a, 0xe0, 0x5a, 0x5f, 0x6d,
14890 0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
14891 0x97, 0x98, 0x99, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xc0, 0x6a, 0xd0, 0xa1, 0x07,
14892 0x20, 0x21, 0x22, 0x23, 0x24, 0x15, 0x06, 0x17, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x09, 0x0a, 0x1b,
14893 0x30, 0x31, 0x1a, 0x33, 0x34, 0x35, 0x36, 0x08, 0x38, 0x39, 0x3a, 0x3b, 0x04, 0x14, 0x3e, 0xe1,
14894 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
14895 0x58, 0x59, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75,
14896 0x76, 0x77, 0x78, 0x80, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e,
14897 0x9f, 0xa0, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
14898 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xda, 0xdb,
14899 0xdc, 0xdd, 0xde, 0xdf, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
14900 };
14901
14902 if ((input_len < DISPLAY_LEN_MIN_8500) || (input_len > DISPLAY_LEN_MAX_8500)) return (PARSER_GLOBAL_LENGTH);
14903
14904 if (memcmp (SIGNATURE_RACF, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14905
14906 u32 *digest = (u32 *) hash_buf->digest;
14907
14908 salt_t *salt = hash_buf->salt;
14909
14910 char *salt_pos = input_buf + 6 + 1;
14911
14912 char *digest_pos = strchr (salt_pos, '*');
14913
14914 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14915
14916 uint salt_len = digest_pos - salt_pos;
14917
14918 if (salt_len > 8) return (PARSER_SALT_LENGTH);
14919
14920 uint hash_len = input_len - 1 - salt_len - 1 - 6;
14921
14922 if (hash_len != 16) return (PARSER_HASH_LENGTH);
14923
14924 digest_pos++;
14925
14926 char *salt_buf_ptr = (char *) salt->salt_buf;
14927 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
14928
14929 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
14930
14931 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14932
14933 salt->salt_len = salt_len;
14934
14935 for (uint i = 0; i < salt_len; i++)
14936 {
14937 salt_buf_pc_ptr[i] = ascii_to_ebcdic[(int) salt_buf_ptr[i]];
14938 }
14939 for (uint i = salt_len; i < 8; i++)
14940 {
14941 salt_buf_pc_ptr[i] = 0x40;
14942 }
14943
14944 uint tt;
14945
14946 IP (salt->salt_buf_pc[0], salt->salt_buf_pc[1], tt);
14947
14948 salt->salt_buf_pc[0] = rotl32 (salt->salt_buf_pc[0], 3u);
14949 salt->salt_buf_pc[1] = rotl32 (salt->salt_buf_pc[1], 3u);
14950
14951 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
14952 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
14953
14954 digest[0] = byte_swap_32 (digest[0]);
14955 digest[1] = byte_swap_32 (digest[1]);
14956
14957 IP (digest[0], digest[1], tt);
14958
14959 digest[0] = rotr32 (digest[0], 29);
14960 digest[1] = rotr32 (digest[1], 29);
14961 digest[2] = 0;
14962 digest[3] = 0;
14963
14964 return (PARSER_OK);
14965 }
14966
14967 int lotus5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14968 {
14969 if ((input_len < DISPLAY_LEN_MIN_8600) || (input_len > DISPLAY_LEN_MAX_8600)) return (PARSER_GLOBAL_LENGTH);
14970
14971 u32 *digest = (u32 *) hash_buf->digest;
14972
14973 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14974 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14975 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14976 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14977
14978 digest[0] = byte_swap_32 (digest[0]);
14979 digest[1] = byte_swap_32 (digest[1]);
14980 digest[2] = byte_swap_32 (digest[2]);
14981 digest[3] = byte_swap_32 (digest[3]);
14982
14983 return (PARSER_OK);
14984 }
14985
14986 int lotus6_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14987 {
14988 if ((input_len < DISPLAY_LEN_MIN_8700) || (input_len > DISPLAY_LEN_MAX_8700)) return (PARSER_GLOBAL_LENGTH);
14989
14990 if ((input_buf[0] != '(') || (input_buf[1] != 'G') || (input_buf[21] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
14991
14992 u32 *digest = (u32 *) hash_buf->digest;
14993
14994 salt_t *salt = hash_buf->salt;
14995
14996 u8 tmp_buf[120] = { 0 };
14997
14998 base64_decode (lotus64_to_int, (const u8 *) input_buf + 2, input_len - 3, tmp_buf);
14999
15000 tmp_buf[3] += -4; // dont ask!
15001
15002 memcpy (salt->salt_buf, tmp_buf, 5);
15003
15004 salt->salt_len = 5;
15005
15006 memcpy (digest, tmp_buf + 5, 9);
15007
15008 // yes, only 9 byte are needed to crack, but 10 to display
15009
15010 salt->salt_buf_pc[7] = input_buf[20];
15011
15012 return (PARSER_OK);
15013 }
15014
15015 int lotus8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15016 {
15017 if ((input_len < DISPLAY_LEN_MIN_9100) || (input_len > DISPLAY_LEN_MAX_9100)) return (PARSER_GLOBAL_LENGTH);
15018
15019 if ((input_buf[0] != '(') || (input_buf[1] != 'H') || (input_buf[DISPLAY_LEN_MAX_9100 - 1] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
15020
15021 u32 *digest = (u32 *) hash_buf->digest;
15022
15023 salt_t *salt = hash_buf->salt;
15024
15025 u8 tmp_buf[120] = { 0 };
15026
15027 base64_decode (lotus64_to_int, (const u8 *) input_buf + 2, input_len - 3, tmp_buf);
15028
15029 tmp_buf[3] += -4; // dont ask!
15030
15031 // salt
15032
15033 memcpy (salt->salt_buf, tmp_buf, 16);
15034
15035 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)
15036
15037 // iteration
15038
15039 char tmp_iter_buf[11] = { 0 };
15040
15041 memcpy (tmp_iter_buf, tmp_buf + 16, 10);
15042
15043 tmp_iter_buf[10] = 0;
15044
15045 salt->salt_iter = atoi (tmp_iter_buf);
15046
15047 if (salt->salt_iter < 1) // well, the limit hopefully is much higher
15048 {
15049 return (PARSER_SALT_ITERATION);
15050 }
15051
15052 salt->salt_iter--; // first round in init
15053
15054 // 2 additional bytes for display only
15055
15056 salt->salt_buf_pc[0] = tmp_buf[26];
15057 salt->salt_buf_pc[1] = tmp_buf[27];
15058
15059 // digest
15060
15061 memcpy (digest, tmp_buf + 28, 8);
15062
15063 digest[0] = byte_swap_32 (digest[0]);
15064 digest[1] = byte_swap_32 (digest[1]);
15065 digest[2] = 0;
15066 digest[3] = 0;
15067
15068 return (PARSER_OK);
15069 }
15070
15071 int hmailserver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15072 {
15073 if ((input_len < DISPLAY_LEN_MIN_1421) || (input_len > DISPLAY_LEN_MAX_1421)) return (PARSER_GLOBAL_LENGTH);
15074
15075 u32 *digest = (u32 *) hash_buf->digest;
15076
15077 salt_t *salt = hash_buf->salt;
15078
15079 char *salt_buf_pos = input_buf;
15080
15081 char *hash_buf_pos = salt_buf_pos + 6;
15082
15083 digest[0] = hex_to_u32 ((const u8 *) &hash_buf_pos[ 0]);
15084 digest[1] = hex_to_u32 ((const u8 *) &hash_buf_pos[ 8]);
15085 digest[2] = hex_to_u32 ((const u8 *) &hash_buf_pos[16]);
15086 digest[3] = hex_to_u32 ((const u8 *) &hash_buf_pos[24]);
15087 digest[4] = hex_to_u32 ((const u8 *) &hash_buf_pos[32]);
15088 digest[5] = hex_to_u32 ((const u8 *) &hash_buf_pos[40]);
15089 digest[6] = hex_to_u32 ((const u8 *) &hash_buf_pos[48]);
15090 digest[7] = hex_to_u32 ((const u8 *) &hash_buf_pos[56]);
15091
15092 digest[0] -= SHA256M_A;
15093 digest[1] -= SHA256M_B;
15094 digest[2] -= SHA256M_C;
15095 digest[3] -= SHA256M_D;
15096 digest[4] -= SHA256M_E;
15097 digest[5] -= SHA256M_F;
15098 digest[6] -= SHA256M_G;
15099 digest[7] -= SHA256M_H;
15100
15101 char *salt_buf_ptr = (char *) salt->salt_buf;
15102
15103 const uint salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf_pos, 6);
15104
15105 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
15106
15107 salt->salt_len = salt_len;
15108
15109 return (PARSER_OK);
15110 }
15111
15112 int phps_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15113 {
15114 if ((input_len < DISPLAY_LEN_MIN_2612) || (input_len > DISPLAY_LEN_MAX_2612)) return (PARSER_GLOBAL_LENGTH);
15115
15116 u32 *digest = (u32 *) hash_buf->digest;
15117
15118 if (memcmp (SIGNATURE_PHPS, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
15119
15120 salt_t *salt = hash_buf->salt;
15121
15122 char *salt_buf = input_buf + 6;
15123
15124 char *digest_buf = strchr (salt_buf, '$');
15125
15126 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15127
15128 uint salt_len = digest_buf - salt_buf;
15129
15130 digest_buf++; // skip the '$' symbol
15131
15132 char *salt_buf_ptr = (char *) salt->salt_buf;
15133
15134 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
15135
15136 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
15137
15138 salt->salt_len = salt_len;
15139
15140 digest[0] = hex_to_u32 ((const u8 *) &digest_buf[ 0]);
15141 digest[1] = hex_to_u32 ((const u8 *) &digest_buf[ 8]);
15142 digest[2] = hex_to_u32 ((const u8 *) &digest_buf[16]);
15143 digest[3] = hex_to_u32 ((const u8 *) &digest_buf[24]);
15144
15145 digest[0] = byte_swap_32 (digest[0]);
15146 digest[1] = byte_swap_32 (digest[1]);
15147 digest[2] = byte_swap_32 (digest[2]);
15148 digest[3] = byte_swap_32 (digest[3]);
15149
15150 digest[0] -= MD5M_A;
15151 digest[1] -= MD5M_B;
15152 digest[2] -= MD5M_C;
15153 digest[3] -= MD5M_D;
15154
15155 return (PARSER_OK);
15156 }
15157
15158 int mediawiki_b_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15159 {
15160 if ((input_len < DISPLAY_LEN_MIN_3711) || (input_len > DISPLAY_LEN_MAX_3711)) return (PARSER_GLOBAL_LENGTH);
15161
15162 if (memcmp (SIGNATURE_MEDIAWIKI_B, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
15163
15164 u32 *digest = (u32 *) hash_buf->digest;
15165
15166 salt_t *salt = hash_buf->salt;
15167
15168 char *salt_buf = input_buf + 3;
15169
15170 char *digest_buf = strchr (salt_buf, '$');
15171
15172 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15173
15174 uint salt_len = digest_buf - salt_buf;
15175
15176 digest_buf++; // skip the '$' symbol
15177
15178 char *salt_buf_ptr = (char *) salt->salt_buf;
15179
15180 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
15181
15182 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
15183
15184 salt_buf_ptr[salt_len] = 0x2d;
15185
15186 salt->salt_len = salt_len + 1;
15187
15188 digest[0] = hex_to_u32 ((const u8 *) &digest_buf[ 0]);
15189 digest[1] = hex_to_u32 ((const u8 *) &digest_buf[ 8]);
15190 digest[2] = hex_to_u32 ((const u8 *) &digest_buf[16]);
15191 digest[3] = hex_to_u32 ((const u8 *) &digest_buf[24]);
15192
15193 digest[0] = byte_swap_32 (digest[0]);
15194 digest[1] = byte_swap_32 (digest[1]);
15195 digest[2] = byte_swap_32 (digest[2]);
15196 digest[3] = byte_swap_32 (digest[3]);
15197
15198 digest[0] -= MD5M_A;
15199 digest[1] -= MD5M_B;
15200 digest[2] -= MD5M_C;
15201 digest[3] -= MD5M_D;
15202
15203 return (PARSER_OK);
15204 }
15205
15206 int peoplesoft_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15207 {
15208 if ((input_len < DISPLAY_LEN_MIN_133) || (input_len > DISPLAY_LEN_MAX_133)) return (PARSER_GLOBAL_LENGTH);
15209
15210 u32 *digest = (u32 *) hash_buf->digest;
15211
15212 salt_t *salt = hash_buf->salt;
15213
15214 u8 tmp_buf[100] = { 0 };
15215
15216 base64_decode (base64_to_int, (const u8 *) input_buf, input_len, tmp_buf);
15217
15218 memcpy (digest, tmp_buf, 20);
15219
15220 digest[0] = byte_swap_32 (digest[0]);
15221 digest[1] = byte_swap_32 (digest[1]);
15222 digest[2] = byte_swap_32 (digest[2]);
15223 digest[3] = byte_swap_32 (digest[3]);
15224 digest[4] = byte_swap_32 (digest[4]);
15225
15226 digest[0] -= SHA1M_A;
15227 digest[1] -= SHA1M_B;
15228 digest[2] -= SHA1M_C;
15229 digest[3] -= SHA1M_D;
15230 digest[4] -= SHA1M_E;
15231
15232 salt->salt_buf[0] = 0x80;
15233
15234 salt->salt_len = 0;
15235
15236 return (PARSER_OK);
15237 }
15238
15239 int skype_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15240 {
15241 if ((input_len < DISPLAY_LEN_MIN_23) || (input_len > DISPLAY_LEN_MAX_23)) return (PARSER_GLOBAL_LENGTH);
15242
15243 u32 *digest = (u32 *) hash_buf->digest;
15244
15245 salt_t *salt = hash_buf->salt;
15246
15247 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
15248 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
15249 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
15250 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
15251
15252 digest[0] = byte_swap_32 (digest[0]);
15253 digest[1] = byte_swap_32 (digest[1]);
15254 digest[2] = byte_swap_32 (digest[2]);
15255 digest[3] = byte_swap_32 (digest[3]);
15256
15257 digest[0] -= MD5M_A;
15258 digest[1] -= MD5M_B;
15259 digest[2] -= MD5M_C;
15260 digest[3] -= MD5M_D;
15261
15262 if (input_buf[32] != ':') return (PARSER_SEPARATOR_UNMATCHED);
15263
15264 uint salt_len = input_len - 32 - 1;
15265
15266 char *salt_buf = input_buf + 32 + 1;
15267
15268 char *salt_buf_ptr = (char *) salt->salt_buf;
15269
15270 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
15271
15272 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
15273
15274 /*
15275 * add static "salt" part
15276 */
15277
15278 memcpy (salt_buf_ptr + salt_len, "\nskyper\n", 8);
15279
15280 salt_len += 8;
15281
15282 salt->salt_len = salt_len;
15283
15284 return (PARSER_OK);
15285 }
15286
15287 int androidfde_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15288 {
15289 if ((input_len < DISPLAY_LEN_MIN_8800) || (input_len > DISPLAY_LEN_MAX_8800)) return (PARSER_GLOBAL_LENGTH);
15290
15291 if (memcmp (SIGNATURE_ANDROIDFDE, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
15292
15293 u32 *digest = (u32 *) hash_buf->digest;
15294
15295 salt_t *salt = hash_buf->salt;
15296
15297 androidfde_t *androidfde = (androidfde_t *) hash_buf->esalt;
15298
15299 /**
15300 * parse line
15301 */
15302
15303 char *saltlen_pos = input_buf + 1 + 3 + 1;
15304
15305 char *saltbuf_pos = strchr (saltlen_pos, '$');
15306
15307 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15308
15309 uint saltlen_len = saltbuf_pos - saltlen_pos;
15310
15311 if (saltlen_len != 2) return (PARSER_SALT_LENGTH);
15312
15313 saltbuf_pos++;
15314
15315 char *keylen_pos = strchr (saltbuf_pos, '$');
15316
15317 if (keylen_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15318
15319 uint saltbuf_len = keylen_pos - saltbuf_pos;
15320
15321 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
15322
15323 keylen_pos++;
15324
15325 char *keybuf_pos = strchr (keylen_pos, '$');
15326
15327 if (keybuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15328
15329 uint keylen_len = keybuf_pos - keylen_pos;
15330
15331 if (keylen_len != 2) return (PARSER_SALT_LENGTH);
15332
15333 keybuf_pos++;
15334
15335 char *databuf_pos = strchr (keybuf_pos, '$');
15336
15337 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15338
15339 uint keybuf_len = databuf_pos - keybuf_pos;
15340
15341 if (keybuf_len != 32) return (PARSER_SALT_LENGTH);
15342
15343 databuf_pos++;
15344
15345 uint data_len = input_len - 1 - 3 - 1 - saltlen_len - 1 - saltbuf_len - 1 - keylen_len - 1 - keybuf_len - 1;
15346
15347 if (data_len != 3072) return (PARSER_SALT_LENGTH);
15348
15349 /**
15350 * copy data
15351 */
15352
15353 digest[0] = hex_to_u32 ((const u8 *) &keybuf_pos[ 0]);
15354 digest[1] = hex_to_u32 ((const u8 *) &keybuf_pos[ 8]);
15355 digest[2] = hex_to_u32 ((const u8 *) &keybuf_pos[16]);
15356 digest[3] = hex_to_u32 ((const u8 *) &keybuf_pos[24]);
15357
15358 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &saltbuf_pos[ 0]);
15359 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &saltbuf_pos[ 8]);
15360 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &saltbuf_pos[16]);
15361 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &saltbuf_pos[24]);
15362
15363 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15364 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15365 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15366 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15367
15368 salt->salt_len = 16;
15369 salt->salt_iter = ROUNDS_ANDROIDFDE - 1;
15370
15371 for (uint i = 0, j = 0; i < 3072; i += 8, j += 1)
15372 {
15373 androidfde->data[j] = hex_to_u32 ((const u8 *) &databuf_pos[i]);
15374 }
15375
15376 return (PARSER_OK);
15377 }
15378
15379 int scrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15380 {
15381 if ((input_len < DISPLAY_LEN_MIN_8900) || (input_len > DISPLAY_LEN_MAX_8900)) return (PARSER_GLOBAL_LENGTH);
15382
15383 if (memcmp (SIGNATURE_SCRYPT, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
15384
15385 u32 *digest = (u32 *) hash_buf->digest;
15386
15387 salt_t *salt = hash_buf->salt;
15388
15389 /**
15390 * parse line
15391 */
15392
15393 // first is the N salt parameter
15394
15395 char *N_pos = input_buf + 6;
15396
15397 if (N_pos[0] != ':') return (PARSER_SEPARATOR_UNMATCHED);
15398
15399 N_pos++;
15400
15401 salt->scrypt_N = atoi (N_pos);
15402
15403 // r
15404
15405 char *r_pos = strchr (N_pos, ':');
15406
15407 if (r_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15408
15409 r_pos++;
15410
15411 salt->scrypt_r = atoi (r_pos);
15412
15413 // p
15414
15415 char *p_pos = strchr (r_pos, ':');
15416
15417 if (p_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15418
15419 p_pos++;
15420
15421 salt->scrypt_p = atoi (p_pos);
15422
15423 // salt
15424
15425 char *saltbuf_pos = strchr (p_pos, ':');
15426
15427 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15428
15429 saltbuf_pos++;
15430
15431 char *hash_pos = strchr (saltbuf_pos, ':');
15432
15433 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15434
15435 hash_pos++;
15436
15437 // base64 decode
15438
15439 int salt_len_base64 = hash_pos - saltbuf_pos;
15440
15441 if (salt_len_base64 > 45) return (PARSER_SALT_LENGTH);
15442
15443 u8 tmp_buf[33] = { 0 };
15444
15445 int tmp_len = base64_decode (base64_to_int, (const u8 *) saltbuf_pos, salt_len_base64, tmp_buf);
15446
15447 char *salt_buf_ptr = (char *) salt->salt_buf;
15448
15449 memcpy (salt_buf_ptr, tmp_buf, tmp_len);
15450
15451 salt->salt_len = tmp_len;
15452 salt->salt_iter = 1;
15453
15454 // digest - base64 decode
15455
15456 memset (tmp_buf, 0, sizeof (tmp_buf));
15457
15458 tmp_len = input_len - (hash_pos - input_buf);
15459
15460 if (tmp_len != 44) return (PARSER_GLOBAL_LENGTH);
15461
15462 base64_decode (base64_to_int, (const u8 *) hash_pos, tmp_len, tmp_buf);
15463
15464 memcpy (digest, tmp_buf, 32);
15465
15466 return (PARSER_OK);
15467 }
15468
15469 int juniper_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15470 {
15471 if ((input_len < DISPLAY_LEN_MIN_501) || (input_len > DISPLAY_LEN_MAX_501)) return (PARSER_GLOBAL_LENGTH);
15472
15473 u32 *digest = (u32 *) hash_buf->digest;
15474
15475 salt_t *salt = hash_buf->salt;
15476
15477 /**
15478 * parse line
15479 */
15480
15481 char decrypted[76] = { 0 }; // iv + hash
15482
15483 juniper_decrypt_hash (input_buf, decrypted);
15484
15485 char *md5crypt_hash = decrypted + 12;
15486
15487 if (memcmp (md5crypt_hash, "$1$danastre$", 12)) return (PARSER_SALT_VALUE);
15488
15489 salt->salt_iter = ROUNDS_MD5CRYPT;
15490
15491 char *salt_pos = md5crypt_hash + 3;
15492
15493 char *hash_pos = strchr (salt_pos, '$'); // or simply salt_pos + 8
15494
15495 salt->salt_len = hash_pos - salt_pos; // should be 8
15496
15497 memcpy ((char *) salt->salt_buf, salt_pos, salt->salt_len);
15498
15499 hash_pos++;
15500
15501 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
15502
15503 return (PARSER_OK);
15504 }
15505
15506 int cisco8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15507 {
15508 if ((input_len < DISPLAY_LEN_MIN_9200) || (input_len > DISPLAY_LEN_MAX_9200)) return (PARSER_GLOBAL_LENGTH);
15509
15510 if (memcmp (SIGNATURE_CISCO8, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
15511
15512 u32 *digest = (u32 *) hash_buf->digest;
15513
15514 salt_t *salt = hash_buf->salt;
15515
15516 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
15517
15518 /**
15519 * parse line
15520 */
15521
15522 // first is *raw* salt
15523
15524 char *salt_pos = input_buf + 3;
15525
15526 char *hash_pos = strchr (salt_pos, '$');
15527
15528 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15529
15530 uint salt_len = hash_pos - salt_pos;
15531
15532 if (salt_len != 14) return (PARSER_SALT_LENGTH);
15533
15534 hash_pos++;
15535
15536 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
15537
15538 memcpy (salt_buf_ptr, salt_pos, 14);
15539
15540 salt_buf_ptr[17] = 0x01;
15541 salt_buf_ptr[18] = 0x80;
15542
15543 // add some stuff to normal salt to make sorted happy
15544
15545 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
15546 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
15547 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
15548 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
15549
15550 salt->salt_len = salt_len;
15551 salt->salt_iter = ROUNDS_CISCO8 - 1;
15552
15553 // base64 decode hash
15554
15555 u8 tmp_buf[100] = { 0 };
15556
15557 uint hash_len = input_len - 3 - salt_len - 1;
15558
15559 int tmp_len = base64_decode (itoa64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
15560
15561 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
15562
15563 memcpy (digest, tmp_buf, 32);
15564
15565 digest[0] = byte_swap_32 (digest[0]);
15566 digest[1] = byte_swap_32 (digest[1]);
15567 digest[2] = byte_swap_32 (digest[2]);
15568 digest[3] = byte_swap_32 (digest[3]);
15569 digest[4] = byte_swap_32 (digest[4]);
15570 digest[5] = byte_swap_32 (digest[5]);
15571 digest[6] = byte_swap_32 (digest[6]);
15572 digest[7] = byte_swap_32 (digest[7]);
15573
15574 return (PARSER_OK);
15575 }
15576
15577 int cisco9_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15578 {
15579 if ((input_len < DISPLAY_LEN_MIN_9300) || (input_len > DISPLAY_LEN_MAX_9300)) return (PARSER_GLOBAL_LENGTH);
15580
15581 if (memcmp (SIGNATURE_CISCO9, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
15582
15583 u32 *digest = (u32 *) hash_buf->digest;
15584
15585 salt_t *salt = hash_buf->salt;
15586
15587 /**
15588 * parse line
15589 */
15590
15591 // first is *raw* salt
15592
15593 char *salt_pos = input_buf + 3;
15594
15595 char *hash_pos = strchr (salt_pos, '$');
15596
15597 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15598
15599 uint salt_len = hash_pos - salt_pos;
15600
15601 if (salt_len != 14) return (PARSER_SALT_LENGTH);
15602
15603 salt->salt_len = salt_len;
15604 hash_pos++;
15605
15606 char *salt_buf_ptr = (char *) salt->salt_buf;
15607
15608 memcpy (salt_buf_ptr, salt_pos, salt_len);
15609 salt_buf_ptr[salt_len] = 0;
15610
15611 // base64 decode hash
15612
15613 u8 tmp_buf[100] = { 0 };
15614
15615 uint hash_len = input_len - 3 - salt_len - 1;
15616
15617 int tmp_len = base64_decode (itoa64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
15618
15619 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
15620
15621 memcpy (digest, tmp_buf, 32);
15622
15623 // fixed:
15624 salt->scrypt_N = 16384;
15625 salt->scrypt_r = 1;
15626 salt->scrypt_p = 1;
15627 salt->salt_iter = 1;
15628
15629 return (PARSER_OK);
15630 }
15631
15632 int office2007_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15633 {
15634 if ((input_len < DISPLAY_LEN_MIN_9400) || (input_len > DISPLAY_LEN_MAX_9400)) return (PARSER_GLOBAL_LENGTH);
15635
15636 if (memcmp (SIGNATURE_OFFICE2007, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
15637
15638 u32 *digest = (u32 *) hash_buf->digest;
15639
15640 salt_t *salt = hash_buf->salt;
15641
15642 office2007_t *office2007 = (office2007_t *) hash_buf->esalt;
15643
15644 /**
15645 * parse line
15646 */
15647
15648 char *version_pos = input_buf + 8 + 1;
15649
15650 char *verifierHashSize_pos = strchr (version_pos, '*');
15651
15652 if (verifierHashSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15653
15654 u32 version_len = verifierHashSize_pos - version_pos;
15655
15656 if (version_len != 4) return (PARSER_SALT_LENGTH);
15657
15658 verifierHashSize_pos++;
15659
15660 char *keySize_pos = strchr (verifierHashSize_pos, '*');
15661
15662 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15663
15664 u32 verifierHashSize_len = keySize_pos - verifierHashSize_pos;
15665
15666 if (verifierHashSize_len != 2) return (PARSER_SALT_LENGTH);
15667
15668 keySize_pos++;
15669
15670 char *saltSize_pos = strchr (keySize_pos, '*');
15671
15672 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15673
15674 u32 keySize_len = saltSize_pos - keySize_pos;
15675
15676 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
15677
15678 saltSize_pos++;
15679
15680 char *osalt_pos = strchr (saltSize_pos, '*');
15681
15682 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15683
15684 u32 saltSize_len = osalt_pos - saltSize_pos;
15685
15686 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
15687
15688 osalt_pos++;
15689
15690 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15691
15692 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15693
15694 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15695
15696 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15697
15698 encryptedVerifier_pos++;
15699
15700 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15701
15702 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15703
15704 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15705
15706 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15707
15708 encryptedVerifierHash_pos++;
15709
15710 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;
15711
15712 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
15713
15714 const uint version = atoi (version_pos);
15715
15716 if (version != 2007) return (PARSER_SALT_VALUE);
15717
15718 const uint verifierHashSize = atoi (verifierHashSize_pos);
15719
15720 if (verifierHashSize != 20) return (PARSER_SALT_VALUE);
15721
15722 const uint keySize = atoi (keySize_pos);
15723
15724 if ((keySize != 128) && (keySize != 256)) return (PARSER_SALT_VALUE);
15725
15726 office2007->keySize = keySize;
15727
15728 const uint saltSize = atoi (saltSize_pos);
15729
15730 if (saltSize != 16) return (PARSER_SALT_VALUE);
15731
15732 /**
15733 * salt
15734 */
15735
15736 salt->salt_len = 16;
15737 salt->salt_iter = ROUNDS_OFFICE2007;
15738
15739 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15740 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15741 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15742 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15743
15744 /**
15745 * esalt
15746 */
15747
15748 office2007->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15749 office2007->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15750 office2007->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15751 office2007->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15752
15753 office2007->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15754 office2007->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15755 office2007->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15756 office2007->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15757 office2007->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15758
15759 /**
15760 * digest
15761 */
15762
15763 digest[0] = office2007->encryptedVerifierHash[0];
15764 digest[1] = office2007->encryptedVerifierHash[1];
15765 digest[2] = office2007->encryptedVerifierHash[2];
15766 digest[3] = office2007->encryptedVerifierHash[3];
15767
15768 return (PARSER_OK);
15769 }
15770
15771 int office2010_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15772 {
15773 if ((input_len < DISPLAY_LEN_MIN_9500) || (input_len > DISPLAY_LEN_MAX_9500)) return (PARSER_GLOBAL_LENGTH);
15774
15775 if (memcmp (SIGNATURE_OFFICE2010, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
15776
15777 u32 *digest = (u32 *) hash_buf->digest;
15778
15779 salt_t *salt = hash_buf->salt;
15780
15781 office2010_t *office2010 = (office2010_t *) hash_buf->esalt;
15782
15783 /**
15784 * parse line
15785 */
15786
15787 char *version_pos = input_buf + 8 + 1;
15788
15789 char *spinCount_pos = strchr (version_pos, '*');
15790
15791 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15792
15793 u32 version_len = spinCount_pos - version_pos;
15794
15795 if (version_len != 4) return (PARSER_SALT_LENGTH);
15796
15797 spinCount_pos++;
15798
15799 char *keySize_pos = strchr (spinCount_pos, '*');
15800
15801 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15802
15803 u32 spinCount_len = keySize_pos - spinCount_pos;
15804
15805 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
15806
15807 keySize_pos++;
15808
15809 char *saltSize_pos = strchr (keySize_pos, '*');
15810
15811 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15812
15813 u32 keySize_len = saltSize_pos - keySize_pos;
15814
15815 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
15816
15817 saltSize_pos++;
15818
15819 char *osalt_pos = strchr (saltSize_pos, '*');
15820
15821 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15822
15823 u32 saltSize_len = osalt_pos - saltSize_pos;
15824
15825 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
15826
15827 osalt_pos++;
15828
15829 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15830
15831 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15832
15833 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15834
15835 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15836
15837 encryptedVerifier_pos++;
15838
15839 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15840
15841 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15842
15843 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15844
15845 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15846
15847 encryptedVerifierHash_pos++;
15848
15849 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;
15850
15851 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
15852
15853 const uint version = atoi (version_pos);
15854
15855 if (version != 2010) return (PARSER_SALT_VALUE);
15856
15857 const uint spinCount = atoi (spinCount_pos);
15858
15859 if (spinCount != 100000) return (PARSER_SALT_VALUE);
15860
15861 const uint keySize = atoi (keySize_pos);
15862
15863 if (keySize != 128) return (PARSER_SALT_VALUE);
15864
15865 const uint saltSize = atoi (saltSize_pos);
15866
15867 if (saltSize != 16) return (PARSER_SALT_VALUE);
15868
15869 /**
15870 * salt
15871 */
15872
15873 salt->salt_len = 16;
15874 salt->salt_iter = spinCount;
15875
15876 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15877 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15878 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15879 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15880
15881 /**
15882 * esalt
15883 */
15884
15885 office2010->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15886 office2010->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15887 office2010->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15888 office2010->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15889
15890 office2010->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15891 office2010->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15892 office2010->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15893 office2010->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15894 office2010->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15895 office2010->encryptedVerifierHash[5] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[40]);
15896 office2010->encryptedVerifierHash[6] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[48]);
15897 office2010->encryptedVerifierHash[7] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[56]);
15898
15899 /**
15900 * digest
15901 */
15902
15903 digest[0] = office2010->encryptedVerifierHash[0];
15904 digest[1] = office2010->encryptedVerifierHash[1];
15905 digest[2] = office2010->encryptedVerifierHash[2];
15906 digest[3] = office2010->encryptedVerifierHash[3];
15907
15908 return (PARSER_OK);
15909 }
15910
15911 int office2013_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15912 {
15913 if ((input_len < DISPLAY_LEN_MIN_9600) || (input_len > DISPLAY_LEN_MAX_9600)) return (PARSER_GLOBAL_LENGTH);
15914
15915 if (memcmp (SIGNATURE_OFFICE2013, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
15916
15917 u32 *digest = (u32 *) hash_buf->digest;
15918
15919 salt_t *salt = hash_buf->salt;
15920
15921 office2013_t *office2013 = (office2013_t *) hash_buf->esalt;
15922
15923 /**
15924 * parse line
15925 */
15926
15927 char *version_pos = input_buf + 8 + 1;
15928
15929 char *spinCount_pos = strchr (version_pos, '*');
15930
15931 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15932
15933 u32 version_len = spinCount_pos - version_pos;
15934
15935 if (version_len != 4) return (PARSER_SALT_LENGTH);
15936
15937 spinCount_pos++;
15938
15939 char *keySize_pos = strchr (spinCount_pos, '*');
15940
15941 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15942
15943 u32 spinCount_len = keySize_pos - spinCount_pos;
15944
15945 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
15946
15947 keySize_pos++;
15948
15949 char *saltSize_pos = strchr (keySize_pos, '*');
15950
15951 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15952
15953 u32 keySize_len = saltSize_pos - keySize_pos;
15954
15955 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
15956
15957 saltSize_pos++;
15958
15959 char *osalt_pos = strchr (saltSize_pos, '*');
15960
15961 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15962
15963 u32 saltSize_len = osalt_pos - saltSize_pos;
15964
15965 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
15966
15967 osalt_pos++;
15968
15969 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15970
15971 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15972
15973 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15974
15975 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15976
15977 encryptedVerifier_pos++;
15978
15979 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15980
15981 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15982
15983 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15984
15985 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15986
15987 encryptedVerifierHash_pos++;
15988
15989 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;
15990
15991 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
15992
15993 const uint version = atoi (version_pos);
15994
15995 if (version != 2013) return (PARSER_SALT_VALUE);
15996
15997 const uint spinCount = atoi (spinCount_pos);
15998
15999 if (spinCount != 100000) return (PARSER_SALT_VALUE);
16000
16001 const uint keySize = atoi (keySize_pos);
16002
16003 if (keySize != 256) return (PARSER_SALT_VALUE);
16004
16005 const uint saltSize = atoi (saltSize_pos);
16006
16007 if (saltSize != 16) return (PARSER_SALT_VALUE);
16008
16009 /**
16010 * salt
16011 */
16012
16013 salt->salt_len = 16;
16014 salt->salt_iter = spinCount;
16015
16016 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
16017 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
16018 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
16019 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
16020
16021 /**
16022 * esalt
16023 */
16024
16025 office2013->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
16026 office2013->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
16027 office2013->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
16028 office2013->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
16029
16030 office2013->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
16031 office2013->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
16032 office2013->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
16033 office2013->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
16034 office2013->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
16035 office2013->encryptedVerifierHash[5] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[40]);
16036 office2013->encryptedVerifierHash[6] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[48]);
16037 office2013->encryptedVerifierHash[7] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[56]);
16038
16039 /**
16040 * digest
16041 */
16042
16043 digest[0] = office2013->encryptedVerifierHash[0];
16044 digest[1] = office2013->encryptedVerifierHash[1];
16045 digest[2] = office2013->encryptedVerifierHash[2];
16046 digest[3] = office2013->encryptedVerifierHash[3];
16047
16048 return (PARSER_OK);
16049 }
16050
16051 int oldoffice01_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16052 {
16053 if ((input_len < DISPLAY_LEN_MIN_9700) || (input_len > DISPLAY_LEN_MAX_9700)) return (PARSER_GLOBAL_LENGTH);
16054
16055 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
16056
16057 u32 *digest = (u32 *) hash_buf->digest;
16058
16059 salt_t *salt = hash_buf->salt;
16060
16061 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
16062
16063 /**
16064 * parse line
16065 */
16066
16067 char *version_pos = input_buf + 11;
16068
16069 char *osalt_pos = strchr (version_pos, '*');
16070
16071 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16072
16073 u32 version_len = osalt_pos - version_pos;
16074
16075 if (version_len != 1) return (PARSER_SALT_LENGTH);
16076
16077 osalt_pos++;
16078
16079 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
16080
16081 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16082
16083 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
16084
16085 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
16086
16087 encryptedVerifier_pos++;
16088
16089 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
16090
16091 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16092
16093 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
16094
16095 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
16096
16097 encryptedVerifierHash_pos++;
16098
16099 u32 encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
16100
16101 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
16102
16103 const uint version = *version_pos - 0x30;
16104
16105 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
16106
16107 /**
16108 * esalt
16109 */
16110
16111 oldoffice01->version = version;
16112
16113 oldoffice01->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
16114 oldoffice01->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
16115 oldoffice01->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
16116 oldoffice01->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
16117
16118 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
16119 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
16120 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
16121 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
16122
16123 oldoffice01->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
16124 oldoffice01->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
16125 oldoffice01->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
16126 oldoffice01->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
16127
16128 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
16129 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
16130 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
16131 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
16132
16133 /**
16134 * salt
16135 */
16136
16137 salt->salt_len = 16;
16138
16139 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
16140 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
16141 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
16142 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
16143
16144 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
16145 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
16146 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
16147 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
16148
16149 // this is a workaround as office produces multiple documents with the same salt
16150
16151 salt->salt_len += 32;
16152
16153 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
16154 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
16155 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
16156 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
16157 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
16158 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
16159 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
16160 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
16161
16162 /**
16163 * digest
16164 */
16165
16166 digest[0] = oldoffice01->encryptedVerifierHash[0];
16167 digest[1] = oldoffice01->encryptedVerifierHash[1];
16168 digest[2] = oldoffice01->encryptedVerifierHash[2];
16169 digest[3] = oldoffice01->encryptedVerifierHash[3];
16170
16171 return (PARSER_OK);
16172 }
16173
16174 int oldoffice01cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16175 {
16176 return oldoffice01_parse_hash (input_buf, input_len, hash_buf);
16177 }
16178
16179 int oldoffice01cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16180 {
16181 if ((input_len < DISPLAY_LEN_MIN_9720) || (input_len > DISPLAY_LEN_MAX_9720)) return (PARSER_GLOBAL_LENGTH);
16182
16183 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
16184
16185 u32 *digest = (u32 *) hash_buf->digest;
16186
16187 salt_t *salt = hash_buf->salt;
16188
16189 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
16190
16191 /**
16192 * parse line
16193 */
16194
16195 char *version_pos = input_buf + 11;
16196
16197 char *osalt_pos = strchr (version_pos, '*');
16198
16199 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16200
16201 u32 version_len = osalt_pos - version_pos;
16202
16203 if (version_len != 1) return (PARSER_SALT_LENGTH);
16204
16205 osalt_pos++;
16206
16207 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
16208
16209 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16210
16211 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
16212
16213 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
16214
16215 encryptedVerifier_pos++;
16216
16217 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
16218
16219 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16220
16221 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
16222
16223 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
16224
16225 encryptedVerifierHash_pos++;
16226
16227 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
16228
16229 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16230
16231 u32 encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
16232
16233 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
16234
16235 rc4key_pos++;
16236
16237 u32 rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
16238
16239 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
16240
16241 const uint version = *version_pos - 0x30;
16242
16243 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
16244
16245 /**
16246 * esalt
16247 */
16248
16249 oldoffice01->version = version;
16250
16251 oldoffice01->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
16252 oldoffice01->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
16253 oldoffice01->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
16254 oldoffice01->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
16255
16256 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
16257 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
16258 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
16259 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
16260
16261 oldoffice01->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
16262 oldoffice01->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
16263 oldoffice01->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
16264 oldoffice01->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
16265
16266 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
16267 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
16268 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
16269 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
16270
16271 oldoffice01->rc4key[1] = 0;
16272 oldoffice01->rc4key[0] = 0;
16273
16274 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
16275 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
16276 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
16277 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
16278 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
16279 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
16280 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
16281 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
16282 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
16283 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
16284
16285 oldoffice01->rc4key[0] = byte_swap_32 (oldoffice01->rc4key[0]);
16286 oldoffice01->rc4key[1] = byte_swap_32 (oldoffice01->rc4key[1]);
16287
16288 /**
16289 * salt
16290 */
16291
16292 salt->salt_len = 16;
16293
16294 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
16295 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
16296 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
16297 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
16298
16299 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
16300 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
16301 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
16302 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
16303
16304 // this is a workaround as office produces multiple documents with the same salt
16305
16306 salt->salt_len += 32;
16307
16308 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
16309 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
16310 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
16311 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
16312 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
16313 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
16314 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
16315 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
16316
16317 /**
16318 * digest
16319 */
16320
16321 digest[0] = oldoffice01->rc4key[0];
16322 digest[1] = oldoffice01->rc4key[1];
16323 digest[2] = 0;
16324 digest[3] = 0;
16325
16326 return (PARSER_OK);
16327 }
16328
16329 int oldoffice34_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16330 {
16331 if ((input_len < DISPLAY_LEN_MIN_9800) || (input_len > DISPLAY_LEN_MAX_9800)) return (PARSER_GLOBAL_LENGTH);
16332
16333 if ((memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE4, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
16334
16335 u32 *digest = (u32 *) hash_buf->digest;
16336
16337 salt_t *salt = hash_buf->salt;
16338
16339 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
16340
16341 /**
16342 * parse line
16343 */
16344
16345 char *version_pos = input_buf + 11;
16346
16347 char *osalt_pos = strchr (version_pos, '*');
16348
16349 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16350
16351 u32 version_len = osalt_pos - version_pos;
16352
16353 if (version_len != 1) return (PARSER_SALT_LENGTH);
16354
16355 osalt_pos++;
16356
16357 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
16358
16359 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16360
16361 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
16362
16363 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
16364
16365 encryptedVerifier_pos++;
16366
16367 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
16368
16369 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16370
16371 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
16372
16373 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
16374
16375 encryptedVerifierHash_pos++;
16376
16377 u32 encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
16378
16379 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
16380
16381 const uint version = *version_pos - 0x30;
16382
16383 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
16384
16385 /**
16386 * esalt
16387 */
16388
16389 oldoffice34->version = version;
16390
16391 oldoffice34->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
16392 oldoffice34->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
16393 oldoffice34->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
16394 oldoffice34->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
16395
16396 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
16397 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
16398 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
16399 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
16400
16401 oldoffice34->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
16402 oldoffice34->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
16403 oldoffice34->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
16404 oldoffice34->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
16405 oldoffice34->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
16406
16407 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
16408 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
16409 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
16410 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
16411 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
16412
16413 /**
16414 * salt
16415 */
16416
16417 salt->salt_len = 16;
16418
16419 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
16420 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
16421 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
16422 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
16423
16424 // this is a workaround as office produces multiple documents with the same salt
16425
16426 salt->salt_len += 32;
16427
16428 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
16429 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
16430 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
16431 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
16432 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
16433 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
16434 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
16435 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
16436
16437 /**
16438 * digest
16439 */
16440
16441 digest[0] = oldoffice34->encryptedVerifierHash[0];
16442 digest[1] = oldoffice34->encryptedVerifierHash[1];
16443 digest[2] = oldoffice34->encryptedVerifierHash[2];
16444 digest[3] = oldoffice34->encryptedVerifierHash[3];
16445
16446 return (PARSER_OK);
16447 }
16448
16449 int oldoffice34cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16450 {
16451 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
16452
16453 return oldoffice34_parse_hash (input_buf, input_len, hash_buf);
16454 }
16455
16456 int oldoffice34cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16457 {
16458 if ((input_len < DISPLAY_LEN_MIN_9820) || (input_len > DISPLAY_LEN_MAX_9820)) return (PARSER_GLOBAL_LENGTH);
16459
16460 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
16461
16462 u32 *digest = (u32 *) hash_buf->digest;
16463
16464 salt_t *salt = hash_buf->salt;
16465
16466 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
16467
16468 /**
16469 * parse line
16470 */
16471
16472 char *version_pos = input_buf + 11;
16473
16474 char *osalt_pos = strchr (version_pos, '*');
16475
16476 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16477
16478 u32 version_len = osalt_pos - version_pos;
16479
16480 if (version_len != 1) return (PARSER_SALT_LENGTH);
16481
16482 osalt_pos++;
16483
16484 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
16485
16486 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16487
16488 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
16489
16490 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
16491
16492 encryptedVerifier_pos++;
16493
16494 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
16495
16496 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16497
16498 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
16499
16500 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
16501
16502 encryptedVerifierHash_pos++;
16503
16504 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
16505
16506 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16507
16508 u32 encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
16509
16510 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
16511
16512 rc4key_pos++;
16513
16514 u32 rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
16515
16516 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
16517
16518 const uint version = *version_pos - 0x30;
16519
16520 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
16521
16522 /**
16523 * esalt
16524 */
16525
16526 oldoffice34->version = version;
16527
16528 oldoffice34->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
16529 oldoffice34->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
16530 oldoffice34->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
16531 oldoffice34->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
16532
16533 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
16534 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
16535 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
16536 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
16537
16538 oldoffice34->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
16539 oldoffice34->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
16540 oldoffice34->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
16541 oldoffice34->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
16542 oldoffice34->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
16543
16544 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
16545 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
16546 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
16547 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
16548 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
16549
16550 oldoffice34->rc4key[1] = 0;
16551 oldoffice34->rc4key[0] = 0;
16552
16553 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
16554 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
16555 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
16556 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
16557 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
16558 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
16559 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
16560 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
16561 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
16562 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
16563
16564 oldoffice34->rc4key[0] = byte_swap_32 (oldoffice34->rc4key[0]);
16565 oldoffice34->rc4key[1] = byte_swap_32 (oldoffice34->rc4key[1]);
16566
16567 /**
16568 * salt
16569 */
16570
16571 salt->salt_len = 16;
16572
16573 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
16574 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
16575 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
16576 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
16577
16578 // this is a workaround as office produces multiple documents with the same salt
16579
16580 salt->salt_len += 32;
16581
16582 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
16583 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
16584 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
16585 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
16586 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
16587 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
16588 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
16589 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
16590
16591 /**
16592 * digest
16593 */
16594
16595 digest[0] = oldoffice34->rc4key[0];
16596 digest[1] = oldoffice34->rc4key[1];
16597 digest[2] = 0;
16598 digest[3] = 0;
16599
16600 return (PARSER_OK);
16601 }
16602
16603 int radmin2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16604 {
16605 if ((input_len < DISPLAY_LEN_MIN_9900) || (input_len > DISPLAY_LEN_MAX_9900)) return (PARSER_GLOBAL_LENGTH);
16606
16607 u32 *digest = (u32 *) hash_buf->digest;
16608
16609 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
16610 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
16611 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
16612 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
16613
16614 digest[0] = byte_swap_32 (digest[0]);
16615 digest[1] = byte_swap_32 (digest[1]);
16616 digest[2] = byte_swap_32 (digest[2]);
16617 digest[3] = byte_swap_32 (digest[3]);
16618
16619 return (PARSER_OK);
16620 }
16621
16622 int djangosha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16623 {
16624 if ((input_len < DISPLAY_LEN_MIN_124) || (input_len > DISPLAY_LEN_MAX_124)) return (PARSER_GLOBAL_LENGTH);
16625
16626 if ((memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5)) && (memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16627
16628 u32 *digest = (u32 *) hash_buf->digest;
16629
16630 salt_t *salt = hash_buf->salt;
16631
16632 char *signature_pos = input_buf;
16633
16634 char *salt_pos = strchr (signature_pos, '$');
16635
16636 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16637
16638 u32 signature_len = salt_pos - signature_pos;
16639
16640 if (signature_len != 4) return (PARSER_SIGNATURE_UNMATCHED);
16641
16642 salt_pos++;
16643
16644 char *hash_pos = strchr (salt_pos, '$');
16645
16646 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16647
16648 u32 salt_len = hash_pos - salt_pos;
16649
16650 if (salt_len > 32) return (PARSER_SALT_LENGTH);
16651
16652 hash_pos++;
16653
16654 u32 hash_len = input_len - signature_len - 1 - salt_len - 1;
16655
16656 if (hash_len != 40) return (PARSER_SALT_LENGTH);
16657
16658 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
16659 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
16660 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
16661 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
16662 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
16663
16664 digest[0] -= SHA1M_A;
16665 digest[1] -= SHA1M_B;
16666 digest[2] -= SHA1M_C;
16667 digest[3] -= SHA1M_D;
16668 digest[4] -= SHA1M_E;
16669
16670 char *salt_buf_ptr = (char *) salt->salt_buf;
16671
16672 memcpy (salt_buf_ptr, salt_pos, salt_len);
16673
16674 salt->salt_len = salt_len;
16675
16676 return (PARSER_OK);
16677 }
16678
16679 int djangopbkdf2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16680 {
16681 if ((input_len < DISPLAY_LEN_MIN_10000) || (input_len > DISPLAY_LEN_MAX_10000)) return (PARSER_GLOBAL_LENGTH);
16682
16683 if (memcmp (SIGNATURE_DJANGOPBKDF2, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
16684
16685 u32 *digest = (u32 *) hash_buf->digest;
16686
16687 salt_t *salt = hash_buf->salt;
16688
16689 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
16690
16691 /**
16692 * parse line
16693 */
16694
16695 char *iter_pos = input_buf + 14;
16696
16697 const int iter = atoi (iter_pos);
16698
16699 if (iter < 1) return (PARSER_SALT_ITERATION);
16700
16701 salt->salt_iter = iter - 1;
16702
16703 char *salt_pos = strchr (iter_pos, '$');
16704
16705 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16706
16707 salt_pos++;
16708
16709 char *hash_pos = strchr (salt_pos, '$');
16710
16711 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16712
16713 const uint salt_len = hash_pos - salt_pos;
16714
16715 hash_pos++;
16716
16717 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
16718
16719 memcpy (salt_buf_ptr, salt_pos, salt_len);
16720
16721 salt->salt_len = salt_len;
16722
16723 salt_buf_ptr[salt_len + 3] = 0x01;
16724 salt_buf_ptr[salt_len + 4] = 0x80;
16725
16726 // add some stuff to normal salt to make sorted happy
16727
16728 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
16729 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
16730 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
16731 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
16732 salt->salt_buf[4] = salt->salt_iter;
16733
16734 // base64 decode hash
16735
16736 u8 tmp_buf[100] = { 0 };
16737
16738 uint hash_len = input_len - (hash_pos - input_buf);
16739
16740 if (hash_len != 44) return (PARSER_HASH_LENGTH);
16741
16742 base64_decode (base64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
16743
16744 memcpy (digest, tmp_buf, 32);
16745
16746 digest[0] = byte_swap_32 (digest[0]);
16747 digest[1] = byte_swap_32 (digest[1]);
16748 digest[2] = byte_swap_32 (digest[2]);
16749 digest[3] = byte_swap_32 (digest[3]);
16750 digest[4] = byte_swap_32 (digest[4]);
16751 digest[5] = byte_swap_32 (digest[5]);
16752 digest[6] = byte_swap_32 (digest[6]);
16753 digest[7] = byte_swap_32 (digest[7]);
16754
16755 return (PARSER_OK);
16756 }
16757
16758 int siphash_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16759 {
16760 if ((input_len < DISPLAY_LEN_MIN_10100) || (input_len > DISPLAY_LEN_MAX_10100)) return (PARSER_GLOBAL_LENGTH);
16761
16762 u32 *digest = (u32 *) hash_buf->digest;
16763
16764 salt_t *salt = hash_buf->salt;
16765
16766 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
16767 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
16768 digest[2] = 0;
16769 digest[3] = 0;
16770
16771 digest[0] = byte_swap_32 (digest[0]);
16772 digest[1] = byte_swap_32 (digest[1]);
16773
16774 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16775 if (input_buf[18] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16776 if (input_buf[20] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16777
16778 char iter_c = input_buf[17];
16779 char iter_d = input_buf[19];
16780
16781 // atm only defaults, let's see if there's more request
16782 if (iter_c != '2') return (PARSER_SALT_ITERATION);
16783 if (iter_d != '4') return (PARSER_SALT_ITERATION);
16784
16785 char *salt_buf = input_buf + 16 + 1 + 1 + 1 + 1 + 1;
16786
16787 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
16788 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
16789 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
16790 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf[24]);
16791
16792 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
16793 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
16794 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
16795 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
16796
16797 salt->salt_len = 16;
16798
16799 return (PARSER_OK);
16800 }
16801
16802 int crammd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16803 {
16804 if ((input_len < DISPLAY_LEN_MIN_10200) || (input_len > DISPLAY_LEN_MAX_10200)) return (PARSER_GLOBAL_LENGTH);
16805
16806 if (memcmp (SIGNATURE_CRAM_MD5, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
16807
16808 u32 *digest = (u32 *) hash_buf->digest;
16809
16810 cram_md5_t *cram_md5 = (cram_md5_t *) hash_buf->esalt;
16811
16812 salt_t *salt = hash_buf->salt;
16813
16814 char *salt_pos = input_buf + 10;
16815
16816 char *hash_pos = strchr (salt_pos, '$');
16817
16818 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16819
16820 uint salt_len = hash_pos - salt_pos;
16821
16822 hash_pos++;
16823
16824 uint hash_len = input_len - 10 - salt_len - 1;
16825
16826 // base64 decode salt
16827
16828 if (salt_len > 133) return (PARSER_SALT_LENGTH);
16829
16830 u8 tmp_buf[100] = { 0 };
16831
16832 salt_len = base64_decode (base64_to_int, (const u8 *) salt_pos, salt_len, tmp_buf);
16833
16834 if (salt_len > 55) return (PARSER_SALT_LENGTH);
16835
16836 tmp_buf[salt_len] = 0x80;
16837
16838 memcpy (&salt->salt_buf, tmp_buf, salt_len + 1);
16839
16840 salt->salt_len = salt_len;
16841
16842 // base64 decode hash
16843
16844 if (hash_len > 133) return (PARSER_HASH_LENGTH);
16845
16846 memset (tmp_buf, 0, sizeof (tmp_buf));
16847
16848 hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
16849
16850 if (hash_len < 32 + 1) return (PARSER_SALT_LENGTH);
16851
16852 uint user_len = hash_len - 32;
16853
16854 const u8 *tmp_hash = tmp_buf + user_len;
16855
16856 user_len--; // skip the trailing space
16857
16858 digest[0] = hex_to_u32 (&tmp_hash[ 0]);
16859 digest[1] = hex_to_u32 (&tmp_hash[ 8]);
16860 digest[2] = hex_to_u32 (&tmp_hash[16]);
16861 digest[3] = hex_to_u32 (&tmp_hash[24]);
16862
16863 digest[0] = byte_swap_32 (digest[0]);
16864 digest[1] = byte_swap_32 (digest[1]);
16865 digest[2] = byte_swap_32 (digest[2]);
16866 digest[3] = byte_swap_32 (digest[3]);
16867
16868 // store username for host only (output hash if cracked)
16869
16870 memset (cram_md5->user, 0, sizeof (cram_md5->user));
16871 memcpy (cram_md5->user, tmp_buf, user_len);
16872
16873 return (PARSER_OK);
16874 }
16875
16876 int saph_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16877 {
16878 if ((input_len < DISPLAY_LEN_MIN_10300) || (input_len > DISPLAY_LEN_MAX_10300)) return (PARSER_GLOBAL_LENGTH);
16879
16880 if (memcmp (SIGNATURE_SAPH_SHA1, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
16881
16882 u32 *digest = (u32 *) hash_buf->digest;
16883
16884 salt_t *salt = hash_buf->salt;
16885
16886 char *iter_pos = input_buf + 10;
16887
16888 u32 iter = atoi (iter_pos);
16889
16890 if (iter < 1)
16891 {
16892 return (PARSER_SALT_ITERATION);
16893 }
16894
16895 iter--; // first iteration is special
16896
16897 salt->salt_iter = iter;
16898
16899 char *base64_pos = strchr (iter_pos, '}');
16900
16901 if (base64_pos == NULL)
16902 {
16903 return (PARSER_SIGNATURE_UNMATCHED);
16904 }
16905
16906 base64_pos++;
16907
16908 // base64 decode salt
16909
16910 u32 base64_len = input_len - (base64_pos - input_buf);
16911
16912 u8 tmp_buf[100] = { 0 };
16913
16914 u32 decoded_len = base64_decode (base64_to_int, (const u8 *) base64_pos, base64_len, tmp_buf);
16915
16916 if (decoded_len < 24)
16917 {
16918 return (PARSER_SALT_LENGTH);
16919 }
16920
16921 // copy the salt
16922
16923 uint salt_len = decoded_len - 20;
16924
16925 if (salt_len < 4) return (PARSER_SALT_LENGTH);
16926 if (salt_len > 16) return (PARSER_SALT_LENGTH);
16927
16928 memcpy (&salt->salt_buf, tmp_buf + 20, salt_len);
16929
16930 salt->salt_len = salt_len;
16931
16932 // set digest
16933
16934 u32 *digest_ptr = (u32*) tmp_buf;
16935
16936 digest[0] = byte_swap_32 (digest_ptr[0]);
16937 digest[1] = byte_swap_32 (digest_ptr[1]);
16938 digest[2] = byte_swap_32 (digest_ptr[2]);
16939 digest[3] = byte_swap_32 (digest_ptr[3]);
16940 digest[4] = byte_swap_32 (digest_ptr[4]);
16941
16942 return (PARSER_OK);
16943 }
16944
16945 int redmine_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16946 {
16947 if ((input_len < DISPLAY_LEN_MIN_7600) || (input_len > DISPLAY_LEN_MAX_7600)) return (PARSER_GLOBAL_LENGTH);
16948
16949 u32 *digest = (u32 *) hash_buf->digest;
16950
16951 salt_t *salt = hash_buf->salt;
16952
16953 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
16954 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
16955 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
16956 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
16957 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
16958
16959 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16960
16961 uint salt_len = input_len - 40 - 1;
16962
16963 char *salt_buf = input_buf + 40 + 1;
16964
16965 char *salt_buf_ptr = (char *) salt->salt_buf;
16966
16967 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
16968
16969 if (salt_len != 32) return (PARSER_SALT_LENGTH);
16970
16971 salt->salt_len = salt_len;
16972
16973 return (PARSER_OK);
16974 }
16975
16976 int pdf11_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16977 {
16978 if ((input_len < DISPLAY_LEN_MIN_10400) || (input_len > DISPLAY_LEN_MAX_10400)) return (PARSER_GLOBAL_LENGTH);
16979
16980 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16981
16982 u32 *digest = (u32 *) hash_buf->digest;
16983
16984 salt_t *salt = hash_buf->salt;
16985
16986 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16987
16988 /**
16989 * parse line
16990 */
16991
16992 char *V_pos = input_buf + 5;
16993
16994 char *R_pos = strchr (V_pos, '*');
16995
16996 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16997
16998 u32 V_len = R_pos - V_pos;
16999
17000 R_pos++;
17001
17002 char *bits_pos = strchr (R_pos, '*');
17003
17004 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17005
17006 u32 R_len = bits_pos - R_pos;
17007
17008 bits_pos++;
17009
17010 char *P_pos = strchr (bits_pos, '*');
17011
17012 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17013
17014 u32 bits_len = P_pos - bits_pos;
17015
17016 P_pos++;
17017
17018 char *enc_md_pos = strchr (P_pos, '*');
17019
17020 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17021
17022 u32 P_len = enc_md_pos - P_pos;
17023
17024 enc_md_pos++;
17025
17026 char *id_len_pos = strchr (enc_md_pos, '*');
17027
17028 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17029
17030 u32 enc_md_len = id_len_pos - enc_md_pos;
17031
17032 id_len_pos++;
17033
17034 char *id_buf_pos = strchr (id_len_pos, '*');
17035
17036 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17037
17038 u32 id_len_len = id_buf_pos - id_len_pos;
17039
17040 id_buf_pos++;
17041
17042 char *u_len_pos = strchr (id_buf_pos, '*');
17043
17044 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17045
17046 u32 id_buf_len = u_len_pos - id_buf_pos;
17047
17048 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
17049
17050 u_len_pos++;
17051
17052 char *u_buf_pos = strchr (u_len_pos, '*');
17053
17054 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17055
17056 u32 u_len_len = u_buf_pos - u_len_pos;
17057
17058 u_buf_pos++;
17059
17060 char *o_len_pos = strchr (u_buf_pos, '*');
17061
17062 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17063
17064 u32 u_buf_len = o_len_pos - u_buf_pos;
17065
17066 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
17067
17068 o_len_pos++;
17069
17070 char *o_buf_pos = strchr (o_len_pos, '*');
17071
17072 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17073
17074 u32 o_len_len = o_buf_pos - o_len_pos;
17075
17076 o_buf_pos++;
17077
17078 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;
17079
17080 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
17081
17082 // validate data
17083
17084 const int V = atoi (V_pos);
17085 const int R = atoi (R_pos);
17086 const int P = atoi (P_pos);
17087
17088 if (V != 1) return (PARSER_SALT_VALUE);
17089 if (R != 2) return (PARSER_SALT_VALUE);
17090
17091 const int enc_md = atoi (enc_md_pos);
17092
17093 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
17094
17095 const int id_len = atoi (id_len_pos);
17096 const int u_len = atoi (u_len_pos);
17097 const int o_len = atoi (o_len_pos);
17098
17099 if (id_len != 16) return (PARSER_SALT_VALUE);
17100 if (u_len != 32) return (PARSER_SALT_VALUE);
17101 if (o_len != 32) return (PARSER_SALT_VALUE);
17102
17103 const int bits = atoi (bits_pos);
17104
17105 if (bits != 40) return (PARSER_SALT_VALUE);
17106
17107 // copy data to esalt
17108
17109 pdf->V = V;
17110 pdf->R = R;
17111 pdf->P = P;
17112
17113 pdf->enc_md = enc_md;
17114
17115 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
17116 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
17117 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
17118 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
17119 pdf->id_len = id_len;
17120
17121 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
17122 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
17123 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
17124 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
17125 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
17126 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
17127 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
17128 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
17129 pdf->u_len = u_len;
17130
17131 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
17132 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
17133 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
17134 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
17135 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
17136 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
17137 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
17138 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
17139 pdf->o_len = o_len;
17140
17141 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
17142 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
17143 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
17144 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
17145
17146 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
17147 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
17148 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
17149 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
17150 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
17151 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
17152 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
17153 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
17154
17155 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
17156 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
17157 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
17158 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
17159 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
17160 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
17161 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
17162 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
17163
17164 // we use ID for salt, maybe needs to change, we will see...
17165
17166 salt->salt_buf[0] = pdf->id_buf[0];
17167 salt->salt_buf[1] = pdf->id_buf[1];
17168 salt->salt_buf[2] = pdf->id_buf[2];
17169 salt->salt_buf[3] = pdf->id_buf[3];
17170 salt->salt_len = pdf->id_len;
17171
17172 digest[0] = pdf->u_buf[0];
17173 digest[1] = pdf->u_buf[1];
17174 digest[2] = pdf->u_buf[2];
17175 digest[3] = pdf->u_buf[3];
17176
17177 return (PARSER_OK);
17178 }
17179
17180 int pdf11cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17181 {
17182 return pdf11_parse_hash (input_buf, input_len, hash_buf);
17183 }
17184
17185 int pdf11cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17186 {
17187 if ((input_len < DISPLAY_LEN_MIN_10420) || (input_len > DISPLAY_LEN_MAX_10420)) return (PARSER_GLOBAL_LENGTH);
17188
17189 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
17190
17191 u32 *digest = (u32 *) hash_buf->digest;
17192
17193 salt_t *salt = hash_buf->salt;
17194
17195 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
17196
17197 /**
17198 * parse line
17199 */
17200
17201 char *V_pos = input_buf + 5;
17202
17203 char *R_pos = strchr (V_pos, '*');
17204
17205 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17206
17207 u32 V_len = R_pos - V_pos;
17208
17209 R_pos++;
17210
17211 char *bits_pos = strchr (R_pos, '*');
17212
17213 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17214
17215 u32 R_len = bits_pos - R_pos;
17216
17217 bits_pos++;
17218
17219 char *P_pos = strchr (bits_pos, '*');
17220
17221 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17222
17223 u32 bits_len = P_pos - bits_pos;
17224
17225 P_pos++;
17226
17227 char *enc_md_pos = strchr (P_pos, '*');
17228
17229 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17230
17231 u32 P_len = enc_md_pos - P_pos;
17232
17233 enc_md_pos++;
17234
17235 char *id_len_pos = strchr (enc_md_pos, '*');
17236
17237 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17238
17239 u32 enc_md_len = id_len_pos - enc_md_pos;
17240
17241 id_len_pos++;
17242
17243 char *id_buf_pos = strchr (id_len_pos, '*');
17244
17245 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17246
17247 u32 id_len_len = id_buf_pos - id_len_pos;
17248
17249 id_buf_pos++;
17250
17251 char *u_len_pos = strchr (id_buf_pos, '*');
17252
17253 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17254
17255 u32 id_buf_len = u_len_pos - id_buf_pos;
17256
17257 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
17258
17259 u_len_pos++;
17260
17261 char *u_buf_pos = strchr (u_len_pos, '*');
17262
17263 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17264
17265 u32 u_len_len = u_buf_pos - u_len_pos;
17266
17267 u_buf_pos++;
17268
17269 char *o_len_pos = strchr (u_buf_pos, '*');
17270
17271 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17272
17273 u32 u_buf_len = o_len_pos - u_buf_pos;
17274
17275 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
17276
17277 o_len_pos++;
17278
17279 char *o_buf_pos = strchr (o_len_pos, '*');
17280
17281 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17282
17283 u32 o_len_len = o_buf_pos - o_len_pos;
17284
17285 o_buf_pos++;
17286
17287 char *rc4key_pos = strchr (o_buf_pos, ':');
17288
17289 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17290
17291 u32 o_buf_len = rc4key_pos - o_buf_pos;
17292
17293 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
17294
17295 rc4key_pos++;
17296
17297 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;
17298
17299 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
17300
17301 // validate data
17302
17303 const int V = atoi (V_pos);
17304 const int R = atoi (R_pos);
17305 const int P = atoi (P_pos);
17306
17307 if (V != 1) return (PARSER_SALT_VALUE);
17308 if (R != 2) return (PARSER_SALT_VALUE);
17309
17310 const int enc_md = atoi (enc_md_pos);
17311
17312 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
17313
17314 const int id_len = atoi (id_len_pos);
17315 const int u_len = atoi (u_len_pos);
17316 const int o_len = atoi (o_len_pos);
17317
17318 if (id_len != 16) return (PARSER_SALT_VALUE);
17319 if (u_len != 32) return (PARSER_SALT_VALUE);
17320 if (o_len != 32) return (PARSER_SALT_VALUE);
17321
17322 const int bits = atoi (bits_pos);
17323
17324 if (bits != 40) return (PARSER_SALT_VALUE);
17325
17326 // copy data to esalt
17327
17328 pdf->V = V;
17329 pdf->R = R;
17330 pdf->P = P;
17331
17332 pdf->enc_md = enc_md;
17333
17334 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
17335 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
17336 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
17337 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
17338 pdf->id_len = id_len;
17339
17340 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
17341 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
17342 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
17343 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
17344 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
17345 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
17346 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
17347 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
17348 pdf->u_len = u_len;
17349
17350 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
17351 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
17352 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
17353 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
17354 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
17355 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
17356 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
17357 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
17358 pdf->o_len = o_len;
17359
17360 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
17361 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
17362 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
17363 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
17364
17365 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
17366 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
17367 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
17368 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
17369 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
17370 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
17371 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
17372 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
17373
17374 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
17375 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
17376 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
17377 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
17378 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
17379 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
17380 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
17381 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
17382
17383 pdf->rc4key[1] = 0;
17384 pdf->rc4key[0] = 0;
17385
17386 pdf->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
17387 pdf->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
17388 pdf->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
17389 pdf->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
17390 pdf->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
17391 pdf->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
17392 pdf->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
17393 pdf->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
17394 pdf->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
17395 pdf->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
17396
17397 pdf->rc4key[0] = byte_swap_32 (pdf->rc4key[0]);
17398 pdf->rc4key[1] = byte_swap_32 (pdf->rc4key[1]);
17399
17400 // we use ID for salt, maybe needs to change, we will see...
17401
17402 salt->salt_buf[0] = pdf->id_buf[0];
17403 salt->salt_buf[1] = pdf->id_buf[1];
17404 salt->salt_buf[2] = pdf->id_buf[2];
17405 salt->salt_buf[3] = pdf->id_buf[3];
17406 salt->salt_buf[4] = pdf->u_buf[0];
17407 salt->salt_buf[5] = pdf->u_buf[1];
17408 salt->salt_buf[6] = pdf->o_buf[0];
17409 salt->salt_buf[7] = pdf->o_buf[1];
17410 salt->salt_len = pdf->id_len + 16;
17411
17412 digest[0] = pdf->rc4key[0];
17413 digest[1] = pdf->rc4key[1];
17414 digest[2] = 0;
17415 digest[3] = 0;
17416
17417 return (PARSER_OK);
17418 }
17419
17420 int pdf14_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17421 {
17422 if ((input_len < DISPLAY_LEN_MIN_10500) || (input_len > DISPLAY_LEN_MAX_10500)) return (PARSER_GLOBAL_LENGTH);
17423
17424 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
17425
17426 u32 *digest = (u32 *) hash_buf->digest;
17427
17428 salt_t *salt = hash_buf->salt;
17429
17430 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
17431
17432 /**
17433 * parse line
17434 */
17435
17436 char *V_pos = input_buf + 5;
17437
17438 char *R_pos = strchr (V_pos, '*');
17439
17440 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17441
17442 u32 V_len = R_pos - V_pos;
17443
17444 R_pos++;
17445
17446 char *bits_pos = strchr (R_pos, '*');
17447
17448 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17449
17450 u32 R_len = bits_pos - R_pos;
17451
17452 bits_pos++;
17453
17454 char *P_pos = strchr (bits_pos, '*');
17455
17456 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17457
17458 u32 bits_len = P_pos - bits_pos;
17459
17460 P_pos++;
17461
17462 char *enc_md_pos = strchr (P_pos, '*');
17463
17464 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17465
17466 u32 P_len = enc_md_pos - P_pos;
17467
17468 enc_md_pos++;
17469
17470 char *id_len_pos = strchr (enc_md_pos, '*');
17471
17472 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17473
17474 u32 enc_md_len = id_len_pos - enc_md_pos;
17475
17476 id_len_pos++;
17477
17478 char *id_buf_pos = strchr (id_len_pos, '*');
17479
17480 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17481
17482 u32 id_len_len = id_buf_pos - id_len_pos;
17483
17484 id_buf_pos++;
17485
17486 char *u_len_pos = strchr (id_buf_pos, '*');
17487
17488 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17489
17490 u32 id_buf_len = u_len_pos - id_buf_pos;
17491
17492 if ((id_buf_len != 32) && (id_buf_len != 64)) return (PARSER_SALT_LENGTH);
17493
17494 u_len_pos++;
17495
17496 char *u_buf_pos = strchr (u_len_pos, '*');
17497
17498 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17499
17500 u32 u_len_len = u_buf_pos - u_len_pos;
17501
17502 u_buf_pos++;
17503
17504 char *o_len_pos = strchr (u_buf_pos, '*');
17505
17506 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17507
17508 u32 u_buf_len = o_len_pos - u_buf_pos;
17509
17510 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
17511
17512 o_len_pos++;
17513
17514 char *o_buf_pos = strchr (o_len_pos, '*');
17515
17516 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17517
17518 u32 o_len_len = o_buf_pos - o_len_pos;
17519
17520 o_buf_pos++;
17521
17522 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;
17523
17524 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
17525
17526 // validate data
17527
17528 const int V = atoi (V_pos);
17529 const int R = atoi (R_pos);
17530 const int P = atoi (P_pos);
17531
17532 int vr_ok = 0;
17533
17534 if ((V == 2) && (R == 3)) vr_ok = 1;
17535 if ((V == 4) && (R == 4)) vr_ok = 1;
17536
17537 if (vr_ok == 0) return (PARSER_SALT_VALUE);
17538
17539 const int id_len = atoi (id_len_pos);
17540 const int u_len = atoi (u_len_pos);
17541 const int o_len = atoi (o_len_pos);
17542
17543 if ((id_len != 16) && (id_len != 32)) return (PARSER_SALT_VALUE);
17544
17545 if (u_len != 32) return (PARSER_SALT_VALUE);
17546 if (o_len != 32) return (PARSER_SALT_VALUE);
17547
17548 const int bits = atoi (bits_pos);
17549
17550 if (bits != 128) return (PARSER_SALT_VALUE);
17551
17552 int enc_md = 1;
17553
17554 if (R >= 4)
17555 {
17556 enc_md = atoi (enc_md_pos);
17557 }
17558
17559 // copy data to esalt
17560
17561 pdf->V = V;
17562 pdf->R = R;
17563 pdf->P = P;
17564
17565 pdf->enc_md = enc_md;
17566
17567 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
17568 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
17569 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
17570 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
17571
17572 if (id_len == 32)
17573 {
17574 pdf->id_buf[4] = hex_to_u32 ((const u8 *) &id_buf_pos[32]);
17575 pdf->id_buf[5] = hex_to_u32 ((const u8 *) &id_buf_pos[40]);
17576 pdf->id_buf[6] = hex_to_u32 ((const u8 *) &id_buf_pos[48]);
17577 pdf->id_buf[7] = hex_to_u32 ((const u8 *) &id_buf_pos[56]);
17578 }
17579
17580 pdf->id_len = id_len;
17581
17582 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
17583 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
17584 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
17585 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
17586 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
17587 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
17588 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
17589 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
17590 pdf->u_len = u_len;
17591
17592 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
17593 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
17594 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
17595 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
17596 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
17597 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
17598 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
17599 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
17600 pdf->o_len = o_len;
17601
17602 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
17603 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
17604 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
17605 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
17606
17607 if (id_len == 32)
17608 {
17609 pdf->id_buf[4] = byte_swap_32 (pdf->id_buf[4]);
17610 pdf->id_buf[5] = byte_swap_32 (pdf->id_buf[5]);
17611 pdf->id_buf[6] = byte_swap_32 (pdf->id_buf[6]);
17612 pdf->id_buf[7] = byte_swap_32 (pdf->id_buf[7]);
17613 }
17614
17615 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
17616 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
17617 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
17618 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
17619 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
17620 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
17621 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
17622 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
17623
17624 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
17625 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
17626 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
17627 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
17628 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
17629 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
17630 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
17631 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
17632
17633 // precompute rc4 data for later use
17634
17635 uint padding[8] =
17636 {
17637 0x5e4ebf28,
17638 0x418a754e,
17639 0x564e0064,
17640 0x0801faff,
17641 0xb6002e2e,
17642 0x803e68d0,
17643 0xfea90c2f,
17644 0x7a695364
17645 };
17646
17647 // md5
17648
17649 uint salt_pc_block[32] = { 0 };
17650
17651 char *salt_pc_ptr = (char *) salt_pc_block;
17652
17653 memcpy (salt_pc_ptr, padding, 32);
17654 memcpy (salt_pc_ptr + 32, pdf->id_buf, pdf->id_len);
17655
17656 uint salt_pc_digest[4] = { 0 };
17657
17658 md5_complete_no_limit (salt_pc_digest, salt_pc_block, 32 + pdf->id_len);
17659
17660 pdf->rc4data[0] = salt_pc_digest[0];
17661 pdf->rc4data[1] = salt_pc_digest[1];
17662
17663 // we use ID for salt, maybe needs to change, we will see...
17664
17665 salt->salt_buf[0] = pdf->id_buf[0];
17666 salt->salt_buf[1] = pdf->id_buf[1];
17667 salt->salt_buf[2] = pdf->id_buf[2];
17668 salt->salt_buf[3] = pdf->id_buf[3];
17669 salt->salt_buf[4] = pdf->u_buf[0];
17670 salt->salt_buf[5] = pdf->u_buf[1];
17671 salt->salt_buf[6] = pdf->o_buf[0];
17672 salt->salt_buf[7] = pdf->o_buf[1];
17673 salt->salt_len = pdf->id_len + 16;
17674
17675 salt->salt_iter = ROUNDS_PDF14;
17676
17677 digest[0] = pdf->u_buf[0];
17678 digest[1] = pdf->u_buf[1];
17679 digest[2] = 0;
17680 digest[3] = 0;
17681
17682 return (PARSER_OK);
17683 }
17684
17685 int pdf17l3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17686 {
17687 int ret = pdf17l8_parse_hash (input_buf, input_len, hash_buf);
17688
17689 if (ret != PARSER_OK)
17690 {
17691 return ret;
17692 }
17693
17694 u32 *digest = (u32 *) hash_buf->digest;
17695
17696 salt_t *salt = hash_buf->salt;
17697
17698 digest[0] -= SHA256M_A;
17699 digest[1] -= SHA256M_B;
17700 digest[2] -= SHA256M_C;
17701 digest[3] -= SHA256M_D;
17702 digest[4] -= SHA256M_E;
17703 digest[5] -= SHA256M_F;
17704 digest[6] -= SHA256M_G;
17705 digest[7] -= SHA256M_H;
17706
17707 salt->salt_buf[2] = 0x80;
17708
17709 return (PARSER_OK);
17710 }
17711
17712 int pdf17l8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17713 {
17714 if ((input_len < DISPLAY_LEN_MIN_10600) || (input_len > DISPLAY_LEN_MAX_10600)) return (PARSER_GLOBAL_LENGTH);
17715
17716 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
17717
17718 u32 *digest = (u32 *) hash_buf->digest;
17719
17720 salt_t *salt = hash_buf->salt;
17721
17722 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
17723
17724 /**
17725 * parse line
17726 */
17727
17728 char *V_pos = input_buf + 5;
17729
17730 char *R_pos = strchr (V_pos, '*');
17731
17732 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17733
17734 u32 V_len = R_pos - V_pos;
17735
17736 R_pos++;
17737
17738 char *bits_pos = strchr (R_pos, '*');
17739
17740 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17741
17742 u32 R_len = bits_pos - R_pos;
17743
17744 bits_pos++;
17745
17746 char *P_pos = strchr (bits_pos, '*');
17747
17748 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17749
17750 u32 bits_len = P_pos - bits_pos;
17751
17752 P_pos++;
17753
17754 char *enc_md_pos = strchr (P_pos, '*');
17755
17756 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17757
17758 u32 P_len = enc_md_pos - P_pos;
17759
17760 enc_md_pos++;
17761
17762 char *id_len_pos = strchr (enc_md_pos, '*');
17763
17764 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17765
17766 u32 enc_md_len = id_len_pos - enc_md_pos;
17767
17768 id_len_pos++;
17769
17770 char *id_buf_pos = strchr (id_len_pos, '*');
17771
17772 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17773
17774 u32 id_len_len = id_buf_pos - id_len_pos;
17775
17776 id_buf_pos++;
17777
17778 char *u_len_pos = strchr (id_buf_pos, '*');
17779
17780 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17781
17782 u32 id_buf_len = u_len_pos - id_buf_pos;
17783
17784 u_len_pos++;
17785
17786 char *u_buf_pos = strchr (u_len_pos, '*');
17787
17788 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17789
17790 u32 u_len_len = u_buf_pos - u_len_pos;
17791
17792 u_buf_pos++;
17793
17794 char *o_len_pos = strchr (u_buf_pos, '*');
17795
17796 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17797
17798 u32 u_buf_len = o_len_pos - u_buf_pos;
17799
17800 o_len_pos++;
17801
17802 char *o_buf_pos = strchr (o_len_pos, '*');
17803
17804 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17805
17806 u32 o_len_len = o_buf_pos - o_len_pos;
17807
17808 o_buf_pos++;
17809
17810 char *last = strchr (o_buf_pos, '*');
17811
17812 if (last == NULL) last = input_buf + input_len;
17813
17814 u32 o_buf_len = last - o_buf_pos;
17815
17816 // validate data
17817
17818 const int V = atoi (V_pos);
17819 const int R = atoi (R_pos);
17820
17821 int vr_ok = 0;
17822
17823 if ((V == 5) && (R == 5)) vr_ok = 1;
17824 if ((V == 5) && (R == 6)) vr_ok = 1;
17825
17826 if (vr_ok == 0) return (PARSER_SALT_VALUE);
17827
17828 const int bits = atoi (bits_pos);
17829
17830 if (bits != 256) return (PARSER_SALT_VALUE);
17831
17832 int enc_md = atoi (enc_md_pos);
17833
17834 if (enc_md != 1) return (PARSER_SALT_VALUE);
17835
17836 const uint id_len = atoi (id_len_pos);
17837 const uint u_len = atoi (u_len_pos);
17838 const uint o_len = atoi (o_len_pos);
17839
17840 if (V_len > 6) return (PARSER_SALT_LENGTH);
17841 if (R_len > 6) return (PARSER_SALT_LENGTH);
17842 if (P_len > 6) return (PARSER_SALT_LENGTH);
17843 if (id_len_len > 6) return (PARSER_SALT_LENGTH);
17844 if (u_len_len > 6) return (PARSER_SALT_LENGTH);
17845 if (o_len_len > 6) return (PARSER_SALT_LENGTH);
17846 if (bits_len > 6) return (PARSER_SALT_LENGTH);
17847 if (enc_md_len > 6) return (PARSER_SALT_LENGTH);
17848
17849 if ((id_len * 2) != id_buf_len) return (PARSER_SALT_VALUE);
17850 if ((u_len * 2) != u_buf_len) return (PARSER_SALT_VALUE);
17851 if ((o_len * 2) != o_buf_len) return (PARSER_SALT_VALUE);
17852
17853 // copy data to esalt
17854
17855 if (u_len < 40) return (PARSER_SALT_VALUE);
17856
17857 for (int i = 0, j = 0; i < 8 + 2; i += 1, j += 8)
17858 {
17859 pdf->u_buf[i] = hex_to_u32 ((const u8 *) &u_buf_pos[j]);
17860 }
17861
17862 salt->salt_buf[0] = pdf->u_buf[8];
17863 salt->salt_buf[1] = pdf->u_buf[9];
17864
17865 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
17866 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
17867
17868 salt->salt_len = 8;
17869 salt->salt_iter = ROUNDS_PDF17L8;
17870
17871 digest[0] = pdf->u_buf[0];
17872 digest[1] = pdf->u_buf[1];
17873 digest[2] = pdf->u_buf[2];
17874 digest[3] = pdf->u_buf[3];
17875 digest[4] = pdf->u_buf[4];
17876 digest[5] = pdf->u_buf[5];
17877 digest[6] = pdf->u_buf[6];
17878 digest[7] = pdf->u_buf[7];
17879
17880 return (PARSER_OK);
17881 }
17882
17883 int pbkdf2_sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17884 {
17885 if ((input_len < DISPLAY_LEN_MIN_10900) || (input_len > DISPLAY_LEN_MAX_10900)) return (PARSER_GLOBAL_LENGTH);
17886
17887 if (memcmp (SIGNATURE_PBKDF2_SHA256, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
17888
17889 u32 *digest = (u32 *) hash_buf->digest;
17890
17891 salt_t *salt = hash_buf->salt;
17892
17893 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
17894
17895 /**
17896 * parse line
17897 */
17898
17899 // iterations
17900
17901 char *iter_pos = input_buf + 7;
17902
17903 u32 iter = atoi (iter_pos);
17904
17905 if (iter < 1) return (PARSER_SALT_ITERATION);
17906 if (iter > 999999) return (PARSER_SALT_ITERATION);
17907
17908 // first is *raw* salt
17909
17910 char *salt_pos = strchr (iter_pos, ':');
17911
17912 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17913
17914 salt_pos++;
17915
17916 char *hash_pos = strchr (salt_pos, ':');
17917
17918 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17919
17920 u32 salt_len = hash_pos - salt_pos;
17921
17922 if (salt_len > 64) return (PARSER_SALT_LENGTH);
17923
17924 hash_pos++;
17925
17926 u32 hash_b64_len = input_len - (hash_pos - input_buf);
17927
17928 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
17929
17930 // decode salt
17931
17932 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
17933
17934 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
17935
17936 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17937
17938 salt_buf_ptr[salt_len + 3] = 0x01;
17939 salt_buf_ptr[salt_len + 4] = 0x80;
17940
17941 salt->salt_len = salt_len;
17942 salt->salt_iter = iter - 1;
17943
17944 // decode hash
17945
17946 u8 tmp_buf[100] = { 0 };
17947
17948 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
17949
17950 if (hash_len < 16) return (PARSER_HASH_LENGTH);
17951
17952 memcpy (digest, tmp_buf, 16);
17953
17954 digest[0] = byte_swap_32 (digest[0]);
17955 digest[1] = byte_swap_32 (digest[1]);
17956 digest[2] = byte_swap_32 (digest[2]);
17957 digest[3] = byte_swap_32 (digest[3]);
17958
17959 // add some stuff to normal salt to make sorted happy
17960
17961 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
17962 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
17963 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
17964 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
17965 salt->salt_buf[4] = salt->salt_iter;
17966
17967 return (PARSER_OK);
17968 }
17969
17970 int prestashop_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17971 {
17972 if ((input_len < DISPLAY_LEN_MIN_11000) || (input_len > DISPLAY_LEN_MAX_11000)) return (PARSER_GLOBAL_LENGTH);
17973
17974 u32 *digest = (u32 *) hash_buf->digest;
17975
17976 salt_t *salt = hash_buf->salt;
17977
17978 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
17979 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
17980 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
17981 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
17982
17983 digest[0] = byte_swap_32 (digest[0]);
17984 digest[1] = byte_swap_32 (digest[1]);
17985 digest[2] = byte_swap_32 (digest[2]);
17986 digest[3] = byte_swap_32 (digest[3]);
17987
17988 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
17989
17990 uint salt_len = input_len - 32 - 1;
17991
17992 char *salt_buf = input_buf + 32 + 1;
17993
17994 char *salt_buf_ptr = (char *) salt->salt_buf;
17995
17996 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
17997
17998 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17999
18000 salt->salt_len = salt_len;
18001
18002 return (PARSER_OK);
18003 }
18004
18005 int postgresql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18006 {
18007 if ((input_len < DISPLAY_LEN_MIN_11100) || (input_len > DISPLAY_LEN_MAX_11100)) return (PARSER_GLOBAL_LENGTH);
18008
18009 if (memcmp (SIGNATURE_POSTGRESQL_AUTH, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
18010
18011 u32 *digest = (u32 *) hash_buf->digest;
18012
18013 salt_t *salt = hash_buf->salt;
18014
18015 char *user_pos = input_buf + 10;
18016
18017 char *salt_pos = strchr (user_pos, '*');
18018
18019 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18020
18021 salt_pos++;
18022
18023 char *hash_pos = strchr (salt_pos, '*');
18024
18025 hash_pos++;
18026
18027 uint hash_len = input_len - (hash_pos - input_buf);
18028
18029 if (hash_len != 32) return (PARSER_HASH_LENGTH);
18030
18031 uint user_len = salt_pos - user_pos - 1;
18032
18033 uint salt_len = hash_pos - salt_pos - 1;
18034
18035 if (salt_len != 8) return (PARSER_SALT_LENGTH);
18036
18037 /*
18038 * store digest
18039 */
18040
18041 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
18042 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
18043 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
18044 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
18045
18046 digest[0] = byte_swap_32 (digest[0]);
18047 digest[1] = byte_swap_32 (digest[1]);
18048 digest[2] = byte_swap_32 (digest[2]);
18049 digest[3] = byte_swap_32 (digest[3]);
18050
18051 digest[0] -= MD5M_A;
18052 digest[1] -= MD5M_B;
18053 digest[2] -= MD5M_C;
18054 digest[3] -= MD5M_D;
18055
18056 /*
18057 * store salt
18058 */
18059
18060 char *salt_buf_ptr = (char *) salt->salt_buf;
18061
18062 // first 4 bytes are the "challenge"
18063
18064 salt_buf_ptr[0] = hex_to_u8 ((const u8 *) &salt_pos[0]);
18065 salt_buf_ptr[1] = hex_to_u8 ((const u8 *) &salt_pos[2]);
18066 salt_buf_ptr[2] = hex_to_u8 ((const u8 *) &salt_pos[4]);
18067 salt_buf_ptr[3] = hex_to_u8 ((const u8 *) &salt_pos[6]);
18068
18069 // append the user name
18070
18071 user_len = parse_and_store_salt (salt_buf_ptr + 4, user_pos, user_len);
18072
18073 salt->salt_len = 4 + user_len;
18074
18075 return (PARSER_OK);
18076 }
18077
18078 int mysql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18079 {
18080 if ((input_len < DISPLAY_LEN_MIN_11200) || (input_len > DISPLAY_LEN_MAX_11200)) return (PARSER_GLOBAL_LENGTH);
18081
18082 if (memcmp (SIGNATURE_MYSQL_AUTH, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
18083
18084 u32 *digest = (u32 *) hash_buf->digest;
18085
18086 salt_t *salt = hash_buf->salt;
18087
18088 char *salt_pos = input_buf + 9;
18089
18090 char *hash_pos = strchr (salt_pos, '*');
18091
18092 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18093
18094 hash_pos++;
18095
18096 uint hash_len = input_len - (hash_pos - input_buf);
18097
18098 if (hash_len != 40) return (PARSER_HASH_LENGTH);
18099
18100 uint salt_len = hash_pos - salt_pos - 1;
18101
18102 if (salt_len != 40) return (PARSER_SALT_LENGTH);
18103
18104 /*
18105 * store digest
18106 */
18107
18108 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
18109 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
18110 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
18111 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
18112 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
18113
18114 /*
18115 * store salt
18116 */
18117
18118 char *salt_buf_ptr = (char *) salt->salt_buf;
18119
18120 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18121
18122 salt->salt_len = salt_len;
18123
18124 return (PARSER_OK);
18125 }
18126
18127 int bitcoin_wallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18128 {
18129 if ((input_len < DISPLAY_LEN_MIN_11300) || (input_len > DISPLAY_LEN_MAX_11300)) return (PARSER_GLOBAL_LENGTH);
18130
18131 if (memcmp (SIGNATURE_BITCOIN_WALLET, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
18132
18133 u32 *digest = (u32 *) hash_buf->digest;
18134
18135 salt_t *salt = hash_buf->salt;
18136
18137 bitcoin_wallet_t *bitcoin_wallet = (bitcoin_wallet_t *) hash_buf->esalt;
18138
18139 /**
18140 * parse line
18141 */
18142
18143 char *cry_master_len_pos = input_buf + 9;
18144
18145 char *cry_master_buf_pos = strchr (cry_master_len_pos, '$');
18146
18147 if (cry_master_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18148
18149 u32 cry_master_len_len = cry_master_buf_pos - cry_master_len_pos;
18150
18151 cry_master_buf_pos++;
18152
18153 char *cry_salt_len_pos = strchr (cry_master_buf_pos, '$');
18154
18155 if (cry_salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18156
18157 u32 cry_master_buf_len = cry_salt_len_pos - cry_master_buf_pos;
18158
18159 cry_salt_len_pos++;
18160
18161 char *cry_salt_buf_pos = strchr (cry_salt_len_pos, '$');
18162
18163 if (cry_salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18164
18165 u32 cry_salt_len_len = cry_salt_buf_pos - cry_salt_len_pos;
18166
18167 cry_salt_buf_pos++;
18168
18169 char *cry_rounds_pos = strchr (cry_salt_buf_pos, '$');
18170
18171 if (cry_rounds_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18172
18173 u32 cry_salt_buf_len = cry_rounds_pos - cry_salt_buf_pos;
18174
18175 cry_rounds_pos++;
18176
18177 char *ckey_len_pos = strchr (cry_rounds_pos, '$');
18178
18179 if (ckey_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18180
18181 u32 cry_rounds_len = ckey_len_pos - cry_rounds_pos;
18182
18183 ckey_len_pos++;
18184
18185 char *ckey_buf_pos = strchr (ckey_len_pos, '$');
18186
18187 if (ckey_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18188
18189 u32 ckey_len_len = ckey_buf_pos - ckey_len_pos;
18190
18191 ckey_buf_pos++;
18192
18193 char *public_key_len_pos = strchr (ckey_buf_pos, '$');
18194
18195 if (public_key_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18196
18197 u32 ckey_buf_len = public_key_len_pos - ckey_buf_pos;
18198
18199 public_key_len_pos++;
18200
18201 char *public_key_buf_pos = strchr (public_key_len_pos, '$');
18202
18203 if (public_key_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18204
18205 u32 public_key_len_len = public_key_buf_pos - public_key_len_pos;
18206
18207 public_key_buf_pos++;
18208
18209 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;
18210
18211 const uint cry_master_len = atoi (cry_master_len_pos);
18212 const uint cry_salt_len = atoi (cry_salt_len_pos);
18213 const uint ckey_len = atoi (ckey_len_pos);
18214 const uint public_key_len = atoi (public_key_len_pos);
18215
18216 if (cry_master_buf_len != cry_master_len) return (PARSER_SALT_VALUE);
18217 if (cry_salt_buf_len != cry_salt_len) return (PARSER_SALT_VALUE);
18218 if (ckey_buf_len != ckey_len) return (PARSER_SALT_VALUE);
18219 if (public_key_buf_len != public_key_len) return (PARSER_SALT_VALUE);
18220
18221 for (uint i = 0, j = 0; j < cry_master_len; i += 1, j += 8)
18222 {
18223 bitcoin_wallet->cry_master_buf[i] = hex_to_u32 ((const u8 *) &cry_master_buf_pos[j]);
18224
18225 bitcoin_wallet->cry_master_buf[i] = byte_swap_32 (bitcoin_wallet->cry_master_buf[i]);
18226 }
18227
18228 for (uint i = 0, j = 0; j < ckey_len; i += 1, j += 8)
18229 {
18230 bitcoin_wallet->ckey_buf[i] = hex_to_u32 ((const u8 *) &ckey_buf_pos[j]);
18231
18232 bitcoin_wallet->ckey_buf[i] = byte_swap_32 (bitcoin_wallet->ckey_buf[i]);
18233 }
18234
18235 for (uint i = 0, j = 0; j < public_key_len; i += 1, j += 8)
18236 {
18237 bitcoin_wallet->public_key_buf[i] = hex_to_u32 ((const u8 *) &public_key_buf_pos[j]);
18238
18239 bitcoin_wallet->public_key_buf[i] = byte_swap_32 (bitcoin_wallet->public_key_buf[i]);
18240 }
18241
18242 bitcoin_wallet->cry_master_len = cry_master_len / 2;
18243 bitcoin_wallet->ckey_len = ckey_len / 2;
18244 bitcoin_wallet->public_key_len = public_key_len / 2;
18245
18246 /*
18247 * store digest (should be unique enought, hopefully)
18248 */
18249
18250 digest[0] = bitcoin_wallet->cry_master_buf[0];
18251 digest[1] = bitcoin_wallet->cry_master_buf[1];
18252 digest[2] = bitcoin_wallet->cry_master_buf[2];
18253 digest[3] = bitcoin_wallet->cry_master_buf[3];
18254
18255 /*
18256 * store salt
18257 */
18258
18259 if (cry_rounds_len >= 7) return (PARSER_SALT_VALUE);
18260
18261 const uint cry_rounds = atoi (cry_rounds_pos);
18262
18263 salt->salt_iter = cry_rounds - 1;
18264
18265 char *salt_buf_ptr = (char *) salt->salt_buf;
18266
18267 const uint salt_len = parse_and_store_salt (salt_buf_ptr, cry_salt_buf_pos, cry_salt_buf_len);
18268
18269 salt->salt_len = salt_len;
18270
18271 return (PARSER_OK);
18272 }
18273
18274 int sip_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18275 {
18276 if ((input_len < DISPLAY_LEN_MIN_11400) || (input_len > DISPLAY_LEN_MAX_11400)) return (PARSER_GLOBAL_LENGTH);
18277
18278 if (memcmp (SIGNATURE_SIP_AUTH, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
18279
18280 u32 *digest = (u32 *) hash_buf->digest;
18281
18282 salt_t *salt = hash_buf->salt;
18283
18284 sip_t *sip = (sip_t *) hash_buf->esalt;
18285
18286 // work with a temporary copy of input_buf (s.t. we can manipulate it directly)
18287
18288 char *temp_input_buf = (char *) mymalloc (input_len + 1);
18289
18290 memcpy (temp_input_buf, input_buf, input_len);
18291
18292 // URI_server:
18293
18294 char *URI_server_pos = temp_input_buf + 6;
18295
18296 char *URI_client_pos = strchr (URI_server_pos, '*');
18297
18298 if (URI_client_pos == NULL)
18299 {
18300 myfree (temp_input_buf);
18301
18302 return (PARSER_SEPARATOR_UNMATCHED);
18303 }
18304
18305 URI_client_pos[0] = 0;
18306 URI_client_pos++;
18307
18308 uint URI_server_len = strlen (URI_server_pos);
18309
18310 if (URI_server_len > 512)
18311 {
18312 myfree (temp_input_buf);
18313
18314 return (PARSER_SALT_LENGTH);
18315 }
18316
18317 // URI_client:
18318
18319 char *user_pos = strchr (URI_client_pos, '*');
18320
18321 if (user_pos == NULL)
18322 {
18323 myfree (temp_input_buf);
18324
18325 return (PARSER_SEPARATOR_UNMATCHED);
18326 }
18327
18328 user_pos[0] = 0;
18329 user_pos++;
18330
18331 uint URI_client_len = strlen (URI_client_pos);
18332
18333 if (URI_client_len > 512)
18334 {
18335 myfree (temp_input_buf);
18336
18337 return (PARSER_SALT_LENGTH);
18338 }
18339
18340 // user:
18341
18342 char *realm_pos = strchr (user_pos, '*');
18343
18344 if (realm_pos == NULL)
18345 {
18346 myfree (temp_input_buf);
18347
18348 return (PARSER_SEPARATOR_UNMATCHED);
18349 }
18350
18351 realm_pos[0] = 0;
18352 realm_pos++;
18353
18354 uint user_len = strlen (user_pos);
18355
18356 if (user_len > 116)
18357 {
18358 myfree (temp_input_buf);
18359
18360 return (PARSER_SALT_LENGTH);
18361 }
18362
18363 // realm:
18364
18365 char *method_pos = strchr (realm_pos, '*');
18366
18367 if (method_pos == NULL)
18368 {
18369 myfree (temp_input_buf);
18370
18371 return (PARSER_SEPARATOR_UNMATCHED);
18372 }
18373
18374 method_pos[0] = 0;
18375 method_pos++;
18376
18377 uint realm_len = strlen (realm_pos);
18378
18379 if (realm_len > 116)
18380 {
18381 myfree (temp_input_buf);
18382
18383 return (PARSER_SALT_LENGTH);
18384 }
18385
18386 // method:
18387
18388 char *URI_prefix_pos = strchr (method_pos, '*');
18389
18390 if (URI_prefix_pos == NULL)
18391 {
18392 myfree (temp_input_buf);
18393
18394 return (PARSER_SEPARATOR_UNMATCHED);
18395 }
18396
18397 URI_prefix_pos[0] = 0;
18398 URI_prefix_pos++;
18399
18400 uint method_len = strlen (method_pos);
18401
18402 if (method_len > 246)
18403 {
18404 myfree (temp_input_buf);
18405
18406 return (PARSER_SALT_LENGTH);
18407 }
18408
18409 // URI_prefix:
18410
18411 char *URI_resource_pos = strchr (URI_prefix_pos, '*');
18412
18413 if (URI_resource_pos == NULL)
18414 {
18415 myfree (temp_input_buf);
18416
18417 return (PARSER_SEPARATOR_UNMATCHED);
18418 }
18419
18420 URI_resource_pos[0] = 0;
18421 URI_resource_pos++;
18422
18423 uint URI_prefix_len = strlen (URI_prefix_pos);
18424
18425 if (URI_prefix_len > 245)
18426 {
18427 myfree (temp_input_buf);
18428
18429 return (PARSER_SALT_LENGTH);
18430 }
18431
18432 // URI_resource:
18433
18434 char *URI_suffix_pos = strchr (URI_resource_pos, '*');
18435
18436 if (URI_suffix_pos == NULL)
18437 {
18438 myfree (temp_input_buf);
18439
18440 return (PARSER_SEPARATOR_UNMATCHED);
18441 }
18442
18443 URI_suffix_pos[0] = 0;
18444 URI_suffix_pos++;
18445
18446 uint URI_resource_len = strlen (URI_resource_pos);
18447
18448 if (URI_resource_len < 1 || URI_resource_len > 246)
18449 {
18450 myfree (temp_input_buf);
18451
18452 return (PARSER_SALT_LENGTH);
18453 }
18454
18455 // URI_suffix:
18456
18457 char *nonce_pos = strchr (URI_suffix_pos, '*');
18458
18459 if (nonce_pos == NULL)
18460 {
18461 myfree (temp_input_buf);
18462
18463 return (PARSER_SEPARATOR_UNMATCHED);
18464 }
18465
18466 nonce_pos[0] = 0;
18467 nonce_pos++;
18468
18469 uint URI_suffix_len = strlen (URI_suffix_pos);
18470
18471 if (URI_suffix_len > 245)
18472 {
18473 myfree (temp_input_buf);
18474
18475 return (PARSER_SALT_LENGTH);
18476 }
18477
18478 // nonce:
18479
18480 char *nonce_client_pos = strchr (nonce_pos, '*');
18481
18482 if (nonce_client_pos == NULL)
18483 {
18484 myfree (temp_input_buf);
18485
18486 return (PARSER_SEPARATOR_UNMATCHED);
18487 }
18488
18489 nonce_client_pos[0] = 0;
18490 nonce_client_pos++;
18491
18492 uint nonce_len = strlen (nonce_pos);
18493
18494 if (nonce_len < 1 || nonce_len > 50)
18495 {
18496 myfree (temp_input_buf);
18497
18498 return (PARSER_SALT_LENGTH);
18499 }
18500
18501 // nonce_client:
18502
18503 char *nonce_count_pos = strchr (nonce_client_pos, '*');
18504
18505 if (nonce_count_pos == NULL)
18506 {
18507 myfree (temp_input_buf);
18508
18509 return (PARSER_SEPARATOR_UNMATCHED);
18510 }
18511
18512 nonce_count_pos[0] = 0;
18513 nonce_count_pos++;
18514
18515 uint nonce_client_len = strlen (nonce_client_pos);
18516
18517 if (nonce_client_len > 50)
18518 {
18519 myfree (temp_input_buf);
18520
18521 return (PARSER_SALT_LENGTH);
18522 }
18523
18524 // nonce_count:
18525
18526 char *qop_pos = strchr (nonce_count_pos, '*');
18527
18528 if (qop_pos == NULL)
18529 {
18530 myfree (temp_input_buf);
18531
18532 return (PARSER_SEPARATOR_UNMATCHED);
18533 }
18534
18535 qop_pos[0] = 0;
18536 qop_pos++;
18537
18538 uint nonce_count_len = strlen (nonce_count_pos);
18539
18540 if (nonce_count_len > 50)
18541 {
18542 myfree (temp_input_buf);
18543
18544 return (PARSER_SALT_LENGTH);
18545 }
18546
18547 // qop:
18548
18549 char *directive_pos = strchr (qop_pos, '*');
18550
18551 if (directive_pos == NULL)
18552 {
18553 myfree (temp_input_buf);
18554
18555 return (PARSER_SEPARATOR_UNMATCHED);
18556 }
18557
18558 directive_pos[0] = 0;
18559 directive_pos++;
18560
18561 uint qop_len = strlen (qop_pos);
18562
18563 if (qop_len > 50)
18564 {
18565 myfree (temp_input_buf);
18566
18567 return (PARSER_SALT_LENGTH);
18568 }
18569
18570 // directive
18571
18572 char *digest_pos = strchr (directive_pos, '*');
18573
18574 if (digest_pos == NULL)
18575 {
18576 myfree (temp_input_buf);
18577
18578 return (PARSER_SEPARATOR_UNMATCHED);
18579 }
18580
18581 digest_pos[0] = 0;
18582 digest_pos++;
18583
18584 uint directive_len = strlen (directive_pos);
18585
18586 if (directive_len != 3)
18587 {
18588 myfree (temp_input_buf);
18589
18590 return (PARSER_SALT_LENGTH);
18591 }
18592
18593 if (memcmp (directive_pos, "MD5", 3))
18594 {
18595 log_info ("ERROR: only the MD5 directive is currently supported\n");
18596
18597 myfree (temp_input_buf);
18598
18599 return (PARSER_SIP_AUTH_DIRECTIVE);
18600 }
18601
18602 /*
18603 * first (pre-)compute: HA2 = md5 ($method . ":" . $uri)
18604 */
18605
18606 uint md5_len = 0;
18607
18608 uint md5_max_len = 4 * 64;
18609
18610 uint md5_remaining_len = md5_max_len;
18611
18612 uint tmp_md5_buf[64] = { 0 };
18613
18614 char *tmp_md5_ptr = (char *) tmp_md5_buf;
18615
18616 snprintf (tmp_md5_ptr, md5_remaining_len, "%s:", method_pos);
18617
18618 md5_len += method_len + 1;
18619 tmp_md5_ptr += method_len + 1;
18620
18621 if (URI_prefix_len > 0)
18622 {
18623 md5_remaining_len = md5_max_len - md5_len;
18624
18625 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s:", URI_prefix_pos);
18626
18627 md5_len += URI_prefix_len + 1;
18628 tmp_md5_ptr += URI_prefix_len + 1;
18629 }
18630
18631 md5_remaining_len = md5_max_len - md5_len;
18632
18633 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s", URI_resource_pos);
18634
18635 md5_len += URI_resource_len;
18636 tmp_md5_ptr += URI_resource_len;
18637
18638 if (URI_suffix_len > 0)
18639 {
18640 md5_remaining_len = md5_max_len - md5_len;
18641
18642 snprintf (tmp_md5_ptr, md5_remaining_len + 1, ":%s", URI_suffix_pos);
18643
18644 md5_len += 1 + URI_suffix_len;
18645 }
18646
18647 uint tmp_digest[4] = { 0 };
18648
18649 md5_complete_no_limit (tmp_digest, tmp_md5_buf, md5_len);
18650
18651 tmp_digest[0] = byte_swap_32 (tmp_digest[0]);
18652 tmp_digest[1] = byte_swap_32 (tmp_digest[1]);
18653 tmp_digest[2] = byte_swap_32 (tmp_digest[2]);
18654 tmp_digest[3] = byte_swap_32 (tmp_digest[3]);
18655
18656 /*
18657 * esalt
18658 */
18659
18660 char *esalt_buf_ptr = (char *) sip->esalt_buf;
18661
18662 uint esalt_len = 0;
18663
18664 uint max_esalt_len = sizeof (sip->esalt_buf); // 151 = (64 + 64 + 55) - 32, where 32 is the hexadecimal MD5 HA1 hash
18665
18666 // there are 2 possibilities for the esalt:
18667
18668 if ((strcmp (qop_pos, "auth") == 0) || (strcmp (qop_pos, "auth-int") == 0))
18669 {
18670 esalt_len = 1 + nonce_len + 1 + nonce_count_len + 1 + nonce_client_len + 1 + qop_len + 1 + 32;
18671
18672 if (esalt_len > max_esalt_len)
18673 {
18674 myfree (temp_input_buf);
18675
18676 return (PARSER_SALT_LENGTH);
18677 }
18678
18679 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%s:%s:%s:%08x%08x%08x%08x",
18680 nonce_pos,
18681 nonce_count_pos,
18682 nonce_client_pos,
18683 qop_pos,
18684 tmp_digest[0],
18685 tmp_digest[1],
18686 tmp_digest[2],
18687 tmp_digest[3]);
18688 }
18689 else
18690 {
18691 esalt_len = 1 + nonce_len + 1 + 32;
18692
18693 if (esalt_len > max_esalt_len)
18694 {
18695 myfree (temp_input_buf);
18696
18697 return (PARSER_SALT_LENGTH);
18698 }
18699
18700 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%08x%08x%08x%08x",
18701 nonce_pos,
18702 tmp_digest[0],
18703 tmp_digest[1],
18704 tmp_digest[2],
18705 tmp_digest[3]);
18706 }
18707
18708 // add 0x80 to esalt
18709
18710 esalt_buf_ptr[esalt_len] = 0x80;
18711
18712 sip->esalt_len = esalt_len;
18713
18714 /*
18715 * actual salt
18716 */
18717
18718 char *sip_salt_ptr = (char *) sip->salt_buf;
18719
18720 uint salt_len = user_len + 1 + realm_len + 1;
18721
18722 uint max_salt_len = 119;
18723
18724 if (salt_len > max_salt_len)
18725 {
18726 myfree (temp_input_buf);
18727
18728 return (PARSER_SALT_LENGTH);
18729 }
18730
18731 snprintf (sip_salt_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
18732
18733 sip->salt_len = salt_len;
18734
18735 /*
18736 * fake salt (for sorting)
18737 */
18738
18739 char *salt_buf_ptr = (char *) salt->salt_buf;
18740
18741 max_salt_len = 55;
18742
18743 uint fake_salt_len = salt_len;
18744
18745 if (fake_salt_len > max_salt_len)
18746 {
18747 fake_salt_len = max_salt_len;
18748 }
18749
18750 snprintf (salt_buf_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
18751
18752 salt->salt_len = fake_salt_len;
18753
18754 /*
18755 * digest
18756 */
18757
18758 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
18759 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
18760 digest[2] = hex_to_u32 ((const u8 *) &digest_pos[16]);
18761 digest[3] = hex_to_u32 ((const u8 *) &digest_pos[24]);
18762
18763 digest[0] = byte_swap_32 (digest[0]);
18764 digest[1] = byte_swap_32 (digest[1]);
18765 digest[2] = byte_swap_32 (digest[2]);
18766 digest[3] = byte_swap_32 (digest[3]);
18767
18768 myfree (temp_input_buf);
18769
18770 return (PARSER_OK);
18771 }
18772
18773 int crc32_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18774 {
18775 if ((input_len < DISPLAY_LEN_MIN_11500) || (input_len > DISPLAY_LEN_MAX_11500)) return (PARSER_GLOBAL_LENGTH);
18776
18777 if (input_buf[8] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
18778
18779 u32 *digest = (u32 *) hash_buf->digest;
18780
18781 salt_t *salt = hash_buf->salt;
18782
18783 // digest
18784
18785 char *digest_pos = input_buf;
18786
18787 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[0]);
18788 digest[1] = 0;
18789 digest[2] = 0;
18790 digest[3] = 0;
18791
18792 // salt
18793
18794 char *salt_buf = input_buf + 8 + 1;
18795
18796 uint salt_len = 8;
18797
18798 char *salt_buf_ptr = (char *) salt->salt_buf;
18799
18800 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
18801
18802 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18803
18804 salt->salt_len = salt_len;
18805
18806 return (PARSER_OK);
18807 }
18808
18809 int seven_zip_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18810 {
18811 if ((input_len < DISPLAY_LEN_MIN_11600) || (input_len > DISPLAY_LEN_MAX_11600)) return (PARSER_GLOBAL_LENGTH);
18812
18813 if (memcmp (SIGNATURE_SEVEN_ZIP, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
18814
18815 u32 *digest = (u32 *) hash_buf->digest;
18816
18817 salt_t *salt = hash_buf->salt;
18818
18819 seven_zip_t *seven_zip = (seven_zip_t *) hash_buf->esalt;
18820
18821 /**
18822 * parse line
18823 */
18824
18825 char *p_buf_pos = input_buf + 4;
18826
18827 char *NumCyclesPower_pos = strchr (p_buf_pos, '$');
18828
18829 if (NumCyclesPower_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18830
18831 u32 p_buf_len = NumCyclesPower_pos - p_buf_pos;
18832
18833 NumCyclesPower_pos++;
18834
18835 char *salt_len_pos = strchr (NumCyclesPower_pos, '$');
18836
18837 if (salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18838
18839 u32 NumCyclesPower_len = salt_len_pos - NumCyclesPower_pos;
18840
18841 salt_len_pos++;
18842
18843 char *salt_buf_pos = strchr (salt_len_pos, '$');
18844
18845 if (salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18846
18847 u32 salt_len_len = salt_buf_pos - salt_len_pos;
18848
18849 salt_buf_pos++;
18850
18851 char *iv_len_pos = strchr (salt_buf_pos, '$');
18852
18853 if (iv_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18854
18855 u32 salt_buf_len = iv_len_pos - salt_buf_pos;
18856
18857 iv_len_pos++;
18858
18859 char *iv_buf_pos = strchr (iv_len_pos, '$');
18860
18861 if (iv_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18862
18863 u32 iv_len_len = iv_buf_pos - iv_len_pos;
18864
18865 iv_buf_pos++;
18866
18867 char *crc_buf_pos = strchr (iv_buf_pos, '$');
18868
18869 if (crc_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18870
18871 u32 iv_buf_len = crc_buf_pos - iv_buf_pos;
18872
18873 crc_buf_pos++;
18874
18875 char *data_len_pos = strchr (crc_buf_pos, '$');
18876
18877 if (data_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18878
18879 u32 crc_buf_len = data_len_pos - crc_buf_pos;
18880
18881 data_len_pos++;
18882
18883 char *unpack_size_pos = strchr (data_len_pos, '$');
18884
18885 if (unpack_size_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18886
18887 u32 data_len_len = unpack_size_pos - data_len_pos;
18888
18889 unpack_size_pos++;
18890
18891 char *data_buf_pos = strchr (unpack_size_pos, '$');
18892
18893 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18894
18895 u32 unpack_size_len = data_buf_pos - unpack_size_pos;
18896
18897 data_buf_pos++;
18898
18899 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;
18900
18901 const uint iter = atoi (NumCyclesPower_pos);
18902 const uint crc = atoi (crc_buf_pos);
18903 const uint p_buf = atoi (p_buf_pos);
18904 const uint salt_len = atoi (salt_len_pos);
18905 const uint iv_len = atoi (iv_len_pos);
18906 const uint unpack_size = atoi (unpack_size_pos);
18907 const uint data_len = atoi (data_len_pos);
18908
18909 /**
18910 * verify some data
18911 */
18912
18913 if (p_buf != 0) return (PARSER_SALT_VALUE);
18914 if (salt_len != 0) return (PARSER_SALT_VALUE);
18915
18916 if ((data_len * 2) != data_buf_len) return (PARSER_SALT_VALUE);
18917
18918 if (data_len > 384) return (PARSER_SALT_VALUE);
18919
18920 if (unpack_size > data_len) return (PARSER_SALT_VALUE);
18921
18922 /**
18923 * store data
18924 */
18925
18926 seven_zip->iv_buf[0] = hex_to_u32 ((const u8 *) &iv_buf_pos[ 0]);
18927 seven_zip->iv_buf[1] = hex_to_u32 ((const u8 *) &iv_buf_pos[ 8]);
18928 seven_zip->iv_buf[2] = hex_to_u32 ((const u8 *) &iv_buf_pos[16]);
18929 seven_zip->iv_buf[3] = hex_to_u32 ((const u8 *) &iv_buf_pos[24]);
18930
18931 seven_zip->iv_len = iv_len;
18932
18933 memcpy (seven_zip->salt_buf, salt_buf_pos, salt_buf_len); // we just need that for later ascii_digest()
18934
18935 seven_zip->salt_len = 0;
18936
18937 seven_zip->crc = crc;
18938
18939 for (uint i = 0, j = 0; j < data_buf_len; i += 1, j += 8)
18940 {
18941 seven_zip->data_buf[i] = hex_to_u32 ((const u8 *) &data_buf_pos[j]);
18942
18943 seven_zip->data_buf[i] = byte_swap_32 (seven_zip->data_buf[i]);
18944 }
18945
18946 seven_zip->data_len = data_len;
18947
18948 seven_zip->unpack_size = unpack_size;
18949
18950 // real salt
18951
18952 salt->salt_buf[0] = seven_zip->data_buf[0];
18953 salt->salt_buf[1] = seven_zip->data_buf[1];
18954 salt->salt_buf[2] = seven_zip->data_buf[2];
18955 salt->salt_buf[3] = seven_zip->data_buf[3];
18956
18957 salt->salt_len = 16;
18958
18959 salt->salt_sign[0] = iter;
18960
18961 salt->salt_iter = 1 << iter;
18962
18963 /**
18964 * digest
18965 */
18966
18967 digest[0] = crc;
18968 digest[1] = 0;
18969 digest[2] = 0;
18970 digest[3] = 0;
18971
18972 return (PARSER_OK);
18973 }
18974
18975 int gost2012sbog_256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18976 {
18977 if ((input_len < DISPLAY_LEN_MIN_11700) || (input_len > DISPLAY_LEN_MAX_11700)) return (PARSER_GLOBAL_LENGTH);
18978
18979 u32 *digest = (u32 *) hash_buf->digest;
18980
18981 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
18982 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
18983 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
18984 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
18985 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
18986 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
18987 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
18988 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
18989
18990 digest[0] = byte_swap_32 (digest[0]);
18991 digest[1] = byte_swap_32 (digest[1]);
18992 digest[2] = byte_swap_32 (digest[2]);
18993 digest[3] = byte_swap_32 (digest[3]);
18994 digest[4] = byte_swap_32 (digest[4]);
18995 digest[5] = byte_swap_32 (digest[5]);
18996 digest[6] = byte_swap_32 (digest[6]);
18997 digest[7] = byte_swap_32 (digest[7]);
18998
18999 return (PARSER_OK);
19000 }
19001
19002 int gost2012sbog_512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19003 {
19004 if ((input_len < DISPLAY_LEN_MIN_11800) || (input_len > DISPLAY_LEN_MAX_11800)) return (PARSER_GLOBAL_LENGTH);
19005
19006 u32 *digest = (u32 *) hash_buf->digest;
19007
19008 digest[ 0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
19009 digest[ 1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
19010 digest[ 2] = hex_to_u32 ((const u8 *) &input_buf[ 16]);
19011 digest[ 3] = hex_to_u32 ((const u8 *) &input_buf[ 24]);
19012 digest[ 4] = hex_to_u32 ((const u8 *) &input_buf[ 32]);
19013 digest[ 5] = hex_to_u32 ((const u8 *) &input_buf[ 40]);
19014 digest[ 6] = hex_to_u32 ((const u8 *) &input_buf[ 48]);
19015 digest[ 7] = hex_to_u32 ((const u8 *) &input_buf[ 56]);
19016 digest[ 8] = hex_to_u32 ((const u8 *) &input_buf[ 64]);
19017 digest[ 9] = hex_to_u32 ((const u8 *) &input_buf[ 72]);
19018 digest[10] = hex_to_u32 ((const u8 *) &input_buf[ 80]);
19019 digest[11] = hex_to_u32 ((const u8 *) &input_buf[ 88]);
19020 digest[12] = hex_to_u32 ((const u8 *) &input_buf[ 96]);
19021 digest[13] = hex_to_u32 ((const u8 *) &input_buf[104]);
19022 digest[14] = hex_to_u32 ((const u8 *) &input_buf[112]);
19023 digest[15] = hex_to_u32 ((const u8 *) &input_buf[120]);
19024
19025 digest[ 0] = byte_swap_32 (digest[ 0]);
19026 digest[ 1] = byte_swap_32 (digest[ 1]);
19027 digest[ 2] = byte_swap_32 (digest[ 2]);
19028 digest[ 3] = byte_swap_32 (digest[ 3]);
19029 digest[ 4] = byte_swap_32 (digest[ 4]);
19030 digest[ 5] = byte_swap_32 (digest[ 5]);
19031 digest[ 6] = byte_swap_32 (digest[ 6]);
19032 digest[ 7] = byte_swap_32 (digest[ 7]);
19033 digest[ 8] = byte_swap_32 (digest[ 8]);
19034 digest[ 9] = byte_swap_32 (digest[ 9]);
19035 digest[10] = byte_swap_32 (digest[10]);
19036 digest[11] = byte_swap_32 (digest[11]);
19037 digest[12] = byte_swap_32 (digest[12]);
19038 digest[13] = byte_swap_32 (digest[13]);
19039 digest[14] = byte_swap_32 (digest[14]);
19040 digest[15] = byte_swap_32 (digest[15]);
19041
19042 return (PARSER_OK);
19043 }
19044
19045 int pbkdf2_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19046 {
19047 if ((input_len < DISPLAY_LEN_MIN_11900) || (input_len > DISPLAY_LEN_MAX_11900)) return (PARSER_GLOBAL_LENGTH);
19048
19049 if (memcmp (SIGNATURE_PBKDF2_MD5, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
19050
19051 u32 *digest = (u32 *) hash_buf->digest;
19052
19053 salt_t *salt = hash_buf->salt;
19054
19055 pbkdf2_md5_t *pbkdf2_md5 = (pbkdf2_md5_t *) hash_buf->esalt;
19056
19057 /**
19058 * parse line
19059 */
19060
19061 // iterations
19062
19063 char *iter_pos = input_buf + 4;
19064
19065 u32 iter = atoi (iter_pos);
19066
19067 if (iter < 1) return (PARSER_SALT_ITERATION);
19068 if (iter > 999999) return (PARSER_SALT_ITERATION);
19069
19070 // first is *raw* salt
19071
19072 char *salt_pos = strchr (iter_pos, ':');
19073
19074 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19075
19076 salt_pos++;
19077
19078 char *hash_pos = strchr (salt_pos, ':');
19079
19080 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19081
19082 u32 salt_len = hash_pos - salt_pos;
19083
19084 if (salt_len > 64) return (PARSER_SALT_LENGTH);
19085
19086 hash_pos++;
19087
19088 u32 hash_b64_len = input_len - (hash_pos - input_buf);
19089
19090 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
19091
19092 // decode salt
19093
19094 char *salt_buf_ptr = (char *) pbkdf2_md5->salt_buf;
19095
19096 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
19097
19098 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
19099
19100 salt_buf_ptr[salt_len + 3] = 0x01;
19101 salt_buf_ptr[salt_len + 4] = 0x80;
19102
19103 salt->salt_len = salt_len;
19104 salt->salt_iter = iter - 1;
19105
19106 // decode hash
19107
19108 u8 tmp_buf[100] = { 0 };
19109
19110 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
19111
19112 if (hash_len < 16) return (PARSER_HASH_LENGTH);
19113
19114 memcpy (digest, tmp_buf, 16);
19115
19116 // add some stuff to normal salt to make sorted happy
19117
19118 salt->salt_buf[0] = pbkdf2_md5->salt_buf[0];
19119 salt->salt_buf[1] = pbkdf2_md5->salt_buf[1];
19120 salt->salt_buf[2] = pbkdf2_md5->salt_buf[2];
19121 salt->salt_buf[3] = pbkdf2_md5->salt_buf[3];
19122 salt->salt_buf[4] = salt->salt_iter;
19123
19124 return (PARSER_OK);
19125 }
19126
19127 int pbkdf2_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19128 {
19129 if ((input_len < DISPLAY_LEN_MIN_12000) || (input_len > DISPLAY_LEN_MAX_12000)) return (PARSER_GLOBAL_LENGTH);
19130
19131 if (memcmp (SIGNATURE_PBKDF2_SHA1, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
19132
19133 u32 *digest = (u32 *) hash_buf->digest;
19134
19135 salt_t *salt = hash_buf->salt;
19136
19137 pbkdf2_sha1_t *pbkdf2_sha1 = (pbkdf2_sha1_t *) hash_buf->esalt;
19138
19139 /**
19140 * parse line
19141 */
19142
19143 // iterations
19144
19145 char *iter_pos = input_buf + 5;
19146
19147 u32 iter = atoi (iter_pos);
19148
19149 if (iter < 1) return (PARSER_SALT_ITERATION);
19150 if (iter > 999999) return (PARSER_SALT_ITERATION);
19151
19152 // first is *raw* salt
19153
19154 char *salt_pos = strchr (iter_pos, ':');
19155
19156 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19157
19158 salt_pos++;
19159
19160 char *hash_pos = strchr (salt_pos, ':');
19161
19162 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19163
19164 u32 salt_len = hash_pos - salt_pos;
19165
19166 if (salt_len > 64) return (PARSER_SALT_LENGTH);
19167
19168 hash_pos++;
19169
19170 u32 hash_b64_len = input_len - (hash_pos - input_buf);
19171
19172 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
19173
19174 // decode salt
19175
19176 char *salt_buf_ptr = (char *) pbkdf2_sha1->salt_buf;
19177
19178 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
19179
19180 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
19181
19182 salt_buf_ptr[salt_len + 3] = 0x01;
19183 salt_buf_ptr[salt_len + 4] = 0x80;
19184
19185 salt->salt_len = salt_len;
19186 salt->salt_iter = iter - 1;
19187
19188 // decode hash
19189
19190 u8 tmp_buf[100] = { 0 };
19191
19192 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
19193
19194 if (hash_len < 16) return (PARSER_HASH_LENGTH);
19195
19196 memcpy (digest, tmp_buf, 16);
19197
19198 digest[0] = byte_swap_32 (digest[0]);
19199 digest[1] = byte_swap_32 (digest[1]);
19200 digest[2] = byte_swap_32 (digest[2]);
19201 digest[3] = byte_swap_32 (digest[3]);
19202
19203 // add some stuff to normal salt to make sorted happy
19204
19205 salt->salt_buf[0] = pbkdf2_sha1->salt_buf[0];
19206 salt->salt_buf[1] = pbkdf2_sha1->salt_buf[1];
19207 salt->salt_buf[2] = pbkdf2_sha1->salt_buf[2];
19208 salt->salt_buf[3] = pbkdf2_sha1->salt_buf[3];
19209 salt->salt_buf[4] = salt->salt_iter;
19210
19211 return (PARSER_OK);
19212 }
19213
19214 int pbkdf2_sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19215 {
19216 if ((input_len < DISPLAY_LEN_MIN_12100) || (input_len > DISPLAY_LEN_MAX_12100)) return (PARSER_GLOBAL_LENGTH);
19217
19218 if (memcmp (SIGNATURE_PBKDF2_SHA512, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
19219
19220 u64 *digest = (u64 *) hash_buf->digest;
19221
19222 salt_t *salt = hash_buf->salt;
19223
19224 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
19225
19226 /**
19227 * parse line
19228 */
19229
19230 // iterations
19231
19232 char *iter_pos = input_buf + 7;
19233
19234 u32 iter = atoi (iter_pos);
19235
19236 if (iter < 1) return (PARSER_SALT_ITERATION);
19237 if (iter > 999999) return (PARSER_SALT_ITERATION);
19238
19239 // first is *raw* salt
19240
19241 char *salt_pos = strchr (iter_pos, ':');
19242
19243 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19244
19245 salt_pos++;
19246
19247 char *hash_pos = strchr (salt_pos, ':');
19248
19249 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19250
19251 u32 salt_len = hash_pos - salt_pos;
19252
19253 if (salt_len > 64) return (PARSER_SALT_LENGTH);
19254
19255 hash_pos++;
19256
19257 u32 hash_b64_len = input_len - (hash_pos - input_buf);
19258
19259 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
19260
19261 // decode salt
19262
19263 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
19264
19265 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
19266
19267 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
19268
19269 salt_buf_ptr[salt_len + 3] = 0x01;
19270 salt_buf_ptr[salt_len + 4] = 0x80;
19271
19272 salt->salt_len = salt_len;
19273 salt->salt_iter = iter - 1;
19274
19275 // decode hash
19276
19277 u8 tmp_buf[100] = { 0 };
19278
19279 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
19280
19281 if (hash_len < 16) return (PARSER_HASH_LENGTH);
19282
19283 memcpy (digest, tmp_buf, 64);
19284
19285 digest[0] = byte_swap_64 (digest[0]);
19286 digest[1] = byte_swap_64 (digest[1]);
19287 digest[2] = byte_swap_64 (digest[2]);
19288 digest[3] = byte_swap_64 (digest[3]);
19289 digest[4] = byte_swap_64 (digest[4]);
19290 digest[5] = byte_swap_64 (digest[5]);
19291 digest[6] = byte_swap_64 (digest[6]);
19292 digest[7] = byte_swap_64 (digest[7]);
19293
19294 // add some stuff to normal salt to make sorted happy
19295
19296 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
19297 salt->salt_buf[1] = pbkdf2_sha512->salt_buf[1];
19298 salt->salt_buf[2] = pbkdf2_sha512->salt_buf[2];
19299 salt->salt_buf[3] = pbkdf2_sha512->salt_buf[3];
19300 salt->salt_buf[4] = salt->salt_iter;
19301
19302 return (PARSER_OK);
19303 }
19304
19305 int ecryptfs_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19306 {
19307 if ((input_len < DISPLAY_LEN_MIN_12200) || (input_len > DISPLAY_LEN_MAX_12200)) return (PARSER_GLOBAL_LENGTH);
19308
19309 if (memcmp (SIGNATURE_ECRYPTFS, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
19310
19311 uint *digest = (uint *) hash_buf->digest;
19312
19313 salt_t *salt = hash_buf->salt;
19314
19315 /**
19316 * parse line
19317 */
19318
19319 char *salt_pos = input_buf + 10 + 2 + 2; // skip over "0$" and "1$"
19320
19321 char *hash_pos = strchr (salt_pos, '$');
19322
19323 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19324
19325 u32 salt_len = hash_pos - salt_pos;
19326
19327 if (salt_len != 16) return (PARSER_SALT_LENGTH);
19328
19329 hash_pos++;
19330
19331 u32 hash_len = input_len - 10 - 2 - 2 - salt_len - 1;
19332
19333 if (hash_len != 16) return (PARSER_HASH_LENGTH);
19334
19335 // decode hash
19336
19337 digest[ 0] = hex_to_u32 ((const u8 *) &hash_pos[0]);
19338 digest[ 1] = hex_to_u32 ((const u8 *) &hash_pos[8]);
19339 digest[ 2] = 0;
19340 digest[ 3] = 0;
19341 digest[ 4] = 0;
19342 digest[ 5] = 0;
19343 digest[ 6] = 0;
19344 digest[ 7] = 0;
19345 digest[ 8] = 0;
19346 digest[ 9] = 0;
19347 digest[10] = 0;
19348 digest[11] = 0;
19349 digest[12] = 0;
19350 digest[13] = 0;
19351 digest[14] = 0;
19352 digest[15] = 0;
19353
19354 // decode salt
19355
19356 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[0]);
19357 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[8]);
19358
19359 salt->salt_iter = ROUNDS_ECRYPTFS;
19360 salt->salt_len = 8;
19361
19362 return (PARSER_OK);
19363 }
19364
19365 int bsdicrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19366 {
19367 if ((input_len < DISPLAY_LEN_MIN_12400) || (input_len > DISPLAY_LEN_MAX_12400)) return (PARSER_GLOBAL_LENGTH);
19368
19369 if (memcmp (SIGNATURE_BSDICRYPT, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
19370
19371 unsigned char c19 = itoa64_to_int (input_buf[19]);
19372
19373 if (c19 & 3) return (PARSER_HASH_VALUE);
19374
19375 salt_t *salt = hash_buf->salt;
19376
19377 u32 *digest = (u32 *) hash_buf->digest;
19378
19379 // iteration count
19380
19381 salt->salt_iter = itoa64_to_int (input_buf[1])
19382 | itoa64_to_int (input_buf[2]) << 6
19383 | itoa64_to_int (input_buf[3]) << 12
19384 | itoa64_to_int (input_buf[4]) << 18;
19385
19386 // set salt
19387
19388 salt->salt_buf[0] = itoa64_to_int (input_buf[5])
19389 | itoa64_to_int (input_buf[6]) << 6
19390 | itoa64_to_int (input_buf[7]) << 12
19391 | itoa64_to_int (input_buf[8]) << 18;
19392
19393 salt->salt_len = 4;
19394
19395 u8 tmp_buf[100] = { 0 };
19396
19397 base64_decode (itoa64_to_int, (const u8 *) input_buf + 9, 11, tmp_buf);
19398
19399 memcpy (digest, tmp_buf, 8);
19400
19401 uint tt;
19402
19403 IP (digest[0], digest[1], tt);
19404
19405 digest[0] = rotr32 (digest[0], 31);
19406 digest[1] = rotr32 (digest[1], 31);
19407 digest[2] = 0;
19408 digest[3] = 0;
19409
19410 return (PARSER_OK);
19411 }
19412
19413 int rar3hp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19414 {
19415 if ((input_len < DISPLAY_LEN_MIN_12500) || (input_len > DISPLAY_LEN_MAX_12500)) return (PARSER_GLOBAL_LENGTH);
19416
19417 if (memcmp (SIGNATURE_RAR3, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
19418
19419 u32 *digest = (u32 *) hash_buf->digest;
19420
19421 salt_t *salt = hash_buf->salt;
19422
19423 /**
19424 * parse line
19425 */
19426
19427 char *type_pos = input_buf + 6 + 1;
19428
19429 char *salt_pos = strchr (type_pos, '*');
19430
19431 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19432
19433 u32 type_len = salt_pos - type_pos;
19434
19435 if (type_len != 1) return (PARSER_SALT_LENGTH);
19436
19437 salt_pos++;
19438
19439 char *crypted_pos = strchr (salt_pos, '*');
19440
19441 if (crypted_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19442
19443 u32 salt_len = crypted_pos - salt_pos;
19444
19445 if (salt_len != 16) return (PARSER_SALT_LENGTH);
19446
19447 crypted_pos++;
19448
19449 u32 crypted_len = input_len - 6 - 1 - type_len - 1 - salt_len - 1;
19450
19451 if (crypted_len != 32) return (PARSER_SALT_LENGTH);
19452
19453 /**
19454 * copy data
19455 */
19456
19457 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[0]);
19458 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[8]);
19459
19460 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
19461 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
19462
19463 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &crypted_pos[ 0]);
19464 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &crypted_pos[ 8]);
19465 salt->salt_buf[4] = hex_to_u32 ((const u8 *) &crypted_pos[16]);
19466 salt->salt_buf[5] = hex_to_u32 ((const u8 *) &crypted_pos[24]);
19467
19468 salt->salt_len = 24;
19469 salt->salt_iter = ROUNDS_RAR3;
19470
19471 // there's no hash for rar3. the data which is in crypted_pos is some encrypted data and
19472 // if it matches the value \xc4\x3d\x7b\x00\x40\x07\x00 after decrypt we know that we successfully cracked it.
19473
19474 digest[0] = 0xc43d7b00;
19475 digest[1] = 0x40070000;
19476 digest[2] = 0;
19477 digest[3] = 0;
19478
19479 return (PARSER_OK);
19480 }
19481
19482 int rar5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19483 {
19484 if ((input_len < DISPLAY_LEN_MIN_13000) || (input_len > DISPLAY_LEN_MAX_13000)) return (PARSER_GLOBAL_LENGTH);
19485
19486 if (memcmp (SIGNATURE_RAR5, input_buf, 1 + 4 + 1)) return (PARSER_SIGNATURE_UNMATCHED);
19487
19488 u32 *digest = (u32 *) hash_buf->digest;
19489
19490 salt_t *salt = hash_buf->salt;
19491
19492 rar5_t *rar5 = (rar5_t *) hash_buf->esalt;
19493
19494 /**
19495 * parse line
19496 */
19497
19498 char *param0_pos = input_buf + 1 + 4 + 1;
19499
19500 char *param1_pos = strchr (param0_pos, '$');
19501
19502 if (param1_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19503
19504 u32 param0_len = param1_pos - param0_pos;
19505
19506 param1_pos++;
19507
19508 char *param2_pos = strchr (param1_pos, '$');
19509
19510 if (param2_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19511
19512 u32 param1_len = param2_pos - param1_pos;
19513
19514 param2_pos++;
19515
19516 char *param3_pos = strchr (param2_pos, '$');
19517
19518 if (param3_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19519
19520 u32 param2_len = param3_pos - param2_pos;
19521
19522 param3_pos++;
19523
19524 char *param4_pos = strchr (param3_pos, '$');
19525
19526 if (param4_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19527
19528 u32 param3_len = param4_pos - param3_pos;
19529
19530 param4_pos++;
19531
19532 char *param5_pos = strchr (param4_pos, '$');
19533
19534 if (param5_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19535
19536 u32 param4_len = param5_pos - param4_pos;
19537
19538 param5_pos++;
19539
19540 u32 param5_len = input_len - 1 - 4 - 1 - param0_len - 1 - param1_len - 1 - param2_len - 1 - param3_len - 1 - param4_len - 1;
19541
19542 char *salt_buf = param1_pos;
19543 char *iv = param3_pos;
19544 char *pswcheck = param5_pos;
19545
19546 const uint salt_len = atoi (param0_pos);
19547 const uint iterations = atoi (param2_pos);
19548 const uint pswcheck_len = atoi (param4_pos);
19549
19550 /**
19551 * verify some data
19552 */
19553
19554 if (param1_len != 32) return (PARSER_SALT_VALUE);
19555 if (param3_len != 32) return (PARSER_SALT_VALUE);
19556 if (param5_len != 16) return (PARSER_SALT_VALUE);
19557
19558 if (salt_len != 16) return (PARSER_SALT_VALUE);
19559 if (iterations == 0) return (PARSER_SALT_VALUE);
19560 if (pswcheck_len != 8) return (PARSER_SALT_VALUE);
19561
19562 /**
19563 * store data
19564 */
19565
19566 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
19567 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
19568 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
19569 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf[24]);
19570
19571 rar5->iv[0] = hex_to_u32 ((const u8 *) &iv[ 0]);
19572 rar5->iv[1] = hex_to_u32 ((const u8 *) &iv[ 8]);
19573 rar5->iv[2] = hex_to_u32 ((const u8 *) &iv[16]);
19574 rar5->iv[3] = hex_to_u32 ((const u8 *) &iv[24]);
19575
19576 salt->salt_len = 16;
19577
19578 salt->salt_sign[0] = iterations;
19579
19580 salt->salt_iter = ((1 << iterations) + 32) - 1;
19581
19582 /**
19583 * digest buf
19584 */
19585
19586 digest[0] = hex_to_u32 ((const u8 *) &pswcheck[ 0]);
19587 digest[1] = hex_to_u32 ((const u8 *) &pswcheck[ 8]);
19588 digest[2] = 0;
19589 digest[3] = 0;
19590
19591 return (PARSER_OK);
19592 }
19593
19594 int krb5tgs_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19595 {
19596 if ((input_len < DISPLAY_LEN_MIN_13100) || (input_len > DISPLAY_LEN_MAX_13100)) return (PARSER_GLOBAL_LENGTH);
19597
19598 if (memcmp (SIGNATURE_KRB5TGS, input_buf, 11)) return (PARSER_SIGNATURE_UNMATCHED);
19599
19600 u32 *digest = (u32 *) hash_buf->digest;
19601
19602 salt_t *salt = hash_buf->salt;
19603
19604 krb5tgs_t *krb5tgs = (krb5tgs_t *) hash_buf->esalt;
19605
19606 /**
19607 * parse line
19608 */
19609
19610 /* Skip '$' */
19611 char *account_pos = input_buf + 11 + 1;
19612
19613 char *data_pos;
19614
19615 uint data_len;
19616
19617 if (account_pos[0] == '*')
19618 {
19619 account_pos++;
19620
19621 data_pos = strchr (account_pos, '*');
19622
19623 /* Skip '*' */
19624 data_pos++;
19625
19626 if (data_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19627
19628 uint account_len = data_pos - account_pos + 1;
19629
19630 if (account_len >= 512) return (PARSER_SALT_LENGTH);
19631
19632 /* Skip '$' */
19633 data_pos++;
19634
19635 data_len = input_len - 11 - 1 - account_len - 2;
19636
19637 memcpy (krb5tgs->account_info, account_pos - 1, account_len);
19638 }
19639 else
19640 {
19641 /* assume $krb5tgs$23$checksum$edata2 */
19642 data_pos = account_pos;
19643
19644 memcpy (krb5tgs->account_info, "**", 3);
19645
19646 data_len = input_len - 11 - 1 - 1;
19647 }
19648
19649 if (data_len < ((16 + 32) * 2)) return (PARSER_SALT_LENGTH);
19650
19651 char *checksum_ptr = (char *) krb5tgs->checksum;
19652
19653 for (uint i = 0; i < 16 * 2; i += 2)
19654 {
19655 const char p0 = data_pos[i + 0];
19656 const char p1 = data_pos[i + 1];
19657
19658 *checksum_ptr++ = hex_convert (p1) << 0
19659 | hex_convert (p0) << 4;
19660 }
19661
19662 char *edata_ptr = (char *) krb5tgs->edata2;
19663
19664 krb5tgs->edata2_len = (data_len - 32) / 2 ;
19665
19666 /* skip '$' */
19667 for (uint i = 16 * 2 + 1; i < (krb5tgs->edata2_len * 2) + (16 * 2 + 1); i += 2)
19668 {
19669 const char p0 = data_pos[i + 0];
19670 const char p1 = data_pos[i + 1];
19671 *edata_ptr++ = hex_convert (p1) << 0
19672 | hex_convert (p0) << 4;
19673 }
19674
19675 /* this is needed for hmac_md5 */
19676 *edata_ptr++ = 0x80;
19677
19678 salt->salt_buf[0] = krb5tgs->checksum[0];
19679 salt->salt_buf[1] = krb5tgs->checksum[1];
19680 salt->salt_buf[2] = krb5tgs->checksum[2];
19681 salt->salt_buf[3] = krb5tgs->checksum[3];
19682
19683 salt->salt_len = 32;
19684
19685 digest[0] = krb5tgs->checksum[0];
19686 digest[1] = krb5tgs->checksum[1];
19687 digest[2] = krb5tgs->checksum[2];
19688 digest[3] = krb5tgs->checksum[3];
19689
19690 return (PARSER_OK);
19691 }
19692
19693 int axcrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19694 {
19695 if ((input_len < DISPLAY_LEN_MIN_13200) || (input_len > DISPLAY_LEN_MAX_13200)) return (PARSER_GLOBAL_LENGTH);
19696
19697 if (memcmp (SIGNATURE_AXCRYPT, input_buf, 11)) return (PARSER_SIGNATURE_UNMATCHED);
19698
19699 u32 *digest = (u32 *) hash_buf->digest;
19700
19701 salt_t *salt = hash_buf->salt;
19702
19703 /**
19704 * parse line
19705 */
19706
19707 /* Skip '*' */
19708 char *wrapping_rounds_pos = input_buf + 11 + 1;
19709
19710 char *salt_pos;
19711
19712 char *wrapped_key_pos;
19713
19714 char *data_pos;
19715
19716 salt->salt_iter = atoi (wrapping_rounds_pos);
19717
19718 salt_pos = strchr (wrapping_rounds_pos, '*');
19719
19720 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19721
19722 uint wrapping_rounds_len = salt_pos - wrapping_rounds_pos;
19723
19724 /* Skip '*' */
19725 salt_pos++;
19726
19727 data_pos = salt_pos;
19728
19729 wrapped_key_pos = strchr (salt_pos, '*');
19730
19731 if (wrapped_key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19732
19733 uint salt_len = wrapped_key_pos - salt_pos;
19734
19735 if (salt_len != 32) return (PARSER_SALT_LENGTH);
19736
19737 /* Skip '*' */
19738 wrapped_key_pos++;
19739
19740 uint wrapped_key_len = input_len - 11 - 1 - wrapping_rounds_len - 1 - salt_len - 1;
19741
19742 if (wrapped_key_len != 48) return (PARSER_SALT_LENGTH);
19743
19744 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &data_pos[ 0]);
19745 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &data_pos[ 8]);
19746 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &data_pos[16]);
19747 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &data_pos[24]);
19748
19749 data_pos += 33;
19750
19751 salt->salt_buf[4] = hex_to_u32 ((const u8 *) &data_pos[ 0]);
19752 salt->salt_buf[5] = hex_to_u32 ((const u8 *) &data_pos[ 8]);
19753 salt->salt_buf[6] = hex_to_u32 ((const u8 *) &data_pos[16]);
19754 salt->salt_buf[7] = hex_to_u32 ((const u8 *) &data_pos[24]);
19755 salt->salt_buf[8] = hex_to_u32 ((const u8 *) &data_pos[32]);
19756 salt->salt_buf[9] = hex_to_u32 ((const u8 *) &data_pos[40]);
19757
19758 salt->salt_len = 40;
19759
19760 digest[0] = salt->salt_buf[0];
19761 digest[1] = salt->salt_buf[1];
19762 digest[2] = salt->salt_buf[2];
19763 digest[3] = salt->salt_buf[3];
19764
19765 return (PARSER_OK);
19766 }
19767
19768 int keepass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19769 {
19770 if ((input_len < DISPLAY_LEN_MIN_13400) || (input_len > DISPLAY_LEN_MAX_13400)) return (PARSER_GLOBAL_LENGTH);
19771
19772 if (memcmp (SIGNATURE_KEEPASS, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
19773
19774 u32 *digest = (u32 *) hash_buf->digest;
19775
19776 salt_t *salt = hash_buf->salt;
19777
19778 keepass_t *keepass = (keepass_t *) hash_buf->esalt;
19779
19780 /**
19781 * parse line
19782 */
19783
19784 char *version_pos;
19785
19786 char *rounds_pos;
19787
19788 char *algorithm_pos;
19789
19790 char *final_random_seed_pos;
19791 u32 final_random_seed_len;
19792
19793 char *transf_random_seed_pos;
19794 u32 transf_random_seed_len;
19795
19796 char *enc_iv_pos;
19797 u32 enc_iv_len;
19798
19799 /* default is no keyfile provided */
19800 char *keyfile_len_pos;
19801 u32 keyfile_len = 0;
19802 u32 is_keyfile_present = 0;
19803 char *keyfile_inline_pos;
19804 char *keyfile_pos;
19805
19806 /* specific to version 1 */
19807 char *contents_len_pos;
19808 u32 contents_len;
19809 char *contents_pos;
19810
19811 /* specific to version 2 */
19812 char *expected_bytes_pos;
19813 u32 expected_bytes_len;
19814
19815 char *contents_hash_pos;
19816 u32 contents_hash_len;
19817
19818 version_pos = input_buf + 8 + 1 + 1;
19819
19820 keepass->version = atoi (version_pos);
19821
19822 rounds_pos = strchr (version_pos, '*');
19823
19824 if (rounds_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19825
19826 rounds_pos++;
19827
19828 salt->salt_iter = (atoi (rounds_pos));
19829
19830 algorithm_pos = strchr (rounds_pos, '*');
19831
19832 if (algorithm_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19833
19834 algorithm_pos++;
19835
19836 keepass->algorithm = atoi (algorithm_pos);
19837
19838 final_random_seed_pos = strchr (algorithm_pos, '*');
19839
19840 if (final_random_seed_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19841
19842 final_random_seed_pos++;
19843
19844 keepass->final_random_seed[0] = hex_to_u32 ((const u8 *) &final_random_seed_pos[ 0]);
19845 keepass->final_random_seed[1] = hex_to_u32 ((const u8 *) &final_random_seed_pos[ 8]);
19846 keepass->final_random_seed[2] = hex_to_u32 ((const u8 *) &final_random_seed_pos[16]);
19847 keepass->final_random_seed[3] = hex_to_u32 ((const u8 *) &final_random_seed_pos[24]);
19848
19849 if (keepass->version == 2)
19850 {
19851 keepass->final_random_seed[4] = hex_to_u32 ((const u8 *) &final_random_seed_pos[32]);
19852 keepass->final_random_seed[5] = hex_to_u32 ((const u8 *) &final_random_seed_pos[40]);
19853 keepass->final_random_seed[6] = hex_to_u32 ((const u8 *) &final_random_seed_pos[48]);
19854 keepass->final_random_seed[7] = hex_to_u32 ((const u8 *) &final_random_seed_pos[56]);
19855 }
19856
19857 transf_random_seed_pos = strchr (final_random_seed_pos, '*');
19858
19859 if (transf_random_seed_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19860
19861 final_random_seed_len = transf_random_seed_pos - final_random_seed_pos;
19862
19863 if (keepass->version == 1 && final_random_seed_len != 32) return (PARSER_SALT_LENGTH);
19864 if (keepass->version == 2 && final_random_seed_len != 64) return (PARSER_SALT_LENGTH);
19865
19866 transf_random_seed_pos++;
19867
19868 keepass->transf_random_seed[0] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[ 0]);
19869 keepass->transf_random_seed[1] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[ 8]);
19870 keepass->transf_random_seed[2] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[16]);
19871 keepass->transf_random_seed[3] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[24]);
19872 keepass->transf_random_seed[4] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[32]);
19873 keepass->transf_random_seed[5] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[40]);
19874 keepass->transf_random_seed[6] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[48]);
19875 keepass->transf_random_seed[7] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[56]);
19876
19877 enc_iv_pos = strchr (transf_random_seed_pos, '*');
19878
19879 if (enc_iv_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19880
19881 transf_random_seed_len = enc_iv_pos - transf_random_seed_pos;
19882
19883 if (transf_random_seed_len != 64) return (PARSER_SALT_LENGTH);
19884
19885 enc_iv_pos++;
19886
19887 keepass->enc_iv[0] = hex_to_u32 ((const u8 *) &enc_iv_pos[ 0]);
19888 keepass->enc_iv[1] = hex_to_u32 ((const u8 *) &enc_iv_pos[ 8]);
19889 keepass->enc_iv[2] = hex_to_u32 ((const u8 *) &enc_iv_pos[16]);
19890 keepass->enc_iv[3] = hex_to_u32 ((const u8 *) &enc_iv_pos[24]);
19891
19892 if (keepass->version == 1)
19893 {
19894 contents_hash_pos = strchr (enc_iv_pos, '*');
19895
19896 if (contents_hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19897
19898 enc_iv_len = contents_hash_pos - enc_iv_pos;
19899
19900 if (enc_iv_len != 32) return (PARSER_SALT_LENGTH);
19901
19902 contents_hash_pos++;
19903
19904 keepass->contents_hash[0] = hex_to_u32 ((const u8 *) &contents_hash_pos[ 0]);
19905 keepass->contents_hash[1] = hex_to_u32 ((const u8 *) &contents_hash_pos[ 8]);
19906 keepass->contents_hash[2] = hex_to_u32 ((const u8 *) &contents_hash_pos[16]);
19907 keepass->contents_hash[3] = hex_to_u32 ((const u8 *) &contents_hash_pos[24]);
19908 keepass->contents_hash[4] = hex_to_u32 ((const u8 *) &contents_hash_pos[32]);
19909 keepass->contents_hash[5] = hex_to_u32 ((const u8 *) &contents_hash_pos[40]);
19910 keepass->contents_hash[6] = hex_to_u32 ((const u8 *) &contents_hash_pos[48]);
19911 keepass->contents_hash[7] = hex_to_u32 ((const u8 *) &contents_hash_pos[56]);
19912
19913 /* get length of contents following */
19914 char *inline_flag_pos = strchr (contents_hash_pos, '*');
19915
19916 if (inline_flag_pos == NULL) return (PARSER_SALT_LENGTH);
19917
19918 contents_hash_len = inline_flag_pos - contents_hash_pos;
19919
19920 if (contents_hash_len != 64) return (PARSER_SALT_LENGTH);
19921
19922 inline_flag_pos++;
19923
19924 u32 inline_flag = atoi (inline_flag_pos);
19925
19926 if (inline_flag != 1) return (PARSER_SALT_LENGTH);
19927
19928 contents_len_pos = strchr (inline_flag_pos, '*');
19929
19930 if (contents_len_pos == NULL) return (PARSER_SALT_LENGTH);
19931
19932 contents_len_pos++;
19933
19934 contents_len = atoi (contents_len_pos);
19935
19936 if (contents_len > 50000) return (PARSER_SALT_LENGTH);
19937
19938 contents_pos = strchr (contents_len_pos, '*');
19939
19940 if (contents_pos == NULL) return (PARSER_SALT_LENGTH);
19941
19942 contents_pos++;
19943
19944 u32 i;
19945
19946 keepass->contents_len = contents_len;
19947
19948 contents_len = contents_len / 4;
19949
19950 keyfile_inline_pos = strchr (contents_pos, '*');
19951
19952 u32 real_contents_len;
19953
19954 if (keyfile_inline_pos == NULL)
19955 real_contents_len = input_len - (contents_pos - input_buf);
19956 else
19957 {
19958 real_contents_len = keyfile_inline_pos - contents_pos;
19959 keyfile_inline_pos++;
19960 is_keyfile_present = 1;
19961 }
19962
19963 if (real_contents_len != keepass->contents_len * 2) return (PARSER_SALT_LENGTH);
19964
19965 for (i = 0; i < contents_len; i++)
19966 keepass->contents[i] = hex_to_u32 ((const u8 *) &contents_pos[i * 8]);
19967 }
19968 else if (keepass->version == 2)
19969 {
19970 expected_bytes_pos = strchr (enc_iv_pos, '*');
19971
19972 if (expected_bytes_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19973
19974 enc_iv_len = expected_bytes_pos - enc_iv_pos;
19975
19976 if (enc_iv_len != 32) return (PARSER_SALT_LENGTH);
19977
19978 expected_bytes_pos++;
19979
19980 keepass->expected_bytes[0] = hex_to_u32 ((const u8 *) &expected_bytes_pos[ 0]);
19981 keepass->expected_bytes[1] = hex_to_u32 ((const u8 *) &expected_bytes_pos[ 8]);
19982 keepass->expected_bytes[2] = hex_to_u32 ((const u8 *) &expected_bytes_pos[16]);
19983 keepass->expected_bytes[3] = hex_to_u32 ((const u8 *) &expected_bytes_pos[24]);
19984 keepass->expected_bytes[4] = hex_to_u32 ((const u8 *) &expected_bytes_pos[32]);
19985 keepass->expected_bytes[5] = hex_to_u32 ((const u8 *) &expected_bytes_pos[40]);
19986 keepass->expected_bytes[6] = hex_to_u32 ((const u8 *) &expected_bytes_pos[48]);
19987 keepass->expected_bytes[7] = hex_to_u32 ((const u8 *) &expected_bytes_pos[56]);
19988
19989 contents_hash_pos = strchr (expected_bytes_pos, '*');
19990
19991 if (contents_hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19992
19993 expected_bytes_len = contents_hash_pos - expected_bytes_pos;
19994
19995 if (expected_bytes_len != 64) return (PARSER_SALT_LENGTH);
19996
19997 contents_hash_pos++;
19998
19999 keepass->contents_hash[0] = hex_to_u32 ((const u8 *) &contents_hash_pos[ 0]);
20000 keepass->contents_hash[1] = hex_to_u32 ((const u8 *) &contents_hash_pos[ 8]);
20001 keepass->contents_hash[2] = hex_to_u32 ((const u8 *) &contents_hash_pos[16]);
20002 keepass->contents_hash[3] = hex_to_u32 ((const u8 *) &contents_hash_pos[24]);
20003 keepass->contents_hash[4] = hex_to_u32 ((const u8 *) &contents_hash_pos[32]);
20004 keepass->contents_hash[5] = hex_to_u32 ((const u8 *) &contents_hash_pos[40]);
20005 keepass->contents_hash[6] = hex_to_u32 ((const u8 *) &contents_hash_pos[48]);
20006 keepass->contents_hash[7] = hex_to_u32 ((const u8 *) &contents_hash_pos[56]);
20007
20008 keyfile_inline_pos = strchr (contents_hash_pos, '*');
20009
20010 if (keyfile_inline_pos == NULL)
20011 contents_hash_len = input_len - (int) (contents_hash_pos - input_buf);
20012 else
20013 {
20014 contents_hash_len = keyfile_inline_pos - contents_hash_pos;
20015 keyfile_inline_pos++;
20016 is_keyfile_present = 1;
20017 }
20018 if (contents_hash_len != 64) return (PARSER_SALT_LENGTH);
20019 }
20020
20021 if (is_keyfile_present != 0)
20022 {
20023 keyfile_len_pos = strchr (keyfile_inline_pos, '*');
20024
20025 keyfile_len_pos++;
20026
20027 keyfile_len = atoi (keyfile_len_pos);
20028
20029 keepass->keyfile_len = keyfile_len;
20030
20031 if (keyfile_len != 64) return (PARSER_SALT_LENGTH);
20032
20033 keyfile_pos = strchr (keyfile_len_pos, '*');
20034
20035 if (keyfile_pos == NULL) return (PARSER_SALT_LENGTH);
20036
20037 keyfile_pos++;
20038
20039 u32 real_keyfile_len = input_len - (keyfile_pos - input_buf);
20040
20041 if (real_keyfile_len != 64) return (PARSER_SALT_LENGTH);
20042
20043 keepass->keyfile[0] = hex_to_u32 ((const u8 *) &keyfile_pos[ 0]);
20044 keepass->keyfile[1] = hex_to_u32 ((const u8 *) &keyfile_pos[ 8]);
20045 keepass->keyfile[2] = hex_to_u32 ((const u8 *) &keyfile_pos[16]);
20046 keepass->keyfile[3] = hex_to_u32 ((const u8 *) &keyfile_pos[24]);
20047 keepass->keyfile[4] = hex_to_u32 ((const u8 *) &keyfile_pos[32]);
20048 keepass->keyfile[5] = hex_to_u32 ((const u8 *) &keyfile_pos[40]);
20049 keepass->keyfile[6] = hex_to_u32 ((const u8 *) &keyfile_pos[48]);
20050 keepass->keyfile[7] = hex_to_u32 ((const u8 *) &keyfile_pos[56]);
20051 }
20052
20053 digest[0] = keepass->enc_iv[0];
20054 digest[1] = keepass->enc_iv[1];
20055 digest[2] = keepass->enc_iv[2];
20056 digest[3] = keepass->enc_iv[3];
20057
20058 salt->salt_buf[0] = keepass->transf_random_seed[0];
20059 salt->salt_buf[1] = keepass->transf_random_seed[1];
20060 salt->salt_buf[2] = keepass->transf_random_seed[2];
20061 salt->salt_buf[3] = keepass->transf_random_seed[3];
20062 salt->salt_buf[4] = keepass->transf_random_seed[4];
20063 salt->salt_buf[5] = keepass->transf_random_seed[5];
20064 salt->salt_buf[6] = keepass->transf_random_seed[6];
20065 salt->salt_buf[7] = keepass->transf_random_seed[7];
20066
20067 return (PARSER_OK);
20068 }
20069
20070 int cf10_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
20071 {
20072 if ((input_len < DISPLAY_LEN_MIN_12600) || (input_len > DISPLAY_LEN_MAX_12600)) return (PARSER_GLOBAL_LENGTH);
20073
20074 u32 *digest = (u32 *) hash_buf->digest;
20075
20076 salt_t *salt = hash_buf->salt;
20077
20078 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
20079 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
20080 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
20081 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
20082 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
20083 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
20084 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
20085 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
20086
20087 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
20088
20089 uint salt_len = input_len - 64 - 1;
20090
20091 char *salt_buf = input_buf + 64 + 1;
20092
20093 char *salt_buf_ptr = (char *) salt->salt_buf;
20094
20095 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
20096
20097 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
20098
20099 salt->salt_len = salt_len;
20100
20101 /**
20102 * we can precompute the first sha256 transform
20103 */
20104
20105 uint w[16] = { 0 };
20106
20107 w[ 0] = byte_swap_32 (salt->salt_buf[ 0]);
20108 w[ 1] = byte_swap_32 (salt->salt_buf[ 1]);
20109 w[ 2] = byte_swap_32 (salt->salt_buf[ 2]);
20110 w[ 3] = byte_swap_32 (salt->salt_buf[ 3]);
20111 w[ 4] = byte_swap_32 (salt->salt_buf[ 4]);
20112 w[ 5] = byte_swap_32 (salt->salt_buf[ 5]);
20113 w[ 6] = byte_swap_32 (salt->salt_buf[ 6]);
20114 w[ 7] = byte_swap_32 (salt->salt_buf[ 7]);
20115 w[ 8] = byte_swap_32 (salt->salt_buf[ 8]);
20116 w[ 9] = byte_swap_32 (salt->salt_buf[ 9]);
20117 w[10] = byte_swap_32 (salt->salt_buf[10]);
20118 w[11] = byte_swap_32 (salt->salt_buf[11]);
20119 w[12] = byte_swap_32 (salt->salt_buf[12]);
20120 w[13] = byte_swap_32 (salt->salt_buf[13]);
20121 w[14] = byte_swap_32 (salt->salt_buf[14]);
20122 w[15] = byte_swap_32 (salt->salt_buf[15]);
20123
20124 uint pc256[8] = { SHA256M_A, SHA256M_B, SHA256M_C, SHA256M_D, SHA256M_E, SHA256M_F, SHA256M_G, SHA256M_H };
20125
20126 sha256_64 (w, pc256);
20127
20128 salt->salt_buf_pc[0] = pc256[0];
20129 salt->salt_buf_pc[1] = pc256[1];
20130 salt->salt_buf_pc[2] = pc256[2];
20131 salt->salt_buf_pc[3] = pc256[3];
20132 salt->salt_buf_pc[4] = pc256[4];
20133 salt->salt_buf_pc[5] = pc256[5];
20134 salt->salt_buf_pc[6] = pc256[6];
20135 salt->salt_buf_pc[7] = pc256[7];
20136
20137 digest[0] -= pc256[0];
20138 digest[1] -= pc256[1];
20139 digest[2] -= pc256[2];
20140 digest[3] -= pc256[3];
20141 digest[4] -= pc256[4];
20142 digest[5] -= pc256[5];
20143 digest[6] -= pc256[6];
20144 digest[7] -= pc256[7];
20145
20146 return (PARSER_OK);
20147 }
20148
20149 int mywallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
20150 {
20151 if ((input_len < DISPLAY_LEN_MIN_12700) || (input_len > DISPLAY_LEN_MAX_12700)) return (PARSER_GLOBAL_LENGTH);
20152
20153 if (memcmp (SIGNATURE_MYWALLET, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
20154
20155 u32 *digest = (u32 *) hash_buf->digest;
20156
20157 salt_t *salt = hash_buf->salt;
20158
20159 /**
20160 * parse line
20161 */
20162
20163 char *data_len_pos = input_buf + 1 + 10 + 1;
20164
20165 char *data_buf_pos = strchr (data_len_pos, '$');
20166
20167 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20168
20169 u32 data_len_len = data_buf_pos - data_len_pos;
20170
20171 if (data_len_len < 1) return (PARSER_SALT_LENGTH);
20172 if (data_len_len > 5) return (PARSER_SALT_LENGTH);
20173
20174 data_buf_pos++;
20175
20176 u32 data_buf_len = input_len - 1 - 10 - 1 - data_len_len - 1;
20177
20178 if (data_buf_len < 64) return (PARSER_HASH_LENGTH);
20179
20180 if (data_buf_len % 16) return (PARSER_HASH_LENGTH);
20181
20182 u32 data_len = atoi (data_len_pos);
20183
20184 if ((data_len * 2) != data_buf_len) return (PARSER_HASH_LENGTH);
20185
20186 /**
20187 * salt
20188 */
20189
20190 char *salt_pos = data_buf_pos;
20191
20192 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
20193 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
20194 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
20195 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
20196
20197 // this is actually the CT, which is also the hash later (if matched)
20198
20199 salt->salt_buf[4] = hex_to_u32 ((const u8 *) &salt_pos[32]);
20200 salt->salt_buf[5] = hex_to_u32 ((const u8 *) &salt_pos[40]);
20201 salt->salt_buf[6] = hex_to_u32 ((const u8 *) &salt_pos[48]);
20202 salt->salt_buf[7] = hex_to_u32 ((const u8 *) &salt_pos[56]);
20203
20204 salt->salt_len = 32; // note we need to fix this to 16 in kernel
20205
20206 salt->salt_iter = 10 - 1;
20207
20208 /**
20209 * digest buf
20210 */
20211
20212 digest[0] = salt->salt_buf[4];
20213 digest[1] = salt->salt_buf[5];
20214 digest[2] = salt->salt_buf[6];
20215 digest[3] = salt->salt_buf[7];
20216
20217 return (PARSER_OK);
20218 }
20219
20220 int ms_drsr_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
20221 {
20222 if ((input_len < DISPLAY_LEN_MIN_12800) || (input_len > DISPLAY_LEN_MAX_12800)) return (PARSER_GLOBAL_LENGTH);
20223
20224 if (memcmp (SIGNATURE_MS_DRSR, input_buf, 11)) return (PARSER_SIGNATURE_UNMATCHED);
20225
20226 u32 *digest = (u32 *) hash_buf->digest;
20227
20228 salt_t *salt = hash_buf->salt;
20229
20230 /**
20231 * parse line
20232 */
20233
20234 char *salt_pos = input_buf + 11 + 1;
20235
20236 char *iter_pos = strchr (salt_pos, ',');
20237
20238 if (iter_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20239
20240 u32 salt_len = iter_pos - salt_pos;
20241
20242 if (salt_len != 20) return (PARSER_SALT_LENGTH);
20243
20244 iter_pos++;
20245
20246 char *hash_pos = strchr (iter_pos, ',');
20247
20248 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20249
20250 u32 iter_len = hash_pos - iter_pos;
20251
20252 if (iter_len > 5) return (PARSER_SALT_LENGTH);
20253
20254 hash_pos++;
20255
20256 u32 hash_len = input_len - 11 - 1 - salt_len - 1 - iter_len - 1;
20257
20258 if (hash_len != 64) return (PARSER_HASH_LENGTH);
20259
20260 /**
20261 * salt
20262 */
20263
20264 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
20265 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
20266 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]) & 0xffff0000;
20267 salt->salt_buf[3] = 0x00018000;
20268
20269 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
20270 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
20271 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
20272 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
20273
20274 salt->salt_len = salt_len / 2;
20275
20276 salt->salt_iter = atoi (iter_pos) - 1;
20277
20278 /**
20279 * digest buf
20280 */
20281
20282 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
20283 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
20284 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
20285 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
20286 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
20287 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
20288 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
20289 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
20290
20291 return (PARSER_OK);
20292 }
20293
20294 int androidfde_samsung_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
20295 {
20296 if ((input_len < DISPLAY_LEN_MIN_12900) || (input_len > DISPLAY_LEN_MAX_12900)) return (PARSER_GLOBAL_LENGTH);
20297
20298 u32 *digest = (u32 *) hash_buf->digest;
20299
20300 salt_t *salt = hash_buf->salt;
20301
20302 /**
20303 * parse line
20304 */
20305
20306 char *hash_pos = input_buf + 64;
20307 char *salt1_pos = input_buf + 128;
20308 char *salt2_pos = input_buf;
20309
20310 /**
20311 * salt
20312 */
20313
20314 salt->salt_buf[ 0] = hex_to_u32 ((const u8 *) &salt1_pos[ 0]);
20315 salt->salt_buf[ 1] = hex_to_u32 ((const u8 *) &salt1_pos[ 8]);
20316 salt->salt_buf[ 2] = hex_to_u32 ((const u8 *) &salt1_pos[16]);
20317 salt->salt_buf[ 3] = hex_to_u32 ((const u8 *) &salt1_pos[24]);
20318
20319 salt->salt_buf[ 4] = hex_to_u32 ((const u8 *) &salt2_pos[ 0]);
20320 salt->salt_buf[ 5] = hex_to_u32 ((const u8 *) &salt2_pos[ 8]);
20321 salt->salt_buf[ 6] = hex_to_u32 ((const u8 *) &salt2_pos[16]);
20322 salt->salt_buf[ 7] = hex_to_u32 ((const u8 *) &salt2_pos[24]);
20323
20324 salt->salt_buf[ 8] = hex_to_u32 ((const u8 *) &salt2_pos[32]);
20325 salt->salt_buf[ 9] = hex_to_u32 ((const u8 *) &salt2_pos[40]);
20326 salt->salt_buf[10] = hex_to_u32 ((const u8 *) &salt2_pos[48]);
20327 salt->salt_buf[11] = hex_to_u32 ((const u8 *) &salt2_pos[56]);
20328
20329 salt->salt_len = 48;
20330
20331 salt->salt_iter = ROUNDS_ANDROIDFDE_SAMSUNG - 1;
20332
20333 /**
20334 * digest buf
20335 */
20336
20337 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
20338 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
20339 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
20340 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
20341 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
20342 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
20343 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
20344 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
20345
20346 return (PARSER_OK);
20347 }
20348
20349 int zip2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
20350 {
20351 if ((input_len < DISPLAY_LEN_MIN_13600) || (input_len > DISPLAY_LEN_MAX_13600)) return (PARSER_GLOBAL_LENGTH);
20352
20353 if (memcmp (SIGNATURE_ZIP2_START, input_buf , 6)) return (PARSER_SIGNATURE_UNMATCHED);
20354 if (memcmp (SIGNATURE_ZIP2_STOP , input_buf + input_len - 7, 7)) return (PARSER_SIGNATURE_UNMATCHED);
20355
20356 u32 *digest = (u32 *) hash_buf->digest;
20357
20358 salt_t *salt = hash_buf->salt;
20359
20360 zip2_t *zip2 = (zip2_t *) hash_buf->esalt;
20361
20362 /**
20363 * parse line
20364 */
20365
20366 char *param0_pos = input_buf + 6 + 1;
20367
20368 char *param1_pos = strchr (param0_pos, '*');
20369
20370 if (param1_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20371
20372 u32 param0_len = param1_pos - param0_pos;
20373
20374 param1_pos++;
20375
20376 char *param2_pos = strchr (param1_pos, '*');
20377
20378 if (param2_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20379
20380 u32 param1_len = param2_pos - param1_pos;
20381
20382 param2_pos++;
20383
20384 char *param3_pos = strchr (param2_pos, '*');
20385
20386 if (param3_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20387
20388 u32 param2_len = param3_pos - param2_pos;
20389
20390 param3_pos++;
20391
20392 char *param4_pos = strchr (param3_pos, '*');
20393
20394 if (param4_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20395
20396 u32 param3_len = param4_pos - param3_pos;
20397
20398 param4_pos++;
20399
20400 char *param5_pos = strchr (param4_pos, '*');
20401
20402 if (param5_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20403
20404 u32 param4_len = param5_pos - param4_pos;
20405
20406 param5_pos++;
20407
20408 char *param6_pos = strchr (param5_pos, '*');
20409
20410 if (param6_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20411
20412 u32 param5_len = param6_pos - param5_pos;
20413
20414 param6_pos++;
20415
20416 char *param7_pos = strchr (param6_pos, '*');
20417
20418 if (param7_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20419
20420 u32 param6_len = param7_pos - param6_pos;
20421
20422 param7_pos++;
20423
20424 char *param8_pos = strchr (param7_pos, '*');
20425
20426 if (param8_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20427
20428 u32 param7_len = param8_pos - param7_pos;
20429
20430 param8_pos++;
20431
20432 const uint type = atoi (param0_pos);
20433 const uint mode = atoi (param1_pos);
20434 const uint magic = atoi (param2_pos);
20435
20436 char *salt_buf = param3_pos;
20437
20438 uint verify_bytes; sscanf (param4_pos, "%4x*", &verify_bytes);
20439
20440 const uint compress_length = atoi (param5_pos);
20441
20442 char *data_buf = param6_pos;
20443 char *auth = param7_pos;
20444
20445 /**
20446 * verify some data
20447 */
20448
20449 if (param0_len != 1) return (PARSER_SALT_VALUE);
20450
20451 if (param1_len != 1) return (PARSER_SALT_VALUE);
20452
20453 if (param2_len != 1) return (PARSER_SALT_VALUE);
20454
20455 if ((param3_len != 16) && (param3_len != 24) && (param3_len != 32)) return (PARSER_SALT_VALUE);
20456
20457 if (param4_len >= 5) return (PARSER_SALT_VALUE);
20458
20459 if (param5_len >= 5) return (PARSER_SALT_VALUE);
20460
20461 if (param6_len >= 8192) return (PARSER_SALT_VALUE);
20462
20463 if (param6_len & 1) return (PARSER_SALT_VALUE);
20464
20465 if (param7_len != 20) return (PARSER_SALT_VALUE);
20466
20467 if (type != 0) return (PARSER_SALT_VALUE);
20468
20469 if ((mode != 1) && (mode != 2) && (mode != 3)) return (PARSER_SALT_VALUE);
20470
20471 if (magic != 0) return (PARSER_SALT_VALUE);
20472
20473 if (verify_bytes >= 0x10000) return (PARSER_SALT_VALUE);
20474
20475 /**
20476 * store data
20477 */
20478
20479 zip2->type = type;
20480 zip2->mode = mode;
20481 zip2->magic = magic;
20482
20483 if (mode == 1)
20484 {
20485 zip2->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
20486 zip2->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
20487 zip2->salt_buf[2] = 0;
20488 zip2->salt_buf[3] = 0;
20489
20490 zip2->salt_len = 8;
20491 }
20492 else if (mode == 2)
20493 {
20494 zip2->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
20495 zip2->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
20496 zip2->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
20497 zip2->salt_buf[3] = 0;
20498
20499 zip2->salt_len = 12;
20500 }
20501 else if (mode == 3)
20502 {
20503 zip2->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
20504 zip2->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
20505 zip2->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
20506 zip2->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf[24]);
20507
20508 zip2->salt_len = 16;
20509 }
20510
20511 zip2->salt_buf[0] = byte_swap_32 (zip2->salt_buf[0]);
20512 zip2->salt_buf[1] = byte_swap_32 (zip2->salt_buf[1]);
20513 zip2->salt_buf[2] = byte_swap_32 (zip2->salt_buf[2]);
20514 zip2->salt_buf[3] = byte_swap_32 (zip2->salt_buf[3]);
20515
20516 zip2->verify_bytes = verify_bytes;
20517
20518 zip2->compress_length = compress_length;
20519
20520 char *data_buf_ptr = (char *) zip2->data_buf;
20521
20522 for (uint i = 0; i < param6_len; i += 2)
20523 {
20524 const char p0 = data_buf[i + 0];
20525 const char p1 = data_buf[i + 1];
20526
20527 *data_buf_ptr++ = hex_convert (p1) << 0
20528 | hex_convert (p0) << 4;
20529
20530 zip2->data_len++;
20531 }
20532
20533 *data_buf_ptr = 0x80;
20534
20535 char *auth_ptr = (char *) zip2->auth_buf;
20536
20537 for (uint i = 0; i < param7_len; i += 2)
20538 {
20539 const char p0 = auth[i + 0];
20540 const char p1 = auth[i + 1];
20541
20542 *auth_ptr++ = hex_convert (p1) << 0
20543 | hex_convert (p0) << 4;
20544
20545 zip2->auth_len++;
20546 }
20547
20548 /**
20549 * salt buf (fake)
20550 */
20551
20552 salt->salt_buf[0] = zip2->salt_buf[0];
20553 salt->salt_buf[1] = zip2->salt_buf[1];
20554 salt->salt_buf[2] = zip2->salt_buf[2];
20555 salt->salt_buf[3] = zip2->salt_buf[3];
20556 salt->salt_buf[4] = zip2->data_buf[0];
20557 salt->salt_buf[5] = zip2->data_buf[1];
20558 salt->salt_buf[6] = zip2->data_buf[2];
20559 salt->salt_buf[7] = zip2->data_buf[3];
20560
20561 salt->salt_len = 32;
20562
20563 salt->salt_iter = ROUNDS_ZIP2 - 1;
20564
20565 /**
20566 * digest buf (fake)
20567 */
20568
20569 digest[0] = zip2->auth_buf[0];
20570 digest[1] = zip2->auth_buf[1];
20571 digest[2] = zip2->auth_buf[2];
20572 digest[3] = zip2->auth_buf[3];
20573
20574 return (PARSER_OK);
20575 }
20576
20577 int win8phone_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
20578 {
20579 if ((input_len < DISPLAY_LEN_MIN_13800) || (input_len > DISPLAY_LEN_MAX_13800)) return (PARSER_GLOBAL_LENGTH);
20580
20581 u32 *digest = (u32 *) hash_buf->digest;
20582
20583 salt_t *salt = hash_buf->salt;
20584
20585 win8phone_t *esalt = hash_buf->esalt;
20586
20587 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
20588 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
20589 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
20590 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
20591 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
20592 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
20593 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
20594 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
20595
20596 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
20597
20598 char *salt_buf_ptr = input_buf + 64 + 1;
20599
20600 u32 *salt_buf = esalt->salt_buf;
20601
20602 for (int i = 0, j = 0; i < 32; i += 1, j += 8)
20603 {
20604 salt_buf[i] = hex_to_u32 ((const u8 *) &salt_buf_ptr[j]);
20605 }
20606
20607 salt->salt_buf[0] = salt_buf[0];
20608 salt->salt_buf[1] = salt_buf[1];
20609 salt->salt_buf[2] = salt_buf[2];
20610 salt->salt_buf[3] = salt_buf[3];
20611 salt->salt_buf[4] = salt_buf[4];
20612 salt->salt_buf[5] = salt_buf[5];
20613 salt->salt_buf[6] = salt_buf[6];
20614 salt->salt_buf[7] = salt_buf[7];
20615
20616 salt->salt_len = 64;
20617
20618 return (PARSER_OK);
20619 }
20620
20621 /**
20622 * parallel running threads
20623 */
20624
20625 #ifdef WIN
20626
20627 BOOL WINAPI sigHandler_default (DWORD sig)
20628 {
20629 switch (sig)
20630 {
20631 case CTRL_CLOSE_EVENT:
20632
20633 /*
20634 * special case see: https://stackoverflow.com/questions/3640633/c-setconsolectrlhandler-routine-issue/5610042#5610042
20635 * if the user interacts w/ the user-interface (GUI/cmd), we need to do the finalization job within this signal handler
20636 * function otherwise it is too late (e.g. after returning from this function)
20637 */
20638
20639 myabort ();
20640
20641 SetConsoleCtrlHandler (NULL, TRUE);
20642
20643 hc_sleep (10);
20644
20645 return TRUE;
20646
20647 case CTRL_C_EVENT:
20648 case CTRL_LOGOFF_EVENT:
20649 case CTRL_SHUTDOWN_EVENT:
20650
20651 myabort ();
20652
20653 SetConsoleCtrlHandler (NULL, TRUE);
20654
20655 return TRUE;
20656 }
20657
20658 return FALSE;
20659 }
20660
20661 BOOL WINAPI sigHandler_benchmark (DWORD sig)
20662 {
20663 switch (sig)
20664 {
20665 case CTRL_CLOSE_EVENT:
20666
20667 myabort ();
20668
20669 SetConsoleCtrlHandler (NULL, TRUE);
20670
20671 hc_sleep (10);
20672
20673 return TRUE;
20674
20675 case CTRL_C_EVENT:
20676 case CTRL_LOGOFF_EVENT:
20677 case CTRL_SHUTDOWN_EVENT:
20678
20679 myquit ();
20680
20681 SetConsoleCtrlHandler (NULL, TRUE);
20682
20683 return TRUE;
20684 }
20685
20686 return FALSE;
20687 }
20688
20689 void hc_signal (BOOL WINAPI (callback) (DWORD))
20690 {
20691 if (callback == NULL)
20692 {
20693 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, FALSE);
20694 }
20695 else
20696 {
20697 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, TRUE);
20698 }
20699 }
20700
20701 #else
20702
20703 void sigHandler_default (int sig)
20704 {
20705 myabort ();
20706
20707 signal (sig, NULL);
20708 }
20709
20710 void sigHandler_benchmark (int sig)
20711 {
20712 myquit ();
20713
20714 signal (sig, NULL);
20715 }
20716
20717 void hc_signal (void (callback) (int))
20718 {
20719 if (callback == NULL) callback = SIG_DFL;
20720
20721 signal (SIGINT, callback);
20722 signal (SIGTERM, callback);
20723 signal (SIGABRT, callback);
20724 }
20725
20726 #endif
20727
20728 void status_display ();
20729
20730 void *thread_keypress (void *p)
20731 {
20732 int benchmark = *((int *) p);
20733
20734 uint quiet = data.quiet;
20735
20736 tty_break();
20737
20738 while ((data.devices_status != STATUS_EXHAUSTED) && (data.devices_status != STATUS_CRACKED) && (data.devices_status != STATUS_ABORTED) && (data.devices_status != STATUS_QUIT))
20739 {
20740 int ch = tty_getchar();
20741
20742 if (ch == -1) break;
20743
20744 if (ch == 0) continue;
20745
20746 //https://github.com/hashcat/hashcat/issues/302
20747 //#ifdef _POSIX
20748 //if (ch != '\n')
20749 //#endif
20750
20751 hc_thread_mutex_lock (mux_display);
20752
20753 log_info ("");
20754
20755 switch (ch)
20756 {
20757 case 's':
20758 case '\r':
20759 case '\n':
20760
20761 log_info ("");
20762
20763 status_display ();
20764
20765 log_info ("");
20766
20767 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
20768 if (quiet == 0) fflush (stdout);
20769
20770 break;
20771
20772 case 'b':
20773
20774 log_info ("");
20775
20776 bypass ();
20777
20778 log_info ("");
20779
20780 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
20781 if (quiet == 0) fflush (stdout);
20782
20783 break;
20784
20785 case 'p':
20786
20787 log_info ("");
20788
20789 SuspendThreads ();
20790
20791 log_info ("");
20792
20793 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
20794 if (quiet == 0) fflush (stdout);
20795
20796 break;
20797
20798 case 'r':
20799
20800 log_info ("");
20801
20802 ResumeThreads ();
20803
20804 log_info ("");
20805
20806 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
20807 if (quiet == 0) fflush (stdout);
20808
20809 break;
20810
20811 case 'c':
20812
20813 log_info ("");
20814
20815 if (benchmark == 1) break;
20816
20817 stop_at_checkpoint ();
20818
20819 log_info ("");
20820
20821 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
20822 if (quiet == 0) fflush (stdout);
20823
20824 break;
20825
20826 case 'q':
20827
20828 log_info ("");
20829
20830 if (benchmark == 1)
20831 {
20832 myquit ();
20833 }
20834 else
20835 {
20836 myabort ();
20837 }
20838
20839 break;
20840 }
20841
20842 //https://github.com/hashcat/hashcat/issues/302
20843 //#ifdef _POSIX
20844 //if (ch != '\n')
20845 //#endif
20846
20847 hc_thread_mutex_unlock (mux_display);
20848 }
20849
20850 tty_fix();
20851
20852 return (p);
20853 }
20854
20855 /**
20856 * rules common
20857 */
20858
20859 bool class_num (const u8 c)
20860 {
20861 return ((c >= '0') && (c <= '9'));
20862 }
20863
20864 bool class_lower (const u8 c)
20865 {
20866 return ((c >= 'a') && (c <= 'z'));
20867 }
20868
20869 bool class_upper (const u8 c)
20870 {
20871 return ((c >= 'A') && (c <= 'Z'));
20872 }
20873
20874 bool class_alpha (const u8 c)
20875 {
20876 return (class_lower (c) || class_upper (c));
20877 }
20878
20879 int conv_ctoi (const u8 c)
20880 {
20881 if (class_num (c))
20882 {
20883 return c - '0';
20884 }
20885 else if (class_upper (c))
20886 {
20887 return c - 'A' + 10;
20888 }
20889
20890 return -1;
20891 }
20892
20893 int conv_itoc (const u8 c)
20894 {
20895 if (c < 10)
20896 {
20897 return c + '0';
20898 }
20899 else if (c < 37)
20900 {
20901 return c + 'A' - 10;
20902 }
20903
20904 return -1;
20905 }
20906
20907 /**
20908 * device rules
20909 */
20910
20911 #define INCR_POS if (++rule_pos == rule_len) return (-1)
20912 #define SET_NAME(rule,val) (rule)->cmds[rule_cnt] = ((val) & 0xff) << 0
20913 #define SET_P0(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 8
20914 #define SET_P1(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 16
20915 #define MAX_KERNEL_RULES 255
20916 #define GET_NAME(rule) rule_cmd = (((rule)->cmds[rule_cnt] >> 0) & 0xff)
20917 #define GET_P0(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 8) & 0xff)
20918 #define GET_P1(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 16) & 0xff)
20919
20920 #define SET_P0_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 8
20921 #define SET_P1_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 16
20922 #define GET_P0_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 8) & 0xff)
20923 #define GET_P1_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 16) & 0xff)
20924
20925 int cpu_rule_to_kernel_rule (char *rule_buf, uint rule_len, kernel_rule_t *rule)
20926 {
20927 uint rule_pos;
20928 uint rule_cnt;
20929
20930 for (rule_pos = 0, rule_cnt = 0; rule_pos < rule_len && rule_cnt < MAX_KERNEL_RULES; rule_pos++, rule_cnt++)
20931 {
20932 switch (rule_buf[rule_pos])
20933 {
20934 case ' ':
20935 rule_cnt--;
20936 break;
20937
20938 case RULE_OP_MANGLE_NOOP:
20939 SET_NAME (rule, rule_buf[rule_pos]);
20940 break;
20941
20942 case RULE_OP_MANGLE_LREST:
20943 SET_NAME (rule, rule_buf[rule_pos]);
20944 break;
20945
20946 case RULE_OP_MANGLE_UREST:
20947 SET_NAME (rule, rule_buf[rule_pos]);
20948 break;
20949
20950 case RULE_OP_MANGLE_LREST_UFIRST:
20951 SET_NAME (rule, rule_buf[rule_pos]);
20952 break;
20953
20954 case RULE_OP_MANGLE_UREST_LFIRST:
20955 SET_NAME (rule, rule_buf[rule_pos]);
20956 break;
20957
20958 case RULE_OP_MANGLE_TREST:
20959 SET_NAME (rule, rule_buf[rule_pos]);
20960 break;
20961
20962 case RULE_OP_MANGLE_TOGGLE_AT:
20963 SET_NAME (rule, rule_buf[rule_pos]);
20964 SET_P0_CONV (rule, rule_buf[rule_pos]);
20965 break;
20966
20967 case RULE_OP_MANGLE_REVERSE:
20968 SET_NAME (rule, rule_buf[rule_pos]);
20969 break;
20970
20971 case RULE_OP_MANGLE_DUPEWORD:
20972 SET_NAME (rule, rule_buf[rule_pos]);
20973 break;
20974
20975 case RULE_OP_MANGLE_DUPEWORD_TIMES:
20976 SET_NAME (rule, rule_buf[rule_pos]);
20977 SET_P0_CONV (rule, rule_buf[rule_pos]);
20978 break;
20979
20980 case RULE_OP_MANGLE_REFLECT:
20981 SET_NAME (rule, rule_buf[rule_pos]);
20982 break;
20983
20984 case RULE_OP_MANGLE_ROTATE_LEFT:
20985 SET_NAME (rule, rule_buf[rule_pos]);
20986 break;
20987
20988 case RULE_OP_MANGLE_ROTATE_RIGHT:
20989 SET_NAME (rule, rule_buf[rule_pos]);
20990 break;
20991
20992 case RULE_OP_MANGLE_APPEND:
20993 SET_NAME (rule, rule_buf[rule_pos]);
20994 SET_P0 (rule, rule_buf[rule_pos]);
20995 break;
20996
20997 case RULE_OP_MANGLE_PREPEND:
20998 SET_NAME (rule, rule_buf[rule_pos]);
20999 SET_P0 (rule, rule_buf[rule_pos]);
21000 break;
21001
21002 case RULE_OP_MANGLE_DELETE_FIRST:
21003 SET_NAME (rule, rule_buf[rule_pos]);
21004 break;
21005
21006 case RULE_OP_MANGLE_DELETE_LAST:
21007 SET_NAME (rule, rule_buf[rule_pos]);
21008 break;
21009
21010 case RULE_OP_MANGLE_DELETE_AT:
21011 SET_NAME (rule, rule_buf[rule_pos]);
21012 SET_P0_CONV (rule, rule_buf[rule_pos]);
21013 break;
21014
21015 case RULE_OP_MANGLE_EXTRACT:
21016 SET_NAME (rule, rule_buf[rule_pos]);
21017 SET_P0_CONV (rule, rule_buf[rule_pos]);
21018 SET_P1_CONV (rule, rule_buf[rule_pos]);
21019 break;
21020
21021 case RULE_OP_MANGLE_OMIT:
21022 SET_NAME (rule, rule_buf[rule_pos]);
21023 SET_P0_CONV (rule, rule_buf[rule_pos]);
21024 SET_P1_CONV (rule, rule_buf[rule_pos]);
21025 break;
21026
21027 case RULE_OP_MANGLE_INSERT:
21028 SET_NAME (rule, rule_buf[rule_pos]);
21029 SET_P0_CONV (rule, rule_buf[rule_pos]);
21030 SET_P1 (rule, rule_buf[rule_pos]);
21031 break;
21032
21033 case RULE_OP_MANGLE_OVERSTRIKE:
21034 SET_NAME (rule, rule_buf[rule_pos]);
21035 SET_P0_CONV (rule, rule_buf[rule_pos]);
21036 SET_P1 (rule, rule_buf[rule_pos]);
21037 break;
21038
21039 case RULE_OP_MANGLE_TRUNCATE_AT:
21040 SET_NAME (rule, rule_buf[rule_pos]);
21041 SET_P0_CONV (rule, rule_buf[rule_pos]);
21042 break;
21043
21044 case RULE_OP_MANGLE_REPLACE:
21045 SET_NAME (rule, rule_buf[rule_pos]);
21046 SET_P0 (rule, rule_buf[rule_pos]);
21047 SET_P1 (rule, rule_buf[rule_pos]);
21048 break;
21049
21050 case RULE_OP_MANGLE_PURGECHAR:
21051 return (-1);
21052 break;
21053
21054 case RULE_OP_MANGLE_TOGGLECASE_REC:
21055 return (-1);
21056 break;
21057
21058 case RULE_OP_MANGLE_DUPECHAR_FIRST:
21059 SET_NAME (rule, rule_buf[rule_pos]);
21060 SET_P0_CONV (rule, rule_buf[rule_pos]);
21061 break;
21062
21063 case RULE_OP_MANGLE_DUPECHAR_LAST:
21064 SET_NAME (rule, rule_buf[rule_pos]);
21065 SET_P0_CONV (rule, rule_buf[rule_pos]);
21066 break;
21067
21068 case RULE_OP_MANGLE_DUPECHAR_ALL:
21069 SET_NAME (rule, rule_buf[rule_pos]);
21070 break;
21071
21072 case RULE_OP_MANGLE_SWITCH_FIRST:
21073 SET_NAME (rule, rule_buf[rule_pos]);
21074 break;
21075
21076 case RULE_OP_MANGLE_SWITCH_LAST:
21077 SET_NAME (rule, rule_buf[rule_pos]);
21078 break;
21079
21080 case RULE_OP_MANGLE_SWITCH_AT:
21081 SET_NAME (rule, rule_buf[rule_pos]);
21082 SET_P0_CONV (rule, rule_buf[rule_pos]);
21083 SET_P1_CONV (rule, rule_buf[rule_pos]);
21084 break;
21085
21086 case RULE_OP_MANGLE_CHR_SHIFTL:
21087 SET_NAME (rule, rule_buf[rule_pos]);
21088 SET_P0_CONV (rule, rule_buf[rule_pos]);
21089 break;
21090
21091 case RULE_OP_MANGLE_CHR_SHIFTR:
21092 SET_NAME (rule, rule_buf[rule_pos]);
21093 SET_P0_CONV (rule, rule_buf[rule_pos]);
21094 break;
21095
21096 case RULE_OP_MANGLE_CHR_INCR:
21097 SET_NAME (rule, rule_buf[rule_pos]);
21098 SET_P0_CONV (rule, rule_buf[rule_pos]);
21099 break;
21100
21101 case RULE_OP_MANGLE_CHR_DECR:
21102 SET_NAME (rule, rule_buf[rule_pos]);
21103 SET_P0_CONV (rule, rule_buf[rule_pos]);
21104 break;
21105
21106 case RULE_OP_MANGLE_REPLACE_NP1:
21107 SET_NAME (rule, rule_buf[rule_pos]);
21108 SET_P0_CONV (rule, rule_buf[rule_pos]);
21109 break;
21110
21111 case RULE_OP_MANGLE_REPLACE_NM1:
21112 SET_NAME (rule, rule_buf[rule_pos]);
21113 SET_P0_CONV (rule, rule_buf[rule_pos]);
21114 break;
21115
21116 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
21117 SET_NAME (rule, rule_buf[rule_pos]);
21118 SET_P0_CONV (rule, rule_buf[rule_pos]);
21119 break;
21120
21121 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
21122 SET_NAME (rule, rule_buf[rule_pos]);
21123 SET_P0_CONV (rule, rule_buf[rule_pos]);
21124 break;
21125
21126 case RULE_OP_MANGLE_TITLE:
21127 SET_NAME (rule, rule_buf[rule_pos]);
21128 break;
21129
21130 default:
21131 return (-1);
21132 break;
21133 }
21134 }
21135
21136 if (rule_pos < rule_len) return (-1);
21137
21138 return (0);
21139 }
21140
21141 int kernel_rule_to_cpu_rule (char *rule_buf, kernel_rule_t *rule)
21142 {
21143 uint rule_cnt;
21144 uint rule_pos;
21145 uint rule_len = HCBUFSIZ - 1; // maximum possible len
21146
21147 char rule_cmd;
21148
21149 for (rule_cnt = 0, rule_pos = 0; rule_pos < rule_len && rule_cnt < MAX_KERNEL_RULES; rule_pos++, rule_cnt++)
21150 {
21151 GET_NAME (rule);
21152
21153 if (rule_cnt > 0) rule_buf[rule_pos++] = ' ';
21154
21155 switch (rule_cmd)
21156 {
21157 case RULE_OP_MANGLE_NOOP:
21158 rule_buf[rule_pos] = rule_cmd;
21159 break;
21160
21161 case RULE_OP_MANGLE_LREST:
21162 rule_buf[rule_pos] = rule_cmd;
21163 break;
21164
21165 case RULE_OP_MANGLE_UREST:
21166 rule_buf[rule_pos] = rule_cmd;
21167 break;
21168
21169 case RULE_OP_MANGLE_LREST_UFIRST:
21170 rule_buf[rule_pos] = rule_cmd;
21171 break;
21172
21173 case RULE_OP_MANGLE_UREST_LFIRST:
21174 rule_buf[rule_pos] = rule_cmd;
21175 break;
21176
21177 case RULE_OP_MANGLE_TREST:
21178 rule_buf[rule_pos] = rule_cmd;
21179 break;
21180
21181 case RULE_OP_MANGLE_TOGGLE_AT:
21182 rule_buf[rule_pos] = rule_cmd;
21183 GET_P0_CONV (rule);
21184 break;
21185
21186 case RULE_OP_MANGLE_REVERSE:
21187 rule_buf[rule_pos] = rule_cmd;
21188 break;
21189
21190 case RULE_OP_MANGLE_DUPEWORD:
21191 rule_buf[rule_pos] = rule_cmd;
21192 break;
21193
21194 case RULE_OP_MANGLE_DUPEWORD_TIMES:
21195 rule_buf[rule_pos] = rule_cmd;
21196 GET_P0_CONV (rule);
21197 break;
21198
21199 case RULE_OP_MANGLE_REFLECT:
21200 rule_buf[rule_pos] = rule_cmd;
21201 break;
21202
21203 case RULE_OP_MANGLE_ROTATE_LEFT:
21204 rule_buf[rule_pos] = rule_cmd;
21205 break;
21206
21207 case RULE_OP_MANGLE_ROTATE_RIGHT:
21208 rule_buf[rule_pos] = rule_cmd;
21209 break;
21210
21211 case RULE_OP_MANGLE_APPEND:
21212 rule_buf[rule_pos] = rule_cmd;
21213 GET_P0 (rule);
21214 break;
21215
21216 case RULE_OP_MANGLE_PREPEND:
21217 rule_buf[rule_pos] = rule_cmd;
21218 GET_P0 (rule);
21219 break;
21220
21221 case RULE_OP_MANGLE_DELETE_FIRST:
21222 rule_buf[rule_pos] = rule_cmd;
21223 break;
21224
21225 case RULE_OP_MANGLE_DELETE_LAST:
21226 rule_buf[rule_pos] = rule_cmd;
21227 break;
21228
21229 case RULE_OP_MANGLE_DELETE_AT:
21230 rule_buf[rule_pos] = rule_cmd;
21231 GET_P0_CONV (rule);
21232 break;
21233
21234 case RULE_OP_MANGLE_EXTRACT:
21235 rule_buf[rule_pos] = rule_cmd;
21236 GET_P0_CONV (rule);
21237 GET_P1_CONV (rule);
21238 break;
21239
21240 case RULE_OP_MANGLE_OMIT:
21241 rule_buf[rule_pos] = rule_cmd;
21242 GET_P0_CONV (rule);
21243 GET_P1_CONV (rule);
21244 break;
21245
21246 case RULE_OP_MANGLE_INSERT:
21247 rule_buf[rule_pos] = rule_cmd;
21248 GET_P0_CONV (rule);
21249 GET_P1 (rule);
21250 break;
21251
21252 case RULE_OP_MANGLE_OVERSTRIKE:
21253 rule_buf[rule_pos] = rule_cmd;
21254 GET_P0_CONV (rule);
21255 GET_P1 (rule);
21256 break;
21257
21258 case RULE_OP_MANGLE_TRUNCATE_AT:
21259 rule_buf[rule_pos] = rule_cmd;
21260 GET_P0_CONV (rule);
21261 break;
21262
21263 case RULE_OP_MANGLE_REPLACE:
21264 rule_buf[rule_pos] = rule_cmd;
21265 GET_P0 (rule);
21266 GET_P1 (rule);
21267 break;
21268
21269 case RULE_OP_MANGLE_PURGECHAR:
21270 return (-1);
21271 break;
21272
21273 case RULE_OP_MANGLE_TOGGLECASE_REC:
21274 return (-1);
21275 break;
21276
21277 case RULE_OP_MANGLE_DUPECHAR_FIRST:
21278 rule_buf[rule_pos] = rule_cmd;
21279 GET_P0_CONV (rule);
21280 break;
21281
21282 case RULE_OP_MANGLE_DUPECHAR_LAST:
21283 rule_buf[rule_pos] = rule_cmd;
21284 GET_P0_CONV (rule);
21285 break;
21286
21287 case RULE_OP_MANGLE_DUPECHAR_ALL:
21288 rule_buf[rule_pos] = rule_cmd;
21289 break;
21290
21291 case RULE_OP_MANGLE_SWITCH_FIRST:
21292 rule_buf[rule_pos] = rule_cmd;
21293 break;
21294
21295 case RULE_OP_MANGLE_SWITCH_LAST:
21296 rule_buf[rule_pos] = rule_cmd;
21297 break;
21298
21299 case RULE_OP_MANGLE_SWITCH_AT:
21300 rule_buf[rule_pos] = rule_cmd;
21301 GET_P0_CONV (rule);
21302 GET_P1_CONV (rule);
21303 break;
21304
21305 case RULE_OP_MANGLE_CHR_SHIFTL:
21306 rule_buf[rule_pos] = rule_cmd;
21307 GET_P0_CONV (rule);
21308 break;
21309
21310 case RULE_OP_MANGLE_CHR_SHIFTR:
21311 rule_buf[rule_pos] = rule_cmd;
21312 GET_P0_CONV (rule);
21313 break;
21314
21315 case RULE_OP_MANGLE_CHR_INCR:
21316 rule_buf[rule_pos] = rule_cmd;
21317 GET_P0_CONV (rule);
21318 break;
21319
21320 case RULE_OP_MANGLE_CHR_DECR:
21321 rule_buf[rule_pos] = rule_cmd;
21322 GET_P0_CONV (rule);
21323 break;
21324
21325 case RULE_OP_MANGLE_REPLACE_NP1:
21326 rule_buf[rule_pos] = rule_cmd;
21327 GET_P0_CONV (rule);
21328 break;
21329
21330 case RULE_OP_MANGLE_REPLACE_NM1:
21331 rule_buf[rule_pos] = rule_cmd;
21332 GET_P0_CONV (rule);
21333 break;
21334
21335 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
21336 rule_buf[rule_pos] = rule_cmd;
21337 GET_P0_CONV (rule);
21338 break;
21339
21340 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
21341 rule_buf[rule_pos] = rule_cmd;
21342 GET_P0_CONV (rule);
21343 break;
21344
21345 case RULE_OP_MANGLE_TITLE:
21346 rule_buf[rule_pos] = rule_cmd;
21347 break;
21348
21349 case 0:
21350 return rule_pos - 1;
21351 break;
21352
21353 default:
21354 return (-1);
21355 break;
21356 }
21357 }
21358
21359 if (rule_cnt > 0)
21360 {
21361 return rule_pos;
21362 }
21363
21364 return (-1);
21365 }
21366
21367 /**
21368 * CPU rules : this is from hashcat sources, cpu based rules
21369 */
21370
21371 #define NEXT_RULEPOS(rp) if (++(rp) == rule_len) return (RULE_RC_SYNTAX_ERROR)
21372 #define NEXT_RPTOI(r,rp,up) if (((up) = conv_ctoi ((r)[(rp)])) == -1) return (RULE_RC_SYNTAX_ERROR)
21373
21374 #define MANGLE_TOGGLE_AT(a,p) if (class_alpha ((a)[(p)])) (a)[(p)] ^= 0x20
21375 #define MANGLE_LOWER_AT(a,p) if (class_upper ((a)[(p)])) (a)[(p)] ^= 0x20
21376 #define MANGLE_UPPER_AT(a,p) if (class_lower ((a)[(p)])) (a)[(p)] ^= 0x20
21377
21378 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); arr[(r)] = arr[(l)]; arr[(l)] = c; } */
21379 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); (a)[(r)] = (a)[(l)]; (a)[(l)] = c; } */
21380 #define MANGLE_SWITCH(a,l,r) { char c = (a)[(r)]; (a)[(r)] = (a)[(l)]; (a)[(l)] = c; }
21381
21382 int mangle_lrest (char arr[BLOCK_SIZE], int arr_len)
21383 {
21384 int pos;
21385
21386 for (pos = 0; pos < arr_len; pos++) MANGLE_LOWER_AT (arr, pos);
21387
21388 return (arr_len);
21389 }
21390
21391 int mangle_urest (char arr[BLOCK_SIZE], int arr_len)
21392 {
21393 int pos;
21394
21395 for (pos = 0; pos < arr_len; pos++) MANGLE_UPPER_AT (arr, pos);
21396
21397 return (arr_len);
21398 }
21399
21400 int mangle_trest (char arr[BLOCK_SIZE], int arr_len)
21401 {
21402 int pos;
21403
21404 for (pos = 0; pos < arr_len; pos++) MANGLE_TOGGLE_AT (arr, pos);
21405
21406 return (arr_len);
21407 }
21408
21409 int mangle_reverse (char arr[BLOCK_SIZE], int arr_len)
21410 {
21411 int l;
21412 int r;
21413
21414 for (l = 0; l < arr_len; l++)
21415 {
21416 r = arr_len - 1 - l;
21417
21418 if (l >= r) break;
21419
21420 MANGLE_SWITCH (arr, l, r);
21421 }
21422
21423 return (arr_len);
21424 }
21425
21426 int mangle_double (char arr[BLOCK_SIZE], int arr_len)
21427 {
21428 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
21429
21430 memcpy (&arr[arr_len], arr, (size_t) arr_len);
21431
21432 return (arr_len * 2);
21433 }
21434
21435 int mangle_double_times (char arr[BLOCK_SIZE], int arr_len, int times)
21436 {
21437 if (((arr_len * times) + arr_len) >= BLOCK_SIZE) return (arr_len);
21438
21439 int orig_len = arr_len;
21440
21441 int i;
21442
21443 for (i = 0; i < times; i++)
21444 {
21445 memcpy (&arr[arr_len], arr, orig_len);
21446
21447 arr_len += orig_len;
21448 }
21449
21450 return (arr_len);
21451 }
21452
21453 int mangle_reflect (char arr[BLOCK_SIZE], int arr_len)
21454 {
21455 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
21456
21457 mangle_double (arr, arr_len);
21458
21459 mangle_reverse (arr + arr_len, arr_len);
21460
21461 return (arr_len * 2);
21462 }
21463
21464 int mangle_rotate_left (char arr[BLOCK_SIZE], int arr_len)
21465 {
21466 int l;
21467 int r;
21468
21469 for (l = 0, r = arr_len - 1; r > 0; r--)
21470 {
21471 MANGLE_SWITCH (arr, l, r);
21472 }
21473
21474 return (arr_len);
21475 }
21476
21477 int mangle_rotate_right (char arr[BLOCK_SIZE], int arr_len)
21478 {
21479 int l;
21480 int r;
21481
21482 for (l = 0, r = arr_len - 1; l < r; l++)
21483 {
21484 MANGLE_SWITCH (arr, l, r);
21485 }
21486
21487 return (arr_len);
21488 }
21489
21490 int mangle_append (char arr[BLOCK_SIZE], int arr_len, char c)
21491 {
21492 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
21493
21494 arr[arr_len] = c;
21495
21496 return (arr_len + 1);
21497 }
21498
21499 int mangle_prepend (char arr[BLOCK_SIZE], int arr_len, char c)
21500 {
21501 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
21502
21503 int arr_pos;
21504
21505 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
21506 {
21507 arr[arr_pos + 1] = arr[arr_pos];
21508 }
21509
21510 arr[0] = c;
21511
21512 return (arr_len + 1);
21513 }
21514
21515 int mangle_delete_at (char arr[BLOCK_SIZE], int arr_len, int upos)
21516 {
21517 if (upos >= arr_len) return (arr_len);
21518
21519 int arr_pos;
21520
21521 for (arr_pos = upos; arr_pos < arr_len - 1; arr_pos++)
21522 {
21523 arr[arr_pos] = arr[arr_pos + 1];
21524 }
21525
21526 return (arr_len - 1);
21527 }
21528
21529 int mangle_extract (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
21530 {
21531 if (upos >= arr_len) return (arr_len);
21532
21533 if ((upos + ulen) > arr_len) return (arr_len);
21534
21535 int arr_pos;
21536
21537 for (arr_pos = 0; arr_pos < ulen; arr_pos++)
21538 {
21539 arr[arr_pos] = arr[upos + arr_pos];
21540 }
21541
21542 return (ulen);
21543 }
21544
21545 int mangle_omit (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
21546 {
21547 if (upos >= arr_len) return (arr_len);
21548
21549 if ((upos + ulen) >= arr_len) return (arr_len);
21550
21551 int arr_pos;
21552
21553 for (arr_pos = upos; arr_pos < arr_len - ulen; arr_pos++)
21554 {
21555 arr[arr_pos] = arr[arr_pos + ulen];
21556 }
21557
21558 return (arr_len - ulen);
21559 }
21560
21561 int mangle_insert (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
21562 {
21563 if (upos >= arr_len) return (arr_len);
21564
21565 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
21566
21567 int arr_pos;
21568
21569 for (arr_pos = arr_len - 1; arr_pos > upos - 1; arr_pos--)
21570 {
21571 arr[arr_pos + 1] = arr[arr_pos];
21572 }
21573
21574 arr[upos] = c;
21575
21576 return (arr_len + 1);
21577 }
21578
21579 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)
21580 {
21581 if ((arr_len + arr2_cpy) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
21582
21583 if (arr_pos > arr_len) return (RULE_RC_REJECT_ERROR);
21584
21585 if (arr2_pos > arr2_len) return (RULE_RC_REJECT_ERROR);
21586
21587 if ((arr2_pos + arr2_cpy) > arr2_len) return (RULE_RC_REJECT_ERROR);
21588
21589 if (arr2_cpy < 1) return (RULE_RC_SYNTAX_ERROR);
21590
21591 memcpy (arr2, arr2 + arr2_pos, arr2_len - arr2_pos);
21592
21593 memcpy (arr2 + arr2_cpy, arr + arr_pos, arr_len - arr_pos);
21594
21595 memcpy (arr + arr_pos, arr2, arr_len - arr_pos + arr2_cpy);
21596
21597 return (arr_len + arr2_cpy);
21598 }
21599
21600 int mangle_overstrike (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
21601 {
21602 if (upos >= arr_len) return (arr_len);
21603
21604 arr[upos] = c;
21605
21606 return (arr_len);
21607 }
21608
21609 int mangle_truncate_at (char arr[BLOCK_SIZE], int arr_len, int upos)
21610 {
21611 if (upos >= arr_len) return (arr_len);
21612
21613 memset (arr + upos, 0, arr_len - upos);
21614
21615 return (upos);
21616 }
21617
21618 int mangle_replace (char arr[BLOCK_SIZE], int arr_len, char oldc, char newc)
21619 {
21620 int arr_pos;
21621
21622 for (arr_pos = 0; arr_pos < arr_len; arr_pos++)
21623 {
21624 if (arr[arr_pos] != oldc) continue;
21625
21626 arr[arr_pos] = newc;
21627 }
21628
21629 return (arr_len);
21630 }
21631
21632 int mangle_purgechar (char arr[BLOCK_SIZE], int arr_len, char c)
21633 {
21634 int arr_pos;
21635
21636 int ret_len;
21637
21638 for (ret_len = 0, arr_pos = 0; arr_pos < arr_len; arr_pos++)
21639 {
21640 if (arr[arr_pos] == c) continue;
21641
21642 arr[ret_len] = arr[arr_pos];
21643
21644 ret_len++;
21645 }
21646
21647 return (ret_len);
21648 }
21649
21650 int mangle_dupeblock_prepend (char arr[BLOCK_SIZE], int arr_len, int ulen)
21651 {
21652 if (ulen > arr_len) return (arr_len);
21653
21654 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
21655
21656 char cs[100] = { 0 };
21657
21658 memcpy (cs, arr, ulen);
21659
21660 int i;
21661
21662 for (i = 0; i < ulen; i++)
21663 {
21664 char c = cs[i];
21665
21666 arr_len = mangle_insert (arr, arr_len, i, c);
21667 }
21668
21669 return (arr_len);
21670 }
21671
21672 int mangle_dupeblock_append (char arr[BLOCK_SIZE], int arr_len, int ulen)
21673 {
21674 if (ulen > arr_len) return (arr_len);
21675
21676 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
21677
21678 int upos = arr_len - ulen;
21679
21680 int i;
21681
21682 for (i = 0; i < ulen; i++)
21683 {
21684 char c = arr[upos + i];
21685
21686 arr_len = mangle_append (arr, arr_len, c);
21687 }
21688
21689 return (arr_len);
21690 }
21691
21692 int mangle_dupechar_at (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
21693 {
21694 if ( arr_len == 0) return (arr_len);
21695 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
21696
21697 char c = arr[upos];
21698
21699 int i;
21700
21701 for (i = 0; i < ulen; i++)
21702 {
21703 arr_len = mangle_insert (arr, arr_len, upos, c);
21704 }
21705
21706 return (arr_len);
21707 }
21708
21709 int mangle_dupechar (char arr[BLOCK_SIZE], int arr_len)
21710 {
21711 if ( arr_len == 0) return (arr_len);
21712 if ((arr_len + arr_len) >= BLOCK_SIZE) return (arr_len);
21713
21714 int arr_pos;
21715
21716 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
21717 {
21718 int new_pos = arr_pos * 2;
21719
21720 arr[new_pos] = arr[arr_pos];
21721
21722 arr[new_pos + 1] = arr[arr_pos];
21723 }
21724
21725 return (arr_len * 2);
21726 }
21727
21728 int mangle_switch_at_check (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
21729 {
21730 if (upos >= arr_len) return (arr_len);
21731 if (upos2 >= arr_len) return (arr_len);
21732
21733 MANGLE_SWITCH (arr, upos, upos2);
21734
21735 return (arr_len);
21736 }
21737
21738 int mangle_switch_at (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
21739 {
21740 MANGLE_SWITCH (arr, upos, upos2);
21741
21742 return (arr_len);
21743 }
21744
21745 int mangle_chr_shiftl (char arr[BLOCK_SIZE], int arr_len, int upos)
21746 {
21747 if (upos >= arr_len) return (arr_len);
21748
21749 arr[upos] <<= 1;
21750
21751 return (arr_len);
21752 }
21753
21754 int mangle_chr_shiftr (char arr[BLOCK_SIZE], int arr_len, int upos)
21755 {
21756 if (upos >= arr_len) return (arr_len);
21757
21758 arr[upos] >>= 1;
21759
21760 return (arr_len);
21761 }
21762
21763 int mangle_chr_incr (char arr[BLOCK_SIZE], int arr_len, int upos)
21764 {
21765 if (upos >= arr_len) return (arr_len);
21766
21767 arr[upos] += 1;
21768
21769 return (arr_len);
21770 }
21771
21772 int mangle_chr_decr (char arr[BLOCK_SIZE], int arr_len, int upos)
21773 {
21774 if (upos >= arr_len) return (arr_len);
21775
21776 arr[upos] -= 1;
21777
21778 return (arr_len);
21779 }
21780
21781 int mangle_title (char arr[BLOCK_SIZE], int arr_len)
21782 {
21783 int upper_next = 1;
21784
21785 int pos;
21786
21787 for (pos = 0; pos < arr_len; pos++)
21788 {
21789 if (arr[pos] == ' ')
21790 {
21791 upper_next = 1;
21792
21793 continue;
21794 }
21795
21796 if (upper_next)
21797 {
21798 upper_next = 0;
21799
21800 MANGLE_UPPER_AT (arr, pos);
21801 }
21802 else
21803 {
21804 MANGLE_LOWER_AT (arr, pos);
21805 }
21806 }
21807
21808 return (arr_len);
21809 }
21810
21811 int generate_random_rule (char rule_buf[RP_RULE_BUFSIZ], u32 rp_gen_func_min, u32 rp_gen_func_max)
21812 {
21813 u32 rp_gen_num = get_random_num (rp_gen_func_min, rp_gen_func_max);
21814
21815 u32 j;
21816
21817 u32 rule_pos = 0;
21818
21819 for (j = 0; j < rp_gen_num; j++)
21820 {
21821 u32 r = 0;
21822 u32 p1 = 0;
21823 u32 p2 = 0;
21824 u32 p3 = 0;
21825
21826 switch ((char) get_random_num (0, 9))
21827 {
21828 case 0:
21829 r = get_random_num (0, sizeof (grp_op_nop));
21830 rule_buf[rule_pos++] = grp_op_nop[r];
21831 break;
21832
21833 case 1:
21834 r = get_random_num (0, sizeof (grp_op_pos_p0));
21835 rule_buf[rule_pos++] = grp_op_pos_p0[r];
21836 p1 = get_random_num (0, sizeof (grp_pos));
21837 rule_buf[rule_pos++] = grp_pos[p1];
21838 break;
21839
21840 case 2:
21841 r = get_random_num (0, sizeof (grp_op_pos_p1));
21842 rule_buf[rule_pos++] = grp_op_pos_p1[r];
21843 p1 = get_random_num (1, 6);
21844 rule_buf[rule_pos++] = grp_pos[p1];
21845 break;
21846
21847 case 3:
21848 r = get_random_num (0, sizeof (grp_op_chr));
21849 rule_buf[rule_pos++] = grp_op_chr[r];
21850 p1 = get_random_num (0x20, 0x7e);
21851 rule_buf[rule_pos++] = (char) p1;
21852 break;
21853
21854 case 4:
21855 r = get_random_num (0, sizeof (grp_op_chr_chr));
21856 rule_buf[rule_pos++] = grp_op_chr_chr[r];
21857 p1 = get_random_num (0x20, 0x7e);
21858 rule_buf[rule_pos++] = (char) p1;
21859 p2 = get_random_num (0x20, 0x7e);
21860 while (p1 == p2)
21861 p2 = get_random_num (0x20, 0x7e);
21862 rule_buf[rule_pos++] = (char) p2;
21863 break;
21864
21865 case 5:
21866 r = get_random_num (0, sizeof (grp_op_pos_chr));
21867 rule_buf[rule_pos++] = grp_op_pos_chr[r];
21868 p1 = get_random_num (0, sizeof (grp_pos));
21869 rule_buf[rule_pos++] = grp_pos[p1];
21870 p2 = get_random_num (0x20, 0x7e);
21871 rule_buf[rule_pos++] = (char) p2;
21872 break;
21873
21874 case 6:
21875 r = get_random_num (0, sizeof (grp_op_pos_pos0));
21876 rule_buf[rule_pos++] = grp_op_pos_pos0[r];
21877 p1 = get_random_num (0, sizeof (grp_pos));
21878 rule_buf[rule_pos++] = grp_pos[p1];
21879 p2 = get_random_num (0, sizeof (grp_pos));
21880 while (p1 == p2)
21881 p2 = get_random_num (0, sizeof (grp_pos));
21882 rule_buf[rule_pos++] = grp_pos[p2];
21883 break;
21884
21885 case 7:
21886 r = get_random_num (0, sizeof (grp_op_pos_pos1));
21887 rule_buf[rule_pos++] = grp_op_pos_pos1[r];
21888 p1 = get_random_num (0, sizeof (grp_pos));
21889 rule_buf[rule_pos++] = grp_pos[p1];
21890 p2 = get_random_num (1, sizeof (grp_pos));
21891 while (p1 == p2)
21892 p2 = get_random_num (1, sizeof (grp_pos));
21893 rule_buf[rule_pos++] = grp_pos[p2];
21894 break;
21895
21896 case 8:
21897 r = get_random_num (0, sizeof (grp_op_pos1_pos2_pos3));
21898 rule_buf[rule_pos++] = grp_op_pos1_pos2_pos3[r];
21899 p1 = get_random_num (0, sizeof (grp_pos));
21900 rule_buf[rule_pos++] = grp_pos[p1];
21901 p2 = get_random_num (1, sizeof (grp_pos));
21902 rule_buf[rule_pos++] = grp_pos[p1];
21903 p3 = get_random_num (0, sizeof (grp_pos));
21904 rule_buf[rule_pos++] = grp_pos[p3];
21905 break;
21906 }
21907 }
21908
21909 return (rule_pos);
21910 }
21911
21912 int _old_apply_rule (char *rule, int rule_len, char in[BLOCK_SIZE], int in_len, char out[BLOCK_SIZE])
21913 {
21914 char mem[BLOCK_SIZE] = { 0 };
21915
21916 if (in == NULL) return (RULE_RC_REJECT_ERROR);
21917
21918 if (out == NULL) return (RULE_RC_REJECT_ERROR);
21919
21920 if (in_len < 1 || in_len > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
21921
21922 if (rule_len < 1) return (RULE_RC_REJECT_ERROR);
21923
21924 int out_len = in_len;
21925 int mem_len = in_len;
21926
21927 memcpy (out, in, out_len);
21928
21929 int rule_pos;
21930
21931 for (rule_pos = 0; rule_pos < rule_len; rule_pos++)
21932 {
21933 int upos, upos2;
21934 int ulen;
21935
21936 switch (rule[rule_pos])
21937 {
21938 case ' ':
21939 break;
21940
21941 case RULE_OP_MANGLE_NOOP:
21942 break;
21943
21944 case RULE_OP_MANGLE_LREST:
21945 out_len = mangle_lrest (out, out_len);
21946 break;
21947
21948 case RULE_OP_MANGLE_UREST:
21949 out_len = mangle_urest (out, out_len);
21950 break;
21951
21952 case RULE_OP_MANGLE_LREST_UFIRST:
21953 out_len = mangle_lrest (out, out_len);
21954 if (out_len) MANGLE_UPPER_AT (out, 0);
21955 break;
21956
21957 case RULE_OP_MANGLE_UREST_LFIRST:
21958 out_len = mangle_urest (out, out_len);
21959 if (out_len) MANGLE_LOWER_AT (out, 0);
21960 break;
21961
21962 case RULE_OP_MANGLE_TREST:
21963 out_len = mangle_trest (out, out_len);
21964 break;
21965
21966 case RULE_OP_MANGLE_TOGGLE_AT:
21967 NEXT_RULEPOS (rule_pos);
21968 NEXT_RPTOI (rule, rule_pos, upos);
21969 if (upos < out_len) MANGLE_TOGGLE_AT (out, upos);
21970 break;
21971
21972 case RULE_OP_MANGLE_REVERSE:
21973 out_len = mangle_reverse (out, out_len);
21974 break;
21975
21976 case RULE_OP_MANGLE_DUPEWORD:
21977 out_len = mangle_double (out, out_len);
21978 break;
21979
21980 case RULE_OP_MANGLE_DUPEWORD_TIMES:
21981 NEXT_RULEPOS (rule_pos);
21982 NEXT_RPTOI (rule, rule_pos, ulen);
21983 out_len = mangle_double_times (out, out_len, ulen);
21984 break;
21985
21986 case RULE_OP_MANGLE_REFLECT:
21987 out_len = mangle_reflect (out, out_len);
21988 break;
21989
21990 case RULE_OP_MANGLE_ROTATE_LEFT:
21991 mangle_rotate_left (out, out_len);
21992 break;
21993
21994 case RULE_OP_MANGLE_ROTATE_RIGHT:
21995 mangle_rotate_right (out, out_len);
21996 break;
21997
21998 case RULE_OP_MANGLE_APPEND:
21999 NEXT_RULEPOS (rule_pos);
22000 out_len = mangle_append (out, out_len, rule[rule_pos]);
22001 break;
22002
22003 case RULE_OP_MANGLE_PREPEND:
22004 NEXT_RULEPOS (rule_pos);
22005 out_len = mangle_prepend (out, out_len, rule[rule_pos]);
22006 break;
22007
22008 case RULE_OP_MANGLE_DELETE_FIRST:
22009 out_len = mangle_delete_at (out, out_len, 0);
22010 break;
22011
22012 case RULE_OP_MANGLE_DELETE_LAST:
22013 out_len = mangle_delete_at (out, out_len, (out_len) ? out_len - 1 : 0);
22014 break;
22015
22016 case RULE_OP_MANGLE_DELETE_AT:
22017 NEXT_RULEPOS (rule_pos);
22018 NEXT_RPTOI (rule, rule_pos, upos);
22019 out_len = mangle_delete_at (out, out_len, upos);
22020 break;
22021
22022 case RULE_OP_MANGLE_EXTRACT:
22023 NEXT_RULEPOS (rule_pos);
22024 NEXT_RPTOI (rule, rule_pos, upos);
22025 NEXT_RULEPOS (rule_pos);
22026 NEXT_RPTOI (rule, rule_pos, ulen);
22027 out_len = mangle_extract (out, out_len, upos, ulen);
22028 break;
22029
22030 case RULE_OP_MANGLE_OMIT:
22031 NEXT_RULEPOS (rule_pos);
22032 NEXT_RPTOI (rule, rule_pos, upos);
22033 NEXT_RULEPOS (rule_pos);
22034 NEXT_RPTOI (rule, rule_pos, ulen);
22035 out_len = mangle_omit (out, out_len, upos, ulen);
22036 break;
22037
22038 case RULE_OP_MANGLE_INSERT:
22039 NEXT_RULEPOS (rule_pos);
22040 NEXT_RPTOI (rule, rule_pos, upos);
22041 NEXT_RULEPOS (rule_pos);
22042 out_len = mangle_insert (out, out_len, upos, rule[rule_pos]);
22043 break;
22044
22045 case RULE_OP_MANGLE_OVERSTRIKE:
22046 NEXT_RULEPOS (rule_pos);
22047 NEXT_RPTOI (rule, rule_pos, upos);
22048 NEXT_RULEPOS (rule_pos);
22049 out_len = mangle_overstrike (out, out_len, upos, rule[rule_pos]);
22050 break;
22051
22052 case RULE_OP_MANGLE_TRUNCATE_AT:
22053 NEXT_RULEPOS (rule_pos);
22054 NEXT_RPTOI (rule, rule_pos, upos);
22055 out_len = mangle_truncate_at (out, out_len, upos);
22056 break;
22057
22058 case RULE_OP_MANGLE_REPLACE:
22059 NEXT_RULEPOS (rule_pos);
22060 NEXT_RULEPOS (rule_pos);
22061 out_len = mangle_replace (out, out_len, rule[rule_pos - 1], rule[rule_pos]);
22062 break;
22063
22064 case RULE_OP_MANGLE_PURGECHAR:
22065 NEXT_RULEPOS (rule_pos);
22066 out_len = mangle_purgechar (out, out_len, rule[rule_pos]);
22067 break;
22068
22069 case RULE_OP_MANGLE_TOGGLECASE_REC:
22070 /* todo */
22071 break;
22072
22073 case RULE_OP_MANGLE_DUPECHAR_FIRST:
22074 NEXT_RULEPOS (rule_pos);
22075 NEXT_RPTOI (rule, rule_pos, ulen);
22076 out_len = mangle_dupechar_at (out, out_len, 0, ulen);
22077 break;
22078
22079 case RULE_OP_MANGLE_DUPECHAR_LAST:
22080 NEXT_RULEPOS (rule_pos);
22081 NEXT_RPTOI (rule, rule_pos, ulen);
22082 out_len = mangle_dupechar_at (out, out_len, out_len - 1, ulen);
22083 break;
22084
22085 case RULE_OP_MANGLE_DUPECHAR_ALL:
22086 out_len = mangle_dupechar (out, out_len);
22087 break;
22088
22089 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
22090 NEXT_RULEPOS (rule_pos);
22091 NEXT_RPTOI (rule, rule_pos, ulen);
22092 out_len = mangle_dupeblock_prepend (out, out_len, ulen);
22093 break;
22094
22095 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
22096 NEXT_RULEPOS (rule_pos);
22097 NEXT_RPTOI (rule, rule_pos, ulen);
22098 out_len = mangle_dupeblock_append (out, out_len, ulen);
22099 break;
22100
22101 case RULE_OP_MANGLE_SWITCH_FIRST:
22102 if (out_len >= 2) mangle_switch_at (out, out_len, 0, 1);
22103 break;
22104
22105 case RULE_OP_MANGLE_SWITCH_LAST:
22106 if (out_len >= 2) mangle_switch_at (out, out_len, out_len - 1, out_len - 2);
22107 break;
22108
22109 case RULE_OP_MANGLE_SWITCH_AT:
22110 NEXT_RULEPOS (rule_pos);
22111 NEXT_RPTOI (rule, rule_pos, upos);
22112 NEXT_RULEPOS (rule_pos);
22113 NEXT_RPTOI (rule, rule_pos, upos2);
22114 out_len = mangle_switch_at_check (out, out_len, upos, upos2);
22115 break;
22116
22117 case RULE_OP_MANGLE_CHR_SHIFTL:
22118 NEXT_RULEPOS (rule_pos);
22119 NEXT_RPTOI (rule, rule_pos, upos);
22120 mangle_chr_shiftl (out, out_len, upos);
22121 break;
22122
22123 case RULE_OP_MANGLE_CHR_SHIFTR:
22124 NEXT_RULEPOS (rule_pos);
22125 NEXT_RPTOI (rule, rule_pos, upos);
22126 mangle_chr_shiftr (out, out_len, upos);
22127 break;
22128
22129 case RULE_OP_MANGLE_CHR_INCR:
22130 NEXT_RULEPOS (rule_pos);
22131 NEXT_RPTOI (rule, rule_pos, upos);
22132 mangle_chr_incr (out, out_len, upos);
22133 break;
22134
22135 case RULE_OP_MANGLE_CHR_DECR:
22136 NEXT_RULEPOS (rule_pos);
22137 NEXT_RPTOI (rule, rule_pos, upos);
22138 mangle_chr_decr (out, out_len, upos);
22139 break;
22140
22141 case RULE_OP_MANGLE_REPLACE_NP1:
22142 NEXT_RULEPOS (rule_pos);
22143 NEXT_RPTOI (rule, rule_pos, upos);
22144 if ((upos >= 0) && ((upos + 1) < out_len)) mangle_overstrike (out, out_len, upos, out[upos + 1]);
22145 break;
22146
22147 case RULE_OP_MANGLE_REPLACE_NM1:
22148 NEXT_RULEPOS (rule_pos);
22149 NEXT_RPTOI (rule, rule_pos, upos);
22150 if ((upos >= 1) && ((upos + 0) < out_len)) mangle_overstrike (out, out_len, upos, out[upos - 1]);
22151 break;
22152
22153 case RULE_OP_MANGLE_TITLE:
22154 out_len = mangle_title (out, out_len);
22155 break;
22156
22157 case RULE_OP_MANGLE_EXTRACT_MEMORY:
22158 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
22159 NEXT_RULEPOS (rule_pos);
22160 NEXT_RPTOI (rule, rule_pos, upos);
22161 NEXT_RULEPOS (rule_pos);
22162 NEXT_RPTOI (rule, rule_pos, ulen);
22163 NEXT_RULEPOS (rule_pos);
22164 NEXT_RPTOI (rule, rule_pos, upos2);
22165 if ((out_len = mangle_insert_multi (out, out_len, upos2, mem, mem_len, upos, ulen)) < 1) return (out_len);
22166 break;
22167
22168 case RULE_OP_MANGLE_APPEND_MEMORY:
22169 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
22170 if ((out_len + mem_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
22171 memcpy (out + out_len, mem, mem_len);
22172 out_len += mem_len;
22173 break;
22174
22175 case RULE_OP_MANGLE_PREPEND_MEMORY:
22176 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
22177 if ((mem_len + out_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
22178 memcpy (mem + mem_len, out, out_len);
22179 out_len += mem_len;
22180 memcpy (out, mem, out_len);
22181 break;
22182
22183 case RULE_OP_MEMORIZE_WORD:
22184 memcpy (mem, out, out_len);
22185 mem_len = out_len;
22186 break;
22187
22188 case RULE_OP_REJECT_LESS:
22189 NEXT_RULEPOS (rule_pos);
22190 NEXT_RPTOI (rule, rule_pos, upos);
22191 if (out_len > upos) return (RULE_RC_REJECT_ERROR);
22192 break;
22193
22194 case RULE_OP_REJECT_GREATER:
22195 NEXT_RULEPOS (rule_pos);
22196 NEXT_RPTOI (rule, rule_pos, upos);
22197 if (out_len < upos) return (RULE_RC_REJECT_ERROR);
22198 break;
22199
22200 case RULE_OP_REJECT_CONTAIN:
22201 NEXT_RULEPOS (rule_pos);
22202 if (strchr (out, rule[rule_pos]) != NULL) return (RULE_RC_REJECT_ERROR);
22203 break;
22204
22205 case RULE_OP_REJECT_NOT_CONTAIN:
22206 NEXT_RULEPOS (rule_pos);
22207 if (strchr (out, rule[rule_pos]) == NULL) return (RULE_RC_REJECT_ERROR);
22208 break;
22209
22210 case RULE_OP_REJECT_EQUAL_FIRST:
22211 NEXT_RULEPOS (rule_pos);
22212 if (out[0] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
22213 break;
22214
22215 case RULE_OP_REJECT_EQUAL_LAST:
22216 NEXT_RULEPOS (rule_pos);
22217 if (out[out_len - 1] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
22218 break;
22219
22220 case RULE_OP_REJECT_EQUAL_AT:
22221 NEXT_RULEPOS (rule_pos);
22222 NEXT_RPTOI (rule, rule_pos, upos);
22223 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
22224 NEXT_RULEPOS (rule_pos);
22225 if (out[upos] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
22226 break;
22227
22228 case RULE_OP_REJECT_CONTAINS:
22229 NEXT_RULEPOS (rule_pos);
22230 NEXT_RPTOI (rule, rule_pos, upos);
22231 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
22232 NEXT_RULEPOS (rule_pos);
22233 int c; int cnt; for (c = 0, cnt = 0; c < out_len; c++) if (out[c] == rule[rule_pos]) cnt++;
22234 if (cnt < upos) return (RULE_RC_REJECT_ERROR);
22235 break;
22236
22237 case RULE_OP_REJECT_MEMORY:
22238 if ((out_len == mem_len) && (memcmp (out, mem, out_len) == 0)) return (RULE_RC_REJECT_ERROR);
22239 break;
22240
22241 default:
22242 return (RULE_RC_SYNTAX_ERROR);
22243 break;
22244 }
22245 }
22246
22247 memset (out + out_len, 0, BLOCK_SIZE - out_len);
22248
22249 return (out_len);
22250 }