905d81fbf1a765f45237c5227d15576455dca119
[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 #if defined(_WIN) && defined(HAVE_NVAPI)
2675 int hm_get_adapter_index_nv (HM_ADAPTER_NV nvGPUHandle[DEVICES_MAX])
2676 {
2677 NvU32 pGpuCount;
2678
2679 if (hm_NvAPI_EnumPhysicalGPUs (data.hm_nv, nvGPUHandle, &pGpuCount) != NVAPI_OK) return (0);
2680
2681 if (pGpuCount == 0)
2682 {
2683 log_info ("WARN: No NvAPI adapters found");
2684
2685 return (0);
2686 }
2687
2688 return (pGpuCount);
2689 }
2690 #endif // _WIN && HAVE_NVAPI
2691
2692 #if defined(LINUX) && defined(HAVE_NVML)
2693 int hm_get_adapter_index_nv (HM_ADAPTER_NV nvGPUHandle[DEVICES_MAX])
2694 {
2695 int pGpuCount = 0;
2696
2697 for (uint i = 0; i < DEVICES_MAX; i++)
2698 {
2699 if (hm_NVML_nvmlDeviceGetHandleByIndex (data.hm_nv, 1, i, &nvGPUHandle[i]) != NVML_SUCCESS) break;
2700
2701 // can be used to determine if the device by index matches the cuda device by index
2702 // char name[100]; memset (name, 0, sizeof (name));
2703 // hm_NVML_nvmlDeviceGetName (data.hm_nv, nvGPUHandle[i], name, sizeof (name) - 1);
2704
2705 pGpuCount++;
2706 }
2707
2708 if (pGpuCount == 0)
2709 {
2710 log_info ("WARN: No NVML adapters found");
2711
2712 return (0);
2713 }
2714
2715 return (pGpuCount);
2716 }
2717 #endif // LINUX && HAVE_NVML
2718
2719 #ifdef HAVE_ADL
2720 int get_adapters_num_amd (void *adl, int *iNumberAdapters)
2721 {
2722 if (hm_ADL_Adapter_NumberOfAdapters_Get ((ADL_PTR *) adl, iNumberAdapters) != ADL_OK) return -1;
2723
2724 if (iNumberAdapters == 0)
2725 {
2726 log_info ("WARN: No ADL adapters found.");
2727
2728 return -1;
2729 }
2730
2731 return 0;
2732 }
2733
2734 /*
2735 int hm_show_performance_level (HM_LIB hm_dll, int iAdapterIndex)
2736 {
2737 ADLODPerformanceLevels *lpOdPerformanceLevels = NULL;
2738 ADLODParameters lpOdParameters;
2739
2740 lpOdParameters.iSize = sizeof (ADLODParameters);
2741 size_t plevels_size = 0;
2742
2743 if (hm_ADL_Overdrive_ODParameters_Get (hm_dll, iAdapterIndex, &lpOdParameters) != ADL_OK) return -1;
2744
2745 log_info ("[DEBUG] %s, adapter %d performance level (%d) : %s %s",
2746 __func__, iAdapterIndex,
2747 lpOdParameters.iNumberOfPerformanceLevels,
2748 (lpOdParameters.iActivityReportingSupported) ? "activity reporting" : "",
2749 (lpOdParameters.iDiscretePerformanceLevels) ? "discrete performance levels" : "performance ranges");
2750
2751 plevels_size = sizeof (ADLODPerformanceLevels) + sizeof (ADLODPerformanceLevel) * (lpOdParameters.iNumberOfPerformanceLevels - 1);
2752
2753 lpOdPerformanceLevels = (ADLODPerformanceLevels *) mymalloc (plevels_size);
2754
2755 lpOdPerformanceLevels->iSize = sizeof (ADLODPerformanceLevels) + sizeof (ADLODPerformanceLevel) * (lpOdParameters.iNumberOfPerformanceLevels - 1);
2756
2757 if (hm_ADL_Overdrive_ODPerformanceLevels_Get (hm_dll, iAdapterIndex, 0, lpOdPerformanceLevels) != ADL_OK) return -1;
2758
2759 for (int j = 0; j < lpOdParameters.iNumberOfPerformanceLevels; j++)
2760 log_info ("[DEBUG] %s, adapter %d, level %d : engine %d, memory %d, voltage: %d",
2761 __func__, iAdapterIndex, j,
2762 lpOdPerformanceLevels->aLevels[j].iEngineClock / 100, lpOdPerformanceLevels->aLevels[j].iMemoryClock / 100, lpOdPerformanceLevels->aLevels[j].iVddc);
2763
2764 myfree (lpOdPerformanceLevels);
2765
2766 return 0;
2767 }
2768 */
2769
2770 LPAdapterInfo hm_get_adapter_info_amd (void *adl, int iNumberAdapters)
2771 {
2772 size_t AdapterInfoSize = iNumberAdapters * sizeof (AdapterInfo);
2773
2774 LPAdapterInfo lpAdapterInfo = (LPAdapterInfo) mymalloc (AdapterInfoSize);
2775
2776 if (hm_ADL_Adapter_AdapterInfo_Get ((ADL_PTR *) adl, lpAdapterInfo, AdapterInfoSize) != ADL_OK) return NULL;
2777
2778 return lpAdapterInfo;
2779 }
2780
2781 /*
2782 //
2783 // does not help at all, since AMD does not assign different bus id, device id when we have multi GPU setups
2784 //
2785
2786 int hm_get_opencl_device_index (hm_attrs_t *hm_device, uint num_adl_adapters, int bus_num, int dev_num)
2787 {
2788 u32 idx = -1;
2789
2790 for (uint i = 0; i < num_adl_adapters; i++)
2791 {
2792 int opencl_bus_num = hm_device[i].busid;
2793 int opencl_dev_num = hm_device[i].devid;
2794
2795 if ((opencl_bus_num == bus_num) && (opencl_dev_num == dev_num))
2796 {
2797 idx = i;
2798
2799 break;
2800 }
2801 }
2802
2803 if (idx >= DEVICES_MAX) return -1;
2804
2805 return idx;
2806 }
2807
2808 void hm_get_opencl_busid_devid (hm_attrs_t *hm_device, uint opencl_num_devices, cl_device_id *devices)
2809 {
2810 for (uint i = 0; i < opencl_num_devices; i++)
2811 {
2812 cl_device_topology_amd device_topology;
2813
2814 hc_clGetDeviceInfo (devices[i], CL_DEVICE_TOPOLOGY_AMD, sizeof (device_topology), &device_topology, NULL);
2815
2816 hm_device[i].busid = device_topology.pcie.bus;
2817 hm_device[i].devid = device_topology.pcie.device;
2818 }
2819 }
2820 */
2821
2822 void hm_sort_adl_adapters_by_busid_devid (u32 *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2823 {
2824 // basically bubble sort
2825
2826 for (int i = 0; i < num_adl_adapters; i++)
2827 {
2828 for (int j = 0; j < num_adl_adapters - 1; j++)
2829 {
2830 // get info of adapter [x]
2831
2832 u32 adapter_index_x = valid_adl_device_list[j];
2833 AdapterInfo info_x = lpAdapterInfo[adapter_index_x];
2834
2835 u32 bus_num_x = info_x.iBusNumber;
2836 u32 dev_num_x = info_x.iDeviceNumber;
2837
2838 // get info of adapter [y]
2839
2840 u32 adapter_index_y = valid_adl_device_list[j + 1];
2841 AdapterInfo info_y = lpAdapterInfo[adapter_index_y];
2842
2843 u32 bus_num_y = info_y.iBusNumber;
2844 u32 dev_num_y = info_y.iDeviceNumber;
2845
2846 uint need_swap = 0;
2847
2848 if (bus_num_y < bus_num_x)
2849 {
2850 need_swap = 1;
2851 }
2852 else if (bus_num_y == bus_num_x)
2853 {
2854 if (dev_num_y < dev_num_x)
2855 {
2856 need_swap = 1;
2857 }
2858 }
2859
2860 if (need_swap == 1)
2861 {
2862 u32 temp = valid_adl_device_list[j + 1];
2863
2864 valid_adl_device_list[j + 1] = valid_adl_device_list[j];
2865 valid_adl_device_list[j + 0] = temp;
2866 }
2867 }
2868 }
2869 }
2870
2871 u32 *hm_get_list_valid_adl_adapters (int iNumberAdapters, int *num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2872 {
2873 *num_adl_adapters = 0;
2874
2875 u32 *adl_adapters = NULL;
2876
2877 int *bus_numbers = NULL;
2878 int *device_numbers = NULL;
2879
2880 for (int i = 0; i < iNumberAdapters; i++)
2881 {
2882 AdapterInfo info = lpAdapterInfo[i];
2883
2884 if (strlen (info.strUDID) < 1) continue;
2885
2886 #ifdef WIN
2887 if (info.iVendorID != 1002) continue;
2888 #else
2889 if (info.iVendorID != 0x1002) continue;
2890 #endif
2891
2892 if (info.iBusNumber < 0) continue;
2893 if (info.iDeviceNumber < 0) continue;
2894
2895 int found = 0;
2896
2897 for (int pos = 0; pos < *num_adl_adapters; pos++)
2898 {
2899 if ((bus_numbers[pos] == info.iBusNumber) && (device_numbers[pos] == info.iDeviceNumber))
2900 {
2901 found = 1;
2902 break;
2903 }
2904 }
2905
2906 if (found) continue;
2907
2908 // add it to the list
2909
2910 adl_adapters = (u32 *) myrealloc (adl_adapters, (*num_adl_adapters) * sizeof (int), sizeof (int));
2911
2912 adl_adapters[*num_adl_adapters] = i;
2913
2914 // rest is just bookkeeping
2915
2916 bus_numbers = (int*) myrealloc (bus_numbers, (*num_adl_adapters) * sizeof (int), sizeof (int));
2917 device_numbers = (int*) myrealloc (device_numbers, (*num_adl_adapters) * sizeof (int), sizeof (int));
2918
2919 bus_numbers[*num_adl_adapters] = info.iBusNumber;
2920 device_numbers[*num_adl_adapters] = info.iDeviceNumber;
2921
2922 (*num_adl_adapters)++;
2923 }
2924
2925 myfree (bus_numbers);
2926 myfree (device_numbers);
2927
2928 // sort the list by increasing bus id, device id number
2929
2930 hm_sort_adl_adapters_by_busid_devid (adl_adapters, *num_adl_adapters, lpAdapterInfo);
2931
2932 return adl_adapters;
2933 }
2934
2935 int hm_check_fanspeed_control (void *adl, hm_attrs_t *hm_device, u32 *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2936 {
2937 // loop through all valid devices
2938
2939 for (int i = 0; i < num_adl_adapters; i++)
2940 {
2941 u32 adapter_index = valid_adl_device_list[i];
2942
2943 // get AdapterInfo
2944
2945 AdapterInfo info = lpAdapterInfo[adapter_index];
2946
2947 // unfortunately this doesn't work since bus id and dev id are not unique
2948 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
2949 // if (opencl_device_index == -1) continue;
2950
2951 int opencl_device_index = i;
2952
2953 // if (hm_show_performance_level (adl, info.iAdapterIndex) != 0) return -1;
2954
2955 // get fanspeed info
2956
2957 if (hm_device[opencl_device_index].od_version == 5)
2958 {
2959 ADLFanSpeedInfo FanSpeedInfo;
2960
2961 memset (&FanSpeedInfo, 0, sizeof (ADLFanSpeedInfo));
2962
2963 FanSpeedInfo.iSize = sizeof (ADLFanSpeedInfo);
2964
2965 if (hm_ADL_Overdrive5_FanSpeedInfo_Get (adl, info.iAdapterIndex, 0, &FanSpeedInfo) != ADL_OK) return -1;
2966
2967 // check read and write capability in fanspeedinfo
2968
2969 if ((FanSpeedInfo.iFlags & ADL_DL_FANCTRL_SUPPORTS_PERCENT_READ) &&
2970 (FanSpeedInfo.iFlags & ADL_DL_FANCTRL_SUPPORTS_PERCENT_WRITE))
2971 {
2972 hm_device[opencl_device_index].fan_supported = 1;
2973 }
2974 else
2975 {
2976 hm_device[opencl_device_index].fan_supported = 0;
2977 }
2978 }
2979 else // od_version == 6
2980 {
2981 ADLOD6FanSpeedInfo faninfo;
2982
2983 memset (&faninfo, 0, sizeof (faninfo));
2984
2985 if (hm_ADL_Overdrive6_FanSpeed_Get (adl, info.iAdapterIndex, &faninfo) != ADL_OK) return -1;
2986
2987 // check read capability in fanspeedinfo
2988
2989 if (faninfo.iSpeedType & ADL_OD6_FANSPEED_TYPE_PERCENT)
2990 {
2991 hm_device[opencl_device_index].fan_supported = 1;
2992 }
2993 else
2994 {
2995 hm_device[opencl_device_index].fan_supported = 0;
2996 }
2997 }
2998 }
2999
3000 return 0;
3001 }
3002
3003 int hm_get_overdrive_version (void *adl, hm_attrs_t *hm_device, u32 *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
3004 {
3005 for (int i = 0; i < num_adl_adapters; i++)
3006 {
3007 u32 adapter_index = valid_adl_device_list[i];
3008
3009 // get AdapterInfo
3010
3011 AdapterInfo info = lpAdapterInfo[adapter_index];
3012
3013 // get overdrive version
3014
3015 int od_supported = 0;
3016 int od_enabled = 0;
3017 int od_version = 0;
3018
3019 if (hm_ADL_Overdrive_Caps (adl, info.iAdapterIndex, &od_supported, &od_enabled, &od_version) != ADL_OK) return -1;
3020
3021 // store the overdrive version in hm_device
3022
3023 // unfortunately this doesn't work since bus id and dev id are not unique
3024 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
3025 // if (opencl_device_index == -1) continue;
3026
3027 int opencl_device_index = i;
3028
3029 hm_device[opencl_device_index].od_version = od_version;
3030 }
3031
3032 return 0;
3033 }
3034
3035 int hm_get_adapter_index_amd (hm_attrs_t *hm_device, u32 *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
3036 {
3037 for (int i = 0; i < num_adl_adapters; i++)
3038 {
3039 u32 adapter_index = valid_adl_device_list[i];
3040
3041 // get AdapterInfo
3042
3043 AdapterInfo info = lpAdapterInfo[adapter_index];
3044
3045 // store the iAdapterIndex in hm_device
3046
3047 // unfortunately this doesn't work since bus id and dev id are not unique
3048 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
3049 // if (opencl_device_index == -1) continue;
3050
3051 int opencl_device_index = i;
3052
3053 hm_device[opencl_device_index].adapter_index.amd = info.iAdapterIndex;
3054 }
3055
3056 return num_adl_adapters;
3057 }
3058 #endif // HAVE_ADL
3059
3060 int hm_get_threshold_slowdown_with_device_id (const uint device_id)
3061 {
3062 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3063
3064 #ifdef HAVE_ADL
3065 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_AMD)
3066 {
3067 if (data.hm_amd)
3068 {
3069 if (data.hm_device[device_id].od_version == 5)
3070 {
3071
3072 }
3073 else if (data.hm_device[device_id].od_version == 6)
3074 {
3075 int CurrentValue = 0;
3076 int DefaultValue = 0;
3077
3078 if (hm_ADL_Overdrive6_TargetTemperatureData_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, &CurrentValue, &DefaultValue) != ADL_OK) return -1;
3079
3080 // the return value has never been tested since hm_ADL_Overdrive6_TargetTemperatureData_Get() never worked on any system. expect problems.
3081
3082 return DefaultValue;
3083 }
3084 }
3085 }
3086 #endif
3087
3088 #if defined(HAVE_NVML) || defined(HAVE_NVAPI)
3089 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_NV)
3090 {
3091 #if defined(LINUX) && defined(HAVE_NVML)
3092 int target = 0;
3093
3094 hm_NVML_nvmlDeviceGetTemperatureThreshold (data.hm_nv, data.hm_device[device_id].adapter_index.nv, NVML_TEMPERATURE_THRESHOLD_SLOWDOWN, (unsigned int *) &target);
3095
3096 return target;
3097 #endif
3098
3099 #if defined(WIN) && defined(HAVE_NVAPI)
3100
3101 #endif // WIN && HAVE_NVAPI
3102 }
3103 #endif // HAVE_NVML || HAVE_NVAPI
3104
3105 return -1;
3106 }
3107
3108 int hm_get_temperature_with_device_id (const uint device_id)
3109 {
3110 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3111
3112 #ifdef HAVE_ADL
3113 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_AMD)
3114 {
3115 if (data.hm_amd)
3116 {
3117 if (data.hm_device[device_id].od_version == 5)
3118 {
3119 ADLTemperature Temperature;
3120
3121 Temperature.iSize = sizeof (ADLTemperature);
3122
3123 if (hm_ADL_Overdrive5_Temperature_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, 0, &Temperature) != ADL_OK) return -1;
3124
3125 return Temperature.iTemperature / 1000;
3126 }
3127 else if (data.hm_device[device_id].od_version == 6)
3128 {
3129 int Temperature = 0;
3130
3131 if (hm_ADL_Overdrive6_Temperature_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, &Temperature) != ADL_OK) return -1;
3132
3133 return Temperature / 1000;
3134 }
3135 }
3136 }
3137 #endif
3138
3139 #if defined(HAVE_NVML) || defined(HAVE_NVAPI)
3140 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_NV)
3141 {
3142 #if defined(LINUX) && defined(HAVE_NVML)
3143 int temperature = 0;
3144
3145 hm_NVML_nvmlDeviceGetTemperature (data.hm_nv, data.hm_device[device_id].adapter_index.nv, NVML_TEMPERATURE_GPU, (uint *) &temperature);
3146
3147 return temperature;
3148 #endif
3149
3150 #if defined(WIN) && defined(HAVE_NVAPI)
3151 NV_GPU_THERMAL_SETTINGS pThermalSettings;
3152
3153 pThermalSettings.version = NV_GPU_THERMAL_SETTINGS_VER;
3154 pThermalSettings.count = NVAPI_MAX_THERMAL_SENSORS_PER_GPU;
3155 pThermalSettings.sensor[0].controller = NVAPI_THERMAL_CONTROLLER_UNKNOWN;
3156 pThermalSettings.sensor[0].target = NVAPI_THERMAL_TARGET_GPU;
3157
3158 if (hm_NvAPI_GPU_GetThermalSettings (data.hm_nv, data.hm_device[device_id].adapter_index.nv, 0, &pThermalSettings) != NVAPI_OK) return -1;
3159
3160 return pThermalSettings.sensor[0].currentTemp;
3161 #endif // WIN && HAVE_NVAPI
3162 }
3163 #endif // HAVE_NVML || HAVE_NVAPI
3164
3165 return -1;
3166 }
3167
3168 int hm_get_fanspeed_with_device_id (const uint device_id)
3169 {
3170 // we shouldn't really need this extra CL_DEVICE_TYPE_GPU check, because fan_supported should not be set w/ CPUs
3171 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3172
3173 if (data.hm_device[device_id].fan_supported == 1)
3174 {
3175 #ifdef HAVE_ADL
3176 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_AMD)
3177 {
3178 if (data.hm_amd)
3179 {
3180 if (data.hm_device[device_id].od_version == 5)
3181 {
3182 ADLFanSpeedValue lpFanSpeedValue;
3183
3184 memset (&lpFanSpeedValue, 0, sizeof (lpFanSpeedValue));
3185
3186 lpFanSpeedValue.iSize = sizeof (lpFanSpeedValue);
3187 lpFanSpeedValue.iSpeedType = ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
3188 lpFanSpeedValue.iFlags = ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED;
3189
3190 if (hm_ADL_Overdrive5_FanSpeed_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, 0, &lpFanSpeedValue) != ADL_OK) return -1;
3191
3192 return lpFanSpeedValue.iFanSpeed;
3193 }
3194 else // od_version == 6
3195 {
3196 ADLOD6FanSpeedInfo faninfo;
3197
3198 memset (&faninfo, 0, sizeof (faninfo));
3199
3200 if (hm_ADL_Overdrive6_FanSpeed_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, &faninfo) != ADL_OK) return -1;
3201
3202 return faninfo.iFanSpeedPercent;
3203 }
3204 }
3205 }
3206 #endif // HAVE_ADL
3207
3208 #if defined(HAVE_NVML) || defined(HAVE_NVAPI)
3209 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_NV)
3210 {
3211 #if defined(LINUX) && defined(HAVE_NVML)
3212 int speed = 0;
3213
3214 hm_NVML_nvmlDeviceGetFanSpeed (data.hm_nv, 1, data.hm_device[device_id].adapter_index.nv, (uint *) &speed);
3215
3216 return speed;
3217 #endif
3218
3219 #if defined(WIN) && defined(HAVE_NVAPI)
3220 NV_GPU_COOLER_SETTINGS pCoolerSettings;
3221
3222 pCoolerSettings.Version = GPU_COOLER_SETTINGS_VER | sizeof (NV_GPU_COOLER_SETTINGS);
3223
3224 hm_NvAPI_GPU_GetCoolerSettings (data.hm_nv, data.hm_device[device_id].adapter_index.nv, 0, &pCoolerSettings);
3225
3226 return pCoolerSettings.Cooler[0].CurrentLevel;
3227 #endif
3228 }
3229 #endif // HAVE_NVML || HAVE_NVAPI
3230 }
3231
3232 return -1;
3233 }
3234
3235 int hm_get_maxbuslanes_with_device_id (const uint device_id)
3236 {
3237 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3238
3239 #ifdef HAVE_ADL
3240 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_AMD)
3241 {
3242 if (data.hm_amd)
3243 {
3244 ADLPMActivity PMActivity;
3245
3246 PMActivity.iSize = sizeof (ADLPMActivity);
3247
3248 if (hm_ADL_Overdrive_CurrentActivity_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, &PMActivity) != ADL_OK) return -1;
3249
3250 return PMActivity.iMaximumBusLanes;
3251 }
3252 }
3253 #endif // HAVE_ADL
3254
3255 #if defined(HAVE_NVML) || defined(HAVE_NVAPI)
3256 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_NV)
3257 {
3258 #if defined(LINUX) && defined(HAVE_NVML)
3259
3260 #endif
3261
3262 #if defined(WIN) && defined(HAVE_NVAPI)
3263
3264 #endif
3265 }
3266 #endif // HAVE_NVML || HAVE_NVAPI
3267
3268 return -1;
3269 }
3270
3271 int hm_get_currentbuslanes_with_device_id (const uint device_id)
3272 {
3273 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3274
3275 #ifdef HAVE_ADL
3276 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_AMD)
3277 {
3278 if (data.hm_amd)
3279 {
3280 ADLPMActivity PMActivity;
3281
3282 PMActivity.iSize = sizeof (ADLPMActivity);
3283
3284 if (hm_ADL_Overdrive_CurrentActivity_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, &PMActivity) != ADL_OK) return -1;
3285
3286 return PMActivity.iCurrentBusLanes;
3287 }
3288 }
3289 #endif // HAVE_ADL
3290
3291 #if defined(HAVE_NVML) || defined(HAVE_NVAPI)
3292 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_NV)
3293 {
3294 #if defined(LINUX) && defined(HAVE_NVML)
3295
3296 #endif
3297
3298 #if defined(WIN) && defined(HAVE_NVAPI)
3299
3300 #endif
3301 }
3302 #endif // HAVE_NVML || HAVE_NVAPI
3303
3304 return -1;
3305 }
3306
3307 int hm_get_utilization_with_device_id (const uint device_id)
3308 {
3309 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3310
3311 #ifdef HAVE_ADL
3312 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_AMD)
3313 {
3314 if (data.hm_amd)
3315 {
3316 ADLPMActivity PMActivity;
3317
3318 PMActivity.iSize = sizeof (ADLPMActivity);
3319
3320 if (hm_ADL_Overdrive_CurrentActivity_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, &PMActivity) != ADL_OK) return -1;
3321
3322 return PMActivity.iActivityPercent;
3323 }
3324 }
3325 #endif // HAVE_ADL
3326
3327 #if defined(HAVE_NVML) || defined(HAVE_NVAPI)
3328 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_NV)
3329 {
3330 #if defined(LINUX) && defined(HAVE_NVML)
3331 nvmlUtilization_t utilization;
3332
3333 hm_NVML_nvmlDeviceGetUtilizationRates (data.hm_nv, data.hm_device[device_id].adapter_index.nv, &utilization);
3334
3335 return utilization.gpu;
3336 #endif
3337
3338 #if defined(WIN) && defined(HAVE_NVAPI)
3339 NV_GPU_DYNAMIC_PSTATES_INFO_EX pDynamicPstatesInfoEx;
3340
3341 pDynamicPstatesInfoEx.version = NV_GPU_DYNAMIC_PSTATES_INFO_EX_VER;
3342
3343 if (hm_NvAPI_GPU_GetDynamicPstatesInfoEx (data.hm_nv, data.hm_device[device_id].adapter_index.nv, &pDynamicPstatesInfoEx) != NVAPI_OK) return -1;
3344
3345 return pDynamicPstatesInfoEx.utilization[0].percentage;
3346 #endif
3347 }
3348 #endif // HAVE_NVML || HAVE_NVAPI
3349
3350 return -1;
3351 }
3352
3353 int hm_get_memoryspeed_with_device_id (const uint device_id)
3354 {
3355 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3356
3357 #ifdef HAVE_ADL
3358 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_AMD)
3359 {
3360 if (data.hm_amd)
3361 {
3362 ADLPMActivity PMActivity;
3363
3364 PMActivity.iSize = sizeof (ADLPMActivity);
3365
3366 if (hm_ADL_Overdrive_CurrentActivity_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, &PMActivity) != ADL_OK) return -1;
3367
3368 return PMActivity.iMemoryClock / 100;
3369 }
3370 }
3371 #endif // HAVE_ADL
3372
3373 #if defined(HAVE_NVML) || defined(HAVE_NVAPI)
3374 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_NV)
3375 {
3376 #if defined(LINUX) && defined(HAVE_NVML)
3377 unsigned int clock;
3378
3379 hm_NVML_nvmlDeviceGetClockInfo (data.hm_nv, data.hm_device[device_id].adapter_index.nv, NVML_CLOCK_MEM, &clock);
3380
3381 return clock;
3382 #endif
3383
3384 #if defined(WIN) && defined(HAVE_NVAPI)
3385 NV_GPU_CLOCK_FREQUENCIES pClkFreqs = { 0 };
3386
3387 pClkFreqs.version = NV_GPU_CLOCK_FREQUENCIES_VER;
3388 pClkFreqs.ClockType = NV_GPU_CLOCK_FREQUENCIES_CURRENT_FREQ;
3389
3390 if (hm_NvAPI_GPU_GetAllClockFrequencies (data.hm_nv, data.hm_device[device_id].adapter_index.nv, &pClkFreqs) != NVAPI_OK) return -1;
3391
3392 return pClkFreqs.domain[NVAPI_GPU_PUBLIC_CLOCK_MEMORY].frequency / 1000;
3393 #endif
3394 }
3395 #endif // HAVE_NVML || HAVE_NVAPI
3396
3397 return -1;
3398 }
3399
3400 int hm_get_corespeed_with_device_id (const uint device_id)
3401 {
3402 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3403
3404 #ifdef HAVE_ADL
3405 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_AMD)
3406 {
3407 if (data.hm_amd)
3408 {
3409 ADLPMActivity PMActivity;
3410
3411 PMActivity.iSize = sizeof (ADLPMActivity);
3412
3413 if (hm_ADL_Overdrive_CurrentActivity_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, &PMActivity) != ADL_OK) return -1;
3414
3415 return PMActivity.iEngineClock / 100;
3416 }
3417 }
3418 #endif // HAVE_ADL
3419
3420 #if defined(HAVE_NVML) || defined(HAVE_NVAPI)
3421 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_NV)
3422 {
3423 #if defined(LINUX) && defined(HAVE_NVML)
3424 unsigned int clock;
3425
3426 hm_NVML_nvmlDeviceGetClockInfo (data.hm_nv, data.hm_device[device_id].adapter_index.nv, NVML_CLOCK_SM, &clock);
3427
3428 return clock;
3429 #endif
3430
3431 #if defined(WIN) && defined(HAVE_NVAPI)
3432 NV_GPU_CLOCK_FREQUENCIES pClkFreqs = { 0 };
3433
3434 pClkFreqs.version = NV_GPU_CLOCK_FREQUENCIES_VER;
3435 pClkFreqs.ClockType = NV_GPU_CLOCK_FREQUENCIES_CURRENT_FREQ;
3436
3437 if (hm_NvAPI_GPU_GetAllClockFrequencies (data.hm_nv, data.hm_device[device_id].adapter_index.nv, &pClkFreqs) != NVAPI_OK) return -1;
3438
3439 return pClkFreqs.domain[NVAPI_GPU_PUBLIC_CLOCK_GRAPHICS].frequency / 1000;
3440 #endif
3441 }
3442 #endif // HAVE_NVML || HAVE_NVAPI
3443
3444 return -1;
3445 }
3446
3447 #ifdef HAVE_ADL
3448 int hm_set_fanspeed_with_device_id_amd (const uint device_id, const int fanspeed)
3449 {
3450 if (data.hm_device[device_id].fan_supported == 1)
3451 {
3452 if (data.hm_amd)
3453 {
3454 if (data.hm_device[device_id].od_version == 5)
3455 {
3456 ADLFanSpeedValue lpFanSpeedValue;
3457
3458 memset (&lpFanSpeedValue, 0, sizeof (lpFanSpeedValue));
3459
3460 lpFanSpeedValue.iSize = sizeof (lpFanSpeedValue);
3461 lpFanSpeedValue.iSpeedType = ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
3462 lpFanSpeedValue.iFlags = ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED;
3463 lpFanSpeedValue.iFanSpeed = fanspeed;
3464
3465 if (hm_ADL_Overdrive5_FanSpeed_Set (data.hm_amd, data.hm_device[device_id].adapter_index.amd, 0, &lpFanSpeedValue) != ADL_OK) return -1;
3466
3467 return 0;
3468 }
3469 else // od_version == 6
3470 {
3471 ADLOD6FanSpeedValue fan_speed_value;
3472
3473 memset (&fan_speed_value, 0, sizeof (fan_speed_value));
3474
3475 fan_speed_value.iSpeedType = ADL_OD6_FANSPEED_TYPE_PERCENT;
3476 fan_speed_value.iFanSpeed = fanspeed;
3477
3478 if (hm_ADL_Overdrive6_FanSpeed_Set (data.hm_amd, data.hm_device[device_id].adapter_index.amd, &fan_speed_value) != ADL_OK) return -1;
3479
3480 return 0;
3481 }
3482 }
3483 }
3484
3485 return -1;
3486 }
3487 #endif
3488
3489 // helper function for status display
3490
3491 void hm_device_val_to_str (char *target_buf, int max_buf_size, char *suffix, int value)
3492 {
3493 #define VALUE_NOT_AVAILABLE "N/A"
3494
3495 if (value == -1)
3496 {
3497 snprintf (target_buf, max_buf_size, VALUE_NOT_AVAILABLE);
3498 }
3499 else
3500 {
3501 snprintf (target_buf, max_buf_size, "%2d%s", value, suffix);
3502 }
3503 }
3504 #endif // HAVE_HWMON
3505
3506 /**
3507 * maskprocessor
3508 */
3509
3510 void mp_css_to_uniq_tbl (uint css_cnt, cs_t *css, uint uniq_tbls[SP_PW_MAX][CHARSIZ])
3511 {
3512 /* generates a lookup table where key is the char itself for fastest possible lookup performance */
3513
3514 if (css_cnt > SP_PW_MAX)
3515 {
3516 log_error ("ERROR: mask length is too long");
3517
3518 exit (-1);
3519 }
3520
3521 for (uint css_pos = 0; css_pos < css_cnt; css_pos++)
3522 {
3523 uint *uniq_tbl = uniq_tbls[css_pos];
3524
3525 uint *cs_buf = css[css_pos].cs_buf;
3526 uint cs_len = css[css_pos].cs_len;
3527
3528 for (uint cs_pos = 0; cs_pos < cs_len; cs_pos++)
3529 {
3530 uint c = cs_buf[cs_pos] & 0xff;
3531
3532 uniq_tbl[c] = 1;
3533 }
3534 }
3535 }
3536
3537 void mp_add_cs_buf (uint *in_buf, size_t in_len, cs_t *css, int css_cnt)
3538 {
3539 cs_t *cs = &css[css_cnt];
3540
3541 size_t css_uniq_sz = CHARSIZ * sizeof (uint);
3542
3543 uint *css_uniq = (uint *) mymalloc (css_uniq_sz);
3544
3545 size_t i;
3546
3547 for (i = 0; i < cs->cs_len; i++)
3548 {
3549 const uint u = cs->cs_buf[i];
3550
3551 css_uniq[u] = 1;
3552 }
3553
3554 for (i = 0; i < in_len; i++)
3555 {
3556 uint u = in_buf[i] & 0xff;
3557
3558 if (data.opts_type & OPTS_TYPE_PT_UPPER) u = toupper (u);
3559
3560 if (css_uniq[u] == 1) continue;
3561
3562 css_uniq[u] = 1;
3563
3564 cs->cs_buf[cs->cs_len] = u;
3565
3566 cs->cs_len++;
3567 }
3568
3569 myfree (css_uniq);
3570 }
3571
3572 void mp_expand (char *in_buf, size_t in_len, cs_t *mp_sys, cs_t *mp_usr, int mp_usr_offset, int interpret)
3573 {
3574 size_t in_pos;
3575
3576 for (in_pos = 0; in_pos < in_len; in_pos++)
3577 {
3578 uint p0 = in_buf[in_pos] & 0xff;
3579
3580 if (interpret == 1 && p0 == '?')
3581 {
3582 in_pos++;
3583
3584 if (in_pos == in_len) break;
3585
3586 uint p1 = in_buf[in_pos] & 0xff;
3587
3588 switch (p1)
3589 {
3590 case 'l': mp_add_cs_buf (mp_sys[0].cs_buf, mp_sys[0].cs_len, mp_usr, mp_usr_offset);
3591 break;
3592 case 'u': mp_add_cs_buf (mp_sys[1].cs_buf, mp_sys[1].cs_len, mp_usr, mp_usr_offset);
3593 break;
3594 case 'd': mp_add_cs_buf (mp_sys[2].cs_buf, mp_sys[2].cs_len, mp_usr, mp_usr_offset);
3595 break;
3596 case 's': mp_add_cs_buf (mp_sys[3].cs_buf, mp_sys[3].cs_len, mp_usr, mp_usr_offset);
3597 break;
3598 case 'a': mp_add_cs_buf (mp_sys[4].cs_buf, mp_sys[4].cs_len, mp_usr, mp_usr_offset);
3599 break;
3600 case 'b': mp_add_cs_buf (mp_sys[5].cs_buf, mp_sys[5].cs_len, mp_usr, mp_usr_offset);
3601 break;
3602 case '1': if (mp_usr[0].cs_len == 0) { log_error ("ERROR: Custom-charset 1 is undefined\n"); exit (-1); }
3603 mp_add_cs_buf (mp_usr[0].cs_buf, mp_usr[0].cs_len, mp_usr, mp_usr_offset);
3604 break;
3605 case '2': if (mp_usr[1].cs_len == 0) { log_error ("ERROR: Custom-charset 2 is undefined\n"); exit (-1); }
3606 mp_add_cs_buf (mp_usr[1].cs_buf, mp_usr[1].cs_len, mp_usr, mp_usr_offset);
3607 break;
3608 case '3': if (mp_usr[2].cs_len == 0) { log_error ("ERROR: Custom-charset 3 is undefined\n"); exit (-1); }
3609 mp_add_cs_buf (mp_usr[2].cs_buf, mp_usr[2].cs_len, mp_usr, mp_usr_offset);
3610 break;
3611 case '4': if (mp_usr[3].cs_len == 0) { log_error ("ERROR: Custom-charset 4 is undefined\n"); exit (-1); }
3612 mp_add_cs_buf (mp_usr[3].cs_buf, mp_usr[3].cs_len, mp_usr, mp_usr_offset);
3613 break;
3614 case '?': mp_add_cs_buf (&p0, 1, mp_usr, mp_usr_offset);
3615 break;
3616 default: log_error ("Syntax error: %s", in_buf);
3617 exit (-1);
3618 }
3619 }
3620 else
3621 {
3622 if (data.hex_charset)
3623 {
3624 in_pos++;
3625
3626 if (in_pos == in_len)
3627 {
3628 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", in_buf);
3629
3630 exit (-1);
3631 }
3632
3633 uint p1 = in_buf[in_pos] & 0xff;
3634
3635 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3636 {
3637 log_error ("ERROR: invalid hex character detected in mask %s", in_buf);
3638
3639 exit (-1);
3640 }
3641
3642 uint chr = 0;
3643
3644 chr = hex_convert (p1) << 0;
3645 chr |= hex_convert (p0) << 4;
3646
3647 mp_add_cs_buf (&chr, 1, mp_usr, mp_usr_offset);
3648 }
3649 else
3650 {
3651 uint chr = p0;
3652
3653 mp_add_cs_buf (&chr, 1, mp_usr, mp_usr_offset);
3654 }
3655 }
3656 }
3657 }
3658
3659 u64 mp_get_sum (uint css_cnt, cs_t *css)
3660 {
3661 u64 sum = 1;
3662
3663 for (uint css_pos = 0; css_pos < css_cnt; css_pos++)
3664 {
3665 sum *= css[css_pos].cs_len;
3666 }
3667
3668 return (sum);
3669 }
3670
3671 cs_t *mp_gen_css (char *mask_buf, size_t mask_len, cs_t *mp_sys, cs_t *mp_usr, uint *css_cnt)
3672 {
3673 cs_t *css = (cs_t *) mycalloc (256, sizeof (cs_t));
3674
3675 uint mask_pos;
3676 uint css_pos;
3677
3678 for (mask_pos = 0, css_pos = 0; mask_pos < mask_len; mask_pos++, css_pos++)
3679 {
3680 char p0 = mask_buf[mask_pos];
3681
3682 if (p0 == '?')
3683 {
3684 mask_pos++;
3685
3686 if (mask_pos == mask_len) break;
3687
3688 char p1 = mask_buf[mask_pos];
3689
3690 uint chr = p1;
3691
3692 switch (p1)
3693 {
3694 case 'l': mp_add_cs_buf (mp_sys[0].cs_buf, mp_sys[0].cs_len, css, css_pos);
3695 break;
3696 case 'u': mp_add_cs_buf (mp_sys[1].cs_buf, mp_sys[1].cs_len, css, css_pos);
3697 break;
3698 case 'd': mp_add_cs_buf (mp_sys[2].cs_buf, mp_sys[2].cs_len, css, css_pos);
3699 break;
3700 case 's': mp_add_cs_buf (mp_sys[3].cs_buf, mp_sys[3].cs_len, css, css_pos);
3701 break;
3702 case 'a': mp_add_cs_buf (mp_sys[4].cs_buf, mp_sys[4].cs_len, css, css_pos);
3703 break;
3704 case 'b': mp_add_cs_buf (mp_sys[5].cs_buf, mp_sys[5].cs_len, css, css_pos);
3705 break;
3706 case '1': if (mp_usr[0].cs_len == 0) { log_error ("ERROR: Custom-charset 1 is undefined\n"); exit (-1); }
3707 mp_add_cs_buf (mp_usr[0].cs_buf, mp_usr[0].cs_len, css, css_pos);
3708 break;
3709 case '2': if (mp_usr[1].cs_len == 0) { log_error ("ERROR: Custom-charset 2 is undefined\n"); exit (-1); }
3710 mp_add_cs_buf (mp_usr[1].cs_buf, mp_usr[1].cs_len, css, css_pos);
3711 break;
3712 case '3': if (mp_usr[2].cs_len == 0) { log_error ("ERROR: Custom-charset 3 is undefined\n"); exit (-1); }
3713 mp_add_cs_buf (mp_usr[2].cs_buf, mp_usr[2].cs_len, css, css_pos);
3714 break;
3715 case '4': if (mp_usr[3].cs_len == 0) { log_error ("ERROR: Custom-charset 4 is undefined\n"); exit (-1); }
3716 mp_add_cs_buf (mp_usr[3].cs_buf, mp_usr[3].cs_len, css, css_pos);
3717 break;
3718 case '?': mp_add_cs_buf (&chr, 1, css, css_pos);
3719 break;
3720 default: log_error ("ERROR: syntax error: %s", mask_buf);
3721 exit (-1);
3722 }
3723 }
3724 else
3725 {
3726 if (data.hex_charset)
3727 {
3728 mask_pos++;
3729
3730 // if there is no 2nd hex character, show an error:
3731
3732 if (mask_pos == mask_len)
3733 {
3734 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", mask_buf);
3735
3736 exit (-1);
3737 }
3738
3739 char p1 = mask_buf[mask_pos];
3740
3741 // if they are not valid hex character, show an error:
3742
3743 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3744 {
3745 log_error ("ERROR: invalid hex character detected in mask %s", mask_buf);
3746
3747 exit (-1);
3748 }
3749
3750 uint chr = 0;
3751
3752 chr |= hex_convert (p1) << 0;
3753 chr |= hex_convert (p0) << 4;
3754
3755 mp_add_cs_buf (&chr, 1, css, css_pos);
3756 }
3757 else
3758 {
3759 uint chr = p0;
3760
3761 mp_add_cs_buf (&chr, 1, css, css_pos);
3762 }
3763 }
3764 }
3765
3766 if (css_pos == 0)
3767 {
3768 log_error ("ERROR: invalid mask length (0)");
3769
3770 exit (-1);
3771 }
3772
3773 *css_cnt = css_pos;
3774
3775 return (css);
3776 }
3777
3778 void mp_exec (u64 val, char *buf, cs_t *css, int css_cnt)
3779 {
3780 for (int i = 0; i < css_cnt; i++)
3781 {
3782 uint len = css[i].cs_len;
3783 u64 next = val / len;
3784 uint pos = val % len;
3785 buf[i] = (char) css[i].cs_buf[pos] & 0xff;
3786 val = next;
3787 }
3788 }
3789
3790 void mp_cut_at (char *mask, uint max)
3791 {
3792 uint i;
3793 uint j;
3794 uint mask_len = strlen (mask);
3795
3796 for (i = 0, j = 0; i < mask_len && j < max; i++, j++)
3797 {
3798 if (mask[i] == '?') i++;
3799 }
3800
3801 mask[i] = 0;
3802 }
3803
3804 void mp_setup_sys (cs_t *mp_sys)
3805 {
3806 uint pos;
3807 uint chr;
3808 uint donec[CHARSIZ] = { 0 };
3809
3810 for (pos = 0, chr = 'a'; chr <= 'z'; chr++) { donec[chr] = 1;
3811 mp_sys[0].cs_buf[pos++] = chr;
3812 mp_sys[0].cs_len = pos; }
3813
3814 for (pos = 0, chr = 'A'; chr <= 'Z'; chr++) { donec[chr] = 1;
3815 mp_sys[1].cs_buf[pos++] = chr;
3816 mp_sys[1].cs_len = pos; }
3817
3818 for (pos = 0, chr = '0'; chr <= '9'; chr++) { donec[chr] = 1;
3819 mp_sys[2].cs_buf[pos++] = chr;
3820 mp_sys[2].cs_len = pos; }
3821
3822 for (pos = 0, chr = 0x20; chr <= 0x7e; chr++) { if (donec[chr]) continue;
3823 mp_sys[3].cs_buf[pos++] = chr;
3824 mp_sys[3].cs_len = pos; }
3825
3826 for (pos = 0, chr = 0x20; chr <= 0x7e; chr++) { mp_sys[4].cs_buf[pos++] = chr;
3827 mp_sys[4].cs_len = pos; }
3828
3829 for (pos = 0, chr = 0x00; chr <= 0xff; chr++) { mp_sys[5].cs_buf[pos++] = chr;
3830 mp_sys[5].cs_len = pos; }
3831 }
3832
3833 void mp_setup_usr (cs_t *mp_sys, cs_t *mp_usr, char *buf, uint index)
3834 {
3835 FILE *fp = fopen (buf, "rb");
3836
3837 if (fp == NULL || feof (fp)) // feof() in case if file is empty
3838 {
3839 mp_expand (buf, strlen (buf), mp_sys, mp_usr, index, 1);
3840 }
3841 else
3842 {
3843 char mp_file[1024] = { 0 };
3844
3845 size_t len = fread (mp_file, 1, sizeof (mp_file) - 1, fp);
3846
3847 fclose (fp);
3848
3849 len = in_superchop (mp_file);
3850
3851 if (len == 0)
3852 {
3853 log_info ("WARNING: charset file corrupted");
3854
3855 mp_expand (buf, strlen (buf), mp_sys, mp_usr, index, 1);
3856 }
3857 else
3858 {
3859 mp_expand (mp_file, len, mp_sys, mp_usr, index, 0);
3860 }
3861 }
3862 }
3863
3864 void mp_reset_usr (cs_t *mp_usr, uint index)
3865 {
3866 mp_usr[index].cs_len = 0;
3867
3868 memset (mp_usr[index].cs_buf, 0, sizeof (mp_usr[index].cs_buf));
3869 }
3870
3871 char *mp_get_truncated_mask (char *mask_buf, size_t mask_len, uint len)
3872 {
3873 char *new_mask_buf = (char *) mymalloc (256);
3874
3875 uint mask_pos;
3876
3877 uint css_pos;
3878
3879 for (mask_pos = 0, css_pos = 0; mask_pos < mask_len; mask_pos++, css_pos++)
3880 {
3881 if (css_pos == len) break;
3882
3883 char p0 = mask_buf[mask_pos];
3884
3885 new_mask_buf[mask_pos] = p0;
3886
3887 if (p0 == '?')
3888 {
3889 mask_pos++;
3890
3891 if (mask_pos == mask_len) break;
3892
3893 new_mask_buf[mask_pos] = mask_buf[mask_pos];
3894 }
3895 else
3896 {
3897 if (data.hex_charset)
3898 {
3899 mask_pos++;
3900
3901 if (mask_pos == mask_len)
3902 {
3903 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", mask_buf);
3904
3905 exit (-1);
3906 }
3907
3908 char p1 = mask_buf[mask_pos];
3909
3910 // if they are not valid hex character, show an error:
3911
3912 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3913 {
3914 log_error ("ERROR: invalid hex character detected in mask: %s", mask_buf);
3915
3916 exit (-1);
3917 }
3918
3919 new_mask_buf[mask_pos] = p1;
3920 }
3921 }
3922 }
3923
3924 if (css_pos == len) return (new_mask_buf);
3925
3926 myfree (new_mask_buf);
3927
3928 return (NULL);
3929 }
3930
3931 /**
3932 * statprocessor
3933 */
3934
3935 u64 sp_get_sum (uint start, uint stop, cs_t *root_css_buf)
3936 {
3937 u64 sum = 1;
3938
3939 uint i;
3940
3941 for (i = start; i < stop; i++)
3942 {
3943 sum *= root_css_buf[i].cs_len;
3944 }
3945
3946 return (sum);
3947 }
3948
3949 void sp_exec (u64 ctx, char *pw_buf, cs_t *root_css_buf, cs_t *markov_css_buf, uint start, uint stop)
3950 {
3951 u64 v = ctx;
3952
3953 cs_t *cs = &root_css_buf[start];
3954
3955 uint i;
3956
3957 for (i = start; i < stop; i++)
3958 {
3959 const u64 m = v % cs->cs_len;
3960 const u64 d = v / cs->cs_len;
3961
3962 v = d;
3963
3964 const uint k = cs->cs_buf[m];
3965
3966 pw_buf[i - start] = (char) k;
3967
3968 cs = &markov_css_buf[(i * CHARSIZ) + k];
3969 }
3970 }
3971
3972 int sp_comp_val (const void *p1, const void *p2)
3973 {
3974 hcstat_table_t *b1 = (hcstat_table_t *) p1;
3975 hcstat_table_t *b2 = (hcstat_table_t *) p2;
3976
3977 return b2->val - b1->val;
3978 }
3979
3980 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)
3981 {
3982 uint i;
3983 uint j;
3984 uint k;
3985
3986 /**
3987 * Initialize hcstats
3988 */
3989
3990 u64 *root_stats_buf = (u64 *) mycalloc (SP_ROOT_CNT, sizeof (u64));
3991
3992 u64 *root_stats_ptr = root_stats_buf;
3993
3994 u64 *root_stats_buf_by_pos[SP_PW_MAX];
3995
3996 for (i = 0; i < SP_PW_MAX; i++)
3997 {
3998 root_stats_buf_by_pos[i] = root_stats_ptr;
3999
4000 root_stats_ptr += CHARSIZ;
4001 }
4002
4003 u64 *markov_stats_buf = (u64 *) mycalloc (SP_MARKOV_CNT, sizeof (u64));
4004
4005 u64 *markov_stats_ptr = markov_stats_buf;
4006
4007 u64 *markov_stats_buf_by_key[SP_PW_MAX][CHARSIZ];
4008
4009 for (i = 0; i < SP_PW_MAX; i++)
4010 {
4011 for (j = 0; j < CHARSIZ; j++)
4012 {
4013 markov_stats_buf_by_key[i][j] = markov_stats_ptr;
4014
4015 markov_stats_ptr += CHARSIZ;
4016 }
4017 }
4018
4019 /**
4020 * Load hcstats File
4021 */
4022
4023 if (hcstat == NULL)
4024 {
4025 char hcstat_tmp[256] = { 0 };
4026
4027 snprintf (hcstat_tmp, sizeof (hcstat_tmp) - 1, "%s/%s", shared_dir, SP_HCSTAT);
4028
4029 hcstat = hcstat_tmp;
4030 }
4031
4032 FILE *fd = fopen (hcstat, "rb");
4033
4034 if (fd == NULL)
4035 {
4036 log_error ("%s: %s", hcstat, strerror (errno));
4037
4038 exit (-1);
4039 }
4040
4041 if (fread (root_stats_buf, sizeof (u64), SP_ROOT_CNT, fd) != SP_ROOT_CNT)
4042 {
4043 log_error ("%s: Could not load data", hcstat);
4044
4045 fclose (fd);
4046
4047 exit (-1);
4048 }
4049
4050 if (fread (markov_stats_buf, sizeof (u64), SP_MARKOV_CNT, fd) != SP_MARKOV_CNT)
4051 {
4052 log_error ("%s: Could not load data", hcstat);
4053
4054 fclose (fd);
4055
4056 exit (-1);
4057 }
4058
4059 fclose (fd);
4060
4061 /**
4062 * Markov modifier of hcstat_table on user request
4063 */
4064
4065 if (disable)
4066 {
4067 memset (root_stats_buf, 0, SP_ROOT_CNT * sizeof (u64));
4068 memset (markov_stats_buf, 0, SP_MARKOV_CNT * sizeof (u64));
4069 }
4070
4071 if (classic)
4072 {
4073 /* Add all stats to first position */
4074
4075 for (i = 1; i < SP_PW_MAX; i++)
4076 {
4077 u64 *out = root_stats_buf_by_pos[0];
4078 u64 *in = root_stats_buf_by_pos[i];
4079
4080 for (j = 0; j < CHARSIZ; j++)
4081 {
4082 *out++ += *in++;
4083 }
4084 }
4085
4086 for (i = 1; i < SP_PW_MAX; i++)
4087 {
4088 u64 *out = markov_stats_buf_by_key[0][0];
4089 u64 *in = markov_stats_buf_by_key[i][0];
4090
4091 for (j = 0; j < CHARSIZ; j++)
4092 {
4093 for (k = 0; k < CHARSIZ; k++)
4094 {
4095 *out++ += *in++;
4096 }
4097 }
4098 }
4099
4100 /* copy them to all pw_positions */
4101
4102 for (i = 1; i < SP_PW_MAX; i++)
4103 {
4104 memcpy (root_stats_buf_by_pos[i], root_stats_buf_by_pos[0], CHARSIZ * sizeof (u64));
4105 }
4106
4107 for (i = 1; i < SP_PW_MAX; i++)
4108 {
4109 memcpy (markov_stats_buf_by_key[i][0], markov_stats_buf_by_key[0][0], CHARSIZ * CHARSIZ * sizeof (u64));
4110 }
4111 }
4112
4113 /**
4114 * Initialize tables
4115 */
4116
4117 hcstat_table_t *root_table_ptr = root_table_buf;
4118
4119 hcstat_table_t *root_table_buf_by_pos[SP_PW_MAX];
4120
4121 for (i = 0; i < SP_PW_MAX; i++)
4122 {
4123 root_table_buf_by_pos[i] = root_table_ptr;
4124
4125 root_table_ptr += CHARSIZ;
4126 }
4127
4128 hcstat_table_t *markov_table_ptr = markov_table_buf;
4129
4130 hcstat_table_t *markov_table_buf_by_key[SP_PW_MAX][CHARSIZ];
4131
4132 for (i = 0; i < SP_PW_MAX; i++)
4133 {
4134 for (j = 0; j < CHARSIZ; j++)
4135 {
4136 markov_table_buf_by_key[i][j] = markov_table_ptr;
4137
4138 markov_table_ptr += CHARSIZ;
4139 }
4140 }
4141
4142 /**
4143 * Convert hcstat to tables
4144 */
4145
4146 for (i = 0; i < SP_ROOT_CNT; i++)
4147 {
4148 uint key = i % CHARSIZ;
4149
4150 root_table_buf[i].key = key;
4151 root_table_buf[i].val = root_stats_buf[i];
4152 }
4153
4154 for (i = 0; i < SP_MARKOV_CNT; i++)
4155 {
4156 uint key = i % CHARSIZ;
4157
4158 markov_table_buf[i].key = key;
4159 markov_table_buf[i].val = markov_stats_buf[i];
4160 }
4161
4162 myfree (root_stats_buf);
4163 myfree (markov_stats_buf);
4164
4165 /**
4166 * Finally sort them
4167 */
4168
4169 for (i = 0; i < SP_PW_MAX; i++)
4170 {
4171 qsort (root_table_buf_by_pos[i], CHARSIZ, sizeof (hcstat_table_t), sp_comp_val);
4172 }
4173
4174 for (i = 0; i < SP_PW_MAX; i++)
4175 {
4176 for (j = 0; j < CHARSIZ; j++)
4177 {
4178 qsort (markov_table_buf_by_key[i][j], CHARSIZ, sizeof (hcstat_table_t), sp_comp_val);
4179 }
4180 }
4181 }
4182
4183 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])
4184 {
4185 /**
4186 * Convert tables to css
4187 */
4188
4189 for (uint i = 0; i < SP_ROOT_CNT; i++)
4190 {
4191 uint pw_pos = i / CHARSIZ;
4192
4193 cs_t *cs = &root_css_buf[pw_pos];
4194
4195 if (cs->cs_len == threshold) continue;
4196
4197 uint key = root_table_buf[i].key;
4198
4199 if (uniq_tbls[pw_pos][key] == 0) continue;
4200
4201 cs->cs_buf[cs->cs_len] = key;
4202
4203 cs->cs_len++;
4204 }
4205
4206 /**
4207 * Convert table to css
4208 */
4209
4210 for (uint i = 0; i < SP_MARKOV_CNT; i++)
4211 {
4212 uint c = i / CHARSIZ;
4213
4214 cs_t *cs = &markov_css_buf[c];
4215
4216 if (cs->cs_len == threshold) continue;
4217
4218 uint pw_pos = c / CHARSIZ;
4219
4220 uint key = markov_table_buf[i].key;
4221
4222 if ((pw_pos + 1) < SP_PW_MAX) if (uniq_tbls[pw_pos + 1][key] == 0) continue;
4223
4224 cs->cs_buf[cs->cs_len] = key;
4225
4226 cs->cs_len++;
4227 }
4228
4229 /*
4230 for (uint i = 0; i < 8; i++)
4231 {
4232 for (uint j = 0x20; j < 0x80; j++)
4233 {
4234 cs_t *ptr = &markov_css_buf[(i * CHARSIZ) + j];
4235
4236 printf ("pos:%u key:%u len:%u\n", i, j, ptr->cs_len);
4237
4238 for (uint k = 0; k < 10; k++)
4239 {
4240 printf (" %u\n", ptr->cs_buf[k]);
4241 }
4242 }
4243 }
4244 */
4245 }
4246
4247 void sp_stretch_root (hcstat_table_t *in, hcstat_table_t *out)
4248 {
4249 for (uint i = 0; i < SP_PW_MAX; i += 2)
4250 {
4251 memcpy (out, in, CHARSIZ * sizeof (hcstat_table_t));
4252
4253 out += CHARSIZ;
4254 in += CHARSIZ;
4255
4256 out->key = 0;
4257 out->val = 1;
4258
4259 out++;
4260
4261 for (uint j = 1; j < CHARSIZ; j++)
4262 {
4263 out->key = j;
4264 out->val = 0;
4265
4266 out++;
4267 }
4268 }
4269 }
4270
4271 void sp_stretch_markov (hcstat_table_t *in, hcstat_table_t *out)
4272 {
4273 for (uint i = 0; i < SP_PW_MAX; i += 2)
4274 {
4275 memcpy (out, in, CHARSIZ * CHARSIZ * sizeof (hcstat_table_t));
4276
4277 out += CHARSIZ * CHARSIZ;
4278 in += CHARSIZ * CHARSIZ;
4279
4280 for (uint j = 0; j < CHARSIZ; j++)
4281 {
4282 out->key = 0;
4283 out->val = 1;
4284
4285 out++;
4286
4287 for (uint k = 1; k < CHARSIZ; k++)
4288 {
4289 out->key = k;
4290 out->val = 0;
4291
4292 out++;
4293 }
4294 }
4295 }
4296 }
4297
4298 /**
4299 * mixed shared functions
4300 */
4301
4302 void dump_hex (const u8 *s, const int sz)
4303 {
4304 for (int i = 0; i < sz; i++)
4305 {
4306 log_info_nn ("%02x ", s[i]);
4307 }
4308
4309 log_info ("");
4310 }
4311
4312 void usage_mini_print (const char *progname)
4313 {
4314 for (uint i = 0; USAGE_MINI[i] != NULL; i++) log_info (USAGE_MINI[i], progname);
4315 }
4316
4317 void usage_big_print (const char *progname)
4318 {
4319 for (uint i = 0; USAGE_BIG[i] != NULL; i++) log_info (USAGE_BIG[i], progname);
4320 }
4321
4322 char *get_exec_path ()
4323 {
4324 int exec_path_len = 1024;
4325
4326 char *exec_path = (char *) mymalloc (exec_path_len);
4327
4328 #ifdef LINUX
4329
4330 char tmp[32] = { 0 };
4331
4332 snprintf (tmp, sizeof (tmp) - 1, "/proc/%d/exe", getpid ());
4333
4334 const int len = readlink (tmp, exec_path, exec_path_len - 1);
4335
4336 #elif WIN
4337
4338 const int len = GetModuleFileName (NULL, exec_path, exec_path_len - 1);
4339
4340 #elif OSX
4341
4342 uint size = exec_path_len;
4343
4344 if (_NSGetExecutablePath (exec_path, &size) != 0)
4345 {
4346 log_error("! executable path buffer too small\n");
4347
4348 exit (-1);
4349 }
4350
4351 const int len = strlen (exec_path);
4352
4353 #else
4354 #error Your Operating System is not supported or detected
4355 #endif
4356
4357 exec_path[len] = 0;
4358
4359 return exec_path;
4360 }
4361
4362 char *get_install_dir (const char *progname)
4363 {
4364 char *install_dir = mystrdup (progname);
4365 char *last_slash = NULL;
4366
4367 if ((last_slash = strrchr (install_dir, '/')) != NULL)
4368 {
4369 *last_slash = 0;
4370 }
4371 else if ((last_slash = strrchr (install_dir, '\\')) != NULL)
4372 {
4373 *last_slash = 0;
4374 }
4375 else
4376 {
4377 install_dir[0] = '.';
4378 install_dir[1] = 0;
4379 }
4380
4381 return (install_dir);
4382 }
4383
4384 char *get_profile_dir (const char *homedir)
4385 {
4386 #define DOT_HASHCAT ".hashcat"
4387
4388 size_t len = strlen (homedir) + 1 + strlen (DOT_HASHCAT) + 1;
4389
4390 char *profile_dir = (char *) mymalloc (len + 1);
4391
4392 snprintf (profile_dir, len, "%s/%s", homedir, DOT_HASHCAT);
4393
4394 return profile_dir;
4395 }
4396
4397 char *get_session_dir (const char *profile_dir)
4398 {
4399 #define SESSIONS_FOLDER "sessions"
4400
4401 size_t len = strlen (profile_dir) + 1 + strlen (SESSIONS_FOLDER) + 1;
4402
4403 char *session_dir = (char *) mymalloc (len + 1);
4404
4405 snprintf (session_dir, len, "%s/%s", profile_dir, SESSIONS_FOLDER);
4406
4407 return session_dir;
4408 }
4409
4410 uint count_lines (FILE *fd)
4411 {
4412 uint cnt = 0;
4413
4414 char *buf = (char *) mymalloc (HCBUFSIZ + 1);
4415
4416 char prev = '\n';
4417
4418 while (!feof (fd))
4419 {
4420 size_t nread = fread (buf, sizeof (char), HCBUFSIZ, fd);
4421
4422 if (nread < 1) continue;
4423
4424 size_t i;
4425
4426 for (i = 0; i < nread; i++)
4427 {
4428 if (prev == '\n') cnt++;
4429
4430 prev = buf[i];
4431 }
4432 }
4433
4434 myfree (buf);
4435
4436 return cnt;
4437 }
4438
4439 void truecrypt_crc32 (const char *filename, u8 keytab[64])
4440 {
4441 uint crc = ~0;
4442
4443 FILE *fd = fopen (filename, "rb");
4444
4445 if (fd == NULL)
4446 {
4447 log_error ("%s: %s", filename, strerror (errno));
4448
4449 exit (-1);
4450 }
4451
4452 #define MAX_KEY_SIZE (1024 * 1024)
4453
4454 u8 *buf = (u8 *) mymalloc (MAX_KEY_SIZE + 1);
4455
4456 int nread = fread (buf, sizeof (u8), MAX_KEY_SIZE, fd);
4457
4458 fclose (fd);
4459
4460 int kpos = 0;
4461
4462 for (int fpos = 0; fpos < nread; fpos++)
4463 {
4464 crc = crc32tab[(crc ^ buf[fpos]) & 0xff] ^ (crc >> 8);
4465
4466 keytab[kpos++] += (crc >> 24) & 0xff;
4467 keytab[kpos++] += (crc >> 16) & 0xff;
4468 keytab[kpos++] += (crc >> 8) & 0xff;
4469 keytab[kpos++] += (crc >> 0) & 0xff;
4470
4471 if (kpos >= 64) kpos = 0;
4472 }
4473
4474 myfree (buf);
4475 }
4476
4477 #ifdef OSX
4478 int pthread_setaffinity_np (pthread_t thread, size_t cpu_size, cpu_set_t *cpu_set)
4479 {
4480 int core;
4481
4482 for (core = 0; core < (8 * (int)cpu_size); core++)
4483 if (CPU_ISSET(core, cpu_set)) break;
4484
4485 thread_affinity_policy_data_t policy = { core };
4486
4487 const int rc = thread_policy_set (pthread_mach_thread_np (thread), THREAD_AFFINITY_POLICY, (thread_policy_t) &policy, 1);
4488
4489 if (data.quiet == 0)
4490 {
4491 if (rc != KERN_SUCCESS)
4492 {
4493 log_error ("ERROR: %s : %d", "thread_policy_set()", rc);
4494 }
4495 }
4496
4497 return rc;
4498 }
4499 #endif
4500
4501 void set_cpu_affinity (char *cpu_affinity)
4502 {
4503 #ifdef WIN
4504 DWORD_PTR aff_mask = 0;
4505 #elif _POSIX
4506 cpu_set_t cpuset;
4507 CPU_ZERO (&cpuset);
4508 #endif
4509
4510 if (cpu_affinity)
4511 {
4512 char *devices = strdup (cpu_affinity);
4513
4514 char *next = strtok (devices, ",");
4515
4516 do
4517 {
4518 uint cpu_id = atoi (next);
4519
4520 if (cpu_id == 0)
4521 {
4522 #ifdef WIN
4523 aff_mask = 0;
4524 #elif _POSIX
4525 CPU_ZERO (&cpuset);
4526 #endif
4527
4528 break;
4529 }
4530
4531 if (cpu_id > 32)
4532 {
4533 log_error ("ERROR: invalid cpu_id %u specified", cpu_id);
4534
4535 exit (-1);
4536 }
4537
4538 #ifdef WIN
4539 aff_mask |= 1 << (cpu_id - 1);
4540 #elif _POSIX
4541 CPU_SET ((cpu_id - 1), &cpuset);
4542 #endif
4543
4544 } while ((next = strtok (NULL, ",")) != NULL);
4545
4546 free (devices);
4547 }
4548
4549 #ifdef WIN
4550 SetProcessAffinityMask (GetCurrentProcess (), aff_mask);
4551 SetThreadAffinityMask (GetCurrentThread (), aff_mask);
4552 #elif _POSIX
4553 pthread_t thread = pthread_self ();
4554 pthread_setaffinity_np (thread, sizeof (cpu_set_t), &cpuset);
4555 #endif
4556 }
4557
4558 void *rulefind (const void *key, void *base, int nmemb, size_t size, int (*compar) (const void *, const void *))
4559 {
4560 char *element, *end;
4561
4562 end = (char *) base + nmemb * size;
4563
4564 for (element = (char *) base; element < end; element += size)
4565 if (!compar (element, key))
4566 return element;
4567
4568 return NULL;
4569 }
4570
4571 int sort_by_u32 (const void *v1, const void *v2)
4572 {
4573 const u32 *s1 = (const u32 *) v1;
4574 const u32 *s2 = (const u32 *) v2;
4575
4576 return *s1 - *s2;
4577 }
4578
4579 int sort_by_salt (const void *v1, const void *v2)
4580 {
4581 const salt_t *s1 = (const salt_t *) v1;
4582 const salt_t *s2 = (const salt_t *) v2;
4583
4584 const int res1 = s1->salt_len - s2->salt_len;
4585
4586 if (res1 != 0) return (res1);
4587
4588 const int res2 = s1->salt_iter - s2->salt_iter;
4589
4590 if (res2 != 0) return (res2);
4591
4592 uint n;
4593
4594 n = 16;
4595
4596 while (n--)
4597 {
4598 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4599 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4600 }
4601
4602 n = 8;
4603
4604 while (n--)
4605 {
4606 if (s1->salt_buf_pc[n] > s2->salt_buf_pc[n]) return ( 1);
4607 if (s1->salt_buf_pc[n] < s2->salt_buf_pc[n]) return (-1);
4608 }
4609
4610 return (0);
4611 }
4612
4613 int sort_by_salt_buf (const void *v1, const void *v2)
4614 {
4615 const pot_t *p1 = (const pot_t *) v1;
4616 const pot_t *p2 = (const pot_t *) v2;
4617
4618 const hash_t *h1 = &p1->hash;
4619 const hash_t *h2 = &p2->hash;
4620
4621 const salt_t *s1 = h1->salt;
4622 const salt_t *s2 = h2->salt;
4623
4624 uint n = 16;
4625
4626 while (n--)
4627 {
4628 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4629 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4630 }
4631
4632 return 0;
4633 }
4634
4635 int sort_by_hash_t_salt (const void *v1, const void *v2)
4636 {
4637 const hash_t *h1 = (const hash_t *) v1;
4638 const hash_t *h2 = (const hash_t *) v2;
4639
4640 const salt_t *s1 = h1->salt;
4641 const salt_t *s2 = h2->salt;
4642
4643 // testphase: this should work
4644 uint n = 16;
4645
4646 while (n--)
4647 {
4648 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4649 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4650 }
4651
4652 /* original code, seems buggy since salt_len can be very big (had a case with 131 len)
4653 also it thinks salt_buf[x] is a char but its a uint so salt_len should be / 4
4654 if (s1->salt_len > s2->salt_len) return ( 1);
4655 if (s1->salt_len < s2->salt_len) return (-1);
4656
4657 uint n = s1->salt_len;
4658
4659 while (n--)
4660 {
4661 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4662 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4663 }
4664 */
4665
4666 return 0;
4667 }
4668
4669 int sort_by_hash_t_salt_hccap (const void *v1, const void *v2)
4670 {
4671 const hash_t *h1 = (const hash_t *) v1;
4672 const hash_t *h2 = (const hash_t *) v2;
4673
4674 const salt_t *s1 = h1->salt;
4675 const salt_t *s2 = h2->salt;
4676
4677 // 16 - 2 (since last 2 uints contain the digest)
4678 uint n = 14;
4679
4680 while (n--)
4681 {
4682 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4683 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4684 }
4685
4686 return 0;
4687 }
4688
4689 int sort_by_hash_no_salt (const void *v1, const void *v2)
4690 {
4691 const hash_t *h1 = (const hash_t *) v1;
4692 const hash_t *h2 = (const hash_t *) v2;
4693
4694 const void *d1 = h1->digest;
4695 const void *d2 = h2->digest;
4696
4697 return data.sort_by_digest (d1, d2);
4698 }
4699
4700 int sort_by_hash (const void *v1, const void *v2)
4701 {
4702 const hash_t *h1 = (const hash_t *) v1;
4703 const hash_t *h2 = (const hash_t *) v2;
4704
4705 if (data.isSalted)
4706 {
4707 const salt_t *s1 = h1->salt;
4708 const salt_t *s2 = h2->salt;
4709
4710 int res = sort_by_salt (s1, s2);
4711
4712 if (res != 0) return (res);
4713 }
4714
4715 const void *d1 = h1->digest;
4716 const void *d2 = h2->digest;
4717
4718 return data.sort_by_digest (d1, d2);
4719 }
4720
4721 int sort_by_pot (const void *v1, const void *v2)
4722 {
4723 const pot_t *p1 = (const pot_t *) v1;
4724 const pot_t *p2 = (const pot_t *) v2;
4725
4726 const hash_t *h1 = &p1->hash;
4727 const hash_t *h2 = &p2->hash;
4728
4729 return sort_by_hash (h1, h2);
4730 }
4731
4732 int sort_by_mtime (const void *p1, const void *p2)
4733 {
4734 const char **f1 = (const char **) p1;
4735 const char **f2 = (const char **) p2;
4736
4737 struct stat s1; stat (*f1, &s1);
4738 struct stat s2; stat (*f2, &s2);
4739
4740 return s2.st_mtime - s1.st_mtime;
4741 }
4742
4743 int sort_by_cpu_rule (const void *p1, const void *p2)
4744 {
4745 const cpu_rule_t *r1 = (const cpu_rule_t *) p1;
4746 const cpu_rule_t *r2 = (const cpu_rule_t *) p2;
4747
4748 return memcmp (r1, r2, sizeof (cpu_rule_t));
4749 }
4750
4751 int sort_by_kernel_rule (const void *p1, const void *p2)
4752 {
4753 const kernel_rule_t *r1 = (const kernel_rule_t *) p1;
4754 const kernel_rule_t *r2 = (const kernel_rule_t *) p2;
4755
4756 return memcmp (r1, r2, sizeof (kernel_rule_t));
4757 }
4758
4759 int sort_by_stringptr (const void *p1, const void *p2)
4760 {
4761 const char **s1 = (const char **) p1;
4762 const char **s2 = (const char **) p2;
4763
4764 return strcmp (*s1, *s2);
4765 }
4766
4767 int sort_by_dictstat (const void *s1, const void *s2)
4768 {
4769 dictstat_t *d1 = (dictstat_t *) s1;
4770 dictstat_t *d2 = (dictstat_t *) s2;
4771
4772 #ifdef LINUX
4773 d2->stat.st_atim = d1->stat.st_atim;
4774 #else
4775 d2->stat.st_atime = d1->stat.st_atime;
4776 #endif
4777
4778 return memcmp (&d1->stat, &d2->stat, sizeof (struct stat));
4779 }
4780
4781 int sort_by_bitmap (const void *p1, const void *p2)
4782 {
4783 const bitmap_result_t *b1 = (const bitmap_result_t *) p1;
4784 const bitmap_result_t *b2 = (const bitmap_result_t *) p2;
4785
4786 return b1->collisions - b2->collisions;
4787 }
4788
4789 int sort_by_digest_4_2 (const void *v1, const void *v2)
4790 {
4791 const u32 *d1 = (const u32 *) v1;
4792 const u32 *d2 = (const u32 *) v2;
4793
4794 uint n = 2;
4795
4796 while (n--)
4797 {
4798 if (d1[n] > d2[n]) return ( 1);
4799 if (d1[n] < d2[n]) return (-1);
4800 }
4801
4802 return (0);
4803 }
4804
4805 int sort_by_digest_4_4 (const void *v1, const void *v2)
4806 {
4807 const u32 *d1 = (const u32 *) v1;
4808 const u32 *d2 = (const u32 *) v2;
4809
4810 uint n = 4;
4811
4812 while (n--)
4813 {
4814 if (d1[n] > d2[n]) return ( 1);
4815 if (d1[n] < d2[n]) return (-1);
4816 }
4817
4818 return (0);
4819 }
4820
4821 int sort_by_digest_4_5 (const void *v1, const void *v2)
4822 {
4823 const u32 *d1 = (const u32 *) v1;
4824 const u32 *d2 = (const u32 *) v2;
4825
4826 uint n = 5;
4827
4828 while (n--)
4829 {
4830 if (d1[n] > d2[n]) return ( 1);
4831 if (d1[n] < d2[n]) return (-1);
4832 }
4833
4834 return (0);
4835 }
4836
4837 int sort_by_digest_4_6 (const void *v1, const void *v2)
4838 {
4839 const u32 *d1 = (const u32 *) v1;
4840 const u32 *d2 = (const u32 *) v2;
4841
4842 uint n = 6;
4843
4844 while (n--)
4845 {
4846 if (d1[n] > d2[n]) return ( 1);
4847 if (d1[n] < d2[n]) return (-1);
4848 }
4849
4850 return (0);
4851 }
4852
4853 int sort_by_digest_4_8 (const void *v1, const void *v2)
4854 {
4855 const u32 *d1 = (const u32 *) v1;
4856 const u32 *d2 = (const u32 *) v2;
4857
4858 uint n = 8;
4859
4860 while (n--)
4861 {
4862 if (d1[n] > d2[n]) return ( 1);
4863 if (d1[n] < d2[n]) return (-1);
4864 }
4865
4866 return (0);
4867 }
4868
4869 int sort_by_digest_4_16 (const void *v1, const void *v2)
4870 {
4871 const u32 *d1 = (const u32 *) v1;
4872 const u32 *d2 = (const u32 *) v2;
4873
4874 uint n = 16;
4875
4876 while (n--)
4877 {
4878 if (d1[n] > d2[n]) return ( 1);
4879 if (d1[n] < d2[n]) return (-1);
4880 }
4881
4882 return (0);
4883 }
4884
4885 int sort_by_digest_4_32 (const void *v1, const void *v2)
4886 {
4887 const u32 *d1 = (const u32 *) v1;
4888 const u32 *d2 = (const u32 *) v2;
4889
4890 uint n = 32;
4891
4892 while (n--)
4893 {
4894 if (d1[n] > d2[n]) return ( 1);
4895 if (d1[n] < d2[n]) return (-1);
4896 }
4897
4898 return (0);
4899 }
4900
4901 int sort_by_digest_4_64 (const void *v1, const void *v2)
4902 {
4903 const u32 *d1 = (const u32 *) v1;
4904 const u32 *d2 = (const u32 *) v2;
4905
4906 uint n = 64;
4907
4908 while (n--)
4909 {
4910 if (d1[n] > d2[n]) return ( 1);
4911 if (d1[n] < d2[n]) return (-1);
4912 }
4913
4914 return (0);
4915 }
4916
4917 int sort_by_digest_8_8 (const void *v1, const void *v2)
4918 {
4919 const u64 *d1 = (const u64 *) v1;
4920 const u64 *d2 = (const u64 *) v2;
4921
4922 uint n = 8;
4923
4924 while (n--)
4925 {
4926 if (d1[n] > d2[n]) return ( 1);
4927 if (d1[n] < d2[n]) return (-1);
4928 }
4929
4930 return (0);
4931 }
4932
4933 int sort_by_digest_8_16 (const void *v1, const void *v2)
4934 {
4935 const u64 *d1 = (const u64 *) v1;
4936 const u64 *d2 = (const u64 *) v2;
4937
4938 uint n = 16;
4939
4940 while (n--)
4941 {
4942 if (d1[n] > d2[n]) return ( 1);
4943 if (d1[n] < d2[n]) return (-1);
4944 }
4945
4946 return (0);
4947 }
4948
4949 int sort_by_digest_8_25 (const void *v1, const void *v2)
4950 {
4951 const u64 *d1 = (const u64 *) v1;
4952 const u64 *d2 = (const u64 *) v2;
4953
4954 uint n = 25;
4955
4956 while (n--)
4957 {
4958 if (d1[n] > d2[n]) return ( 1);
4959 if (d1[n] < d2[n]) return (-1);
4960 }
4961
4962 return (0);
4963 }
4964
4965 int sort_by_digest_p0p1 (const void *v1, const void *v2)
4966 {
4967 const u32 *d1 = (const u32 *) v1;
4968 const u32 *d2 = (const u32 *) v2;
4969
4970 const uint dgst_pos0 = data.dgst_pos0;
4971 const uint dgst_pos1 = data.dgst_pos1;
4972 const uint dgst_pos2 = data.dgst_pos2;
4973 const uint dgst_pos3 = data.dgst_pos3;
4974
4975 if (d1[dgst_pos3] > d2[dgst_pos3]) return ( 1);
4976 if (d1[dgst_pos3] < d2[dgst_pos3]) return (-1);
4977 if (d1[dgst_pos2] > d2[dgst_pos2]) return ( 1);
4978 if (d1[dgst_pos2] < d2[dgst_pos2]) return (-1);
4979 if (d1[dgst_pos1] > d2[dgst_pos1]) return ( 1);
4980 if (d1[dgst_pos1] < d2[dgst_pos1]) return (-1);
4981 if (d1[dgst_pos0] > d2[dgst_pos0]) return ( 1);
4982 if (d1[dgst_pos0] < d2[dgst_pos0]) return (-1);
4983
4984 return (0);
4985 }
4986
4987 int sort_by_tuning_db_alias (const void *v1, const void *v2)
4988 {
4989 const tuning_db_alias_t *t1 = (const tuning_db_alias_t *) v1;
4990 const tuning_db_alias_t *t2 = (const tuning_db_alias_t *) v2;
4991
4992 const int res1 = strcmp (t1->device_name, t2->device_name);
4993
4994 if (res1 != 0) return (res1);
4995
4996 return 0;
4997 }
4998
4999 int sort_by_tuning_db_entry (const void *v1, const void *v2)
5000 {
5001 const tuning_db_entry_t *t1 = (const tuning_db_entry_t *) v1;
5002 const tuning_db_entry_t *t2 = (const tuning_db_entry_t *) v2;
5003
5004 const int res1 = strcmp (t1->device_name, t2->device_name);
5005
5006 if (res1 != 0) return (res1);
5007
5008 const int res2 = t1->attack_mode
5009 - t2->attack_mode;
5010
5011 if (res2 != 0) return (res2);
5012
5013 const int res3 = t1->hash_type
5014 - t2->hash_type;
5015
5016 if (res3 != 0) return (res3);
5017
5018 return 0;
5019 }
5020
5021 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)
5022 {
5023 uint outfile_autohex = data.outfile_autohex;
5024
5025 unsigned char *rule_ptr = (unsigned char *) rule_buf;
5026
5027 FILE *debug_fp = NULL;
5028
5029 if (debug_file != NULL)
5030 {
5031 debug_fp = fopen (debug_file, "ab");
5032
5033 lock_file (debug_fp);
5034 }
5035 else
5036 {
5037 debug_fp = stderr;
5038 }
5039
5040 if (debug_fp == NULL)
5041 {
5042 log_info ("WARNING: Could not open debug-file for writing");
5043 }
5044 else
5045 {
5046 if ((debug_mode == 2) || (debug_mode == 3) || (debug_mode == 4))
5047 {
5048 format_plain (debug_fp, orig_plain_ptr, orig_plain_len, outfile_autohex);
5049
5050 if ((debug_mode == 3) || (debug_mode == 4)) fputc (':', debug_fp);
5051 }
5052
5053 fwrite (rule_ptr, rule_len, 1, debug_fp);
5054
5055 if (debug_mode == 4)
5056 {
5057 fputc (':', debug_fp);
5058
5059 format_plain (debug_fp, mod_plain_ptr, mod_plain_len, outfile_autohex);
5060 }
5061
5062 fputc ('\n', debug_fp);
5063
5064 if (debug_file != NULL) fclose (debug_fp);
5065 }
5066 }
5067
5068 void format_plain (FILE *fp, unsigned char *plain_ptr, uint plain_len, uint outfile_autohex)
5069 {
5070 int needs_hexify = 0;
5071
5072 if (outfile_autohex == 1)
5073 {
5074 for (uint i = 0; i < plain_len; i++)
5075 {
5076 if (plain_ptr[i] < 0x20)
5077 {
5078 needs_hexify = 1;
5079
5080 break;
5081 }
5082
5083 if (plain_ptr[i] > 0x7f)
5084 {
5085 needs_hexify = 1;
5086
5087 break;
5088 }
5089 }
5090 }
5091
5092 if (needs_hexify == 1)
5093 {
5094 fprintf (fp, "$HEX[");
5095
5096 for (uint i = 0; i < plain_len; i++)
5097 {
5098 fprintf (fp, "%02x", plain_ptr[i]);
5099 }
5100
5101 fprintf (fp, "]");
5102 }
5103 else
5104 {
5105 fwrite (plain_ptr, plain_len, 1, fp);
5106 }
5107 }
5108
5109 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)
5110 {
5111 uint outfile_format = data.outfile_format;
5112
5113 char separator = data.separator;
5114
5115 if (outfile_format & OUTFILE_FMT_HASH)
5116 {
5117 fprintf (out_fp, "%s", out_buf);
5118
5119 if (outfile_format & (OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
5120 {
5121 fputc (separator, out_fp);
5122 }
5123 }
5124 else if (data.username)
5125 {
5126 if (username != NULL)
5127 {
5128 for (uint i = 0; i < user_len; i++)
5129 {
5130 fprintf (out_fp, "%c", username[i]);
5131 }
5132
5133 if (outfile_format & (OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
5134 {
5135 fputc (separator, out_fp);
5136 }
5137 }
5138 }
5139
5140 if (outfile_format & OUTFILE_FMT_PLAIN)
5141 {
5142 format_plain (out_fp, plain_ptr, plain_len, data.outfile_autohex);
5143
5144 if (outfile_format & (OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
5145 {
5146 fputc (separator, out_fp);
5147 }
5148 }
5149
5150 if (outfile_format & OUTFILE_FMT_HEXPLAIN)
5151 {
5152 for (uint i = 0; i < plain_len; i++)
5153 {
5154 fprintf (out_fp, "%02x", plain_ptr[i]);
5155 }
5156
5157 if (outfile_format & (OUTFILE_FMT_CRACKPOS))
5158 {
5159 fputc (separator, out_fp);
5160 }
5161 }
5162
5163 if (outfile_format & OUTFILE_FMT_CRACKPOS)
5164 {
5165 #ifdef _WIN
5166 __mingw_fprintf (out_fp, "%llu", crackpos);
5167 #endif
5168
5169 #ifdef _POSIX
5170 #ifdef __x86_64__
5171 fprintf (out_fp, "%lu", (unsigned long) crackpos);
5172 #else
5173 fprintf (out_fp, "%llu", crackpos);
5174 #endif
5175 #endif
5176 }
5177
5178 fputc ('\n', out_fp);
5179 }
5180
5181 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)
5182 {
5183 pot_t pot_key;
5184
5185 pot_key.hash.salt = hashes_buf->salt;
5186 pot_key.hash.digest = hashes_buf->digest;
5187
5188 pot_t *pot_ptr = (pot_t *) bsearch (&pot_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5189
5190 if (pot_ptr)
5191 {
5192 log_info_nn ("");
5193
5194 input_buf[input_len] = 0;
5195
5196 // user
5197 unsigned char *username = NULL;
5198 uint user_len = 0;
5199
5200 if (data.username)
5201 {
5202 user_t *user = hashes_buf->hash_info->user;
5203
5204 if (user)
5205 {
5206 username = (unsigned char *) (user->user_name);
5207
5208 user_len = user->user_len;
5209 }
5210 }
5211
5212 // do output the line
5213 format_output (out_fp, input_buf, (unsigned char *) pot_ptr->plain_buf, pot_ptr->plain_len, 0, username, user_len);
5214 }
5215 }
5216
5217 #define LM_WEAK_HASH "\x4e\xcf\x0d\x0c\x0a\xe2\xfb\xc1"
5218 #define LM_MASKED_PLAIN "[notfound]"
5219
5220 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)
5221 {
5222 // left
5223
5224 pot_t pot_left_key;
5225
5226 pot_left_key.hash.salt = hash_left->salt;
5227 pot_left_key.hash.digest = hash_left->digest;
5228
5229 pot_t *pot_left_ptr = (pot_t *) bsearch (&pot_left_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5230
5231 // right
5232
5233 uint weak_hash_found = 0;
5234
5235 pot_t pot_right_key;
5236
5237 pot_right_key.hash.salt = hash_right->salt;
5238 pot_right_key.hash.digest = hash_right->digest;
5239
5240 pot_t *pot_right_ptr = (pot_t *) bsearch (&pot_right_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5241
5242 if (pot_right_ptr == NULL)
5243 {
5244 // special case, if "weak hash"
5245
5246 if (memcmp (hash_right->digest, LM_WEAK_HASH, 8) == 0)
5247 {
5248 weak_hash_found = 1;
5249
5250 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5251
5252 // in theory this is not needed, but we are paranoia:
5253
5254 memset (pot_right_ptr->plain_buf, 0, sizeof (pot_right_ptr->plain_buf));
5255 pot_right_ptr->plain_len = 0;
5256 }
5257 }
5258
5259 if ((pot_left_ptr == NULL) && (pot_right_ptr == NULL))
5260 {
5261 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
5262
5263 return;
5264 }
5265
5266 // at least one half was found:
5267
5268 log_info_nn ("");
5269
5270 input_buf[input_len] = 0;
5271
5272 // user
5273
5274 unsigned char *username = NULL;
5275 uint user_len = 0;
5276
5277 if (data.username)
5278 {
5279 user_t *user = hash_left->hash_info->user;
5280
5281 if (user)
5282 {
5283 username = (unsigned char *) (user->user_name);
5284
5285 user_len = user->user_len;
5286 }
5287 }
5288
5289 // mask the part which was not found
5290
5291 uint left_part_masked = 0;
5292 uint right_part_masked = 0;
5293
5294 uint mask_plain_len = strlen (LM_MASKED_PLAIN);
5295
5296 if (pot_left_ptr == NULL)
5297 {
5298 left_part_masked = 1;
5299
5300 pot_left_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5301
5302 memset (pot_left_ptr->plain_buf, 0, sizeof (pot_left_ptr->plain_buf));
5303
5304 memcpy (pot_left_ptr->plain_buf, LM_MASKED_PLAIN, mask_plain_len);
5305 pot_left_ptr->plain_len = mask_plain_len;
5306 }
5307
5308 if (pot_right_ptr == NULL)
5309 {
5310 right_part_masked = 1;
5311
5312 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5313
5314 memset (pot_right_ptr->plain_buf, 0, sizeof (pot_right_ptr->plain_buf));
5315
5316 memcpy (pot_right_ptr->plain_buf, LM_MASKED_PLAIN, mask_plain_len);
5317 pot_right_ptr->plain_len = mask_plain_len;
5318 }
5319
5320 // create the pot_ptr out of pot_left_ptr and pot_right_ptr
5321
5322 pot_t pot_ptr;
5323
5324 pot_ptr.plain_len = pot_left_ptr->plain_len + pot_right_ptr->plain_len;
5325
5326 memcpy (pot_ptr.plain_buf, pot_left_ptr->plain_buf, pot_left_ptr->plain_len);
5327
5328 memcpy (pot_ptr.plain_buf + pot_left_ptr->plain_len, pot_right_ptr->plain_buf, pot_right_ptr->plain_len);
5329
5330 // do output the line
5331
5332 format_output (out_fp, input_buf, (unsigned char *) pot_ptr.plain_buf, pot_ptr.plain_len, 0, username, user_len);
5333
5334 if (weak_hash_found == 1) myfree (pot_right_ptr);
5335
5336 if (left_part_masked == 1) myfree (pot_left_ptr);
5337 if (right_part_masked == 1) myfree (pot_right_ptr);
5338 }
5339
5340 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)
5341 {
5342 pot_t pot_key;
5343
5344 memcpy (&pot_key.hash, hashes_buf, sizeof (hash_t));
5345
5346 pot_t *pot_ptr = (pot_t *) bsearch (&pot_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5347
5348 if (pot_ptr == NULL)
5349 {
5350 log_info_nn ("");
5351
5352 input_buf[input_len] = 0;
5353
5354 format_output (out_fp, input_buf, NULL, 0, 0, NULL, 0);
5355 }
5356 }
5357
5358 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)
5359 {
5360 // left
5361
5362 pot_t pot_left_key;
5363
5364 memcpy (&pot_left_key.hash, hash_left, sizeof (hash_t));
5365
5366 pot_t *pot_left_ptr = (pot_t *) bsearch (&pot_left_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5367
5368 // right
5369
5370 pot_t pot_right_key;
5371
5372 memcpy (&pot_right_key.hash, hash_right, sizeof (hash_t));
5373
5374 pot_t *pot_right_ptr = (pot_t *) bsearch (&pot_right_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5375
5376 uint weak_hash_found = 0;
5377
5378 if (pot_right_ptr == NULL)
5379 {
5380 // special case, if "weak hash"
5381
5382 if (memcmp (hash_right->digest, LM_WEAK_HASH, 8) == 0)
5383 {
5384 weak_hash_found = 1;
5385
5386 // we just need that pot_right_ptr is not a NULL pointer
5387
5388 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5389 }
5390 }
5391
5392 if ((pot_left_ptr != NULL) && (pot_right_ptr != NULL))
5393 {
5394 if (weak_hash_found == 1) myfree (pot_right_ptr);
5395
5396 return;
5397 }
5398
5399 // ... at least one part was not cracked
5400
5401 log_info_nn ("");
5402
5403 input_buf[input_len] = 0;
5404
5405 // only show the hash part which is still not cracked
5406
5407 uint user_len = input_len - 32;
5408
5409 char *hash_output = (char *) mymalloc (33);
5410
5411 memcpy (hash_output, input_buf, input_len);
5412
5413 if (pot_left_ptr != NULL)
5414 {
5415 // only show right part (because left part was already found)
5416
5417 memcpy (hash_output + user_len, input_buf + user_len + 16, 16);
5418
5419 hash_output[user_len + 16] = 0;
5420 }
5421
5422 if (pot_right_ptr != NULL)
5423 {
5424 // only show left part (because right part was already found)
5425
5426 memcpy (hash_output + user_len, input_buf + user_len, 16);
5427
5428 hash_output[user_len + 16] = 0;
5429 }
5430
5431 format_output (out_fp, hash_output, NULL, 0, 0, NULL, 0);
5432
5433 myfree (hash_output);
5434
5435 if (weak_hash_found == 1) myfree (pot_right_ptr);
5436 }
5437
5438 uint setup_opencl_platforms_filter (char *opencl_platforms)
5439 {
5440 uint opencl_platforms_filter = 0;
5441
5442 if (opencl_platforms)
5443 {
5444 char *platforms = strdup (opencl_platforms);
5445
5446 char *next = strtok (platforms, ",");
5447
5448 do
5449 {
5450 int platform = atoi (next);
5451
5452 if (platform < 1 || platform > 32)
5453 {
5454 log_error ("ERROR: invalid OpenCL platform %u specified", platform);
5455
5456 exit (-1);
5457 }
5458
5459 opencl_platforms_filter |= 1 << (platform - 1);
5460
5461 } while ((next = strtok (NULL, ",")) != NULL);
5462
5463 free (platforms);
5464 }
5465 else
5466 {
5467 opencl_platforms_filter = -1;
5468 }
5469
5470 return opencl_platforms_filter;
5471 }
5472
5473 u32 setup_devices_filter (char *opencl_devices)
5474 {
5475 u32 devices_filter = 0;
5476
5477 if (opencl_devices)
5478 {
5479 char *devices = strdup (opencl_devices);
5480
5481 char *next = strtok (devices, ",");
5482
5483 do
5484 {
5485 int device_id = atoi (next);
5486
5487 if (device_id < 1 || device_id > 32)
5488 {
5489 log_error ("ERROR: invalid device_id %u specified", device_id);
5490
5491 exit (-1);
5492 }
5493
5494 devices_filter |= 1 << (device_id - 1);
5495
5496 } while ((next = strtok (NULL, ",")) != NULL);
5497
5498 free (devices);
5499 }
5500 else
5501 {
5502 devices_filter = -1;
5503 }
5504
5505 return devices_filter;
5506 }
5507
5508 cl_device_type setup_device_types_filter (char *opencl_device_types)
5509 {
5510 cl_device_type device_types_filter = 0;
5511
5512 if (opencl_device_types)
5513 {
5514 char *device_types = strdup (opencl_device_types);
5515
5516 char *next = strtok (device_types, ",");
5517
5518 do
5519 {
5520 int device_type = atoi (next);
5521
5522 if (device_type < 1 || device_type > 3)
5523 {
5524 log_error ("ERROR: invalid device_type %u specified", device_type);
5525
5526 exit (-1);
5527 }
5528
5529 device_types_filter |= 1 << device_type;
5530
5531 } while ((next = strtok (NULL, ",")) != NULL);
5532
5533 free (device_types);
5534 }
5535 else
5536 {
5537 // Do not use CPU by default, this often reduces GPU performance because
5538 // the CPU is too busy to handle GPU synchronization
5539
5540 device_types_filter = CL_DEVICE_TYPE_ALL & ~CL_DEVICE_TYPE_CPU;
5541 }
5542
5543 return device_types_filter;
5544 }
5545
5546 u32 get_random_num (const u32 min, const u32 max)
5547 {
5548 if (min == max) return (min);
5549
5550 return ((rand () % (max - min)) + min);
5551 }
5552
5553 u32 mydivc32 (const u32 dividend, const u32 divisor)
5554 {
5555 u32 quotient = dividend / divisor;
5556
5557 if (dividend % divisor) quotient++;
5558
5559 return quotient;
5560 }
5561
5562 u64 mydivc64 (const u64 dividend, const u64 divisor)
5563 {
5564 u64 quotient = dividend / divisor;
5565
5566 if (dividend % divisor) quotient++;
5567
5568 return quotient;
5569 }
5570
5571 void format_timer_display (struct tm *tm, char *buf, size_t len)
5572 {
5573 const char *time_entities_s[] = { "year", "day", "hour", "min", "sec" };
5574 const char *time_entities_m[] = { "years", "days", "hours", "mins", "secs" };
5575
5576 if (tm->tm_year - 70)
5577 {
5578 char *time_entity1 = ((tm->tm_year - 70) == 1) ? (char *) time_entities_s[0] : (char *) time_entities_m[0];
5579 char *time_entity2 = ( tm->tm_yday == 1) ? (char *) time_entities_s[1] : (char *) time_entities_m[1];
5580
5581 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_year - 70, time_entity1, tm->tm_yday, time_entity2);
5582 }
5583 else if (tm->tm_yday)
5584 {
5585 char *time_entity1 = (tm->tm_yday == 1) ? (char *) time_entities_s[1] : (char *) time_entities_m[1];
5586 char *time_entity2 = (tm->tm_hour == 1) ? (char *) time_entities_s[2] : (char *) time_entities_m[2];
5587
5588 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_yday, time_entity1, tm->tm_hour, time_entity2);
5589 }
5590 else if (tm->tm_hour)
5591 {
5592 char *time_entity1 = (tm->tm_hour == 1) ? (char *) time_entities_s[2] : (char *) time_entities_m[2];
5593 char *time_entity2 = (tm->tm_min == 1) ? (char *) time_entities_s[3] : (char *) time_entities_m[3];
5594
5595 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_hour, time_entity1, tm->tm_min, time_entity2);
5596 }
5597 else if (tm->tm_min)
5598 {
5599 char *time_entity1 = (tm->tm_min == 1) ? (char *) time_entities_s[3] : (char *) time_entities_m[3];
5600 char *time_entity2 = (tm->tm_sec == 1) ? (char *) time_entities_s[4] : (char *) time_entities_m[4];
5601
5602 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_min, time_entity1, tm->tm_sec, time_entity2);
5603 }
5604 else
5605 {
5606 char *time_entity1 = (tm->tm_sec == 1) ? (char *) time_entities_s[4] : (char *) time_entities_m[4];
5607
5608 snprintf (buf, len - 1, "%d %s", tm->tm_sec, time_entity1);
5609 }
5610 }
5611
5612 void format_speed_display (float val, char *buf, size_t len)
5613 {
5614 if (val <= 0)
5615 {
5616 buf[0] = '0';
5617 buf[1] = ' ';
5618 buf[2] = 0;
5619
5620 return;
5621 }
5622
5623 char units[7] = { ' ', 'k', 'M', 'G', 'T', 'P', 'E' };
5624
5625 uint level = 0;
5626
5627 while (val > 99999)
5628 {
5629 val /= 1000;
5630
5631 level++;
5632 }
5633
5634 /* generate output */
5635
5636 if (level == 0)
5637 {
5638 snprintf (buf, len - 1, "%.0f ", val);
5639 }
5640 else
5641 {
5642 snprintf (buf, len - 1, "%.1f %c", val, units[level]);
5643 }
5644 }
5645
5646 void lowercase (u8 *buf, int len)
5647 {
5648 for (int i = 0; i < len; i++) buf[i] = tolower (buf[i]);
5649 }
5650
5651 void uppercase (u8 *buf, int len)
5652 {
5653 for (int i = 0; i < len; i++) buf[i] = toupper (buf[i]);
5654 }
5655
5656 int fgetl (FILE *fp, char *line_buf)
5657 {
5658 int line_len = 0;
5659
5660 while (!feof (fp))
5661 {
5662 const int c = fgetc (fp);
5663
5664 if (c == EOF) break;
5665
5666 line_buf[line_len] = (char) c;
5667
5668 line_len++;
5669
5670 if (line_len == HCBUFSIZ) line_len--;
5671
5672 if (c == '\n') break;
5673 }
5674
5675 if (line_len == 0) return 0;
5676
5677 if (line_buf[line_len - 1] == '\n')
5678 {
5679 line_len--;
5680
5681 line_buf[line_len] = 0;
5682 }
5683
5684 if (line_len == 0) return 0;
5685
5686 if (line_buf[line_len - 1] == '\r')
5687 {
5688 line_len--;
5689
5690 line_buf[line_len] = 0;
5691 }
5692
5693 return (line_len);
5694 }
5695
5696 int in_superchop (char *buf)
5697 {
5698 int len = strlen (buf);
5699
5700 while (len)
5701 {
5702 if (buf[len - 1] == '\n')
5703 {
5704 len--;
5705
5706 continue;
5707 }
5708
5709 if (buf[len - 1] == '\r')
5710 {
5711 len--;
5712
5713 continue;
5714 }
5715
5716 break;
5717 }
5718
5719 buf[len] = 0;
5720
5721 return len;
5722 }
5723
5724 char **scan_directory (const char *path)
5725 {
5726 char *tmp_path = mystrdup (path);
5727
5728 size_t tmp_path_len = strlen (tmp_path);
5729
5730 while (tmp_path[tmp_path_len - 1] == '/' || tmp_path[tmp_path_len - 1] == '\\')
5731 {
5732 tmp_path[tmp_path_len - 1] = 0;
5733
5734 tmp_path_len = strlen (tmp_path);
5735 }
5736
5737 char **files = NULL;
5738
5739 int num_files = 0;
5740
5741 DIR *d = NULL;
5742
5743 if ((d = opendir (tmp_path)) != NULL)
5744 {
5745 #ifdef OSX
5746 struct dirent e;
5747
5748 for (;;) {
5749 memset (&e, 0, sizeof (e));
5750 struct dirent *de = NULL;
5751
5752 if (readdir_r (d, &e, &de) != 0)
5753 {
5754 log_error ("ERROR: readdir_r() failed");
5755
5756 break;
5757 }
5758
5759 if (de == NULL) break;
5760 #else
5761 struct dirent *de;
5762
5763 while ((de = readdir (d)) != NULL)
5764 {
5765 #endif
5766 if ((strcmp (de->d_name, ".") == 0) || (strcmp (de->d_name, "..") == 0)) continue;
5767
5768 int path_size = strlen (tmp_path) + 1 + strlen (de->d_name);
5769
5770 char *path_file = (char *) mymalloc (path_size + 1);
5771
5772 snprintf (path_file, path_size + 1, "%s/%s", tmp_path, de->d_name);
5773
5774 path_file[path_size] = 0;
5775
5776 DIR *d_test;
5777
5778 if ((d_test = opendir (path_file)) != NULL)
5779 {
5780 closedir (d_test);
5781
5782 myfree (path_file);
5783 }
5784 else
5785 {
5786 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5787
5788 num_files++;
5789
5790 files[num_files - 1] = path_file;
5791 }
5792 }
5793
5794 closedir (d);
5795 }
5796 else if (errno == ENOTDIR)
5797 {
5798 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5799
5800 num_files++;
5801
5802 files[num_files - 1] = mystrdup (path);
5803 }
5804
5805 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5806
5807 num_files++;
5808
5809 files[num_files - 1] = NULL;
5810
5811 myfree (tmp_path);
5812
5813 return (files);
5814 }
5815
5816 int count_dictionaries (char **dictionary_files)
5817 {
5818 if (dictionary_files == NULL) return 0;
5819
5820 int cnt = 0;
5821
5822 for (int d = 0; dictionary_files[d] != NULL; d++)
5823 {
5824 cnt++;
5825 }
5826
5827 return (cnt);
5828 }
5829
5830 char *stroptitype (const uint opti_type)
5831 {
5832 switch (opti_type)
5833 {
5834 case OPTI_TYPE_ZERO_BYTE: return ((char *) OPTI_STR_ZERO_BYTE); break;
5835 case OPTI_TYPE_PRECOMPUTE_INIT: return ((char *) OPTI_STR_PRECOMPUTE_INIT); break;
5836 case OPTI_TYPE_PRECOMPUTE_MERKLE: return ((char *) OPTI_STR_PRECOMPUTE_MERKLE); break;
5837 case OPTI_TYPE_PRECOMPUTE_PERMUT: return ((char *) OPTI_STR_PRECOMPUTE_PERMUT); break;
5838 case OPTI_TYPE_MEET_IN_MIDDLE: return ((char *) OPTI_STR_MEET_IN_MIDDLE); break;
5839 case OPTI_TYPE_EARLY_SKIP: return ((char *) OPTI_STR_EARLY_SKIP); break;
5840 case OPTI_TYPE_NOT_SALTED: return ((char *) OPTI_STR_NOT_SALTED); break;
5841 case OPTI_TYPE_NOT_ITERATED: return ((char *) OPTI_STR_NOT_ITERATED); break;
5842 case OPTI_TYPE_PREPENDED_SALT: return ((char *) OPTI_STR_PREPENDED_SALT); break;
5843 case OPTI_TYPE_APPENDED_SALT: return ((char *) OPTI_STR_APPENDED_SALT); break;
5844 case OPTI_TYPE_SINGLE_HASH: return ((char *) OPTI_STR_SINGLE_HASH); break;
5845 case OPTI_TYPE_SINGLE_SALT: return ((char *) OPTI_STR_SINGLE_SALT); break;
5846 case OPTI_TYPE_BRUTE_FORCE: return ((char *) OPTI_STR_BRUTE_FORCE); break;
5847 case OPTI_TYPE_RAW_HASH: return ((char *) OPTI_STR_RAW_HASH); break;
5848 case OPTI_TYPE_SLOW_HASH_SIMD: return ((char *) OPTI_STR_SLOW_HASH_SIMD); break;
5849 case OPTI_TYPE_USES_BITS_8: return ((char *) OPTI_STR_USES_BITS_8); break;
5850 case OPTI_TYPE_USES_BITS_16: return ((char *) OPTI_STR_USES_BITS_16); break;
5851 case OPTI_TYPE_USES_BITS_32: return ((char *) OPTI_STR_USES_BITS_32); break;
5852 case OPTI_TYPE_USES_BITS_64: return ((char *) OPTI_STR_USES_BITS_64); break;
5853 }
5854
5855 return (NULL);
5856 }
5857
5858 char *strparser (const uint parser_status)
5859 {
5860 switch (parser_status)
5861 {
5862 case PARSER_OK: return ((char *) PA_000); break;
5863 case PARSER_COMMENT: return ((char *) PA_001); break;
5864 case PARSER_GLOBAL_ZERO: return ((char *) PA_002); break;
5865 case PARSER_GLOBAL_LENGTH: return ((char *) PA_003); break;
5866 case PARSER_HASH_LENGTH: return ((char *) PA_004); break;
5867 case PARSER_HASH_VALUE: return ((char *) PA_005); break;
5868 case PARSER_SALT_LENGTH: return ((char *) PA_006); break;
5869 case PARSER_SALT_VALUE: return ((char *) PA_007); break;
5870 case PARSER_SALT_ITERATION: return ((char *) PA_008); break;
5871 case PARSER_SEPARATOR_UNMATCHED: return ((char *) PA_009); break;
5872 case PARSER_SIGNATURE_UNMATCHED: return ((char *) PA_010); break;
5873 case PARSER_HCCAP_FILE_SIZE: return ((char *) PA_011); break;
5874 case PARSER_HCCAP_EAPOL_SIZE: return ((char *) PA_012); break;
5875 case PARSER_PSAFE2_FILE_SIZE: return ((char *) PA_013); break;
5876 case PARSER_PSAFE3_FILE_SIZE: return ((char *) PA_014); break;
5877 case PARSER_TC_FILE_SIZE: return ((char *) PA_015); break;
5878 case PARSER_SIP_AUTH_DIRECTIVE: return ((char *) PA_016); break;
5879 }
5880
5881 return ((char *) PA_255);
5882 }
5883
5884 char *strhashtype (const uint hash_mode)
5885 {
5886 switch (hash_mode)
5887 {
5888 case 0: return ((char *) HT_00000); break;
5889 case 10: return ((char *) HT_00010); break;
5890 case 11: return ((char *) HT_00011); break;
5891 case 12: return ((char *) HT_00012); break;
5892 case 20: return ((char *) HT_00020); break;
5893 case 21: return ((char *) HT_00021); break;
5894 case 22: return ((char *) HT_00022); break;
5895 case 23: return ((char *) HT_00023); break;
5896 case 30: return ((char *) HT_00030); break;
5897 case 40: return ((char *) HT_00040); break;
5898 case 50: return ((char *) HT_00050); break;
5899 case 60: return ((char *) HT_00060); break;
5900 case 100: return ((char *) HT_00100); break;
5901 case 101: return ((char *) HT_00101); break;
5902 case 110: return ((char *) HT_00110); break;
5903 case 111: return ((char *) HT_00111); break;
5904 case 112: return ((char *) HT_00112); break;
5905 case 120: return ((char *) HT_00120); break;
5906 case 121: return ((char *) HT_00121); break;
5907 case 122: return ((char *) HT_00122); break;
5908 case 124: return ((char *) HT_00124); break;
5909 case 125: return ((char *) HT_00125); break;
5910 case 130: return ((char *) HT_00130); break;
5911 case 131: return ((char *) HT_00131); break;
5912 case 132: return ((char *) HT_00132); break;
5913 case 133: return ((char *) HT_00133); break;
5914 case 140: return ((char *) HT_00140); break;
5915 case 141: return ((char *) HT_00141); break;
5916 case 150: return ((char *) HT_00150); break;
5917 case 160: return ((char *) HT_00160); break;
5918 case 190: return ((char *) HT_00190); break;
5919 case 200: return ((char *) HT_00200); break;
5920 case 300: return ((char *) HT_00300); break;
5921 case 400: return ((char *) HT_00400); break;
5922 case 500: return ((char *) HT_00500); break;
5923 case 501: return ((char *) HT_00501); break;
5924 case 900: return ((char *) HT_00900); break;
5925 case 910: return ((char *) HT_00910); break;
5926 case 1000: return ((char *) HT_01000); break;
5927 case 1100: return ((char *) HT_01100); break;
5928 case 1400: return ((char *) HT_01400); break;
5929 case 1410: return ((char *) HT_01410); break;
5930 case 1420: return ((char *) HT_01420); break;
5931 case 1421: return ((char *) HT_01421); break;
5932 case 1430: return ((char *) HT_01430); break;
5933 case 1440: return ((char *) HT_01440); break;
5934 case 1441: return ((char *) HT_01441); break;
5935 case 1450: return ((char *) HT_01450); break;
5936 case 1460: return ((char *) HT_01460); break;
5937 case 1500: return ((char *) HT_01500); break;
5938 case 1600: return ((char *) HT_01600); break;
5939 case 1700: return ((char *) HT_01700); break;
5940 case 1710: return ((char *) HT_01710); break;
5941 case 1711: return ((char *) HT_01711); break;
5942 case 1720: return ((char *) HT_01720); break;
5943 case 1722: return ((char *) HT_01722); break;
5944 case 1730: return ((char *) HT_01730); break;
5945 case 1731: return ((char *) HT_01731); break;
5946 case 1740: return ((char *) HT_01740); break;
5947 case 1750: return ((char *) HT_01750); break;
5948 case 1760: return ((char *) HT_01760); break;
5949 case 1800: return ((char *) HT_01800); break;
5950 case 2100: return ((char *) HT_02100); break;
5951 case 2400: return ((char *) HT_02400); break;
5952 case 2410: return ((char *) HT_02410); break;
5953 case 2500: return ((char *) HT_02500); break;
5954 case 2600: return ((char *) HT_02600); break;
5955 case 2611: return ((char *) HT_02611); break;
5956 case 2612: return ((char *) HT_02612); break;
5957 case 2711: return ((char *) HT_02711); break;
5958 case 2811: return ((char *) HT_02811); break;
5959 case 3000: return ((char *) HT_03000); break;
5960 case 3100: return ((char *) HT_03100); break;
5961 case 3200: return ((char *) HT_03200); break;
5962 case 3710: return ((char *) HT_03710); break;
5963 case 3711: return ((char *) HT_03711); break;
5964 case 3800: return ((char *) HT_03800); break;
5965 case 4300: return ((char *) HT_04300); break;
5966 case 4400: return ((char *) HT_04400); break;
5967 case 4500: return ((char *) HT_04500); break;
5968 case 4700: return ((char *) HT_04700); break;
5969 case 4800: return ((char *) HT_04800); break;
5970 case 4900: return ((char *) HT_04900); break;
5971 case 5000: return ((char *) HT_05000); break;
5972 case 5100: return ((char *) HT_05100); break;
5973 case 5200: return ((char *) HT_05200); break;
5974 case 5300: return ((char *) HT_05300); break;
5975 case 5400: return ((char *) HT_05400); break;
5976 case 5500: return ((char *) HT_05500); break;
5977 case 5600: return ((char *) HT_05600); break;
5978 case 5700: return ((char *) HT_05700); break;
5979 case 5800: return ((char *) HT_05800); break;
5980 case 6000: return ((char *) HT_06000); break;
5981 case 6100: return ((char *) HT_06100); break;
5982 case 6211: return ((char *) HT_06211); break;
5983 case 6212: return ((char *) HT_06212); break;
5984 case 6213: return ((char *) HT_06213); break;
5985 case 6221: return ((char *) HT_06221); break;
5986 case 6222: return ((char *) HT_06222); break;
5987 case 6223: return ((char *) HT_06223); break;
5988 case 6231: return ((char *) HT_06231); break;
5989 case 6232: return ((char *) HT_06232); break;
5990 case 6233: return ((char *) HT_06233); break;
5991 case 6241: return ((char *) HT_06241); break;
5992 case 6242: return ((char *) HT_06242); break;
5993 case 6243: return ((char *) HT_06243); break;
5994 case 6300: return ((char *) HT_06300); break;
5995 case 6400: return ((char *) HT_06400); break;
5996 case 6500: return ((char *) HT_06500); break;
5997 case 6600: return ((char *) HT_06600); break;
5998 case 6700: return ((char *) HT_06700); break;
5999 case 6800: return ((char *) HT_06800); break;
6000 case 6900: return ((char *) HT_06900); break;
6001 case 7100: return ((char *) HT_07100); break;
6002 case 7200: return ((char *) HT_07200); break;
6003 case 7300: return ((char *) HT_07300); break;
6004 case 7400: return ((char *) HT_07400); break;
6005 case 7500: return ((char *) HT_07500); break;
6006 case 7600: return ((char *) HT_07600); break;
6007 case 7700: return ((char *) HT_07700); break;
6008 case 7800: return ((char *) HT_07800); break;
6009 case 7900: return ((char *) HT_07900); break;
6010 case 8000: return ((char *) HT_08000); break;
6011 case 8100: return ((char *) HT_08100); break;
6012 case 8200: return ((char *) HT_08200); break;
6013 case 8300: return ((char *) HT_08300); break;
6014 case 8400: return ((char *) HT_08400); break;
6015 case 8500: return ((char *) HT_08500); break;
6016 case 8600: return ((char *) HT_08600); break;
6017 case 8700: return ((char *) HT_08700); break;
6018 case 8800: return ((char *) HT_08800); break;
6019 case 8900: return ((char *) HT_08900); break;
6020 case 9000: return ((char *) HT_09000); break;
6021 case 9100: return ((char *) HT_09100); break;
6022 case 9200: return ((char *) HT_09200); break;
6023 case 9300: return ((char *) HT_09300); break;
6024 case 9400: return ((char *) HT_09400); break;
6025 case 9500: return ((char *) HT_09500); break;
6026 case 9600: return ((char *) HT_09600); break;
6027 case 9700: return ((char *) HT_09700); break;
6028 case 9710: return ((char *) HT_09710); break;
6029 case 9720: return ((char *) HT_09720); break;
6030 case 9800: return ((char *) HT_09800); break;
6031 case 9810: return ((char *) HT_09810); break;
6032 case 9820: return ((char *) HT_09820); break;
6033 case 9900: return ((char *) HT_09900); break;
6034 case 10000: return ((char *) HT_10000); break;
6035 case 10100: return ((char *) HT_10100); break;
6036 case 10200: return ((char *) HT_10200); break;
6037 case 10300: return ((char *) HT_10300); break;
6038 case 10400: return ((char *) HT_10400); break;
6039 case 10410: return ((char *) HT_10410); break;
6040 case 10420: return ((char *) HT_10420); break;
6041 case 10500: return ((char *) HT_10500); break;
6042 case 10600: return ((char *) HT_10600); break;
6043 case 10700: return ((char *) HT_10700); break;
6044 case 10800: return ((char *) HT_10800); break;
6045 case 10900: return ((char *) HT_10900); break;
6046 case 11000: return ((char *) HT_11000); break;
6047 case 11100: return ((char *) HT_11100); break;
6048 case 11200: return ((char *) HT_11200); break;
6049 case 11300: return ((char *) HT_11300); break;
6050 case 11400: return ((char *) HT_11400); break;
6051 case 11500: return ((char *) HT_11500); break;
6052 case 11600: return ((char *) HT_11600); break;
6053 case 11700: return ((char *) HT_11700); break;
6054 case 11800: return ((char *) HT_11800); break;
6055 case 11900: return ((char *) HT_11900); break;
6056 case 12000: return ((char *) HT_12000); break;
6057 case 12100: return ((char *) HT_12100); break;
6058 case 12200: return ((char *) HT_12200); break;
6059 case 12300: return ((char *) HT_12300); break;
6060 case 12400: return ((char *) HT_12400); break;
6061 case 12500: return ((char *) HT_12500); break;
6062 case 12600: return ((char *) HT_12600); break;
6063 case 12700: return ((char *) HT_12700); break;
6064 case 12800: return ((char *) HT_12800); break;
6065 case 12900: return ((char *) HT_12900); break;
6066 case 13000: return ((char *) HT_13000); break;
6067 case 13100: return ((char *) HT_13100); break;
6068 case 13200: return ((char *) HT_13200); break;
6069 case 13300: return ((char *) HT_13300); break;
6070 case 13400: return ((char *) HT_13400); break;
6071 case 13500: return ((char *) HT_13500); break;
6072 case 13600: return ((char *) HT_13600); break;
6073 case 13711: return ((char *) HT_13711); break;
6074 case 13712: return ((char *) HT_13712); break;
6075 case 13713: return ((char *) HT_13713); break;
6076 case 13721: return ((char *) HT_13721); break;
6077 case 13722: return ((char *) HT_13722); break;
6078 case 13723: return ((char *) HT_13723); break;
6079 case 13731: return ((char *) HT_13731); break;
6080 case 13732: return ((char *) HT_13732); break;
6081 case 13733: return ((char *) HT_13733); break;
6082 case 13741: return ((char *) HT_13741); break;
6083 case 13742: return ((char *) HT_13742); break;
6084 case 13743: return ((char *) HT_13743); break;
6085 case 13751: return ((char *) HT_13751); break;
6086 case 13752: return ((char *) HT_13752); break;
6087 case 13753: return ((char *) HT_13753); break;
6088 case 13761: return ((char *) HT_13761); break;
6089 case 13762: return ((char *) HT_13762); break;
6090 case 13763: return ((char *) HT_13763); break;
6091 }
6092
6093 return ((char *) "Unknown");
6094 }
6095
6096 char *strstatus (const uint devices_status)
6097 {
6098 switch (devices_status)
6099 {
6100 case STATUS_INIT: return ((char *) ST_0000); break;
6101 case STATUS_STARTING: return ((char *) ST_0001); break;
6102 case STATUS_RUNNING: return ((char *) ST_0002); break;
6103 case STATUS_PAUSED: return ((char *) ST_0003); break;
6104 case STATUS_EXHAUSTED: return ((char *) ST_0004); break;
6105 case STATUS_CRACKED: return ((char *) ST_0005); break;
6106 case STATUS_ABORTED: return ((char *) ST_0006); break;
6107 case STATUS_QUIT: return ((char *) ST_0007); break;
6108 case STATUS_BYPASS: return ((char *) ST_0008); break;
6109 case STATUS_STOP_AT_CHECKPOINT: return ((char *) ST_0009); break;
6110 case STATUS_AUTOTUNE: return ((char *) ST_0010); break;
6111 }
6112
6113 return ((char *) "Unknown");
6114 }
6115
6116 void ascii_digest (char *out_buf, uint salt_pos, uint digest_pos)
6117 {
6118 uint hash_type = data.hash_type;
6119 uint hash_mode = data.hash_mode;
6120 uint salt_type = data.salt_type;
6121 uint opts_type = data.opts_type;
6122 uint opti_type = data.opti_type;
6123 uint dgst_size = data.dgst_size;
6124
6125 char *hashfile = data.hashfile;
6126
6127 uint len = 4096;
6128
6129 uint digest_buf[64] = { 0 };
6130
6131 u64 *digest_buf64 = (u64 *) digest_buf;
6132
6133 char *digests_buf_ptr = (char *) data.digests_buf;
6134
6135 memcpy (digest_buf, digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size), dgst_size);
6136
6137 if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT)
6138 {
6139 uint tt;
6140
6141 switch (hash_type)
6142 {
6143 case HASH_TYPE_DESCRYPT:
6144 FP (digest_buf[1], digest_buf[0], tt);
6145 break;
6146
6147 case HASH_TYPE_DESRACF:
6148 digest_buf[0] = rotl32 (digest_buf[0], 29);
6149 digest_buf[1] = rotl32 (digest_buf[1], 29);
6150
6151 FP (digest_buf[1], digest_buf[0], tt);
6152 break;
6153
6154 case HASH_TYPE_LM:
6155 FP (digest_buf[1], digest_buf[0], tt);
6156 break;
6157
6158 case HASH_TYPE_NETNTLM:
6159 digest_buf[0] = rotl32 (digest_buf[0], 29);
6160 digest_buf[1] = rotl32 (digest_buf[1], 29);
6161 digest_buf[2] = rotl32 (digest_buf[2], 29);
6162 digest_buf[3] = rotl32 (digest_buf[3], 29);
6163
6164 FP (digest_buf[1], digest_buf[0], tt);
6165 FP (digest_buf[3], digest_buf[2], tt);
6166 break;
6167
6168 case HASH_TYPE_BSDICRYPT:
6169 digest_buf[0] = rotl32 (digest_buf[0], 31);
6170 digest_buf[1] = rotl32 (digest_buf[1], 31);
6171
6172 FP (digest_buf[1], digest_buf[0], tt);
6173 break;
6174 }
6175 }
6176
6177 if (opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE)
6178 {
6179 switch (hash_type)
6180 {
6181 case HASH_TYPE_MD4:
6182 digest_buf[0] += MD4M_A;
6183 digest_buf[1] += MD4M_B;
6184 digest_buf[2] += MD4M_C;
6185 digest_buf[3] += MD4M_D;
6186 break;
6187
6188 case HASH_TYPE_MD5:
6189 digest_buf[0] += MD5M_A;
6190 digest_buf[1] += MD5M_B;
6191 digest_buf[2] += MD5M_C;
6192 digest_buf[3] += MD5M_D;
6193 break;
6194
6195 case HASH_TYPE_SHA1:
6196 digest_buf[0] += SHA1M_A;
6197 digest_buf[1] += SHA1M_B;
6198 digest_buf[2] += SHA1M_C;
6199 digest_buf[3] += SHA1M_D;
6200 digest_buf[4] += SHA1M_E;
6201 break;
6202
6203 case HASH_TYPE_SHA256:
6204 digest_buf[0] += SHA256M_A;
6205 digest_buf[1] += SHA256M_B;
6206 digest_buf[2] += SHA256M_C;
6207 digest_buf[3] += SHA256M_D;
6208 digest_buf[4] += SHA256M_E;
6209 digest_buf[5] += SHA256M_F;
6210 digest_buf[6] += SHA256M_G;
6211 digest_buf[7] += SHA256M_H;
6212 break;
6213
6214 case HASH_TYPE_SHA384:
6215 digest_buf64[0] += SHA384M_A;
6216 digest_buf64[1] += SHA384M_B;
6217 digest_buf64[2] += SHA384M_C;
6218 digest_buf64[3] += SHA384M_D;
6219 digest_buf64[4] += SHA384M_E;
6220 digest_buf64[5] += SHA384M_F;
6221 digest_buf64[6] += 0;
6222 digest_buf64[7] += 0;
6223 break;
6224
6225 case HASH_TYPE_SHA512:
6226 digest_buf64[0] += SHA512M_A;
6227 digest_buf64[1] += SHA512M_B;
6228 digest_buf64[2] += SHA512M_C;
6229 digest_buf64[3] += SHA512M_D;
6230 digest_buf64[4] += SHA512M_E;
6231 digest_buf64[5] += SHA512M_F;
6232 digest_buf64[6] += SHA512M_G;
6233 digest_buf64[7] += SHA512M_H;
6234 break;
6235 }
6236 }
6237
6238 if (opts_type & OPTS_TYPE_PT_GENERATE_LE)
6239 {
6240 if (dgst_size == DGST_SIZE_4_2)
6241 {
6242 for (int i = 0; i < 2; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6243 }
6244 else if (dgst_size == DGST_SIZE_4_4)
6245 {
6246 for (int i = 0; i < 4; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6247 }
6248 else if (dgst_size == DGST_SIZE_4_5)
6249 {
6250 for (int i = 0; i < 5; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6251 }
6252 else if (dgst_size == DGST_SIZE_4_6)
6253 {
6254 for (int i = 0; i < 6; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6255 }
6256 else if (dgst_size == DGST_SIZE_4_8)
6257 {
6258 for (int i = 0; i < 8; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6259 }
6260 else if ((dgst_size == DGST_SIZE_4_16) || (dgst_size == DGST_SIZE_8_8)) // same size, same result :)
6261 {
6262 if (hash_type == HASH_TYPE_WHIRLPOOL)
6263 {
6264 for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6265 }
6266 else if (hash_type == HASH_TYPE_SHA384)
6267 {
6268 for (int i = 0; i < 8; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
6269 }
6270 else if (hash_type == HASH_TYPE_SHA512)
6271 {
6272 for (int i = 0; i < 8; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
6273 }
6274 else if (hash_type == HASH_TYPE_GOST)
6275 {
6276 for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6277 }
6278 }
6279 else if (dgst_size == DGST_SIZE_4_64)
6280 {
6281 for (int i = 0; i < 64; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6282 }
6283 else if (dgst_size == DGST_SIZE_8_25)
6284 {
6285 for (int i = 0; i < 25; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
6286 }
6287 }
6288
6289 uint isSalted = ((data.salt_type == SALT_TYPE_INTERN)
6290 | (data.salt_type == SALT_TYPE_EXTERN)
6291 | (data.salt_type == SALT_TYPE_EMBEDDED));
6292
6293 salt_t salt;
6294
6295 if (isSalted)
6296 {
6297 memset (&salt, 0, sizeof (salt_t));
6298
6299 memcpy (&salt, &data.salts_buf[salt_pos], sizeof (salt_t));
6300
6301 char *ptr = (char *) salt.salt_buf;
6302
6303 uint len = salt.salt_len;
6304
6305 if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT)
6306 {
6307 uint tt;
6308
6309 switch (hash_type)
6310 {
6311 case HASH_TYPE_NETNTLM:
6312
6313 salt.salt_buf[0] = rotr32 (salt.salt_buf[0], 3);
6314 salt.salt_buf[1] = rotr32 (salt.salt_buf[1], 3);
6315
6316 FP (salt.salt_buf[1], salt.salt_buf[0], tt);
6317
6318 break;
6319 }
6320 }
6321
6322 if (opts_type & OPTS_TYPE_ST_UNICODE)
6323 {
6324 for (uint i = 0, j = 0; i < len; i += 1, j += 2)
6325 {
6326 ptr[i] = ptr[j];
6327 }
6328
6329 len = len / 2;
6330 }
6331
6332 if (opts_type & OPTS_TYPE_ST_GENERATE_LE)
6333 {
6334 uint max = salt.salt_len / 4;
6335
6336 if (len % 4) max++;
6337
6338 for (uint i = 0; i < max; i++)
6339 {
6340 salt.salt_buf[i] = byte_swap_32 (salt.salt_buf[i]);
6341 }
6342 }
6343
6344 if (opts_type & OPTS_TYPE_ST_HEX)
6345 {
6346 char tmp[64] = { 0 };
6347
6348 for (uint i = 0, j = 0; i < len; i += 1, j += 2)
6349 {
6350 sprintf (tmp + j, "%02x", (unsigned char) ptr[i]);
6351 }
6352
6353 len = len * 2;
6354
6355 memcpy (ptr, tmp, len);
6356 }
6357
6358 uint memset_size = ((48 - (int) len) > 0) ? (48 - len) : 0;
6359
6360 memset (ptr + len, 0, memset_size);
6361
6362 salt.salt_len = len;
6363 }
6364
6365 //
6366 // some modes require special encoding
6367 //
6368
6369 uint out_buf_plain[256] = { 0 };
6370 uint out_buf_salt[256] = { 0 };
6371
6372 char tmp_buf[1024] = { 0 };
6373
6374 char *ptr_plain = (char *) out_buf_plain;
6375 char *ptr_salt = (char *) out_buf_salt;
6376
6377 if (hash_mode == 22)
6378 {
6379 char username[30] = { 0 };
6380
6381 memcpy (username, salt.salt_buf, salt.salt_len - 22);
6382
6383 char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' };
6384
6385 u16 *ptr = (u16 *) digest_buf;
6386
6387 tmp_buf[ 0] = sig[0];
6388 tmp_buf[ 1] = int_to_base64 (((ptr[1]) >> 12) & 0x3f);
6389 tmp_buf[ 2] = int_to_base64 (((ptr[1]) >> 6) & 0x3f);
6390 tmp_buf[ 3] = int_to_base64 (((ptr[1]) >> 0) & 0x3f);
6391 tmp_buf[ 4] = int_to_base64 (((ptr[0]) >> 12) & 0x3f);
6392 tmp_buf[ 5] = int_to_base64 (((ptr[0]) >> 6) & 0x3f);
6393 tmp_buf[ 6] = sig[1];
6394 tmp_buf[ 7] = int_to_base64 (((ptr[0]) >> 0) & 0x3f);
6395 tmp_buf[ 8] = int_to_base64 (((ptr[3]) >> 12) & 0x3f);
6396 tmp_buf[ 9] = int_to_base64 (((ptr[3]) >> 6) & 0x3f);
6397 tmp_buf[10] = int_to_base64 (((ptr[3]) >> 0) & 0x3f);
6398 tmp_buf[11] = int_to_base64 (((ptr[2]) >> 12) & 0x3f);
6399 tmp_buf[12] = sig[2];
6400 tmp_buf[13] = int_to_base64 (((ptr[2]) >> 6) & 0x3f);
6401 tmp_buf[14] = int_to_base64 (((ptr[2]) >> 0) & 0x3f);
6402 tmp_buf[15] = int_to_base64 (((ptr[5]) >> 12) & 0x3f);
6403 tmp_buf[16] = int_to_base64 (((ptr[5]) >> 6) & 0x3f);
6404 tmp_buf[17] = sig[3];
6405 tmp_buf[18] = int_to_base64 (((ptr[5]) >> 0) & 0x3f);
6406 tmp_buf[19] = int_to_base64 (((ptr[4]) >> 12) & 0x3f);
6407 tmp_buf[20] = int_to_base64 (((ptr[4]) >> 6) & 0x3f);
6408 tmp_buf[21] = int_to_base64 (((ptr[4]) >> 0) & 0x3f);
6409 tmp_buf[22] = int_to_base64 (((ptr[7]) >> 12) & 0x3f);
6410 tmp_buf[23] = sig[4];
6411 tmp_buf[24] = int_to_base64 (((ptr[7]) >> 6) & 0x3f);
6412 tmp_buf[25] = int_to_base64 (((ptr[7]) >> 0) & 0x3f);
6413 tmp_buf[26] = int_to_base64 (((ptr[6]) >> 12) & 0x3f);
6414 tmp_buf[27] = int_to_base64 (((ptr[6]) >> 6) & 0x3f);
6415 tmp_buf[28] = int_to_base64 (((ptr[6]) >> 0) & 0x3f);
6416 tmp_buf[29] = sig[5];
6417
6418 snprintf (out_buf, len-1, "%s:%s",
6419 tmp_buf,
6420 username);
6421 }
6422 else if (hash_mode == 23)
6423 {
6424 // do not show the skyper part in output
6425
6426 char *salt_buf_ptr = (char *) salt.salt_buf;
6427
6428 salt_buf_ptr[salt.salt_len - 8] = 0;
6429
6430 snprintf (out_buf, len-1, "%08x%08x%08x%08x:%s",
6431 digest_buf[0],
6432 digest_buf[1],
6433 digest_buf[2],
6434 digest_buf[3],
6435 salt_buf_ptr);
6436 }
6437 else if (hash_mode == 101)
6438 {
6439 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6440
6441 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6442 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6443 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6444 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6445 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6446
6447 memcpy (tmp_buf, digest_buf, 20);
6448
6449 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6450
6451 snprintf (out_buf, len-1, "{SHA}%s", ptr_plain);
6452 }
6453 else if (hash_mode == 111)
6454 {
6455 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6456
6457 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6458 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6459 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6460 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6461 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6462
6463 memcpy (tmp_buf, digest_buf, 20);
6464 memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len);
6465
6466 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20 + salt.salt_len, (u8 *) ptr_plain);
6467
6468 snprintf (out_buf, len-1, "{SSHA}%s", ptr_plain);
6469 }
6470 else if ((hash_mode == 122) || (hash_mode == 125))
6471 {
6472 snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x",
6473 (char *) salt.salt_buf,
6474 digest_buf[0],
6475 digest_buf[1],
6476 digest_buf[2],
6477 digest_buf[3],
6478 digest_buf[4]);
6479 }
6480 else if (hash_mode == 124)
6481 {
6482 snprintf (out_buf, len-1, "sha1$%s$%08x%08x%08x%08x%08x",
6483 (char *) salt.salt_buf,
6484 digest_buf[0],
6485 digest_buf[1],
6486 digest_buf[2],
6487 digest_buf[3],
6488 digest_buf[4]);
6489 }
6490 else if (hash_mode == 131)
6491 {
6492 snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6493 (char *) salt.salt_buf,
6494 0, 0, 0, 0, 0,
6495 digest_buf[0],
6496 digest_buf[1],
6497 digest_buf[2],
6498 digest_buf[3],
6499 digest_buf[4]);
6500 }
6501 else if (hash_mode == 132)
6502 {
6503 snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x",
6504 (char *) salt.salt_buf,
6505 digest_buf[0],
6506 digest_buf[1],
6507 digest_buf[2],
6508 digest_buf[3],
6509 digest_buf[4]);
6510 }
6511 else if (hash_mode == 133)
6512 {
6513 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6514
6515 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6516 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6517 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6518 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6519 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6520
6521 memcpy (tmp_buf, digest_buf, 20);
6522
6523 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6524
6525 snprintf (out_buf, len-1, "%s", ptr_plain);
6526 }
6527 else if (hash_mode == 141)
6528 {
6529 memcpy (tmp_buf, salt.salt_buf, salt.salt_len);
6530
6531 base64_encode (int_to_base64, (const u8 *) tmp_buf, salt.salt_len, (u8 *) ptr_salt);
6532
6533 memset (tmp_buf, 0, sizeof (tmp_buf));
6534
6535 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6536
6537 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6538 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6539 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6540 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6541 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6542
6543 memcpy (tmp_buf, digest_buf, 20);
6544
6545 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6546
6547 ptr_plain[27] = 0;
6548
6549 snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER, ptr_salt, ptr_plain);
6550 }
6551 else if (hash_mode == 400)
6552 {
6553 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6554
6555 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6556 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6557 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6558 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6559
6560 phpass_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6561
6562 snprintf (out_buf, len-1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, (char *) ptr_plain);
6563 }
6564 else if (hash_mode == 500)
6565 {
6566 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6567
6568 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6569 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6570 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6571 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6572
6573 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6574
6575 if (salt.salt_iter == ROUNDS_MD5CRYPT)
6576 {
6577 snprintf (out_buf, len-1, "$1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6578 }
6579 else
6580 {
6581 snprintf (out_buf, len-1, "$1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6582 }
6583 }
6584 else if (hash_mode == 501)
6585 {
6586 uint digest_idx = salt.digests_offset + digest_pos;
6587
6588 hashinfo_t **hashinfo_ptr = data.hash_info;
6589 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
6590
6591 snprintf (out_buf, len-1, "%s", hash_buf);
6592 }
6593 else if (hash_mode == 1421)
6594 {
6595 u8 *salt_ptr = (u8 *) salt.salt_buf;
6596
6597 snprintf (out_buf, len-1, "%c%c%c%c%c%c%08x%08x%08x%08x%08x%08x%08x%08x",
6598 salt_ptr[0],
6599 salt_ptr[1],
6600 salt_ptr[2],
6601 salt_ptr[3],
6602 salt_ptr[4],
6603 salt_ptr[5],
6604 digest_buf[0],
6605 digest_buf[1],
6606 digest_buf[2],
6607 digest_buf[3],
6608 digest_buf[4],
6609 digest_buf[5],
6610 digest_buf[6],
6611 digest_buf[7]);
6612 }
6613 else if (hash_mode == 1441)
6614 {
6615 memcpy (tmp_buf, salt.salt_buf, salt.salt_len);
6616
6617 base64_encode (int_to_base64, (const u8 *) tmp_buf, salt.salt_len, (u8 *) ptr_salt);
6618
6619 memset (tmp_buf, 0, sizeof (tmp_buf));
6620
6621 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6622
6623 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6624 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6625 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6626 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6627 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6628 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6629 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6630 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6631
6632 memcpy (tmp_buf, digest_buf, 32);
6633
6634 base64_encode (int_to_base64, (const u8 *) tmp_buf, 32, (u8 *) ptr_plain);
6635
6636 ptr_plain[43] = 0;
6637
6638 snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER4, ptr_salt, ptr_plain);
6639 }
6640 else if (hash_mode == 1500)
6641 {
6642 out_buf[0] = salt.salt_sign[0] & 0xff;
6643 out_buf[1] = salt.salt_sign[1] & 0xff;
6644 //original method, but changed because of this ticket: https://hashcat.net/trac/ticket/269
6645 //out_buf[0] = int_to_itoa64 ((salt.salt_buf[0] >> 0) & 0x3f);
6646 //out_buf[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f);
6647
6648 memset (tmp_buf, 0, sizeof (tmp_buf));
6649
6650 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6651
6652 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6653 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6654
6655 memcpy (tmp_buf, digest_buf, 8);
6656
6657 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 8, (u8 *) ptr_plain);
6658
6659 snprintf (out_buf + 2, len-1-2, "%s", ptr_plain);
6660
6661 out_buf[13] = 0;
6662 }
6663 else if (hash_mode == 1600)
6664 {
6665 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6666
6667 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6668 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6669 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6670 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6671
6672 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6673
6674 if (salt.salt_iter == ROUNDS_MD5CRYPT)
6675 {
6676 snprintf (out_buf, len-1, "$apr1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6677 }
6678 else
6679 {
6680 snprintf (out_buf, len-1, "$apr1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6681 }
6682 }
6683 else if (hash_mode == 1711)
6684 {
6685 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6686
6687 digest_buf64[0] = byte_swap_64 (digest_buf64[0]);
6688 digest_buf64[1] = byte_swap_64 (digest_buf64[1]);
6689 digest_buf64[2] = byte_swap_64 (digest_buf64[2]);
6690 digest_buf64[3] = byte_swap_64 (digest_buf64[3]);
6691 digest_buf64[4] = byte_swap_64 (digest_buf64[4]);
6692 digest_buf64[5] = byte_swap_64 (digest_buf64[5]);
6693 digest_buf64[6] = byte_swap_64 (digest_buf64[6]);
6694 digest_buf64[7] = byte_swap_64 (digest_buf64[7]);
6695
6696 memcpy (tmp_buf, digest_buf, 64);
6697 memcpy (tmp_buf + 64, salt.salt_buf, salt.salt_len);
6698
6699 base64_encode (int_to_base64, (const u8 *) tmp_buf, 64 + salt.salt_len, (u8 *) ptr_plain);
6700
6701 snprintf (out_buf, len-1, "%s%s", SIGNATURE_SHA512B64S, ptr_plain);
6702 }
6703 else if (hash_mode == 1722)
6704 {
6705 uint *ptr = digest_buf;
6706
6707 snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6708 (unsigned char *) salt.salt_buf,
6709 ptr[ 1], ptr[ 0],
6710 ptr[ 3], ptr[ 2],
6711 ptr[ 5], ptr[ 4],
6712 ptr[ 7], ptr[ 6],
6713 ptr[ 9], ptr[ 8],
6714 ptr[11], ptr[10],
6715 ptr[13], ptr[12],
6716 ptr[15], ptr[14]);
6717 }
6718 else if (hash_mode == 1731)
6719 {
6720 uint *ptr = digest_buf;
6721
6722 snprintf (out_buf, len-1, "0x0200%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6723 (unsigned char *) salt.salt_buf,
6724 ptr[ 1], ptr[ 0],
6725 ptr[ 3], ptr[ 2],
6726 ptr[ 5], ptr[ 4],
6727 ptr[ 7], ptr[ 6],
6728 ptr[ 9], ptr[ 8],
6729 ptr[11], ptr[10],
6730 ptr[13], ptr[12],
6731 ptr[15], ptr[14]);
6732 }
6733 else if (hash_mode == 1800)
6734 {
6735 // temp workaround
6736
6737 digest_buf64[0] = byte_swap_64 (digest_buf64[0]);
6738 digest_buf64[1] = byte_swap_64 (digest_buf64[1]);
6739 digest_buf64[2] = byte_swap_64 (digest_buf64[2]);
6740 digest_buf64[3] = byte_swap_64 (digest_buf64[3]);
6741 digest_buf64[4] = byte_swap_64 (digest_buf64[4]);
6742 digest_buf64[5] = byte_swap_64 (digest_buf64[5]);
6743 digest_buf64[6] = byte_swap_64 (digest_buf64[6]);
6744 digest_buf64[7] = byte_swap_64 (digest_buf64[7]);
6745
6746 sha512crypt_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
6747
6748 if (salt.salt_iter == ROUNDS_SHA512CRYPT)
6749 {
6750 snprintf (out_buf, len-1, "$6$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6751 }
6752 else
6753 {
6754 snprintf (out_buf, len-1, "$6$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6755 }
6756 }
6757 else if (hash_mode == 2100)
6758 {
6759 uint pos = 0;
6760
6761 snprintf (out_buf + pos, len-1, "%s%i#",
6762 SIGNATURE_DCC2,
6763 salt.salt_iter + 1);
6764
6765 uint signature_len = strlen (out_buf);
6766
6767 pos += signature_len;
6768 len -= signature_len;
6769
6770 char *salt_ptr = (char *) salt.salt_buf;
6771
6772 for (uint i = 0; i < salt.salt_len; i++, pos++, len--) snprintf (out_buf + pos, len-1, "%c", salt_ptr[i]);
6773
6774 snprintf (out_buf + pos, len-1, "#%08x%08x%08x%08x",
6775 byte_swap_32 (digest_buf[0]),
6776 byte_swap_32 (digest_buf[1]),
6777 byte_swap_32 (digest_buf[2]),
6778 byte_swap_32 (digest_buf[3]));
6779 }
6780 else if ((hash_mode == 2400) || (hash_mode == 2410))
6781 {
6782 memcpy (tmp_buf, digest_buf, 16);
6783
6784 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6785
6786 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6787 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6788 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6789 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6790
6791 out_buf[ 0] = int_to_itoa64 ((digest_buf[0] >> 0) & 0x3f);
6792 out_buf[ 1] = int_to_itoa64 ((digest_buf[0] >> 6) & 0x3f);
6793 out_buf[ 2] = int_to_itoa64 ((digest_buf[0] >> 12) & 0x3f);
6794 out_buf[ 3] = int_to_itoa64 ((digest_buf[0] >> 18) & 0x3f);
6795
6796 out_buf[ 4] = int_to_itoa64 ((digest_buf[1] >> 0) & 0x3f);
6797 out_buf[ 5] = int_to_itoa64 ((digest_buf[1] >> 6) & 0x3f);
6798 out_buf[ 6] = int_to_itoa64 ((digest_buf[1] >> 12) & 0x3f);
6799 out_buf[ 7] = int_to_itoa64 ((digest_buf[1] >> 18) & 0x3f);
6800
6801 out_buf[ 8] = int_to_itoa64 ((digest_buf[2] >> 0) & 0x3f);
6802 out_buf[ 9] = int_to_itoa64 ((digest_buf[2] >> 6) & 0x3f);
6803 out_buf[10] = int_to_itoa64 ((digest_buf[2] >> 12) & 0x3f);
6804 out_buf[11] = int_to_itoa64 ((digest_buf[2] >> 18) & 0x3f);
6805
6806 out_buf[12] = int_to_itoa64 ((digest_buf[3] >> 0) & 0x3f);
6807 out_buf[13] = int_to_itoa64 ((digest_buf[3] >> 6) & 0x3f);
6808 out_buf[14] = int_to_itoa64 ((digest_buf[3] >> 12) & 0x3f);
6809 out_buf[15] = int_to_itoa64 ((digest_buf[3] >> 18) & 0x3f);
6810
6811 out_buf[16] = 0;
6812 }
6813 else if (hash_mode == 2500)
6814 {
6815 wpa_t *wpas = (wpa_t *) data.esalts_buf;
6816
6817 wpa_t *wpa = &wpas[salt_pos];
6818
6819 snprintf (out_buf, len-1, "%s:%02x%02x%02x%02x%02x%02x:%02x%02x%02x%02x%02x%02x",
6820 (char *) salt.salt_buf,
6821 wpa->orig_mac1[0],
6822 wpa->orig_mac1[1],
6823 wpa->orig_mac1[2],
6824 wpa->orig_mac1[3],
6825 wpa->orig_mac1[4],
6826 wpa->orig_mac1[5],
6827 wpa->orig_mac2[0],
6828 wpa->orig_mac2[1],
6829 wpa->orig_mac2[2],
6830 wpa->orig_mac2[3],
6831 wpa->orig_mac2[4],
6832 wpa->orig_mac2[5]);
6833 }
6834 else if (hash_mode == 4400)
6835 {
6836 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
6837 byte_swap_32 (digest_buf[0]),
6838 byte_swap_32 (digest_buf[1]),
6839 byte_swap_32 (digest_buf[2]),
6840 byte_swap_32 (digest_buf[3]));
6841 }
6842 else if (hash_mode == 4700)
6843 {
6844 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6845 byte_swap_32 (digest_buf[0]),
6846 byte_swap_32 (digest_buf[1]),
6847 byte_swap_32 (digest_buf[2]),
6848 byte_swap_32 (digest_buf[3]),
6849 byte_swap_32 (digest_buf[4]));
6850 }
6851 else if (hash_mode == 4800)
6852 {
6853 u8 chap_id_byte = (u8) salt.salt_buf[4];
6854
6855 snprintf (out_buf, len-1, "%08x%08x%08x%08x:%08x%08x%08x%08x:%02x",
6856 digest_buf[0],
6857 digest_buf[1],
6858 digest_buf[2],
6859 digest_buf[3],
6860 byte_swap_32 (salt.salt_buf[0]),
6861 byte_swap_32 (salt.salt_buf[1]),
6862 byte_swap_32 (salt.salt_buf[2]),
6863 byte_swap_32 (salt.salt_buf[3]),
6864 chap_id_byte);
6865 }
6866 else if (hash_mode == 4900)
6867 {
6868 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6869 byte_swap_32 (digest_buf[0]),
6870 byte_swap_32 (digest_buf[1]),
6871 byte_swap_32 (digest_buf[2]),
6872 byte_swap_32 (digest_buf[3]),
6873 byte_swap_32 (digest_buf[4]));
6874 }
6875 else if (hash_mode == 5100)
6876 {
6877 snprintf (out_buf, len-1, "%08x%08x",
6878 digest_buf[0],
6879 digest_buf[1]);
6880 }
6881 else if (hash_mode == 5200)
6882 {
6883 snprintf (out_buf, len-1, "%s", hashfile);
6884 }
6885 else if (hash_mode == 5300)
6886 {
6887 ikepsk_t *ikepsks = (ikepsk_t *) data.esalts_buf;
6888
6889 ikepsk_t *ikepsk = &ikepsks[salt_pos];
6890
6891 int buf_len = len -1;
6892
6893 // msg_buf
6894
6895 uint ikepsk_msg_len = ikepsk->msg_len / 4;
6896
6897 for (uint i = 0; i < ikepsk_msg_len; i++)
6898 {
6899 if ((i == 32) || (i == 64) || (i == 66) || (i == 68) || (i == 108))
6900 {
6901 snprintf (out_buf, buf_len, ":");
6902
6903 buf_len--;
6904 out_buf++;
6905 }
6906
6907 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->msg_buf[i]));
6908
6909 buf_len -= 8;
6910 out_buf += 8;
6911 }
6912
6913 // nr_buf
6914
6915 uint ikepsk_nr_len = ikepsk->nr_len / 4;
6916
6917 for (uint i = 0; i < ikepsk_nr_len; i++)
6918 {
6919 if ((i == 0) || (i == 5))
6920 {
6921 snprintf (out_buf, buf_len, ":");
6922
6923 buf_len--;
6924 out_buf++;
6925 }
6926
6927 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->nr_buf[i]));
6928
6929 buf_len -= 8;
6930 out_buf += 8;
6931 }
6932
6933 // digest_buf
6934
6935 for (uint i = 0; i < 4; i++)
6936 {
6937 if (i == 0)
6938 {
6939 snprintf (out_buf, buf_len, ":");
6940
6941 buf_len--;
6942 out_buf++;
6943 }
6944
6945 snprintf (out_buf, buf_len, "%08x", digest_buf[i]);
6946
6947 buf_len -= 8;
6948 out_buf += 8;
6949 }
6950 }
6951 else if (hash_mode == 5400)
6952 {
6953 ikepsk_t *ikepsks = (ikepsk_t *) data.esalts_buf;
6954
6955 ikepsk_t *ikepsk = &ikepsks[salt_pos];
6956
6957 int buf_len = len -1;
6958
6959 // msg_buf
6960
6961 uint ikepsk_msg_len = ikepsk->msg_len / 4;
6962
6963 for (uint i = 0; i < ikepsk_msg_len; i++)
6964 {
6965 if ((i == 32) || (i == 64) || (i == 66) || (i == 68) || (i == 108))
6966 {
6967 snprintf (out_buf, buf_len, ":");
6968
6969 buf_len--;
6970 out_buf++;
6971 }
6972
6973 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->msg_buf[i]));
6974
6975 buf_len -= 8;
6976 out_buf += 8;
6977 }
6978
6979 // nr_buf
6980
6981 uint ikepsk_nr_len = ikepsk->nr_len / 4;
6982
6983 for (uint i = 0; i < ikepsk_nr_len; i++)
6984 {
6985 if ((i == 0) || (i == 5))
6986 {
6987 snprintf (out_buf, buf_len, ":");
6988
6989 buf_len--;
6990 out_buf++;
6991 }
6992
6993 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->nr_buf[i]));
6994
6995 buf_len -= 8;
6996 out_buf += 8;
6997 }
6998
6999 // digest_buf
7000
7001 for (uint i = 0; i < 5; i++)
7002 {
7003 if (i == 0)
7004 {
7005 snprintf (out_buf, buf_len, ":");
7006
7007 buf_len--;
7008 out_buf++;
7009 }
7010
7011 snprintf (out_buf, buf_len, "%08x", digest_buf[i]);
7012
7013 buf_len -= 8;
7014 out_buf += 8;
7015 }
7016 }
7017 else if (hash_mode == 5500)
7018 {
7019 netntlm_t *netntlms = (netntlm_t *) data.esalts_buf;
7020
7021 netntlm_t *netntlm = &netntlms[salt_pos];
7022
7023 char user_buf[64] = { 0 };
7024 char domain_buf[64] = { 0 };
7025 char srvchall_buf[1024] = { 0 };
7026 char clichall_buf[1024] = { 0 };
7027
7028 for (uint i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2)
7029 {
7030 char *ptr = (char *) netntlm->userdomain_buf;
7031
7032 user_buf[i] = ptr[j];
7033 }
7034
7035 for (uint i = 0, j = 0; j < netntlm->domain_len; i += 1, j += 2)
7036 {
7037 char *ptr = (char *) netntlm->userdomain_buf;
7038
7039 domain_buf[i] = ptr[netntlm->user_len + j];
7040 }
7041
7042 for (uint i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2)
7043 {
7044 u8 *ptr = (u8 *) netntlm->chall_buf;
7045
7046 sprintf (srvchall_buf + j, "%02x", ptr[i]);
7047 }
7048
7049 for (uint i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2)
7050 {
7051 u8 *ptr = (u8 *) netntlm->chall_buf;
7052
7053 sprintf (clichall_buf + j, "%02x", ptr[netntlm->srvchall_len + i]);
7054 }
7055
7056 snprintf (out_buf, len-1, "%s::%s:%s:%08x%08x%08x%08x%08x%08x:%s",
7057 user_buf,
7058 domain_buf,
7059 srvchall_buf,
7060 digest_buf[0],
7061 digest_buf[1],
7062 digest_buf[2],
7063 digest_buf[3],
7064 byte_swap_32 (salt.salt_buf_pc[0]),
7065 byte_swap_32 (salt.salt_buf_pc[1]),
7066 clichall_buf);
7067 }
7068 else if (hash_mode == 5600)
7069 {
7070 netntlm_t *netntlms = (netntlm_t *) data.esalts_buf;
7071
7072 netntlm_t *netntlm = &netntlms[salt_pos];
7073
7074 char user_buf[64] = { 0 };
7075 char domain_buf[64] = { 0 };
7076 char srvchall_buf[1024] = { 0 };
7077 char clichall_buf[1024] = { 0 };
7078
7079 for (uint i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2)
7080 {
7081 char *ptr = (char *) netntlm->userdomain_buf;
7082
7083 user_buf[i] = ptr[j];
7084 }
7085
7086 for (uint i = 0, j = 0; j < netntlm->domain_len; i += 1, j += 2)
7087 {
7088 char *ptr = (char *) netntlm->userdomain_buf;
7089
7090 domain_buf[i] = ptr[netntlm->user_len + j];
7091 }
7092
7093 for (uint i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2)
7094 {
7095 u8 *ptr = (u8 *) netntlm->chall_buf;
7096
7097 sprintf (srvchall_buf + j, "%02x", ptr[i]);
7098 }
7099
7100 for (uint i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2)
7101 {
7102 u8 *ptr = (u8 *) netntlm->chall_buf;
7103
7104 sprintf (clichall_buf + j, "%02x", ptr[netntlm->srvchall_len + i]);
7105 }
7106
7107 snprintf (out_buf, len-1, "%s::%s:%s:%08x%08x%08x%08x:%s",
7108 user_buf,
7109 domain_buf,
7110 srvchall_buf,
7111 digest_buf[0],
7112 digest_buf[1],
7113 digest_buf[2],
7114 digest_buf[3],
7115 clichall_buf);
7116 }
7117 else if (hash_mode == 5700)
7118 {
7119 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
7120
7121 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7122 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7123 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7124 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7125 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7126 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7127 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7128 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7129
7130 memcpy (tmp_buf, digest_buf, 32);
7131
7132 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 32, (u8 *) ptr_plain);
7133
7134 ptr_plain[43] = 0;
7135
7136 snprintf (out_buf, len-1, "%s", ptr_plain);
7137 }
7138 else if (hash_mode == 5800)
7139 {
7140 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7141 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7142 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7143 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7144 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7145
7146 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
7147 digest_buf[0],
7148 digest_buf[1],
7149 digest_buf[2],
7150 digest_buf[3],
7151 digest_buf[4]);
7152 }
7153 else if ((hash_mode >= 6200) && (hash_mode <= 6299))
7154 {
7155 snprintf (out_buf, len-1, "%s", hashfile);
7156 }
7157 else if (hash_mode == 6300)
7158 {
7159 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
7160
7161 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7162 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7163 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7164 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7165
7166 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
7167
7168 snprintf (out_buf, len-1, "{smd5}%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
7169 }
7170 else if (hash_mode == 6400)
7171 {
7172 sha256aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
7173
7174 snprintf (out_buf, len-1, "{ssha256}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
7175 }
7176 else if (hash_mode == 6500)
7177 {
7178 sha512aix_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
7179
7180 snprintf (out_buf, len-1, "{ssha512}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
7181 }
7182 else if (hash_mode == 6600)
7183 {
7184 agilekey_t *agilekeys = (agilekey_t *) data.esalts_buf;
7185
7186 agilekey_t *agilekey = &agilekeys[salt_pos];
7187
7188 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
7189 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
7190
7191 uint buf_len = len - 1;
7192
7193 uint off = snprintf (out_buf, buf_len, "%d:%08x%08x:", salt.salt_iter + 1, salt.salt_buf[0], salt.salt_buf[1]);
7194 buf_len -= 22;
7195
7196 for (uint i = 0, j = off; i < 1040; i++, j += 2)
7197 {
7198 snprintf (out_buf + j, buf_len, "%02x", agilekey->cipher[i]);
7199
7200 buf_len -= 2;
7201 }
7202 }
7203 else if (hash_mode == 6700)
7204 {
7205 sha1aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
7206
7207 snprintf (out_buf, len-1, "{ssha1}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
7208 }
7209 else if (hash_mode == 6800)
7210 {
7211 snprintf (out_buf, len-1, "%s", (char *) salt.salt_buf);
7212 }
7213 else if (hash_mode == 7100)
7214 {
7215 uint *ptr = digest_buf;
7216
7217 pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) data.esalts_buf;
7218
7219 pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[salt_pos];
7220
7221 uint esalt[8] = { 0 };
7222
7223 esalt[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]);
7224 esalt[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]);
7225 esalt[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]);
7226 esalt[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]);
7227 esalt[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]);
7228 esalt[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]);
7229 esalt[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]);
7230 esalt[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]);
7231
7232 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",
7233 SIGNATURE_SHA512OSX,
7234 salt.salt_iter + 1,
7235 esalt[ 0], esalt[ 1],
7236 esalt[ 2], esalt[ 3],
7237 esalt[ 4], esalt[ 5],
7238 esalt[ 6], esalt[ 7],
7239 ptr [ 1], ptr [ 0],
7240 ptr [ 3], ptr [ 2],
7241 ptr [ 5], ptr [ 4],
7242 ptr [ 7], ptr [ 6],
7243 ptr [ 9], ptr [ 8],
7244 ptr [11], ptr [10],
7245 ptr [13], ptr [12],
7246 ptr [15], ptr [14]);
7247 }
7248 else if (hash_mode == 7200)
7249 {
7250 uint *ptr = digest_buf;
7251
7252 pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) data.esalts_buf;
7253
7254 pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[salt_pos];
7255
7256 uint len_used = 0;
7257
7258 snprintf (out_buf + len_used, len - len_used - 1, "%s%i.", SIGNATURE_SHA512GRUB, salt.salt_iter + 1);
7259
7260 len_used = strlen (out_buf);
7261
7262 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha512->salt_buf;
7263
7264 for (uint i = 0; i < salt.salt_len; i++, len_used += 2)
7265 {
7266 snprintf (out_buf + len_used, len - len_used - 1, "%02x", salt_buf_ptr[i]);
7267 }
7268
7269 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",
7270 ptr [ 1], ptr [ 0],
7271 ptr [ 3], ptr [ 2],
7272 ptr [ 5], ptr [ 4],
7273 ptr [ 7], ptr [ 6],
7274 ptr [ 9], ptr [ 8],
7275 ptr [11], ptr [10],
7276 ptr [13], ptr [12],
7277 ptr [15], ptr [14]);
7278 }
7279 else if (hash_mode == 7300)
7280 {
7281 rakp_t *rakps = (rakp_t *) data.esalts_buf;
7282
7283 rakp_t *rakp = &rakps[salt_pos];
7284
7285 for (uint i = 0, j = 0; (i * 4) < rakp->salt_len; i += 1, j += 8)
7286 {
7287 sprintf (out_buf + j, "%08x", rakp->salt_buf[i]);
7288 }
7289
7290 snprintf (out_buf + rakp->salt_len * 2, len - 1, ":%08x%08x%08x%08x%08x",
7291 digest_buf[0],
7292 digest_buf[1],
7293 digest_buf[2],
7294 digest_buf[3],
7295 digest_buf[4]);
7296 }
7297 else if (hash_mode == 7400)
7298 {
7299 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
7300
7301 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7302 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7303 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7304 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7305 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7306 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7307 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7308 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7309
7310 sha256crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
7311
7312 if (salt.salt_iter == ROUNDS_SHA256CRYPT)
7313 {
7314 snprintf (out_buf, len-1, "$5$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
7315 }
7316 else
7317 {
7318 snprintf (out_buf, len-1, "$5$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
7319 }
7320 }
7321 else if (hash_mode == 7500)
7322 {
7323 krb5pa_t *krb5pas = (krb5pa_t *) data.esalts_buf;
7324
7325 krb5pa_t *krb5pa = &krb5pas[salt_pos];
7326
7327 u8 *ptr_timestamp = (u8 *) krb5pa->timestamp;
7328 u8 *ptr_checksum = (u8 *) krb5pa->checksum;
7329
7330 char data[128] = { 0 };
7331
7332 char *ptr_data = data;
7333
7334 for (uint i = 0; i < 36; i++, ptr_data += 2)
7335 {
7336 sprintf (ptr_data, "%02x", ptr_timestamp[i]);
7337 }
7338
7339 for (uint i = 0; i < 16; i++, ptr_data += 2)
7340 {
7341 sprintf (ptr_data, "%02x", ptr_checksum[i]);
7342 }
7343
7344 *ptr_data = 0;
7345
7346 snprintf (out_buf, len-1, "%s$%s$%s$%s$%s",
7347 SIGNATURE_KRB5PA,
7348 (char *) krb5pa->user,
7349 (char *) krb5pa->realm,
7350 (char *) krb5pa->salt,
7351 data);
7352 }
7353 else if (hash_mode == 7700)
7354 {
7355 snprintf (out_buf, len-1, "%s$%08X%08X",
7356 (char *) salt.salt_buf,
7357 digest_buf[0],
7358 digest_buf[1]);
7359 }
7360 else if (hash_mode == 7800)
7361 {
7362 snprintf (out_buf, len-1, "%s$%08X%08X%08X%08X%08X",
7363 (char *) salt.salt_buf,
7364 digest_buf[0],
7365 digest_buf[1],
7366 digest_buf[2],
7367 digest_buf[3],
7368 digest_buf[4]);
7369 }
7370 else if (hash_mode == 7900)
7371 {
7372 drupal7_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
7373
7374 // ugly hack start
7375
7376 char *tmp = (char *) salt.salt_buf_pc;
7377
7378 ptr_plain[42] = tmp[0];
7379
7380 // ugly hack end
7381
7382 ptr_plain[43] = 0;
7383
7384 snprintf (out_buf, len-1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, (char *) ptr_plain);
7385 }
7386 else if (hash_mode == 8000)
7387 {
7388 snprintf (out_buf, len-1, "0xc007%s%08x%08x%08x%08x%08x%08x%08x%08x",
7389 (unsigned char *) salt.salt_buf,
7390 digest_buf[0],
7391 digest_buf[1],
7392 digest_buf[2],
7393 digest_buf[3],
7394 digest_buf[4],
7395 digest_buf[5],
7396 digest_buf[6],
7397 digest_buf[7]);
7398 }
7399 else if (hash_mode == 8100)
7400 {
7401 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
7402 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
7403
7404 snprintf (out_buf, len-1, "1%s%08x%08x%08x%08x%08x",
7405 (unsigned char *) salt.salt_buf,
7406 digest_buf[0],
7407 digest_buf[1],
7408 digest_buf[2],
7409 digest_buf[3],
7410 digest_buf[4]);
7411 }
7412 else if (hash_mode == 8200)
7413 {
7414 cloudkey_t *cloudkeys = (cloudkey_t *) data.esalts_buf;
7415
7416 cloudkey_t *cloudkey = &cloudkeys[salt_pos];
7417
7418 char data_buf[4096] = { 0 };
7419
7420 for (int i = 0, j = 0; i < 512; i += 1, j += 8)
7421 {
7422 sprintf (data_buf + j, "%08x", cloudkey->data_buf[i]);
7423 }
7424
7425 data_buf[cloudkey->data_len * 2] = 0;
7426
7427 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7428 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7429 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7430 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7431 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7432 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7433 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7434 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7435
7436 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
7437 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
7438 salt.salt_buf[2] = byte_swap_32 (salt.salt_buf[2]);
7439 salt.salt_buf[3] = byte_swap_32 (salt.salt_buf[3]);
7440
7441 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x:%08x%08x%08x%08x:%u:%s",
7442 digest_buf[0],
7443 digest_buf[1],
7444 digest_buf[2],
7445 digest_buf[3],
7446 digest_buf[4],
7447 digest_buf[5],
7448 digest_buf[6],
7449 digest_buf[7],
7450 salt.salt_buf[0],
7451 salt.salt_buf[1],
7452 salt.salt_buf[2],
7453 salt.salt_buf[3],
7454 salt.salt_iter + 1,
7455 data_buf);
7456 }
7457 else if (hash_mode == 8300)
7458 {
7459 char digest_buf_c[34] = { 0 };
7460
7461 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7462 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7463 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7464 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7465 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7466
7467 base32_encode (int_to_itoa32, (const u8 *) digest_buf, 20, (u8 *) digest_buf_c);
7468
7469 digest_buf_c[32] = 0;
7470
7471 // domain
7472
7473 const uint salt_pc_len = salt.salt_buf_pc[7]; // what a hack
7474
7475 char domain_buf_c[33] = { 0 };
7476
7477 memcpy (domain_buf_c, (char *) salt.salt_buf_pc, salt_pc_len);
7478
7479 for (uint i = 0; i < salt_pc_len; i++)
7480 {
7481 const char next = domain_buf_c[i];
7482
7483 domain_buf_c[i] = '.';
7484
7485 i += next;
7486 }
7487
7488 domain_buf_c[salt_pc_len] = 0;
7489
7490 // final
7491
7492 snprintf (out_buf, len-1, "%s:%s:%s:%u", digest_buf_c, domain_buf_c, (char *) salt.salt_buf, salt.salt_iter);
7493 }
7494 else if (hash_mode == 8500)
7495 {
7496 snprintf (out_buf, len-1, "%s*%s*%08X%08X", SIGNATURE_RACF, (char *) salt.salt_buf, digest_buf[0], digest_buf[1]);
7497 }
7498 else if (hash_mode == 2612)
7499 {
7500 snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x",
7501 SIGNATURE_PHPS,
7502 (char *) salt.salt_buf,
7503 digest_buf[0],
7504 digest_buf[1],
7505 digest_buf[2],
7506 digest_buf[3]);
7507 }
7508 else if (hash_mode == 3711)
7509 {
7510 char *salt_ptr = (char *) salt.salt_buf;
7511
7512 salt_ptr[salt.salt_len - 1] = 0;
7513
7514 snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x",
7515 SIGNATURE_MEDIAWIKI_B,
7516 salt_ptr,
7517 digest_buf[0],
7518 digest_buf[1],
7519 digest_buf[2],
7520 digest_buf[3]);
7521 }
7522 else if (hash_mode == 8800)
7523 {
7524 androidfde_t *androidfdes = (androidfde_t *) data.esalts_buf;
7525
7526 androidfde_t *androidfde = &androidfdes[salt_pos];
7527
7528 char tmp[3073] = { 0 };
7529
7530 for (uint i = 0, j = 0; i < 384; i += 1, j += 8)
7531 {
7532 sprintf (tmp + j, "%08x", androidfde->data[i]);
7533 }
7534
7535 tmp[3072] = 0;
7536
7537 snprintf (out_buf, len-1, "%s16$%08x%08x%08x%08x$16$%08x%08x%08x%08x$%s",
7538 SIGNATURE_ANDROIDFDE,
7539 byte_swap_32 (salt.salt_buf[0]),
7540 byte_swap_32 (salt.salt_buf[1]),
7541 byte_swap_32 (salt.salt_buf[2]),
7542 byte_swap_32 (salt.salt_buf[3]),
7543 byte_swap_32 (digest_buf[0]),
7544 byte_swap_32 (digest_buf[1]),
7545 byte_swap_32 (digest_buf[2]),
7546 byte_swap_32 (digest_buf[3]),
7547 tmp);
7548 }
7549 else if (hash_mode == 8900)
7550 {
7551 uint N = salt.scrypt_N;
7552 uint r = salt.scrypt_r;
7553 uint p = salt.scrypt_p;
7554
7555 char base64_salt[32] = { 0 };
7556
7557 base64_encode (int_to_base64, (const u8 *) salt.salt_buf, salt.salt_len, (u8 *) base64_salt);
7558
7559 memset (tmp_buf, 0, 46);
7560
7561 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7562 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7563 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7564 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7565 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7566 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7567 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7568 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7569 digest_buf[8] = 0; // needed for base64_encode ()
7570
7571 base64_encode (int_to_base64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7572
7573 snprintf (out_buf, len-1, "%s:%i:%i:%i:%s:%s",
7574 SIGNATURE_SCRYPT,
7575 N,
7576 r,
7577 p,
7578 base64_salt,
7579 tmp_buf);
7580 }
7581 else if (hash_mode == 9000)
7582 {
7583 snprintf (out_buf, len-1, "%s", hashfile);
7584 }
7585 else if (hash_mode == 9200)
7586 {
7587 // salt
7588
7589 pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) data.esalts_buf;
7590
7591 pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[salt_pos];
7592
7593 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf;
7594
7595 // hash
7596
7597 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7598 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7599 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7600 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7601 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7602 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7603 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7604 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7605 digest_buf[8] = 0; // needed for base64_encode ()
7606
7607 char tmp_buf[64] = { 0 };
7608
7609 base64_encode (int_to_itoa64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7610 tmp_buf[43] = 0; // cut it here
7611
7612 // output
7613
7614 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO8, salt_buf_ptr, tmp_buf);
7615 }
7616 else if (hash_mode == 9300)
7617 {
7618 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7619 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7620 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7621 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7622 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7623 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7624 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7625 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7626 digest_buf[8] = 0; // needed for base64_encode ()
7627
7628 char tmp_buf[64] = { 0 };
7629
7630 base64_encode (int_to_itoa64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7631 tmp_buf[43] = 0; // cut it here
7632
7633 unsigned char *salt_buf_ptr = (unsigned char *) salt.salt_buf;
7634
7635 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO9, salt_buf_ptr, tmp_buf);
7636 }
7637 else if (hash_mode == 9400)
7638 {
7639 office2007_t *office2007s = (office2007_t *) data.esalts_buf;
7640
7641 office2007_t *office2007 = &office2007s[salt_pos];
7642
7643 snprintf (out_buf, len-1, "%s*%u*%u*%u*%u*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7644 SIGNATURE_OFFICE2007,
7645 2007,
7646 20,
7647 office2007->keySize,
7648 16,
7649 salt.salt_buf[0],
7650 salt.salt_buf[1],
7651 salt.salt_buf[2],
7652 salt.salt_buf[3],
7653 office2007->encryptedVerifier[0],
7654 office2007->encryptedVerifier[1],
7655 office2007->encryptedVerifier[2],
7656 office2007->encryptedVerifier[3],
7657 office2007->encryptedVerifierHash[0],
7658 office2007->encryptedVerifierHash[1],
7659 office2007->encryptedVerifierHash[2],
7660 office2007->encryptedVerifierHash[3],
7661 office2007->encryptedVerifierHash[4]);
7662 }
7663 else if (hash_mode == 9500)
7664 {
7665 office2010_t *office2010s = (office2010_t *) data.esalts_buf;
7666
7667 office2010_t *office2010 = &office2010s[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_OFFICE2010, 2010, 100000, 128, 16,
7670
7671 salt.salt_buf[0],
7672 salt.salt_buf[1],
7673 salt.salt_buf[2],
7674 salt.salt_buf[3],
7675 office2010->encryptedVerifier[0],
7676 office2010->encryptedVerifier[1],
7677 office2010->encryptedVerifier[2],
7678 office2010->encryptedVerifier[3],
7679 office2010->encryptedVerifierHash[0],
7680 office2010->encryptedVerifierHash[1],
7681 office2010->encryptedVerifierHash[2],
7682 office2010->encryptedVerifierHash[3],
7683 office2010->encryptedVerifierHash[4],
7684 office2010->encryptedVerifierHash[5],
7685 office2010->encryptedVerifierHash[6],
7686 office2010->encryptedVerifierHash[7]);
7687 }
7688 else if (hash_mode == 9600)
7689 {
7690 office2013_t *office2013s = (office2013_t *) data.esalts_buf;
7691
7692 office2013_t *office2013 = &office2013s[salt_pos];
7693
7694 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,
7695
7696 salt.salt_buf[0],
7697 salt.salt_buf[1],
7698 salt.salt_buf[2],
7699 salt.salt_buf[3],
7700 office2013->encryptedVerifier[0],
7701 office2013->encryptedVerifier[1],
7702 office2013->encryptedVerifier[2],
7703 office2013->encryptedVerifier[3],
7704 office2013->encryptedVerifierHash[0],
7705 office2013->encryptedVerifierHash[1],
7706 office2013->encryptedVerifierHash[2],
7707 office2013->encryptedVerifierHash[3],
7708 office2013->encryptedVerifierHash[4],
7709 office2013->encryptedVerifierHash[5],
7710 office2013->encryptedVerifierHash[6],
7711 office2013->encryptedVerifierHash[7]);
7712 }
7713 else if (hash_mode == 9700)
7714 {
7715 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7716
7717 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7718
7719 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7720 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7721 byte_swap_32 (salt.salt_buf[0]),
7722 byte_swap_32 (salt.salt_buf[1]),
7723 byte_swap_32 (salt.salt_buf[2]),
7724 byte_swap_32 (salt.salt_buf[3]),
7725 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7726 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7727 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7728 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7729 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7730 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7731 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7732 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]));
7733 }
7734 else if (hash_mode == 9710)
7735 {
7736 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7737
7738 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7739
7740 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7741 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7742 byte_swap_32 (salt.salt_buf[0]),
7743 byte_swap_32 (salt.salt_buf[1]),
7744 byte_swap_32 (salt.salt_buf[2]),
7745 byte_swap_32 (salt.salt_buf[3]),
7746 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7747 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7748 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7749 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7750 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7751 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7752 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7753 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]));
7754 }
7755 else if (hash_mode == 9720)
7756 {
7757 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7758
7759 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7760
7761 u8 *rc4key = (u8 *) oldoffice01->rc4key;
7762
7763 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7764 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7765 byte_swap_32 (salt.salt_buf[0]),
7766 byte_swap_32 (salt.salt_buf[1]),
7767 byte_swap_32 (salt.salt_buf[2]),
7768 byte_swap_32 (salt.salt_buf[3]),
7769 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7770 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7771 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7772 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7773 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7774 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7775 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7776 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]),
7777 rc4key[0],
7778 rc4key[1],
7779 rc4key[2],
7780 rc4key[3],
7781 rc4key[4]);
7782 }
7783 else if (hash_mode == 9800)
7784 {
7785 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7786
7787 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7788
7789 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7790 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7791 salt.salt_buf[0],
7792 salt.salt_buf[1],
7793 salt.salt_buf[2],
7794 salt.salt_buf[3],
7795 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7796 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7797 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7798 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7799 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7800 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7801 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7802 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7803 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]));
7804 }
7805 else if (hash_mode == 9810)
7806 {
7807 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7808
7809 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7810
7811 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7812 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7813 salt.salt_buf[0],
7814 salt.salt_buf[1],
7815 salt.salt_buf[2],
7816 salt.salt_buf[3],
7817 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7818 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7819 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7820 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7821 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7822 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7823 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7824 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7825 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]));
7826 }
7827 else if (hash_mode == 9820)
7828 {
7829 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7830
7831 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7832
7833 u8 *rc4key = (u8 *) oldoffice34->rc4key;
7834
7835 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7836 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7837 salt.salt_buf[0],
7838 salt.salt_buf[1],
7839 salt.salt_buf[2],
7840 salt.salt_buf[3],
7841 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7842 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7843 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7844 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7845 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7846 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7847 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7848 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7849 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]),
7850 rc4key[0],
7851 rc4key[1],
7852 rc4key[2],
7853 rc4key[3],
7854 rc4key[4]);
7855 }
7856 else if (hash_mode == 10000)
7857 {
7858 // salt
7859
7860 pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) data.esalts_buf;
7861
7862 pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[salt_pos];
7863
7864 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf;
7865
7866 // hash
7867
7868 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7869 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7870 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7871 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7872 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7873 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7874 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7875 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7876 digest_buf[8] = 0; // needed for base64_encode ()
7877
7878 char tmp_buf[64] = { 0 };
7879
7880 base64_encode (int_to_base64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7881
7882 // output
7883
7884 snprintf (out_buf, len-1, "%s%i$%s$%s", SIGNATURE_DJANGOPBKDF2, salt.salt_iter + 1, salt_buf_ptr, tmp_buf);
7885 }
7886 else if (hash_mode == 10100)
7887 {
7888 snprintf (out_buf, len-1, "%08x%08x:%u:%u:%08x%08x%08x%08x",
7889 digest_buf[0],
7890 digest_buf[1],
7891 2,
7892 4,
7893 byte_swap_32 (salt.salt_buf[0]),
7894 byte_swap_32 (salt.salt_buf[1]),
7895 byte_swap_32 (salt.salt_buf[2]),
7896 byte_swap_32 (salt.salt_buf[3]));
7897 }
7898 else if (hash_mode == 10200)
7899 {
7900 cram_md5_t *cram_md5s = (cram_md5_t *) data.esalts_buf;
7901
7902 cram_md5_t *cram_md5 = &cram_md5s[salt_pos];
7903
7904 // challenge
7905
7906 char challenge[100] = { 0 };
7907
7908 base64_encode (int_to_base64, (const u8 *) salt.salt_buf, salt.salt_len, (u8 *) challenge);
7909
7910 // response
7911
7912 char tmp_buf[100] = { 0 };
7913
7914 uint tmp_len = snprintf (tmp_buf, 100, "%s %08x%08x%08x%08x",
7915 (char *) cram_md5->user,
7916 digest_buf[0],
7917 digest_buf[1],
7918 digest_buf[2],
7919 digest_buf[3]);
7920
7921 char response[100] = { 0 };
7922
7923 base64_encode (int_to_base64, (const u8 *) tmp_buf, tmp_len, (u8 *) response);
7924
7925 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CRAM_MD5, challenge, response);
7926 }
7927 else if (hash_mode == 10300)
7928 {
7929 char tmp_buf[100] = { 0 };
7930
7931 memcpy (tmp_buf + 0, digest_buf, 20);
7932 memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len);
7933
7934 uint tmp_len = 20 + salt.salt_len;
7935
7936 // base64 encode it
7937
7938 char base64_encoded[100] = { 0 };
7939
7940 base64_encode (int_to_base64, (const u8 *) tmp_buf, tmp_len, (u8 *) base64_encoded);
7941
7942 snprintf (out_buf, len-1, "%s%i}%s", SIGNATURE_SAPH_SHA1, salt.salt_iter + 1, base64_encoded);
7943 }
7944 else if (hash_mode == 10400)
7945 {
7946 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7947
7948 pdf_t *pdf = &pdfs[salt_pos];
7949
7950 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",
7951
7952 pdf->V,
7953 pdf->R,
7954 40,
7955 pdf->P,
7956 pdf->enc_md,
7957 pdf->id_len,
7958 byte_swap_32 (pdf->id_buf[0]),
7959 byte_swap_32 (pdf->id_buf[1]),
7960 byte_swap_32 (pdf->id_buf[2]),
7961 byte_swap_32 (pdf->id_buf[3]),
7962 pdf->u_len,
7963 byte_swap_32 (pdf->u_buf[0]),
7964 byte_swap_32 (pdf->u_buf[1]),
7965 byte_swap_32 (pdf->u_buf[2]),
7966 byte_swap_32 (pdf->u_buf[3]),
7967 byte_swap_32 (pdf->u_buf[4]),
7968 byte_swap_32 (pdf->u_buf[5]),
7969 byte_swap_32 (pdf->u_buf[6]),
7970 byte_swap_32 (pdf->u_buf[7]),
7971 pdf->o_len,
7972 byte_swap_32 (pdf->o_buf[0]),
7973 byte_swap_32 (pdf->o_buf[1]),
7974 byte_swap_32 (pdf->o_buf[2]),
7975 byte_swap_32 (pdf->o_buf[3]),
7976 byte_swap_32 (pdf->o_buf[4]),
7977 byte_swap_32 (pdf->o_buf[5]),
7978 byte_swap_32 (pdf->o_buf[6]),
7979 byte_swap_32 (pdf->o_buf[7])
7980 );
7981 }
7982 else if (hash_mode == 10410)
7983 {
7984 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7985
7986 pdf_t *pdf = &pdfs[salt_pos];
7987
7988 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",
7989
7990 pdf->V,
7991 pdf->R,
7992 40,
7993 pdf->P,
7994 pdf->enc_md,
7995 pdf->id_len,
7996 byte_swap_32 (pdf->id_buf[0]),
7997 byte_swap_32 (pdf->id_buf[1]),
7998 byte_swap_32 (pdf->id_buf[2]),
7999 byte_swap_32 (pdf->id_buf[3]),
8000 pdf->u_len,
8001 byte_swap_32 (pdf->u_buf[0]),
8002 byte_swap_32 (pdf->u_buf[1]),
8003 byte_swap_32 (pdf->u_buf[2]),
8004 byte_swap_32 (pdf->u_buf[3]),
8005 byte_swap_32 (pdf->u_buf[4]),
8006 byte_swap_32 (pdf->u_buf[5]),
8007 byte_swap_32 (pdf->u_buf[6]),
8008 byte_swap_32 (pdf->u_buf[7]),
8009 pdf->o_len,
8010 byte_swap_32 (pdf->o_buf[0]),
8011 byte_swap_32 (pdf->o_buf[1]),
8012 byte_swap_32 (pdf->o_buf[2]),
8013 byte_swap_32 (pdf->o_buf[3]),
8014 byte_swap_32 (pdf->o_buf[4]),
8015 byte_swap_32 (pdf->o_buf[5]),
8016 byte_swap_32 (pdf->o_buf[6]),
8017 byte_swap_32 (pdf->o_buf[7])
8018 );
8019 }
8020 else if (hash_mode == 10420)
8021 {
8022 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
8023
8024 pdf_t *pdf = &pdfs[salt_pos];
8025
8026 u8 *rc4key = (u8 *) pdf->rc4key;
8027
8028 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",
8029
8030 pdf->V,
8031 pdf->R,
8032 40,
8033 pdf->P,
8034 pdf->enc_md,
8035 pdf->id_len,
8036 byte_swap_32 (pdf->id_buf[0]),
8037 byte_swap_32 (pdf->id_buf[1]),
8038 byte_swap_32 (pdf->id_buf[2]),
8039 byte_swap_32 (pdf->id_buf[3]),
8040 pdf->u_len,
8041 byte_swap_32 (pdf->u_buf[0]),
8042 byte_swap_32 (pdf->u_buf[1]),
8043 byte_swap_32 (pdf->u_buf[2]),
8044 byte_swap_32 (pdf->u_buf[3]),
8045 byte_swap_32 (pdf->u_buf[4]),
8046 byte_swap_32 (pdf->u_buf[5]),
8047 byte_swap_32 (pdf->u_buf[6]),
8048 byte_swap_32 (pdf->u_buf[7]),
8049 pdf->o_len,
8050 byte_swap_32 (pdf->o_buf[0]),
8051 byte_swap_32 (pdf->o_buf[1]),
8052 byte_swap_32 (pdf->o_buf[2]),
8053 byte_swap_32 (pdf->o_buf[3]),
8054 byte_swap_32 (pdf->o_buf[4]),
8055 byte_swap_32 (pdf->o_buf[5]),
8056 byte_swap_32 (pdf->o_buf[6]),
8057 byte_swap_32 (pdf->o_buf[7]),
8058 rc4key[0],
8059 rc4key[1],
8060 rc4key[2],
8061 rc4key[3],
8062 rc4key[4]
8063 );
8064 }
8065 else if (hash_mode == 10500)
8066 {
8067 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
8068
8069 pdf_t *pdf = &pdfs[salt_pos];
8070
8071 if (pdf->id_len == 32)
8072 {
8073 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",
8074
8075 pdf->V,
8076 pdf->R,
8077 128,
8078 pdf->P,
8079 pdf->enc_md,
8080 pdf->id_len,
8081 byte_swap_32 (pdf->id_buf[0]),
8082 byte_swap_32 (pdf->id_buf[1]),
8083 byte_swap_32 (pdf->id_buf[2]),
8084 byte_swap_32 (pdf->id_buf[3]),
8085 byte_swap_32 (pdf->id_buf[4]),
8086 byte_swap_32 (pdf->id_buf[5]),
8087 byte_swap_32 (pdf->id_buf[6]),
8088 byte_swap_32 (pdf->id_buf[7]),
8089 pdf->u_len,
8090 byte_swap_32 (pdf->u_buf[0]),
8091 byte_swap_32 (pdf->u_buf[1]),
8092 byte_swap_32 (pdf->u_buf[2]),
8093 byte_swap_32 (pdf->u_buf[3]),
8094 byte_swap_32 (pdf->u_buf[4]),
8095 byte_swap_32 (pdf->u_buf[5]),
8096 byte_swap_32 (pdf->u_buf[6]),
8097 byte_swap_32 (pdf->u_buf[7]),
8098 pdf->o_len,
8099 byte_swap_32 (pdf->o_buf[0]),
8100 byte_swap_32 (pdf->o_buf[1]),
8101 byte_swap_32 (pdf->o_buf[2]),
8102 byte_swap_32 (pdf->o_buf[3]),
8103 byte_swap_32 (pdf->o_buf[4]),
8104 byte_swap_32 (pdf->o_buf[5]),
8105 byte_swap_32 (pdf->o_buf[6]),
8106 byte_swap_32 (pdf->o_buf[7])
8107 );
8108 }
8109 else
8110 {
8111 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",
8112
8113 pdf->V,
8114 pdf->R,
8115 128,
8116 pdf->P,
8117 pdf->enc_md,
8118 pdf->id_len,
8119 byte_swap_32 (pdf->id_buf[0]),
8120 byte_swap_32 (pdf->id_buf[1]),
8121 byte_swap_32 (pdf->id_buf[2]),
8122 byte_swap_32 (pdf->id_buf[3]),
8123 pdf->u_len,
8124 byte_swap_32 (pdf->u_buf[0]),
8125 byte_swap_32 (pdf->u_buf[1]),
8126 byte_swap_32 (pdf->u_buf[2]),
8127 byte_swap_32 (pdf->u_buf[3]),
8128 byte_swap_32 (pdf->u_buf[4]),
8129 byte_swap_32 (pdf->u_buf[5]),
8130 byte_swap_32 (pdf->u_buf[6]),
8131 byte_swap_32 (pdf->u_buf[7]),
8132 pdf->o_len,
8133 byte_swap_32 (pdf->o_buf[0]),
8134 byte_swap_32 (pdf->o_buf[1]),
8135 byte_swap_32 (pdf->o_buf[2]),
8136 byte_swap_32 (pdf->o_buf[3]),
8137 byte_swap_32 (pdf->o_buf[4]),
8138 byte_swap_32 (pdf->o_buf[5]),
8139 byte_swap_32 (pdf->o_buf[6]),
8140 byte_swap_32 (pdf->o_buf[7])
8141 );
8142 }
8143 }
8144 else if (hash_mode == 10600)
8145 {
8146 uint digest_idx = salt.digests_offset + digest_pos;
8147
8148 hashinfo_t **hashinfo_ptr = data.hash_info;
8149 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8150
8151 snprintf (out_buf, len-1, "%s", hash_buf);
8152 }
8153 else if (hash_mode == 10700)
8154 {
8155 uint digest_idx = salt.digests_offset + digest_pos;
8156
8157 hashinfo_t **hashinfo_ptr = data.hash_info;
8158 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8159
8160 snprintf (out_buf, len-1, "%s", hash_buf);
8161 }
8162 else if (hash_mode == 10900)
8163 {
8164 uint digest_idx = salt.digests_offset + digest_pos;
8165
8166 hashinfo_t **hashinfo_ptr = data.hash_info;
8167 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8168
8169 snprintf (out_buf, len-1, "%s", hash_buf);
8170 }
8171 else if (hash_mode == 11100)
8172 {
8173 u32 salt_challenge = salt.salt_buf[0];
8174
8175 salt_challenge = byte_swap_32 (salt_challenge);
8176
8177 unsigned char *user_name = (unsigned char *) (salt.salt_buf + 1);
8178
8179 snprintf (out_buf, len-1, "%s%s*%08x*%08x%08x%08x%08x",
8180 SIGNATURE_POSTGRESQL_AUTH,
8181 user_name,
8182 salt_challenge,
8183 digest_buf[0],
8184 digest_buf[1],
8185 digest_buf[2],
8186 digest_buf[3]);
8187 }
8188 else if (hash_mode == 11200)
8189 {
8190 snprintf (out_buf, len-1, "%s%s*%08x%08x%08x%08x%08x",
8191 SIGNATURE_MYSQL_AUTH,
8192 (unsigned char *) salt.salt_buf,
8193 digest_buf[0],
8194 digest_buf[1],
8195 digest_buf[2],
8196 digest_buf[3],
8197 digest_buf[4]);
8198 }
8199 else if (hash_mode == 11300)
8200 {
8201 bitcoin_wallet_t *bitcoin_wallets = (bitcoin_wallet_t *) data.esalts_buf;
8202
8203 bitcoin_wallet_t *bitcoin_wallet = &bitcoin_wallets[salt_pos];
8204
8205 const uint cry_master_len = bitcoin_wallet->cry_master_len;
8206 const uint ckey_len = bitcoin_wallet->ckey_len;
8207 const uint public_key_len = bitcoin_wallet->public_key_len;
8208
8209 char *cry_master_buf = (char *) mymalloc ((cry_master_len * 2) + 1);
8210 char *ckey_buf = (char *) mymalloc ((ckey_len * 2) + 1);
8211 char *public_key_buf = (char *) mymalloc ((public_key_len * 2) + 1);
8212
8213 for (uint i = 0, j = 0; i < cry_master_len; i += 1, j += 2)
8214 {
8215 const u8 *ptr = (const u8 *) bitcoin_wallet->cry_master_buf;
8216
8217 sprintf (cry_master_buf + j, "%02x", ptr[i]);
8218 }
8219
8220 for (uint i = 0, j = 0; i < ckey_len; i += 1, j += 2)
8221 {
8222 const u8 *ptr = (const u8 *) bitcoin_wallet->ckey_buf;
8223
8224 sprintf (ckey_buf + j, "%02x", ptr[i]);
8225 }
8226
8227 for (uint i = 0, j = 0; i < public_key_len; i += 1, j += 2)
8228 {
8229 const u8 *ptr = (const u8 *) bitcoin_wallet->public_key_buf;
8230
8231 sprintf (public_key_buf + j, "%02x", ptr[i]);
8232 }
8233
8234 snprintf (out_buf, len-1, "%s%d$%s$%d$%s$%d$%d$%s$%d$%s",
8235 SIGNATURE_BITCOIN_WALLET,
8236 cry_master_len * 2,
8237 cry_master_buf,
8238 salt.salt_len,
8239 (unsigned char *) salt.salt_buf,
8240 salt.salt_iter + 1,
8241 ckey_len * 2,
8242 ckey_buf,
8243 public_key_len * 2,
8244 public_key_buf
8245 );
8246
8247 free (cry_master_buf);
8248 free (ckey_buf);
8249 free (public_key_buf);
8250 }
8251 else if (hash_mode == 11400)
8252 {
8253 uint digest_idx = salt.digests_offset + digest_pos;
8254
8255 hashinfo_t **hashinfo_ptr = data.hash_info;
8256 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8257
8258 snprintf (out_buf, len-1, "%s", hash_buf);
8259 }
8260 else if (hash_mode == 11600)
8261 {
8262 seven_zip_t *seven_zips = (seven_zip_t *) data.esalts_buf;
8263
8264 seven_zip_t *seven_zip = &seven_zips[salt_pos];
8265
8266 const uint data_len = seven_zip->data_len;
8267
8268 char *data_buf = (char *) mymalloc ((data_len * 2) + 1);
8269
8270 for (uint i = 0, j = 0; i < data_len; i += 1, j += 2)
8271 {
8272 const u8 *ptr = (const u8 *) seven_zip->data_buf;
8273
8274 sprintf (data_buf + j, "%02x", ptr[i]);
8275 }
8276
8277 snprintf (out_buf, len-1, "%s%u$%u$%u$%s$%u$%08x%08x%08x%08x$%u$%u$%u$%s",
8278 SIGNATURE_SEVEN_ZIP,
8279 0,
8280 salt.salt_sign[0],
8281 0,
8282 (char *) seven_zip->salt_buf,
8283 seven_zip->iv_len,
8284 seven_zip->iv_buf[0],
8285 seven_zip->iv_buf[1],
8286 seven_zip->iv_buf[2],
8287 seven_zip->iv_buf[3],
8288 seven_zip->crc,
8289 seven_zip->data_len,
8290 seven_zip->unpack_size,
8291 data_buf);
8292
8293 free (data_buf);
8294 }
8295 else if (hash_mode == 11700)
8296 {
8297 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8298 digest_buf[0],
8299 digest_buf[1],
8300 digest_buf[2],
8301 digest_buf[3],
8302 digest_buf[4],
8303 digest_buf[5],
8304 digest_buf[6],
8305 digest_buf[7]);
8306 }
8307 else if (hash_mode == 11800)
8308 {
8309 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8310 digest_buf[ 0],
8311 digest_buf[ 1],
8312 digest_buf[ 2],
8313 digest_buf[ 3],
8314 digest_buf[ 4],
8315 digest_buf[ 5],
8316 digest_buf[ 6],
8317 digest_buf[ 7],
8318 digest_buf[ 8],
8319 digest_buf[ 9],
8320 digest_buf[10],
8321 digest_buf[11],
8322 digest_buf[12],
8323 digest_buf[13],
8324 digest_buf[14],
8325 digest_buf[15]);
8326 }
8327 else if (hash_mode == 11900)
8328 {
8329 uint digest_idx = salt.digests_offset + digest_pos;
8330
8331 hashinfo_t **hashinfo_ptr = data.hash_info;
8332 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8333
8334 snprintf (out_buf, len-1, "%s", hash_buf);
8335 }
8336 else if (hash_mode == 12000)
8337 {
8338 uint digest_idx = salt.digests_offset + digest_pos;
8339
8340 hashinfo_t **hashinfo_ptr = data.hash_info;
8341 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8342
8343 snprintf (out_buf, len-1, "%s", hash_buf);
8344 }
8345 else if (hash_mode == 12100)
8346 {
8347 uint digest_idx = salt.digests_offset + digest_pos;
8348
8349 hashinfo_t **hashinfo_ptr = data.hash_info;
8350 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8351
8352 snprintf (out_buf, len-1, "%s", hash_buf);
8353 }
8354 else if (hash_mode == 12200)
8355 {
8356 uint *ptr_digest = digest_buf;
8357 uint *ptr_salt = salt.salt_buf;
8358
8359 snprintf (out_buf, len-1, "%s0$1$%08x%08x$%08x%08x",
8360 SIGNATURE_ECRYPTFS,
8361 ptr_salt[0],
8362 ptr_salt[1],
8363 ptr_digest[0],
8364 ptr_digest[1]);
8365 }
8366 else if (hash_mode == 12300)
8367 {
8368 uint *ptr_digest = digest_buf;
8369 uint *ptr_salt = salt.salt_buf;
8370
8371 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",
8372 ptr_digest[ 0], ptr_digest[ 1],
8373 ptr_digest[ 2], ptr_digest[ 3],
8374 ptr_digest[ 4], ptr_digest[ 5],
8375 ptr_digest[ 6], ptr_digest[ 7],
8376 ptr_digest[ 8], ptr_digest[ 9],
8377 ptr_digest[10], ptr_digest[11],
8378 ptr_digest[12], ptr_digest[13],
8379 ptr_digest[14], ptr_digest[15],
8380 ptr_salt[0],
8381 ptr_salt[1],
8382 ptr_salt[2],
8383 ptr_salt[3]);
8384 }
8385 else if (hash_mode == 12400)
8386 {
8387 // encode iteration count
8388
8389 char salt_iter[5] = { 0 };
8390
8391 salt_iter[0] = int_to_itoa64 ((salt.salt_iter ) & 0x3f);
8392 salt_iter[1] = int_to_itoa64 ((salt.salt_iter >> 6) & 0x3f);
8393 salt_iter[2] = int_to_itoa64 ((salt.salt_iter >> 12) & 0x3f);
8394 salt_iter[3] = int_to_itoa64 ((salt.salt_iter >> 18) & 0x3f);
8395 salt_iter[4] = 0;
8396
8397 // encode salt
8398
8399 ptr_salt[0] = int_to_itoa64 ((salt.salt_buf[0] ) & 0x3f);
8400 ptr_salt[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f);
8401 ptr_salt[2] = int_to_itoa64 ((salt.salt_buf[0] >> 12) & 0x3f);
8402 ptr_salt[3] = int_to_itoa64 ((salt.salt_buf[0] >> 18) & 0x3f);
8403 ptr_salt[4] = 0;
8404
8405 // encode digest
8406
8407 memset (tmp_buf, 0, sizeof (tmp_buf));
8408
8409 digest_buf[0] = byte_swap_32 (digest_buf[0]);
8410 digest_buf[1] = byte_swap_32 (digest_buf[1]);
8411
8412 memcpy (tmp_buf, digest_buf, 8);
8413
8414 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 8, (u8 *) ptr_plain);
8415
8416 ptr_plain[11] = 0;
8417
8418 // fill the resulting buffer
8419
8420 snprintf (out_buf, len - 1, "_%s%s%s", salt_iter, ptr_salt, ptr_plain);
8421 }
8422 else if (hash_mode == 12500)
8423 {
8424 snprintf (out_buf, len - 1, "%s*0*%08x%08x*%08x%08x%08x%08x",
8425 SIGNATURE_RAR3,
8426 byte_swap_32 (salt.salt_buf[0]),
8427 byte_swap_32 (salt.salt_buf[1]),
8428 salt.salt_buf[2],
8429 salt.salt_buf[3],
8430 salt.salt_buf[4],
8431 salt.salt_buf[5]);
8432 }
8433 else if (hash_mode == 12600)
8434 {
8435 snprintf (out_buf, len - 1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8436 digest_buf[0] + salt.salt_buf_pc[0],
8437 digest_buf[1] + salt.salt_buf_pc[1],
8438 digest_buf[2] + salt.salt_buf_pc[2],
8439 digest_buf[3] + salt.salt_buf_pc[3],
8440 digest_buf[4] + salt.salt_buf_pc[4],
8441 digest_buf[5] + salt.salt_buf_pc[5],
8442 digest_buf[6] + salt.salt_buf_pc[6],
8443 digest_buf[7] + salt.salt_buf_pc[7]);
8444 }
8445 else if (hash_mode == 12700)
8446 {
8447 uint digest_idx = salt.digests_offset + digest_pos;
8448
8449 hashinfo_t **hashinfo_ptr = data.hash_info;
8450 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8451
8452 snprintf (out_buf, len-1, "%s", hash_buf);
8453 }
8454 else if (hash_mode == 12800)
8455 {
8456 const u8 *ptr = (const u8 *) salt.salt_buf;
8457
8458 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",
8459 SIGNATURE_MS_DRSR,
8460 ptr[0],
8461 ptr[1],
8462 ptr[2],
8463 ptr[3],
8464 ptr[4],
8465 ptr[5],
8466 ptr[6],
8467 ptr[7],
8468 ptr[8],
8469 ptr[9],
8470 salt.salt_iter + 1,
8471 byte_swap_32 (digest_buf[0]),
8472 byte_swap_32 (digest_buf[1]),
8473 byte_swap_32 (digest_buf[2]),
8474 byte_swap_32 (digest_buf[3]),
8475 byte_swap_32 (digest_buf[4]),
8476 byte_swap_32 (digest_buf[5]),
8477 byte_swap_32 (digest_buf[6]),
8478 byte_swap_32 (digest_buf[7])
8479 );
8480 }
8481 else if (hash_mode == 12900)
8482 {
8483 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",
8484 salt.salt_buf[ 4],
8485 salt.salt_buf[ 5],
8486 salt.salt_buf[ 6],
8487 salt.salt_buf[ 7],
8488 salt.salt_buf[ 8],
8489 salt.salt_buf[ 9],
8490 salt.salt_buf[10],
8491 salt.salt_buf[11],
8492 byte_swap_32 (digest_buf[0]),
8493 byte_swap_32 (digest_buf[1]),
8494 byte_swap_32 (digest_buf[2]),
8495 byte_swap_32 (digest_buf[3]),
8496 byte_swap_32 (digest_buf[4]),
8497 byte_swap_32 (digest_buf[5]),
8498 byte_swap_32 (digest_buf[6]),
8499 byte_swap_32 (digest_buf[7]),
8500 salt.salt_buf[ 0],
8501 salt.salt_buf[ 1],
8502 salt.salt_buf[ 2],
8503 salt.salt_buf[ 3]
8504 );
8505 }
8506 else if (hash_mode == 13000)
8507 {
8508 rar5_t *rar5s = (rar5_t *) data.esalts_buf;
8509
8510 rar5_t *rar5 = &rar5s[salt_pos];
8511
8512 snprintf (out_buf, len-1, "$rar5$16$%08x%08x%08x%08x$%u$%08x%08x%08x%08x$8$%08x%08x",
8513 salt.salt_buf[0],
8514 salt.salt_buf[1],
8515 salt.salt_buf[2],
8516 salt.salt_buf[3],
8517 salt.salt_sign[0],
8518 rar5->iv[0],
8519 rar5->iv[1],
8520 rar5->iv[2],
8521 rar5->iv[3],
8522 byte_swap_32 (digest_buf[0]),
8523 byte_swap_32 (digest_buf[1])
8524 );
8525 }
8526 else if (hash_mode == 13100)
8527 {
8528 krb5tgs_t *krb5tgss = (krb5tgs_t *) data.esalts_buf;
8529
8530 krb5tgs_t *krb5tgs = &krb5tgss[salt_pos];
8531
8532 u8 *ptr_checksum = (u8 *) krb5tgs->checksum;
8533 u8 *ptr_edata2 = (u8 *) krb5tgs->edata2;
8534
8535 char data[2560 * 4 * 2] = { 0 };
8536
8537 char *ptr_data = data;
8538
8539 for (uint i = 0; i < 16; i++, ptr_data += 2)
8540 sprintf (ptr_data, "%02x", ptr_checksum[i]);
8541
8542 /* skip '$' */
8543 ptr_data++;
8544
8545 for (uint i = 0; i < krb5tgs->edata2_len; i++, ptr_data += 2)
8546 sprintf (ptr_data, "%02x", ptr_edata2[i]);
8547
8548 snprintf (out_buf, len-1, "%s$%s$%s$%s",
8549 SIGNATURE_KRB5TGS,
8550 (char *) krb5tgs->account_info,
8551 data,
8552 data + 33);
8553 }
8554 else if (hash_mode == 13200)
8555 {
8556 snprintf (out_buf, len-1, "%s*%d*%08x%08x%08x%08x*%08x%08x%08x%08x%08x%08x",
8557 SIGNATURE_AXCRYPT,
8558 salt.salt_iter,
8559 salt.salt_buf[0],
8560 salt.salt_buf[1],
8561 salt.salt_buf[2],
8562 salt.salt_buf[3],
8563 salt.salt_buf[4],
8564 salt.salt_buf[5],
8565 salt.salt_buf[6],
8566 salt.salt_buf[7],
8567 salt.salt_buf[8],
8568 salt.salt_buf[9]);
8569 }
8570 else if (hash_mode == 13300)
8571 {
8572 snprintf (out_buf, len-1, "%s$%08x%08x%08x%08x",
8573 SIGNATURE_AXCRYPT_SHA1,
8574 digest_buf[0],
8575 digest_buf[1],
8576 digest_buf[2],
8577 digest_buf[3]);
8578 }
8579 else if (hash_mode == 13400)
8580 {
8581 keepass_t *keepasss = (keepass_t *) data.esalts_buf;
8582
8583 keepass_t *keepass = &keepasss[salt_pos];
8584
8585 u32 version = (u32) keepass->version;
8586 u32 rounds = salt.salt_iter;
8587 u32 algorithm = (u32) keepass->algorithm;
8588 u32 keyfile_len = (u32) keepass->keyfile_len;
8589
8590 u32 *ptr_final_random_seed = (u32 *) keepass->final_random_seed ;
8591 u32 *ptr_transf_random_seed = (u32 *) keepass->transf_random_seed ;
8592 u32 *ptr_enc_iv = (u32 *) keepass->enc_iv ;
8593 u32 *ptr_contents_hash = (u32 *) keepass->contents_hash ;
8594 u32 *ptr_keyfile = (u32 *) keepass->keyfile ;
8595
8596 /* specific to version 1 */
8597 u32 contents_len;
8598 u32 *ptr_contents;
8599
8600 /* specific to version 2 */
8601 u32 expected_bytes_len;
8602 u32 *ptr_expected_bytes;
8603
8604 u32 final_random_seed_len;
8605 u32 transf_random_seed_len;
8606 u32 enc_iv_len;
8607 u32 contents_hash_len;
8608
8609 transf_random_seed_len = 8;
8610 enc_iv_len = 4;
8611 contents_hash_len = 8;
8612 final_random_seed_len = 8;
8613
8614 if (version == 1)
8615 final_random_seed_len = 4;
8616
8617 snprintf (out_buf, len-1, "%s*%d*%d*%d",
8618 SIGNATURE_KEEPASS,
8619 version,
8620 rounds,
8621 algorithm);
8622
8623 char *ptr_data = out_buf;
8624
8625 ptr_data += strlen(out_buf);
8626
8627 *ptr_data = '*';
8628 ptr_data++;
8629
8630 for (uint i = 0; i < final_random_seed_len; i++, ptr_data += 8)
8631 sprintf (ptr_data, "%08x", ptr_final_random_seed[i]);
8632
8633 *ptr_data = '*';
8634 ptr_data++;
8635
8636 for (uint i = 0; i < transf_random_seed_len; i++, ptr_data += 8)
8637 sprintf (ptr_data, "%08x", ptr_transf_random_seed[i]);
8638
8639 *ptr_data = '*';
8640 ptr_data++;
8641
8642 for (uint i = 0; i < enc_iv_len; i++, ptr_data += 8)
8643 sprintf (ptr_data, "%08x", ptr_enc_iv[i]);
8644
8645 *ptr_data = '*';
8646 ptr_data++;
8647
8648 if (version == 1)
8649 {
8650 contents_len = (u32) keepass->contents_len;
8651 ptr_contents = (u32 *) keepass->contents;
8652
8653 for (uint i = 0; i < contents_hash_len; i++, ptr_data += 8)
8654 sprintf (ptr_data, "%08x", ptr_contents_hash[i]);
8655
8656 *ptr_data = '*';
8657 ptr_data++;
8658
8659 /* inline flag */
8660 *ptr_data = '1';
8661 ptr_data++;
8662
8663 *ptr_data = '*';
8664 ptr_data++;
8665
8666 char ptr_contents_len[10] = { 0 };
8667
8668 sprintf ((char*) ptr_contents_len, "%d", contents_len);
8669
8670 sprintf (ptr_data, "%d", contents_len);
8671
8672 ptr_data += strlen(ptr_contents_len);
8673
8674 *ptr_data = '*';
8675 ptr_data++;
8676
8677 for (uint i = 0; i < contents_len / 4; i++, ptr_data += 8)
8678 sprintf (ptr_data, "%08x", ptr_contents[i]);
8679 }
8680 else if (version == 2)
8681 {
8682 expected_bytes_len = 8;
8683 ptr_expected_bytes = (u32 *) keepass->expected_bytes ;
8684
8685 for (uint i = 0; i < expected_bytes_len; i++, ptr_data += 8)
8686 sprintf (ptr_data, "%08x", ptr_expected_bytes[i]);
8687
8688 *ptr_data = '*';
8689 ptr_data++;
8690
8691 for (uint i = 0; i < contents_hash_len; i++, ptr_data += 8)
8692 sprintf (ptr_data, "%08x", ptr_contents_hash[i]);
8693 }
8694 if (keyfile_len)
8695 {
8696 *ptr_data = '*';
8697 ptr_data++;
8698
8699 /* inline flag */
8700 *ptr_data = '1';
8701 ptr_data++;
8702
8703 *ptr_data = '*';
8704 ptr_data++;
8705
8706 sprintf (ptr_data, "%d", keyfile_len);
8707
8708 ptr_data += 2;
8709
8710 *ptr_data = '*';
8711 ptr_data++;
8712
8713 for (uint i = 0; i < 8; i++, ptr_data += 8)
8714 sprintf (ptr_data, "%08x", ptr_keyfile[i]);
8715 }
8716 }
8717 else if (hash_mode == 13500)
8718 {
8719 pstoken_t *pstokens = (pstoken_t *) data.esalts_buf;
8720
8721 pstoken_t *pstoken = &pstokens[salt_pos];
8722
8723 const u32 salt_len = (pstoken->salt_len > 512) ? 512 : pstoken->salt_len;
8724
8725 char pstoken_tmp[1024 + 1] = { 0 };
8726
8727 for (uint i = 0, j = 0; i < salt_len; i += 1, j += 2)
8728 {
8729 const u8 *ptr = (const u8 *) pstoken->salt_buf;
8730
8731 sprintf (pstoken_tmp + j, "%02x", ptr[i]);
8732 }
8733
8734 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x:%s",
8735 digest_buf[0],
8736 digest_buf[1],
8737 digest_buf[2],
8738 digest_buf[3],
8739 digest_buf[4],
8740 pstoken_tmp);
8741 }
8742 else if (hash_mode == 13600)
8743 {
8744 zip2_t *zip2s = (zip2_t *) data.esalts_buf;
8745
8746 zip2_t *zip2 = &zip2s[salt_pos];
8747
8748 const u32 salt_len = zip2->salt_len;
8749
8750 char salt_tmp[32 + 1] = { 0 };
8751
8752 for (uint i = 0, j = 0; i < salt_len; i += 1, j += 2)
8753 {
8754 const u8 *ptr = (const u8 *) zip2->salt_buf;
8755
8756 sprintf (salt_tmp + j, "%02x", ptr[i]);
8757 }
8758
8759 const u32 data_len = zip2->data_len;
8760
8761 char data_tmp[8192 + 1] = { 0 };
8762
8763 for (uint i = 0, j = 0; i < data_len; i += 1, j += 2)
8764 {
8765 const u8 *ptr = (const u8 *) zip2->data_buf;
8766
8767 sprintf (data_tmp + j, "%02x", ptr[i]);
8768 }
8769
8770 const u32 auth_len = zip2->auth_len;
8771
8772 char auth_tmp[20 + 1] = { 0 };
8773
8774 for (uint i = 0, j = 0; i < auth_len; i += 1, j += 2)
8775 {
8776 const u8 *ptr = (const u8 *) zip2->auth_buf;
8777
8778 sprintf (auth_tmp + j, "%02x", ptr[i]);
8779 }
8780
8781 snprintf (out_buf, 255, "%s*%u*%u*%u*%s*%x*%u*%s*%s*%s",
8782 SIGNATURE_ZIP2_START,
8783 zip2->type,
8784 zip2->mode,
8785 zip2->magic,
8786 salt_tmp,
8787 zip2->verify_bytes,
8788 zip2->compress_length,
8789 data_tmp,
8790 auth_tmp,
8791 SIGNATURE_ZIP2_STOP);
8792 }
8793 else if ((hash_mode >= 13700) && (hash_mode <= 13799))
8794 {
8795 snprintf (out_buf, len-1, "%s", hashfile);
8796 }
8797 else
8798 {
8799 if (hash_type == HASH_TYPE_MD4)
8800 {
8801 snprintf (out_buf, 255, "%08x%08x%08x%08x",
8802 digest_buf[0],
8803 digest_buf[1],
8804 digest_buf[2],
8805 digest_buf[3]);
8806 }
8807 else if (hash_type == HASH_TYPE_MD5)
8808 {
8809 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
8810 digest_buf[0],
8811 digest_buf[1],
8812 digest_buf[2],
8813 digest_buf[3]);
8814 }
8815 else if (hash_type == HASH_TYPE_SHA1)
8816 {
8817 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
8818 digest_buf[0],
8819 digest_buf[1],
8820 digest_buf[2],
8821 digest_buf[3],
8822 digest_buf[4]);
8823 }
8824 else if (hash_type == HASH_TYPE_SHA256)
8825 {
8826 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8827 digest_buf[0],
8828 digest_buf[1],
8829 digest_buf[2],
8830 digest_buf[3],
8831 digest_buf[4],
8832 digest_buf[5],
8833 digest_buf[6],
8834 digest_buf[7]);
8835 }
8836 else if (hash_type == HASH_TYPE_SHA384)
8837 {
8838 uint *ptr = digest_buf;
8839
8840 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8841 ptr[ 1], ptr[ 0],
8842 ptr[ 3], ptr[ 2],
8843 ptr[ 5], ptr[ 4],
8844 ptr[ 7], ptr[ 6],
8845 ptr[ 9], ptr[ 8],
8846 ptr[11], ptr[10]);
8847 }
8848 else if (hash_type == HASH_TYPE_SHA512)
8849 {
8850 uint *ptr = digest_buf;
8851
8852 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8853 ptr[ 1], ptr[ 0],
8854 ptr[ 3], ptr[ 2],
8855 ptr[ 5], ptr[ 4],
8856 ptr[ 7], ptr[ 6],
8857 ptr[ 9], ptr[ 8],
8858 ptr[11], ptr[10],
8859 ptr[13], ptr[12],
8860 ptr[15], ptr[14]);
8861 }
8862 else if (hash_type == HASH_TYPE_LM)
8863 {
8864 snprintf (out_buf, len-1, "%08x%08x",
8865 digest_buf[0],
8866 digest_buf[1]);
8867 }
8868 else if (hash_type == HASH_TYPE_ORACLEH)
8869 {
8870 snprintf (out_buf, len-1, "%08X%08X",
8871 digest_buf[0],
8872 digest_buf[1]);
8873 }
8874 else if (hash_type == HASH_TYPE_BCRYPT)
8875 {
8876 base64_encode (int_to_bf64, (const u8 *) salt.salt_buf, 16, (u8 *) tmp_buf + 0);
8877 base64_encode (int_to_bf64, (const u8 *) digest_buf, 23, (u8 *) tmp_buf + 22);
8878
8879 tmp_buf[22 + 31] = 0; // base64_encode wants to pad
8880
8881 snprintf (out_buf, len-1, "%s$%s", (char *) salt.salt_sign, tmp_buf);
8882 }
8883 else if (hash_type == HASH_TYPE_KECCAK)
8884 {
8885 uint *ptr = digest_buf;
8886
8887 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",
8888 ptr[ 1], ptr[ 0],
8889 ptr[ 3], ptr[ 2],
8890 ptr[ 5], ptr[ 4],
8891 ptr[ 7], ptr[ 6],
8892 ptr[ 9], ptr[ 8],
8893 ptr[11], ptr[10],
8894 ptr[13], ptr[12],
8895 ptr[15], ptr[14],
8896 ptr[17], ptr[16],
8897 ptr[19], ptr[18],
8898 ptr[21], ptr[20],
8899 ptr[23], ptr[22],
8900 ptr[25], ptr[24],
8901 ptr[27], ptr[26],
8902 ptr[29], ptr[28],
8903 ptr[31], ptr[30],
8904 ptr[33], ptr[32],
8905 ptr[35], ptr[34],
8906 ptr[37], ptr[36],
8907 ptr[39], ptr[38],
8908 ptr[41], ptr[30],
8909 ptr[43], ptr[42],
8910 ptr[45], ptr[44],
8911 ptr[47], ptr[46],
8912 ptr[49], ptr[48]
8913 );
8914
8915 out_buf[salt.keccak_mdlen * 2] = 0;
8916 }
8917 else if (hash_type == HASH_TYPE_RIPEMD160)
8918 {
8919 snprintf (out_buf, 255, "%08x%08x%08x%08x%08x",
8920 digest_buf[0],
8921 digest_buf[1],
8922 digest_buf[2],
8923 digest_buf[3],
8924 digest_buf[4]);
8925 }
8926 else if (hash_type == HASH_TYPE_WHIRLPOOL)
8927 {
8928 digest_buf[ 0] = digest_buf[ 0];
8929 digest_buf[ 1] = digest_buf[ 1];
8930 digest_buf[ 2] = digest_buf[ 2];
8931 digest_buf[ 3] = digest_buf[ 3];
8932 digest_buf[ 4] = digest_buf[ 4];
8933 digest_buf[ 5] = digest_buf[ 5];
8934 digest_buf[ 6] = digest_buf[ 6];
8935 digest_buf[ 7] = digest_buf[ 7];
8936 digest_buf[ 8] = digest_buf[ 8];
8937 digest_buf[ 9] = digest_buf[ 9];
8938 digest_buf[10] = digest_buf[10];
8939 digest_buf[11] = digest_buf[11];
8940 digest_buf[12] = digest_buf[12];
8941 digest_buf[13] = digest_buf[13];
8942 digest_buf[14] = digest_buf[14];
8943 digest_buf[15] = digest_buf[15];
8944
8945 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8946 digest_buf[ 0],
8947 digest_buf[ 1],
8948 digest_buf[ 2],
8949 digest_buf[ 3],
8950 digest_buf[ 4],
8951 digest_buf[ 5],
8952 digest_buf[ 6],
8953 digest_buf[ 7],
8954 digest_buf[ 8],
8955 digest_buf[ 9],
8956 digest_buf[10],
8957 digest_buf[11],
8958 digest_buf[12],
8959 digest_buf[13],
8960 digest_buf[14],
8961 digest_buf[15]);
8962 }
8963 else if (hash_type == HASH_TYPE_GOST)
8964 {
8965 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8966 digest_buf[0],
8967 digest_buf[1],
8968 digest_buf[2],
8969 digest_buf[3],
8970 digest_buf[4],
8971 digest_buf[5],
8972 digest_buf[6],
8973 digest_buf[7]);
8974 }
8975 else if (hash_type == HASH_TYPE_MYSQL)
8976 {
8977 snprintf (out_buf, len-1, "%08x%08x",
8978 digest_buf[0],
8979 digest_buf[1]);
8980 }
8981 else if (hash_type == HASH_TYPE_LOTUS5)
8982 {
8983 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
8984 digest_buf[0],
8985 digest_buf[1],
8986 digest_buf[2],
8987 digest_buf[3]);
8988 }
8989 else if (hash_type == HASH_TYPE_LOTUS6)
8990 {
8991 digest_buf[ 0] = byte_swap_32 (digest_buf[ 0]);
8992 digest_buf[ 1] = byte_swap_32 (digest_buf[ 1]);
8993 digest_buf[ 2] = byte_swap_32 (digest_buf[ 2]);
8994 digest_buf[ 3] = byte_swap_32 (digest_buf[ 3]);
8995
8996 char buf[16] = { 0 };
8997
8998 memcpy (buf + 0, salt.salt_buf, 5);
8999 memcpy (buf + 5, digest_buf, 9);
9000
9001 buf[3] -= -4;
9002
9003 base64_encode (int_to_lotus64, (const u8 *) buf, 14, (u8 *) tmp_buf);
9004
9005 tmp_buf[18] = salt.salt_buf_pc[7];
9006 tmp_buf[19] = 0;
9007
9008 snprintf (out_buf, len-1, "(G%s)", tmp_buf);
9009 }
9010 else if (hash_type == HASH_TYPE_LOTUS8)
9011 {
9012 char buf[52] = { 0 };
9013
9014 // salt
9015
9016 memcpy (buf + 0, salt.salt_buf, 16);
9017
9018 buf[3] -= -4;
9019
9020 // iteration
9021
9022 snprintf (buf + 16, 11, "%010i", salt.salt_iter + 1);
9023
9024 // chars
9025
9026 buf[26] = salt.salt_buf_pc[0];
9027 buf[27] = salt.salt_buf_pc[1];
9028
9029 // digest
9030
9031 memcpy (buf + 28, digest_buf, 8);
9032
9033 base64_encode (int_to_lotus64, (const u8 *) buf, 36, (u8 *) tmp_buf);
9034
9035 tmp_buf[49] = 0;
9036
9037 snprintf (out_buf, len-1, "(H%s)", tmp_buf);
9038 }
9039 else if (hash_type == HASH_TYPE_CRC32)
9040 {
9041 snprintf (out_buf, len-1, "%08x", byte_swap_32 (digest_buf[0]));
9042 }
9043 }
9044
9045 if (salt_type == SALT_TYPE_INTERN)
9046 {
9047 size_t pos = strlen (out_buf);
9048
9049 out_buf[pos] = data.separator;
9050
9051 char *ptr = (char *) salt.salt_buf;
9052
9053 memcpy (out_buf + pos + 1, ptr, salt.salt_len);
9054
9055 out_buf[pos + 1 + salt.salt_len] = 0;
9056 }
9057 }
9058
9059 void to_hccap_t (hccap_t *hccap, uint salt_pos, uint digest_pos)
9060 {
9061 memset (hccap, 0, sizeof (hccap_t));
9062
9063 salt_t *salt = &data.salts_buf[salt_pos];
9064
9065 memcpy (hccap->essid, salt->salt_buf, salt->salt_len);
9066
9067 wpa_t *wpas = (wpa_t *) data.esalts_buf;
9068 wpa_t *wpa = &wpas[salt_pos];
9069
9070 hccap->keyver = wpa->keyver;
9071
9072 hccap->eapol_size = wpa->eapol_size;
9073
9074 if (wpa->keyver != 1)
9075 {
9076 uint eapol_tmp[64] = { 0 };
9077
9078 for (uint i = 0; i < 64; i++)
9079 {
9080 eapol_tmp[i] = byte_swap_32 (wpa->eapol[i]);
9081 }
9082
9083 memcpy (hccap->eapol, eapol_tmp, wpa->eapol_size);
9084 }
9085 else
9086 {
9087 memcpy (hccap->eapol, wpa->eapol, wpa->eapol_size);
9088 }
9089
9090 memcpy (hccap->mac1, wpa->orig_mac1, 6);
9091 memcpy (hccap->mac2, wpa->orig_mac2, 6);
9092 memcpy (hccap->nonce1, wpa->orig_nonce1, 32);
9093 memcpy (hccap->nonce2, wpa->orig_nonce2, 32);
9094
9095 char *digests_buf_ptr = (char *) data.digests_buf;
9096
9097 uint dgst_size = data.dgst_size;
9098
9099 uint *digest_ptr = (uint *) (digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size));
9100
9101 if (wpa->keyver != 1)
9102 {
9103 uint digest_tmp[4] = { 0 };
9104
9105 digest_tmp[0] = byte_swap_32 (digest_ptr[0]);
9106 digest_tmp[1] = byte_swap_32 (digest_ptr[1]);
9107 digest_tmp[2] = byte_swap_32 (digest_ptr[2]);
9108 digest_tmp[3] = byte_swap_32 (digest_ptr[3]);
9109
9110 memcpy (hccap->keymic, digest_tmp, 16);
9111 }
9112 else
9113 {
9114 memcpy (hccap->keymic, digest_ptr, 16);
9115 }
9116 }
9117
9118 void SuspendThreads ()
9119 {
9120 if (data.devices_status == STATUS_RUNNING)
9121 {
9122 hc_timer_set (&data.timer_paused);
9123
9124 data.devices_status = STATUS_PAUSED;
9125
9126 log_info ("Paused");
9127 }
9128 }
9129
9130 void ResumeThreads ()
9131 {
9132 if (data.devices_status == STATUS_PAUSED)
9133 {
9134 double ms_paused;
9135
9136 hc_timer_get (data.timer_paused, ms_paused);
9137
9138 data.ms_paused += ms_paused;
9139
9140 data.devices_status = STATUS_RUNNING;
9141
9142 log_info ("Resumed");
9143 }
9144 }
9145
9146 void bypass ()
9147 {
9148 if (data.devices_status != STATUS_RUNNING) return;
9149
9150 data.devices_status = STATUS_BYPASS;
9151
9152 log_info ("Next dictionary / mask in queue selected, bypassing current one");
9153 }
9154
9155 void stop_at_checkpoint ()
9156 {
9157 if (data.devices_status != STATUS_STOP_AT_CHECKPOINT)
9158 {
9159 if (data.devices_status != STATUS_RUNNING) return;
9160 }
9161
9162 // this feature only makes sense if --restore-disable was not specified
9163
9164 if (data.restore_disable == 1)
9165 {
9166 log_info ("WARNING: this feature is disabled when --restore-disable was specified");
9167
9168 return;
9169 }
9170
9171 // check if monitoring of Restore Point updates should be enabled or disabled
9172
9173 if (data.devices_status != STATUS_STOP_AT_CHECKPOINT)
9174 {
9175 data.devices_status = STATUS_STOP_AT_CHECKPOINT;
9176
9177 // save the current restore point value
9178
9179 data.checkpoint_cur_words = get_lowest_words_done ();
9180
9181 log_info ("Checkpoint enabled: will quit at next Restore Point update");
9182 }
9183 else
9184 {
9185 data.devices_status = STATUS_RUNNING;
9186
9187 // reset the global value for checkpoint checks
9188
9189 data.checkpoint_cur_words = 0;
9190
9191 log_info ("Checkpoint disabled: Restore Point updates will no longer be monitored");
9192 }
9193 }
9194
9195 void myabort ()
9196 {
9197 if (data.devices_status == STATUS_INIT) return;
9198 if (data.devices_status == STATUS_STARTING) return;
9199
9200 data.devices_status = STATUS_ABORTED;
9201 }
9202
9203 void myquit ()
9204 {
9205 if (data.devices_status == STATUS_INIT) return;
9206 if (data.devices_status == STATUS_STARTING) return;
9207
9208 data.devices_status = STATUS_QUIT;
9209 }
9210
9211 void load_kernel (const char *kernel_file, int num_devices, size_t *kernel_lengths, const u8 **kernel_sources)
9212 {
9213 FILE *fp = fopen (kernel_file, "rb");
9214
9215 if (fp != NULL)
9216 {
9217 struct stat st;
9218
9219 memset (&st, 0, sizeof (st));
9220
9221 stat (kernel_file, &st);
9222
9223 u8 *buf = (u8 *) mymalloc (st.st_size + 1);
9224
9225 size_t num_read = fread (buf, sizeof (u8), st.st_size, fp);
9226
9227 if (num_read != (size_t) st.st_size)
9228 {
9229 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
9230
9231 exit (-1);
9232 }
9233
9234 fclose (fp);
9235
9236 buf[st.st_size] = 0;
9237
9238 for (int i = 0; i < num_devices; i++)
9239 {
9240 kernel_lengths[i] = (size_t) st.st_size;
9241
9242 kernel_sources[i] = buf;
9243 }
9244 }
9245 else
9246 {
9247 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
9248
9249 exit (-1);
9250 }
9251
9252 return;
9253 }
9254
9255 void writeProgramBin (char *dst, u8 *binary, size_t binary_size)
9256 {
9257 if (binary_size > 0)
9258 {
9259 FILE *fp = fopen (dst, "wb");
9260
9261 lock_file (fp);
9262 fwrite (binary, sizeof (u8), binary_size, fp);
9263
9264 fflush (fp);
9265 fclose (fp);
9266 }
9267 }
9268
9269 /**
9270 * restore
9271 */
9272
9273 restore_data_t *init_restore (int argc, char **argv)
9274 {
9275 restore_data_t *rd = (restore_data_t *) mymalloc (sizeof (restore_data_t));
9276
9277 if (data.restore_disable == 0)
9278 {
9279 FILE *fp = fopen (data.eff_restore_file, "rb");
9280
9281 if (fp)
9282 {
9283 size_t nread = fread (rd, sizeof (restore_data_t), 1, fp);
9284
9285 if (nread != 1)
9286 {
9287 log_error ("ERROR: cannot read %s", data.eff_restore_file);
9288
9289 exit (-1);
9290 }
9291
9292 fclose (fp);
9293
9294 if (rd->pid)
9295 {
9296 char *pidbin = (char *) mymalloc (HCBUFSIZ);
9297
9298 int pidbin_len = -1;
9299
9300 #ifdef _POSIX
9301 snprintf (pidbin, HCBUFSIZ - 1, "/proc/%d/cmdline", rd->pid);
9302
9303 FILE *fd = fopen (pidbin, "rb");
9304
9305 if (fd)
9306 {
9307 pidbin_len = fread (pidbin, 1, HCBUFSIZ, fd);
9308
9309 pidbin[pidbin_len] = 0;
9310
9311 fclose (fd);
9312
9313 char *argv0_r = strrchr (argv[0], '/');
9314
9315 char *pidbin_r = strrchr (pidbin, '/');
9316
9317 if (argv0_r == NULL) argv0_r = argv[0];
9318
9319 if (pidbin_r == NULL) pidbin_r = pidbin;
9320
9321 if (strcmp (argv0_r, pidbin_r) == 0)
9322 {
9323 log_error ("ERROR: already an instance %s running on pid %d", pidbin, rd->pid);
9324
9325 exit (-1);
9326 }
9327 }
9328
9329 #elif _WIN
9330 HANDLE hProcess = OpenProcess (PROCESS_ALL_ACCESS, FALSE, rd->pid);
9331
9332 char *pidbin2 = (char *) mymalloc (HCBUFSIZ);
9333
9334 int pidbin2_len = -1;
9335
9336 pidbin_len = GetModuleFileName (NULL, pidbin, HCBUFSIZ);
9337 pidbin2_len = GetModuleFileNameEx (hProcess, NULL, pidbin2, HCBUFSIZ);
9338
9339 pidbin[pidbin_len] = 0;
9340 pidbin2[pidbin2_len] = 0;
9341
9342 if (pidbin2_len)
9343 {
9344 if (strcmp (pidbin, pidbin2) == 0)
9345 {
9346 log_error ("ERROR: already an instance %s running on pid %d", pidbin2, rd->pid);
9347
9348 exit (-1);
9349 }
9350 }
9351
9352 myfree (pidbin2);
9353
9354 #endif
9355
9356 myfree (pidbin);
9357 }
9358
9359 if (rd->version_bin < RESTORE_MIN)
9360 {
9361 log_error ("ERROR: cannot use outdated %s. Please remove it.", data.eff_restore_file);
9362
9363 exit (-1);
9364 }
9365 }
9366 }
9367
9368 memset (rd, 0, sizeof (restore_data_t));
9369
9370 rd->version_bin = VERSION_BIN;
9371
9372 #ifdef _POSIX
9373 rd->pid = getpid ();
9374 #elif _WIN
9375 rd->pid = GetCurrentProcessId ();
9376 #endif
9377
9378 if (getcwd (rd->cwd, 255) == NULL)
9379 {
9380 myfree (rd);
9381
9382 return (NULL);
9383 }
9384
9385 rd->argc = argc;
9386 rd->argv = argv;
9387
9388 return (rd);
9389 }
9390
9391 void read_restore (const char *eff_restore_file, restore_data_t *rd)
9392 {
9393 FILE *fp = fopen (eff_restore_file, "rb");
9394
9395 if (fp == NULL)
9396 {
9397 log_error ("ERROR: restore file '%s': %s", eff_restore_file, strerror (errno));
9398
9399 exit (-1);
9400 }
9401
9402 if (fread (rd, sizeof (restore_data_t), 1, fp) != 1)
9403 {
9404 log_error ("ERROR: cannot read %s", eff_restore_file);
9405
9406 exit (-1);
9407 }
9408
9409 rd->argv = (char **) mycalloc (rd->argc, sizeof (char *));
9410
9411 char *buf = (char *) mymalloc (HCBUFSIZ);
9412
9413 for (uint i = 0; i < rd->argc; i++)
9414 {
9415 if (fgets (buf, HCBUFSIZ - 1, fp) == NULL)
9416 {
9417 log_error ("ERROR: cannot read %s", eff_restore_file);
9418
9419 exit (-1);
9420 }
9421
9422 size_t len = strlen (buf);
9423
9424 if (len) buf[len - 1] = 0;
9425
9426 rd->argv[i] = mystrdup (buf);
9427 }
9428
9429 myfree (buf);
9430
9431 fclose (fp);
9432
9433 log_info ("INFO: Changing current working directory to the path found within the .restore file: '%s'", rd->cwd);
9434
9435 if (chdir (rd->cwd))
9436 {
9437 log_error ("ERROR: The directory '%s' does not exist. It is needed to restore (--restore) the session.\n"
9438 " You could either create this directory (or link it) or update the .restore file using e.g. the analyze_hc_restore.pl tool:\n"
9439 " https://github.com/philsmd/analyze_hc_restore\n"
9440 " The directory must be relative to (or contain) all files/folders mentioned within the command line.", rd->cwd);
9441
9442 exit (-1);
9443 }
9444 }
9445
9446 u64 get_lowest_words_done ()
9447 {
9448 u64 words_cur = -1;
9449
9450 for (uint device_id = 0; device_id < data.devices_cnt; device_id++)
9451 {
9452 hc_device_param_t *device_param = &data.devices_param[device_id];
9453
9454 if (device_param->skipped) continue;
9455
9456 const u64 words_done = device_param->words_done;
9457
9458 if (words_done < words_cur) words_cur = words_done;
9459 }
9460
9461 // It's possible that a device's workload isn't finished right after a restore-case.
9462 // In that case, this function would return 0 and overwrite the real restore point
9463 // There's also data.words_cur which is set to rd->words_cur but it changes while
9464 // the attack is running therefore we should stick to rd->words_cur.
9465 // Note that -s influences rd->words_cur we should keep a close look on that.
9466
9467 if (words_cur < data.rd->words_cur) words_cur = data.rd->words_cur;
9468
9469 return words_cur;
9470 }
9471
9472 void write_restore (const char *new_restore_file, restore_data_t *rd)
9473 {
9474 u64 words_cur = get_lowest_words_done ();
9475
9476 rd->words_cur = words_cur;
9477
9478 FILE *fp = fopen (new_restore_file, "wb");
9479
9480 if (fp == NULL)
9481 {
9482 log_error ("ERROR: %s: %s", new_restore_file, strerror (errno));
9483
9484 exit (-1);
9485 }
9486
9487 if (setvbuf (fp, NULL, _IONBF, 0))
9488 {
9489 log_error ("ERROR: setvbuf file '%s': %s", new_restore_file, strerror (errno));
9490
9491 exit (-1);
9492 }
9493
9494 fwrite (rd, sizeof (restore_data_t), 1, fp);
9495
9496 for (uint i = 0; i < rd->argc; i++)
9497 {
9498 fprintf (fp, "%s", rd->argv[i]);
9499 fputc ('\n', fp);
9500 }
9501
9502 fflush (fp);
9503
9504 fsync (fileno (fp));
9505
9506 fclose (fp);
9507 }
9508
9509 void cycle_restore ()
9510 {
9511 const char *eff_restore_file = data.eff_restore_file;
9512 const char *new_restore_file = data.new_restore_file;
9513
9514 restore_data_t *rd = data.rd;
9515
9516 write_restore (new_restore_file, rd);
9517
9518 struct stat st;
9519
9520 memset (&st, 0, sizeof(st));
9521
9522 if (stat (eff_restore_file, &st) == 0)
9523 {
9524 if (unlink (eff_restore_file))
9525 {
9526 log_info ("WARN: unlink file '%s': %s", eff_restore_file, strerror (errno));
9527 }
9528 }
9529
9530 if (rename (new_restore_file, eff_restore_file))
9531 {
9532 log_info ("WARN: rename file '%s' to '%s': %s", new_restore_file, eff_restore_file, strerror (errno));
9533 }
9534 }
9535
9536 void check_checkpoint ()
9537 {
9538 // if (data.restore_disable == 1) break; (this is already implied by previous checks)
9539
9540 u64 words_cur = get_lowest_words_done ();
9541
9542 if (words_cur != data.checkpoint_cur_words)
9543 {
9544 myabort ();
9545 }
9546 }
9547
9548 /**
9549 * tuning db
9550 */
9551
9552 void tuning_db_destroy (tuning_db_t *tuning_db)
9553 {
9554 int i;
9555
9556 for (i = 0; i < tuning_db->alias_cnt; i++)
9557 {
9558 tuning_db_alias_t *alias = &tuning_db->alias_buf[i];
9559
9560 myfree (alias->device_name);
9561 myfree (alias->alias_name);
9562 }
9563
9564 for (i = 0; i < tuning_db->entry_cnt; i++)
9565 {
9566 tuning_db_entry_t *entry = &tuning_db->entry_buf[i];
9567
9568 myfree (entry->device_name);
9569 }
9570
9571 myfree (tuning_db->alias_buf);
9572 myfree (tuning_db->entry_buf);
9573
9574 myfree (tuning_db);
9575 }
9576
9577 tuning_db_t *tuning_db_alloc (FILE *fp)
9578 {
9579 tuning_db_t *tuning_db = (tuning_db_t *) mymalloc (sizeof (tuning_db_t));
9580
9581 int num_lines = count_lines (fp);
9582
9583 // a bit over-allocated
9584
9585 tuning_db->alias_buf = (tuning_db_alias_t *) mycalloc (num_lines + 1, sizeof (tuning_db_alias_t));
9586 tuning_db->alias_cnt = 0;
9587
9588 tuning_db->entry_buf = (tuning_db_entry_t *) mycalloc (num_lines + 1, sizeof (tuning_db_entry_t));
9589 tuning_db->entry_cnt = 0;
9590
9591 return tuning_db;
9592 }
9593
9594 tuning_db_t *tuning_db_init (const char *tuning_db_file)
9595 {
9596 FILE *fp = fopen (tuning_db_file, "rb");
9597
9598 if (fp == NULL)
9599 {
9600 log_error ("%s: %s", tuning_db_file, strerror (errno));
9601
9602 exit (-1);
9603 }
9604
9605 tuning_db_t *tuning_db = tuning_db_alloc (fp);
9606
9607 rewind (fp);
9608
9609 int line_num = 0;
9610
9611 char *buf = (char *) mymalloc (HCBUFSIZ);
9612
9613 while (!feof (fp))
9614 {
9615 char *line_buf = fgets (buf, HCBUFSIZ - 1, fp);
9616
9617 if (line_buf == NULL) break;
9618
9619 line_num++;
9620
9621 const int line_len = in_superchop (line_buf);
9622
9623 if (line_len == 0) continue;
9624
9625 if (line_buf[0] == '#') continue;
9626
9627 // start processing
9628
9629 char *token_ptr[7] = { NULL };
9630
9631 int token_cnt = 0;
9632
9633 char *next = strtok (line_buf, "\t ");
9634
9635 token_ptr[token_cnt] = next;
9636
9637 token_cnt++;
9638
9639 while ((next = strtok (NULL, "\t ")) != NULL)
9640 {
9641 token_ptr[token_cnt] = next;
9642
9643 token_cnt++;
9644 }
9645
9646 if (token_cnt == 2)
9647 {
9648 char *device_name = token_ptr[0];
9649 char *alias_name = token_ptr[1];
9650
9651 tuning_db_alias_t *alias = &tuning_db->alias_buf[tuning_db->alias_cnt];
9652
9653 alias->device_name = mystrdup (device_name);
9654 alias->alias_name = mystrdup (alias_name);
9655
9656 tuning_db->alias_cnt++;
9657 }
9658 else if (token_cnt == 6)
9659 {
9660 if ((token_ptr[1][0] != '0') &&
9661 (token_ptr[1][0] != '1') &&
9662 (token_ptr[1][0] != '3') &&
9663 (token_ptr[1][0] != '*'))
9664 {
9665 log_info ("WARNING: Tuning-db: Invalid attack_mode '%c' in Line '%u'", token_ptr[1][0], line_num);
9666
9667 continue;
9668 }
9669
9670 if ((token_ptr[3][0] != '1') &&
9671 (token_ptr[3][0] != '2') &&
9672 (token_ptr[3][0] != '4') &&
9673 (token_ptr[3][0] != '8') &&
9674 (token_ptr[3][0] != 'N'))
9675 {
9676 log_info ("WARNING: Tuning-db: Invalid vector_width '%c' in Line '%u'", token_ptr[3][0], line_num);
9677
9678 continue;
9679 }
9680
9681 char *device_name = token_ptr[0];
9682
9683 int attack_mode = -1;
9684 int hash_type = -1;
9685 int vector_width = -1;
9686 int kernel_accel = -1;
9687 int kernel_loops = -1;
9688
9689 if (token_ptr[1][0] != '*') attack_mode = atoi (token_ptr[1]);
9690 if (token_ptr[2][0] != '*') hash_type = atoi (token_ptr[2]);
9691 if (token_ptr[3][0] != 'N') vector_width = atoi (token_ptr[3]);
9692
9693 if (token_ptr[4][0] != 'A')
9694 {
9695 kernel_accel = atoi (token_ptr[4]);
9696
9697 if ((kernel_accel < 1) || (kernel_accel > 1024))
9698 {
9699 log_info ("WARNING: Tuning-db: Invalid kernel_accel '%d' in Line '%u'", kernel_accel, line_num);
9700
9701 continue;
9702 }
9703 }
9704 else
9705 {
9706 kernel_accel = 0;
9707 }
9708
9709 if (token_ptr[5][0] != 'A')
9710 {
9711 kernel_loops = atoi (token_ptr[5]);
9712
9713 if ((kernel_loops < 1) || (kernel_loops > 1024))
9714 {
9715 log_info ("WARNING: Tuning-db: Invalid kernel_loops '%d' in Line '%u'", kernel_loops, line_num);
9716
9717 continue;
9718 }
9719 }
9720 else
9721 {
9722 kernel_loops = 0;
9723 }
9724
9725 tuning_db_entry_t *entry = &tuning_db->entry_buf[tuning_db->entry_cnt];
9726
9727 entry->device_name = mystrdup (device_name);
9728 entry->attack_mode = attack_mode;
9729 entry->hash_type = hash_type;
9730 entry->vector_width = vector_width;
9731 entry->kernel_accel = kernel_accel;
9732 entry->kernel_loops = kernel_loops;
9733
9734 tuning_db->entry_cnt++;
9735 }
9736 else
9737 {
9738 log_info ("WARNING: Tuning-db: Invalid number of token in Line '%u'", line_num);
9739
9740 continue;
9741 }
9742 }
9743
9744 myfree (buf);
9745
9746 fclose (fp);
9747
9748 // todo: print loaded 'cnt' message
9749
9750 // sort the database
9751
9752 qsort (tuning_db->alias_buf, tuning_db->alias_cnt, sizeof (tuning_db_alias_t), sort_by_tuning_db_alias);
9753 qsort (tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry);
9754
9755 return tuning_db;
9756 }
9757
9758 tuning_db_entry_t *tuning_db_search (tuning_db_t *tuning_db, hc_device_param_t *device_param, int attack_mode, int hash_type)
9759 {
9760 static tuning_db_entry_t s;
9761
9762 // first we need to convert all spaces in the device_name to underscore
9763
9764 char *device_name_nospace = strdup (device_param->device_name);
9765
9766 int device_name_length = strlen (device_name_nospace);
9767
9768 int i;
9769
9770 for (i = 0; i < device_name_length; i++)
9771 {
9772 if (device_name_nospace[i] == ' ') device_name_nospace[i] = '_';
9773 }
9774
9775 // find out if there's an alias configured
9776
9777 tuning_db_alias_t a;
9778
9779 a.device_name = device_name_nospace;
9780
9781 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);
9782
9783 char *alias_name = (alias == NULL) ? NULL : alias->alias_name;
9784
9785 // attack-mode 6 and 7 are attack-mode 1 basically
9786
9787 if (attack_mode == 6) attack_mode = 1;
9788 if (attack_mode == 7) attack_mode = 1;
9789
9790 // bsearch is not ideal but fast enough
9791
9792 s.device_name = device_name_nospace;
9793 s.attack_mode = attack_mode;
9794 s.hash_type = hash_type;
9795
9796 tuning_db_entry_t *entry = NULL;
9797
9798 // this will produce all 2^3 combinations required
9799
9800 for (i = 0; i < 8; i++)
9801 {
9802 s.device_name = (i & 1) ? "*" : device_name_nospace;
9803 s.attack_mode = (i & 2) ? -1 : attack_mode;
9804 s.hash_type = (i & 4) ? -1 : hash_type;
9805
9806 entry = bsearch (&s, tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry);
9807
9808 if (entry != NULL) break;
9809
9810 // in non-wildcard mode do some additional checks:
9811
9812 if ((i & 1) == 0)
9813 {
9814 // in case we have an alias-name
9815
9816 if (alias_name != NULL)
9817 {
9818 s.device_name = alias_name;
9819
9820 entry = bsearch (&s, tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry);
9821
9822 if (entry != NULL) break;
9823 }
9824
9825 // or by device type
9826
9827 if (device_param->device_type & CL_DEVICE_TYPE_CPU)
9828 {
9829 s.device_name = "DEVICE_TYPE_CPU";
9830 }
9831 else if (device_param->device_type & CL_DEVICE_TYPE_GPU)
9832 {
9833 s.device_name = "DEVICE_TYPE_GPU";
9834 }
9835 else if (device_param->device_type & CL_DEVICE_TYPE_ACCELERATOR)
9836 {
9837 s.device_name = "DEVICE_TYPE_ACCELERATOR";
9838 }
9839
9840 entry = bsearch (&s, tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry);
9841
9842 if (entry != NULL) break;
9843 }
9844 }
9845
9846 // free converted device_name
9847
9848 myfree (device_name_nospace);
9849
9850 return entry;
9851 }
9852
9853 /**
9854 * parser
9855 */
9856
9857 uint parse_and_store_salt (char *out, char *in, uint salt_len)
9858 {
9859 u8 tmp[256] = { 0 };
9860
9861 if (salt_len > sizeof (tmp))
9862 {
9863 return UINT_MAX;
9864 }
9865
9866 memcpy (tmp, in, salt_len);
9867
9868 if (data.opts_type & OPTS_TYPE_ST_HEX)
9869 {
9870 if ((salt_len % 2) == 0)
9871 {
9872 u32 new_salt_len = salt_len / 2;
9873
9874 for (uint i = 0, j = 0; i < new_salt_len; i += 1, j += 2)
9875 {
9876 u8 p0 = tmp[j + 0];
9877 u8 p1 = tmp[j + 1];
9878
9879 tmp[i] = hex_convert (p1) << 0;
9880 tmp[i] |= hex_convert (p0) << 4;
9881 }
9882
9883 salt_len = new_salt_len;
9884 }
9885 else
9886 {
9887 return UINT_MAX;
9888 }
9889 }
9890 else if (data.opts_type & OPTS_TYPE_ST_BASE64)
9891 {
9892 salt_len = base64_decode (base64_to_int, (const u8 *) in, salt_len, (u8 *) tmp);
9893 }
9894
9895 memset (tmp + salt_len, 0, sizeof (tmp) - salt_len);
9896
9897 if (data.opts_type & OPTS_TYPE_ST_UNICODE)
9898 {
9899 if (salt_len < 20)
9900 {
9901 u32 *tmp_uint = (u32 *) tmp;
9902
9903 tmp_uint[9] = ((tmp_uint[4] >> 8) & 0x00FF0000) | ((tmp_uint[4] >> 16) & 0x000000FF);
9904 tmp_uint[8] = ((tmp_uint[4] << 8) & 0x00FF0000) | ((tmp_uint[4] >> 0) & 0x000000FF);
9905 tmp_uint[7] = ((tmp_uint[3] >> 8) & 0x00FF0000) | ((tmp_uint[3] >> 16) & 0x000000FF);
9906 tmp_uint[6] = ((tmp_uint[3] << 8) & 0x00FF0000) | ((tmp_uint[3] >> 0) & 0x000000FF);
9907 tmp_uint[5] = ((tmp_uint[2] >> 8) & 0x00FF0000) | ((tmp_uint[2] >> 16) & 0x000000FF);
9908 tmp_uint[4] = ((tmp_uint[2] << 8) & 0x00FF0000) | ((tmp_uint[2] >> 0) & 0x000000FF);
9909 tmp_uint[3] = ((tmp_uint[1] >> 8) & 0x00FF0000) | ((tmp_uint[1] >> 16) & 0x000000FF);
9910 tmp_uint[2] = ((tmp_uint[1] << 8) & 0x00FF0000) | ((tmp_uint[1] >> 0) & 0x000000FF);
9911 tmp_uint[1] = ((tmp_uint[0] >> 8) & 0x00FF0000) | ((tmp_uint[0] >> 16) & 0x000000FF);
9912 tmp_uint[0] = ((tmp_uint[0] << 8) & 0x00FF0000) | ((tmp_uint[0] >> 0) & 0x000000FF);
9913
9914 salt_len = salt_len * 2;
9915 }
9916 else
9917 {
9918 return UINT_MAX;
9919 }
9920 }
9921
9922 if (data.opts_type & OPTS_TYPE_ST_LOWER)
9923 {
9924 lowercase (tmp, salt_len);
9925 }
9926
9927 if (data.opts_type & OPTS_TYPE_ST_UPPER)
9928 {
9929 uppercase (tmp, salt_len);
9930 }
9931
9932 u32 len = salt_len;
9933
9934 if (data.opts_type & OPTS_TYPE_ST_ADD80)
9935 {
9936 tmp[len++] = 0x80;
9937 }
9938
9939 if (data.opts_type & OPTS_TYPE_ST_ADD01)
9940 {
9941 tmp[len++] = 0x01;
9942 }
9943
9944 if (data.opts_type & OPTS_TYPE_ST_GENERATE_LE)
9945 {
9946 u32 *tmp_uint = (uint *) tmp;
9947
9948 u32 max = len / 4;
9949
9950 if (len % 4) max++;
9951
9952 for (u32 i = 0; i < max; i++)
9953 {
9954 tmp_uint[i] = byte_swap_32 (tmp_uint[i]);
9955 }
9956
9957 // Important: we may need to increase the length of memcpy since
9958 // we don't want to "loose" some swapped bytes (could happen if
9959 // they do not perfectly fit in the 4-byte blocks)
9960 // Memcpy does always copy the bytes in the BE order, but since
9961 // we swapped them, some important bytes could be in positions
9962 // we normally skip with the original len
9963
9964 if (len % 4) len += 4 - (len % 4);
9965 }
9966
9967 memcpy (out, tmp, len);
9968
9969 return (salt_len);
9970 }
9971
9972 int bcrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9973 {
9974 if ((input_len < DISPLAY_LEN_MIN_3200) || (input_len > DISPLAY_LEN_MAX_3200)) return (PARSER_GLOBAL_LENGTH);
9975
9976 if ((memcmp (SIGNATURE_BCRYPT1, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT2, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT3, input_buf, 4))) return (PARSER_SIGNATURE_UNMATCHED);
9977
9978 u32 *digest = (u32 *) hash_buf->digest;
9979
9980 salt_t *salt = hash_buf->salt;
9981
9982 memcpy ((char *) salt->salt_sign, input_buf, 6);
9983
9984 char *iter_pos = input_buf + 4;
9985
9986 salt->salt_iter = 1 << atoi (iter_pos);
9987
9988 char *salt_pos = strchr (iter_pos, '$');
9989
9990 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9991
9992 salt_pos++;
9993
9994 uint salt_len = 16;
9995
9996 salt->salt_len = salt_len;
9997
9998 u8 tmp_buf[100] = { 0 };
9999
10000 base64_decode (bf64_to_int, (const u8 *) salt_pos, 22, tmp_buf);
10001
10002 char *salt_buf_ptr = (char *) salt->salt_buf;
10003
10004 memcpy (salt_buf_ptr, tmp_buf, 16);
10005
10006 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
10007 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
10008 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
10009 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
10010
10011 char *hash_pos = salt_pos + 22;
10012
10013 memset (tmp_buf, 0, sizeof (tmp_buf));
10014
10015 base64_decode (bf64_to_int, (const u8 *) hash_pos, 31, tmp_buf);
10016
10017 memcpy (digest, tmp_buf, 24);
10018
10019 digest[0] = byte_swap_32 (digest[0]);
10020 digest[1] = byte_swap_32 (digest[1]);
10021 digest[2] = byte_swap_32 (digest[2]);
10022 digest[3] = byte_swap_32 (digest[3]);
10023 digest[4] = byte_swap_32 (digest[4]);
10024 digest[5] = byte_swap_32 (digest[5]);
10025
10026 digest[5] &= ~0xff; // its just 23 not 24 !
10027
10028 return (PARSER_OK);
10029 }
10030
10031 int cisco4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10032 {
10033 if ((input_len < DISPLAY_LEN_MIN_5700) || (input_len > DISPLAY_LEN_MAX_5700)) return (PARSER_GLOBAL_LENGTH);
10034
10035 u32 *digest = (u32 *) hash_buf->digest;
10036
10037 u8 tmp_buf[100] = { 0 };
10038
10039 base64_decode (itoa64_to_int, (const u8 *) input_buf, 43, tmp_buf);
10040
10041 memcpy (digest, tmp_buf, 32);
10042
10043 digest[0] = byte_swap_32 (digest[0]);
10044 digest[1] = byte_swap_32 (digest[1]);
10045 digest[2] = byte_swap_32 (digest[2]);
10046 digest[3] = byte_swap_32 (digest[3]);
10047 digest[4] = byte_swap_32 (digest[4]);
10048 digest[5] = byte_swap_32 (digest[5]);
10049 digest[6] = byte_swap_32 (digest[6]);
10050 digest[7] = byte_swap_32 (digest[7]);
10051
10052 digest[0] -= SHA256M_A;
10053 digest[1] -= SHA256M_B;
10054 digest[2] -= SHA256M_C;
10055 digest[3] -= SHA256M_D;
10056 digest[4] -= SHA256M_E;
10057 digest[5] -= SHA256M_F;
10058 digest[6] -= SHA256M_G;
10059 digest[7] -= SHA256M_H;
10060
10061 return (PARSER_OK);
10062 }
10063
10064 int lm_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10065 {
10066 if ((input_len < DISPLAY_LEN_MIN_3000) || (input_len > DISPLAY_LEN_MAX_3000)) return (PARSER_GLOBAL_LENGTH);
10067
10068 u32 *digest = (u32 *) hash_buf->digest;
10069
10070 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10071 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10072
10073 digest[0] = byte_swap_32 (digest[0]);
10074 digest[1] = byte_swap_32 (digest[1]);
10075
10076 uint tt;
10077
10078 IP (digest[0], digest[1], tt);
10079
10080 digest[0] = digest[0];
10081 digest[1] = digest[1];
10082 digest[2] = 0;
10083 digest[3] = 0;
10084
10085 return (PARSER_OK);
10086 }
10087
10088 int arubaos_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10089 {
10090 if ((input_len < DISPLAY_LEN_MIN_125) || (input_len > DISPLAY_LEN_MAX_125)) return (PARSER_GLOBAL_LENGTH);
10091
10092 if ((input_buf[8] != '0') || (input_buf[9] != '1')) return (PARSER_SIGNATURE_UNMATCHED);
10093
10094 u32 *digest = (u32 *) hash_buf->digest;
10095
10096 salt_t *salt = hash_buf->salt;
10097
10098 char *hash_pos = input_buf + 10;
10099
10100 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
10101 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
10102 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
10103 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
10104 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
10105
10106 digest[0] -= SHA1M_A;
10107 digest[1] -= SHA1M_B;
10108 digest[2] -= SHA1M_C;
10109 digest[3] -= SHA1M_D;
10110 digest[4] -= SHA1M_E;
10111
10112 uint salt_len = 10;
10113
10114 char *salt_buf_ptr = (char *) salt->salt_buf;
10115
10116 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
10117
10118 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10119
10120 salt->salt_len = salt_len;
10121
10122 return (PARSER_OK);
10123 }
10124
10125 int osx1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10126 {
10127 if ((input_len < DISPLAY_LEN_MIN_122) || (input_len > DISPLAY_LEN_MAX_122)) return (PARSER_GLOBAL_LENGTH);
10128
10129 u32 *digest = (u32 *) hash_buf->digest;
10130
10131 salt_t *salt = hash_buf->salt;
10132
10133 char *hash_pos = input_buf + 8;
10134
10135 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
10136 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
10137 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
10138 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
10139 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
10140
10141 digest[0] -= SHA1M_A;
10142 digest[1] -= SHA1M_B;
10143 digest[2] -= SHA1M_C;
10144 digest[3] -= SHA1M_D;
10145 digest[4] -= SHA1M_E;
10146
10147 uint salt_len = 8;
10148
10149 char *salt_buf_ptr = (char *) salt->salt_buf;
10150
10151 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
10152
10153 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10154
10155 salt->salt_len = salt_len;
10156
10157 return (PARSER_OK);
10158 }
10159
10160 int osx512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10161 {
10162 if ((input_len < DISPLAY_LEN_MIN_1722) || (input_len > DISPLAY_LEN_MAX_1722)) return (PARSER_GLOBAL_LENGTH);
10163
10164 u64 *digest = (u64 *) hash_buf->digest;
10165
10166 salt_t *salt = hash_buf->salt;
10167
10168 char *hash_pos = input_buf + 8;
10169
10170 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
10171 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
10172 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
10173 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
10174 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
10175 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
10176 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
10177 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
10178
10179 digest[0] -= SHA512M_A;
10180 digest[1] -= SHA512M_B;
10181 digest[2] -= SHA512M_C;
10182 digest[3] -= SHA512M_D;
10183 digest[4] -= SHA512M_E;
10184 digest[5] -= SHA512M_F;
10185 digest[6] -= SHA512M_G;
10186 digest[7] -= SHA512M_H;
10187
10188 uint salt_len = 8;
10189
10190 char *salt_buf_ptr = (char *) salt->salt_buf;
10191
10192 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
10193
10194 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10195
10196 salt->salt_len = salt_len;
10197
10198 return (PARSER_OK);
10199 }
10200
10201 int osc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10202 {
10203 if (data.opts_type & OPTS_TYPE_ST_HEX)
10204 {
10205 if ((input_len < DISPLAY_LEN_MIN_21H) || (input_len > DISPLAY_LEN_MAX_21H)) return (PARSER_GLOBAL_LENGTH);
10206 }
10207 else
10208 {
10209 if ((input_len < DISPLAY_LEN_MIN_21) || (input_len > DISPLAY_LEN_MAX_21)) return (PARSER_GLOBAL_LENGTH);
10210 }
10211
10212 u32 *digest = (u32 *) hash_buf->digest;
10213
10214 salt_t *salt = hash_buf->salt;
10215
10216 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10217 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10218 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10219 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10220
10221 digest[0] = byte_swap_32 (digest[0]);
10222 digest[1] = byte_swap_32 (digest[1]);
10223 digest[2] = byte_swap_32 (digest[2]);
10224 digest[3] = byte_swap_32 (digest[3]);
10225
10226 digest[0] -= MD5M_A;
10227 digest[1] -= MD5M_B;
10228 digest[2] -= MD5M_C;
10229 digest[3] -= MD5M_D;
10230
10231 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10232
10233 uint salt_len = input_len - 32 - 1;
10234
10235 char *salt_buf = input_buf + 32 + 1;
10236
10237 char *salt_buf_ptr = (char *) salt->salt_buf;
10238
10239 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10240
10241 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10242
10243 salt->salt_len = salt_len;
10244
10245 return (PARSER_OK);
10246 }
10247
10248 int netscreen_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10249 {
10250 if (data.opts_type & OPTS_TYPE_ST_HEX)
10251 {
10252 if ((input_len < DISPLAY_LEN_MIN_22H) || (input_len > DISPLAY_LEN_MAX_22H)) return (PARSER_GLOBAL_LENGTH);
10253 }
10254 else
10255 {
10256 if ((input_len < DISPLAY_LEN_MIN_22) || (input_len > DISPLAY_LEN_MAX_22)) return (PARSER_GLOBAL_LENGTH);
10257 }
10258
10259 // unscramble
10260
10261 char clean_input_buf[32] = { 0 };
10262
10263 char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' };
10264 int pos[6] = { 0, 6, 12, 17, 23, 29 };
10265
10266 for (int i = 0, j = 0, k = 0; i < 30; i++)
10267 {
10268 if (i == pos[j])
10269 {
10270 if (sig[j] != input_buf[i]) return (PARSER_SIGNATURE_UNMATCHED);
10271
10272 j++;
10273 }
10274 else
10275 {
10276 clean_input_buf[k] = input_buf[i];
10277
10278 k++;
10279 }
10280 }
10281
10282 // base64 decode
10283
10284 u32 *digest = (u32 *) hash_buf->digest;
10285
10286 salt_t *salt = hash_buf->salt;
10287
10288 u32 a, b, c, d, e, f;
10289
10290 a = base64_to_int (clean_input_buf[ 0] & 0x7f);
10291 b = base64_to_int (clean_input_buf[ 1] & 0x7f);
10292 c = base64_to_int (clean_input_buf[ 2] & 0x7f);
10293 d = base64_to_int (clean_input_buf[ 3] & 0x7f);
10294 e = base64_to_int (clean_input_buf[ 4] & 0x7f);
10295 f = base64_to_int (clean_input_buf[ 5] & 0x7f);
10296
10297 digest[0] = (((a << 12) | (b << 6) | (c)) << 16)
10298 | (((d << 12) | (e << 6) | (f)) << 0);
10299
10300 a = base64_to_int (clean_input_buf[ 6] & 0x7f);
10301 b = base64_to_int (clean_input_buf[ 7] & 0x7f);
10302 c = base64_to_int (clean_input_buf[ 8] & 0x7f);
10303 d = base64_to_int (clean_input_buf[ 9] & 0x7f);
10304 e = base64_to_int (clean_input_buf[10] & 0x7f);
10305 f = base64_to_int (clean_input_buf[11] & 0x7f);
10306
10307 digest[1] = (((a << 12) | (b << 6) | (c)) << 16)
10308 | (((d << 12) | (e << 6) | (f)) << 0);
10309
10310 a = base64_to_int (clean_input_buf[12] & 0x7f);
10311 b = base64_to_int (clean_input_buf[13] & 0x7f);
10312 c = base64_to_int (clean_input_buf[14] & 0x7f);
10313 d = base64_to_int (clean_input_buf[15] & 0x7f);
10314 e = base64_to_int (clean_input_buf[16] & 0x7f);
10315 f = base64_to_int (clean_input_buf[17] & 0x7f);
10316
10317 digest[2] = (((a << 12) | (b << 6) | (c)) << 16)
10318 | (((d << 12) | (e << 6) | (f)) << 0);
10319
10320 a = base64_to_int (clean_input_buf[18] & 0x7f);
10321 b = base64_to_int (clean_input_buf[19] & 0x7f);
10322 c = base64_to_int (clean_input_buf[20] & 0x7f);
10323 d = base64_to_int (clean_input_buf[21] & 0x7f);
10324 e = base64_to_int (clean_input_buf[22] & 0x7f);
10325 f = base64_to_int (clean_input_buf[23] & 0x7f);
10326
10327 digest[3] = (((a << 12) | (b << 6) | (c)) << 16)
10328 | (((d << 12) | (e << 6) | (f)) << 0);
10329
10330 digest[0] = byte_swap_32 (digest[0]);
10331 digest[1] = byte_swap_32 (digest[1]);
10332 digest[2] = byte_swap_32 (digest[2]);
10333 digest[3] = byte_swap_32 (digest[3]);
10334
10335 digest[0] -= MD5M_A;
10336 digest[1] -= MD5M_B;
10337 digest[2] -= MD5M_C;
10338 digest[3] -= MD5M_D;
10339
10340 if (input_buf[30] != ':') return (PARSER_SEPARATOR_UNMATCHED);
10341
10342 uint salt_len = input_len - 30 - 1;
10343
10344 char *salt_buf = input_buf + 30 + 1;
10345
10346 char *salt_buf_ptr = (char *) salt->salt_buf;
10347
10348 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10349
10350 // max. salt length: 55 (max for MD5) - 22 (":Administration Tools:") - 1 (0x80) = 32
10351 // 32 - 4 bytes (to fit w0lr for all attack modes) = 28
10352
10353 if (salt_len > 28) return (PARSER_SALT_LENGTH);
10354
10355 salt->salt_len = salt_len;
10356
10357 memcpy (salt_buf_ptr + salt_len, ":Administration Tools:", 22);
10358
10359 salt->salt_len += 22;
10360
10361 return (PARSER_OK);
10362 }
10363
10364 int smf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10365 {
10366 if (data.opts_type & OPTS_TYPE_ST_HEX)
10367 {
10368 if ((input_len < DISPLAY_LEN_MIN_121H) || (input_len > DISPLAY_LEN_MAX_121H)) return (PARSER_GLOBAL_LENGTH);
10369 }
10370 else
10371 {
10372 if ((input_len < DISPLAY_LEN_MIN_121) || (input_len > DISPLAY_LEN_MAX_121)) return (PARSER_GLOBAL_LENGTH);
10373 }
10374
10375 u32 *digest = (u32 *) hash_buf->digest;
10376
10377 salt_t *salt = hash_buf->salt;
10378
10379 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10380 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10381 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10382 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10383 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
10384
10385 digest[0] -= SHA1M_A;
10386 digest[1] -= SHA1M_B;
10387 digest[2] -= SHA1M_C;
10388 digest[3] -= SHA1M_D;
10389 digest[4] -= SHA1M_E;
10390
10391 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10392
10393 uint salt_len = input_len - 40 - 1;
10394
10395 char *salt_buf = input_buf + 40 + 1;
10396
10397 char *salt_buf_ptr = (char *) salt->salt_buf;
10398
10399 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10400
10401 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10402
10403 salt->salt_len = salt_len;
10404
10405 return (PARSER_OK);
10406 }
10407
10408 int dcc2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10409 {
10410 if (data.opts_type & OPTS_TYPE_ST_HEX)
10411 {
10412 if ((input_len < DISPLAY_LEN_MIN_2100H) || (input_len > DISPLAY_LEN_MAX_2100H)) return (PARSER_GLOBAL_LENGTH);
10413 }
10414 else
10415 {
10416 if ((input_len < DISPLAY_LEN_MIN_2100) || (input_len > DISPLAY_LEN_MAX_2100)) return (PARSER_GLOBAL_LENGTH);
10417 }
10418
10419 if (memcmp (SIGNATURE_DCC2, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
10420
10421 char *iter_pos = input_buf + 6;
10422
10423 salt_t *salt = hash_buf->salt;
10424
10425 uint iter = atoi (iter_pos);
10426
10427 if (iter < 1)
10428 {
10429 iter = ROUNDS_DCC2;
10430 }
10431
10432 salt->salt_iter = iter - 1;
10433
10434 char *salt_pos = strchr (iter_pos, '#');
10435
10436 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10437
10438 salt_pos++;
10439
10440 char *digest_pos = strchr (salt_pos, '#');
10441
10442 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10443
10444 digest_pos++;
10445
10446 uint salt_len = digest_pos - salt_pos - 1;
10447
10448 u32 *digest = (u32 *) hash_buf->digest;
10449
10450 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
10451 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
10452 digest[2] = hex_to_u32 ((const u8 *) &digest_pos[16]);
10453 digest[3] = hex_to_u32 ((const u8 *) &digest_pos[24]);
10454
10455 char *salt_buf_ptr = (char *) salt->salt_buf;
10456
10457 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
10458
10459 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10460
10461 salt->salt_len = salt_len;
10462
10463 return (PARSER_OK);
10464 }
10465
10466 int wpa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10467 {
10468 u32 *digest = (u32 *) hash_buf->digest;
10469
10470 salt_t *salt = hash_buf->salt;
10471
10472 wpa_t *wpa = (wpa_t *) hash_buf->esalt;
10473
10474 hccap_t in;
10475
10476 memcpy (&in, input_buf, input_len);
10477
10478 if (in.eapol_size < 1 || in.eapol_size > 255) return (PARSER_HCCAP_EAPOL_SIZE);
10479
10480 memcpy (digest, in.keymic, 16);
10481
10482 /*
10483 http://www.one-net.eu/jsw/j_sec/m_ptype.html
10484 The phrase "Pairwise key expansion"
10485 Access Point Address (referred to as Authenticator Address AA)
10486 Supplicant Address (referred to as Supplicant Address SA)
10487 Access Point Nonce (referred to as Authenticator Anonce)
10488 Wireless Device Nonce (referred to as Supplicant Nonce Snonce)
10489 */
10490
10491 uint salt_len = strlen (in.essid);
10492
10493 if (salt_len > 36)
10494 {
10495 log_info ("WARNING: the length of the ESSID is too long. The hccap file may be invalid or corrupted");
10496
10497 return (PARSER_SALT_LENGTH);
10498 }
10499
10500 memcpy (salt->salt_buf, in.essid, salt_len);
10501
10502 salt->salt_len = salt_len;
10503
10504 salt->salt_iter = ROUNDS_WPA2 - 1;
10505
10506 unsigned char *pke_ptr = (unsigned char *) wpa->pke;
10507
10508 memcpy (pke_ptr, "Pairwise key expansion", 23);
10509
10510 if (memcmp (in.mac1, in.mac2, 6) < 0)
10511 {
10512 memcpy (pke_ptr + 23, in.mac1, 6);
10513 memcpy (pke_ptr + 29, in.mac2, 6);
10514 }
10515 else
10516 {
10517 memcpy (pke_ptr + 23, in.mac2, 6);
10518 memcpy (pke_ptr + 29, in.mac1, 6);
10519 }
10520
10521 if (memcmp (in.nonce1, in.nonce2, 32) < 0)
10522 {
10523 memcpy (pke_ptr + 35, in.nonce1, 32);
10524 memcpy (pke_ptr + 67, in.nonce2, 32);
10525 }
10526 else
10527 {
10528 memcpy (pke_ptr + 35, in.nonce2, 32);
10529 memcpy (pke_ptr + 67, in.nonce1, 32);
10530 }
10531
10532 for (int i = 0; i < 25; i++)
10533 {
10534 wpa->pke[i] = byte_swap_32 (wpa->pke[i]);
10535 }
10536
10537 memcpy (wpa->orig_mac1, in.mac1, 6);
10538 memcpy (wpa->orig_mac2, in.mac2, 6);
10539 memcpy (wpa->orig_nonce1, in.nonce1, 32);
10540 memcpy (wpa->orig_nonce2, in.nonce2, 32);
10541
10542 wpa->keyver = in.keyver;
10543
10544 if (wpa->keyver > 255)
10545 {
10546 log_info ("ATTENTION!");
10547 log_info (" The WPA/WPA2 key version in your .hccap file is invalid!");
10548 log_info (" This could be due to a recent aircrack-ng bug.");
10549 log_info (" The key version was automatically reset to a reasonable value.");
10550 log_info ("");
10551
10552 wpa->keyver &= 0xff;
10553 }
10554
10555 wpa->eapol_size = in.eapol_size;
10556
10557 unsigned char *eapol_ptr = (unsigned char *) wpa->eapol;
10558
10559 memcpy (eapol_ptr, in.eapol, wpa->eapol_size);
10560
10561 memset (eapol_ptr + wpa->eapol_size, 0, 256 - wpa->eapol_size);
10562
10563 eapol_ptr[wpa->eapol_size] = (unsigned char) 0x80;
10564
10565 if (wpa->keyver == 1)
10566 {
10567 // nothing to do
10568 }
10569 else
10570 {
10571 digest[0] = byte_swap_32 (digest[0]);
10572 digest[1] = byte_swap_32 (digest[1]);
10573 digest[2] = byte_swap_32 (digest[2]);
10574 digest[3] = byte_swap_32 (digest[3]);
10575
10576 for (int i = 0; i < 64; i++)
10577 {
10578 wpa->eapol[i] = byte_swap_32 (wpa->eapol[i]);
10579 }
10580 }
10581
10582 uint32_t *p0 = (uint32_t *) in.essid;
10583 uint32_t c0 = 0;
10584 uint32_t c1 = 0;
10585
10586 for (uint i = 0; i < sizeof (in.essid) / sizeof (uint32_t); i++) c0 ^= *p0++;
10587 for (uint i = 0; i < sizeof (wpa->pke) / sizeof (wpa->pke[0]); i++) c1 ^= wpa->pke[i];
10588
10589 salt->salt_buf[10] = c0;
10590 salt->salt_buf[11] = c1;
10591
10592 return (PARSER_OK);
10593 }
10594
10595 int psafe2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10596 {
10597 u32 *digest = (u32 *) hash_buf->digest;
10598
10599 salt_t *salt = hash_buf->salt;
10600
10601 if (input_len == 0)
10602 {
10603 log_error ("Password Safe v2 container not specified");
10604
10605 exit (-1);
10606 }
10607
10608 FILE *fp = fopen (input_buf, "rb");
10609
10610 if (fp == NULL)
10611 {
10612 log_error ("%s: %s", input_buf, strerror (errno));
10613
10614 exit (-1);
10615 }
10616
10617 psafe2_hdr buf;
10618
10619 memset (&buf, 0, sizeof (psafe2_hdr));
10620
10621 int n = fread (&buf, sizeof (psafe2_hdr), 1, fp);
10622
10623 fclose (fp);
10624
10625 if (n != 1) return (PARSER_PSAFE2_FILE_SIZE);
10626
10627 salt->salt_buf[0] = buf.random[0];
10628 salt->salt_buf[1] = buf.random[1];
10629
10630 salt->salt_len = 8;
10631 salt->salt_iter = 1000;
10632
10633 digest[0] = byte_swap_32 (buf.hash[0]);
10634 digest[1] = byte_swap_32 (buf.hash[1]);
10635 digest[2] = byte_swap_32 (buf.hash[2]);
10636 digest[3] = byte_swap_32 (buf.hash[3]);
10637 digest[4] = byte_swap_32 (buf.hash[4]);
10638
10639 return (PARSER_OK);
10640 }
10641
10642 int psafe3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10643 {
10644 u32 *digest = (u32 *) hash_buf->digest;
10645
10646 salt_t *salt = hash_buf->salt;
10647
10648 if (input_len == 0)
10649 {
10650 log_error (".psafe3 not specified");
10651
10652 exit (-1);
10653 }
10654
10655 FILE *fp = fopen (input_buf, "rb");
10656
10657 if (fp == NULL)
10658 {
10659 log_error ("%s: %s", input_buf, strerror (errno));
10660
10661 exit (-1);
10662 }
10663
10664 psafe3_t in;
10665
10666 int n = fread (&in, sizeof (psafe3_t), 1, fp);
10667
10668 fclose (fp);
10669
10670 data.hashfile = input_buf; // we will need this in case it gets cracked
10671
10672 if (memcmp (SIGNATURE_PSAFE3, in.signature, 4)) return (PARSER_SIGNATURE_UNMATCHED);
10673
10674 if (n != 1) return (PARSER_PSAFE3_FILE_SIZE);
10675
10676 salt->salt_iter = in.iterations + 1;
10677
10678 salt->salt_buf[0] = in.salt_buf[0];
10679 salt->salt_buf[1] = in.salt_buf[1];
10680 salt->salt_buf[2] = in.salt_buf[2];
10681 salt->salt_buf[3] = in.salt_buf[3];
10682 salt->salt_buf[4] = in.salt_buf[4];
10683 salt->salt_buf[5] = in.salt_buf[5];
10684 salt->salt_buf[6] = in.salt_buf[6];
10685 salt->salt_buf[7] = in.salt_buf[7];
10686
10687 salt->salt_len = 32;
10688
10689 digest[0] = in.hash_buf[0];
10690 digest[1] = in.hash_buf[1];
10691 digest[2] = in.hash_buf[2];
10692 digest[3] = in.hash_buf[3];
10693 digest[4] = in.hash_buf[4];
10694 digest[5] = in.hash_buf[5];
10695 digest[6] = in.hash_buf[6];
10696 digest[7] = in.hash_buf[7];
10697
10698 digest[0] = byte_swap_32 (digest[0]);
10699 digest[1] = byte_swap_32 (digest[1]);
10700 digest[2] = byte_swap_32 (digest[2]);
10701 digest[3] = byte_swap_32 (digest[3]);
10702 digest[4] = byte_swap_32 (digest[4]);
10703 digest[5] = byte_swap_32 (digest[5]);
10704 digest[6] = byte_swap_32 (digest[6]);
10705 digest[7] = byte_swap_32 (digest[7]);
10706
10707 return (PARSER_OK);
10708 }
10709
10710 int phpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10711 {
10712 if ((input_len < DISPLAY_LEN_MIN_400) || (input_len > DISPLAY_LEN_MAX_400)) return (PARSER_GLOBAL_LENGTH);
10713
10714 if ((memcmp (SIGNATURE_PHPASS1, input_buf, 3)) && (memcmp (SIGNATURE_PHPASS2, input_buf, 3))) return (PARSER_SIGNATURE_UNMATCHED);
10715
10716 u32 *digest = (u32 *) hash_buf->digest;
10717
10718 salt_t *salt = hash_buf->salt;
10719
10720 char *iter_pos = input_buf + 3;
10721
10722 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
10723
10724 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
10725
10726 memcpy ((char *) salt->salt_sign, input_buf, 4);
10727
10728 salt->salt_iter = salt_iter;
10729
10730 char *salt_pos = iter_pos + 1;
10731
10732 uint salt_len = 8;
10733
10734 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10735
10736 salt->salt_len = salt_len;
10737
10738 char *hash_pos = salt_pos + salt_len;
10739
10740 phpass_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10741
10742 return (PARSER_OK);
10743 }
10744
10745 int md5crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10746 {
10747 if (input_len < DISPLAY_LEN_MIN_500) return (PARSER_GLOBAL_LENGTH);
10748
10749 if (memcmp (SIGNATURE_MD5CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
10750
10751 u32 *digest = (u32 *) hash_buf->digest;
10752
10753 salt_t *salt = hash_buf->salt;
10754
10755 char *salt_pos = input_buf + 3;
10756
10757 uint iterations_len = 0;
10758
10759 if (memcmp (salt_pos, "rounds=", 7) == 0)
10760 {
10761 salt_pos += 7;
10762
10763 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10764
10765 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10766 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10767
10768 salt_pos[0] = 0x0;
10769
10770 salt->salt_iter = atoi (salt_pos - iterations_len);
10771
10772 salt_pos += 1;
10773
10774 iterations_len += 8;
10775 }
10776 else
10777 {
10778 salt->salt_iter = ROUNDS_MD5CRYPT;
10779 }
10780
10781 if (input_len > (DISPLAY_LEN_MAX_500 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
10782
10783 char *hash_pos = strchr (salt_pos, '$');
10784
10785 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10786
10787 uint salt_len = hash_pos - salt_pos;
10788
10789 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10790
10791 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10792
10793 salt->salt_len = salt_len;
10794
10795 hash_pos++;
10796
10797 uint hash_len = input_len - 3 - iterations_len - salt_len - 1;
10798
10799 if (hash_len != 22) return (PARSER_HASH_LENGTH);
10800
10801 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10802
10803 return (PARSER_OK);
10804 }
10805
10806 int md5apr1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10807 {
10808 if (memcmp (SIGNATURE_MD5APR1, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
10809
10810 u32 *digest = (u32 *) hash_buf->digest;
10811
10812 salt_t *salt = hash_buf->salt;
10813
10814 char *salt_pos = input_buf + 6;
10815
10816 uint iterations_len = 0;
10817
10818 if (memcmp (salt_pos, "rounds=", 7) == 0)
10819 {
10820 salt_pos += 7;
10821
10822 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10823
10824 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10825 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10826
10827 salt_pos[0] = 0x0;
10828
10829 salt->salt_iter = atoi (salt_pos - iterations_len);
10830
10831 salt_pos += 1;
10832
10833 iterations_len += 8;
10834 }
10835 else
10836 {
10837 salt->salt_iter = ROUNDS_MD5CRYPT;
10838 }
10839
10840 if ((input_len < DISPLAY_LEN_MIN_1600) || (input_len > DISPLAY_LEN_MAX_1600 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
10841
10842 char *hash_pos = strchr (salt_pos, '$');
10843
10844 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10845
10846 uint salt_len = hash_pos - salt_pos;
10847
10848 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10849
10850 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10851
10852 salt->salt_len = salt_len;
10853
10854 hash_pos++;
10855
10856 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10857
10858 return (PARSER_OK);
10859 }
10860
10861 int episerver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10862 {
10863 if ((input_len < DISPLAY_LEN_MIN_141) || (input_len > DISPLAY_LEN_MAX_141)) return (PARSER_GLOBAL_LENGTH);
10864
10865 if (memcmp (SIGNATURE_EPISERVER, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
10866
10867 u32 *digest = (u32 *) hash_buf->digest;
10868
10869 salt_t *salt = hash_buf->salt;
10870
10871 char *salt_pos = input_buf + 14;
10872
10873 char *hash_pos = strchr (salt_pos, '*');
10874
10875 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10876
10877 hash_pos++;
10878
10879 uint salt_len = hash_pos - salt_pos - 1;
10880
10881 char *salt_buf_ptr = (char *) salt->salt_buf;
10882
10883 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
10884
10885 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10886
10887 salt->salt_len = salt_len;
10888
10889 u8 tmp_buf[100] = { 0 };
10890
10891 base64_decode (base64_to_int, (const u8 *) hash_pos, 27, tmp_buf);
10892
10893 memcpy (digest, tmp_buf, 20);
10894
10895 digest[0] = byte_swap_32 (digest[0]);
10896 digest[1] = byte_swap_32 (digest[1]);
10897 digest[2] = byte_swap_32 (digest[2]);
10898 digest[3] = byte_swap_32 (digest[3]);
10899 digest[4] = byte_swap_32 (digest[4]);
10900
10901 digest[0] -= SHA1M_A;
10902 digest[1] -= SHA1M_B;
10903 digest[2] -= SHA1M_C;
10904 digest[3] -= SHA1M_D;
10905 digest[4] -= SHA1M_E;
10906
10907 return (PARSER_OK);
10908 }
10909
10910 int descrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10911 {
10912 if ((input_len < DISPLAY_LEN_MIN_1500) || (input_len > DISPLAY_LEN_MAX_1500)) return (PARSER_GLOBAL_LENGTH);
10913
10914 unsigned char c12 = itoa64_to_int (input_buf[12]);
10915
10916 if (c12 & 3) return (PARSER_HASH_VALUE);
10917
10918 u32 *digest = (u32 *) hash_buf->digest;
10919
10920 salt_t *salt = hash_buf->salt;
10921
10922 // for ascii_digest
10923 salt->salt_sign[0] = input_buf[0];
10924 salt->salt_sign[1] = input_buf[1];
10925
10926 salt->salt_buf[0] = itoa64_to_int (input_buf[0])
10927 | itoa64_to_int (input_buf[1]) << 6;
10928
10929 salt->salt_len = 2;
10930
10931 u8 tmp_buf[100] = { 0 };
10932
10933 base64_decode (itoa64_to_int, (const u8 *) input_buf + 2, 11, tmp_buf);
10934
10935 memcpy (digest, tmp_buf, 8);
10936
10937 uint tt;
10938
10939 IP (digest[0], digest[1], tt);
10940
10941 digest[2] = 0;
10942 digest[3] = 0;
10943
10944 return (PARSER_OK);
10945 }
10946
10947 int md4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10948 {
10949 if ((input_len < DISPLAY_LEN_MIN_900) || (input_len > DISPLAY_LEN_MAX_900)) return (PARSER_GLOBAL_LENGTH);
10950
10951 u32 *digest = (u32 *) hash_buf->digest;
10952
10953 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10954 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10955 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10956 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10957
10958 digest[0] = byte_swap_32 (digest[0]);
10959 digest[1] = byte_swap_32 (digest[1]);
10960 digest[2] = byte_swap_32 (digest[2]);
10961 digest[3] = byte_swap_32 (digest[3]);
10962
10963 digest[0] -= MD4M_A;
10964 digest[1] -= MD4M_B;
10965 digest[2] -= MD4M_C;
10966 digest[3] -= MD4M_D;
10967
10968 return (PARSER_OK);
10969 }
10970
10971 int md4s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10972 {
10973 if (data.opts_type & OPTS_TYPE_ST_HEX)
10974 {
10975 if ((input_len < DISPLAY_LEN_MIN_910H) || (input_len > DISPLAY_LEN_MAX_910H)) return (PARSER_GLOBAL_LENGTH);
10976 }
10977 else
10978 {
10979 if ((input_len < DISPLAY_LEN_MIN_910) || (input_len > DISPLAY_LEN_MAX_910)) return (PARSER_GLOBAL_LENGTH);
10980 }
10981
10982 u32 *digest = (u32 *) hash_buf->digest;
10983
10984 salt_t *salt = hash_buf->salt;
10985
10986 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10987 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10988 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10989 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10990
10991 digest[0] = byte_swap_32 (digest[0]);
10992 digest[1] = byte_swap_32 (digest[1]);
10993 digest[2] = byte_swap_32 (digest[2]);
10994 digest[3] = byte_swap_32 (digest[3]);
10995
10996 digest[0] -= MD4M_A;
10997 digest[1] -= MD4M_B;
10998 digest[2] -= MD4M_C;
10999 digest[3] -= MD4M_D;
11000
11001 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11002
11003 uint salt_len = input_len - 32 - 1;
11004
11005 char *salt_buf = input_buf + 32 + 1;
11006
11007 char *salt_buf_ptr = (char *) salt->salt_buf;
11008
11009 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11010
11011 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11012
11013 salt->salt_len = salt_len;
11014
11015 return (PARSER_OK);
11016 }
11017
11018 int md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11019 {
11020 if ((input_len < DISPLAY_LEN_MIN_0) || (input_len > DISPLAY_LEN_MAX_0)) return (PARSER_GLOBAL_LENGTH);
11021
11022 u32 *digest = (u32 *) hash_buf->digest;
11023
11024 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11025 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11026 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11027 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11028
11029 digest[0] = byte_swap_32 (digest[0]);
11030 digest[1] = byte_swap_32 (digest[1]);
11031 digest[2] = byte_swap_32 (digest[2]);
11032 digest[3] = byte_swap_32 (digest[3]);
11033
11034 digest[0] -= MD5M_A;
11035 digest[1] -= MD5M_B;
11036 digest[2] -= MD5M_C;
11037 digest[3] -= MD5M_D;
11038
11039 return (PARSER_OK);
11040 }
11041
11042 int md5half_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11043 {
11044 if ((input_len < DISPLAY_LEN_MIN_5100) || (input_len > DISPLAY_LEN_MAX_5100)) return (PARSER_GLOBAL_LENGTH);
11045
11046 u32 *digest = (u32 *) hash_buf->digest;
11047
11048 digest[0] = hex_to_u32 ((const u8 *) &input_buf[0]);
11049 digest[1] = hex_to_u32 ((const u8 *) &input_buf[8]);
11050 digest[2] = 0;
11051 digest[3] = 0;
11052
11053 digest[0] = byte_swap_32 (digest[0]);
11054 digest[1] = byte_swap_32 (digest[1]);
11055
11056 return (PARSER_OK);
11057 }
11058
11059 int md5s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11060 {
11061 if (data.opts_type & OPTS_TYPE_ST_HEX)
11062 {
11063 if ((input_len < DISPLAY_LEN_MIN_10H) || (input_len > DISPLAY_LEN_MAX_10H)) return (PARSER_GLOBAL_LENGTH);
11064 }
11065 else
11066 {
11067 if ((input_len < DISPLAY_LEN_MIN_10) || (input_len > DISPLAY_LEN_MAX_10)) return (PARSER_GLOBAL_LENGTH);
11068 }
11069
11070 u32 *digest = (u32 *) hash_buf->digest;
11071
11072 salt_t *salt = hash_buf->salt;
11073
11074 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11075 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11076 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11077 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11078
11079 digest[0] = byte_swap_32 (digest[0]);
11080 digest[1] = byte_swap_32 (digest[1]);
11081 digest[2] = byte_swap_32 (digest[2]);
11082 digest[3] = byte_swap_32 (digest[3]);
11083
11084 digest[0] -= MD5M_A;
11085 digest[1] -= MD5M_B;
11086 digest[2] -= MD5M_C;
11087 digest[3] -= MD5M_D;
11088
11089 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11090
11091 uint salt_len = input_len - 32 - 1;
11092
11093 char *salt_buf = input_buf + 32 + 1;
11094
11095 char *salt_buf_ptr = (char *) salt->salt_buf;
11096
11097 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11098
11099 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11100
11101 salt->salt_len = salt_len;
11102
11103 return (PARSER_OK);
11104 }
11105
11106 int md5pix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11107 {
11108 if ((input_len < DISPLAY_LEN_MIN_2400) || (input_len > DISPLAY_LEN_MAX_2400)) return (PARSER_GLOBAL_LENGTH);
11109
11110 u32 *digest = (u32 *) hash_buf->digest;
11111
11112 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
11113 | itoa64_to_int (input_buf[ 1]) << 6
11114 | itoa64_to_int (input_buf[ 2]) << 12
11115 | itoa64_to_int (input_buf[ 3]) << 18;
11116 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
11117 | itoa64_to_int (input_buf[ 5]) << 6
11118 | itoa64_to_int (input_buf[ 6]) << 12
11119 | itoa64_to_int (input_buf[ 7]) << 18;
11120 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
11121 | itoa64_to_int (input_buf[ 9]) << 6
11122 | itoa64_to_int (input_buf[10]) << 12
11123 | itoa64_to_int (input_buf[11]) << 18;
11124 digest[3] = itoa64_to_int (input_buf[12]) << 0
11125 | itoa64_to_int (input_buf[13]) << 6
11126 | itoa64_to_int (input_buf[14]) << 12
11127 | itoa64_to_int (input_buf[15]) << 18;
11128
11129 digest[0] -= MD5M_A;
11130 digest[1] -= MD5M_B;
11131 digest[2] -= MD5M_C;
11132 digest[3] -= MD5M_D;
11133
11134 digest[0] &= 0x00ffffff;
11135 digest[1] &= 0x00ffffff;
11136 digest[2] &= 0x00ffffff;
11137 digest[3] &= 0x00ffffff;
11138
11139 return (PARSER_OK);
11140 }
11141
11142 int md5asa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11143 {
11144 if (data.opts_type & OPTS_TYPE_ST_HEX)
11145 {
11146 if ((input_len < DISPLAY_LEN_MIN_2410H) || (input_len > DISPLAY_LEN_MAX_2410H)) return (PARSER_GLOBAL_LENGTH);
11147 }
11148 else
11149 {
11150 if ((input_len < DISPLAY_LEN_MIN_2410) || (input_len > DISPLAY_LEN_MAX_2410)) return (PARSER_GLOBAL_LENGTH);
11151 }
11152
11153 u32 *digest = (u32 *) hash_buf->digest;
11154
11155 salt_t *salt = hash_buf->salt;
11156
11157 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
11158 | itoa64_to_int (input_buf[ 1]) << 6
11159 | itoa64_to_int (input_buf[ 2]) << 12
11160 | itoa64_to_int (input_buf[ 3]) << 18;
11161 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
11162 | itoa64_to_int (input_buf[ 5]) << 6
11163 | itoa64_to_int (input_buf[ 6]) << 12
11164 | itoa64_to_int (input_buf[ 7]) << 18;
11165 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
11166 | itoa64_to_int (input_buf[ 9]) << 6
11167 | itoa64_to_int (input_buf[10]) << 12
11168 | itoa64_to_int (input_buf[11]) << 18;
11169 digest[3] = itoa64_to_int (input_buf[12]) << 0
11170 | itoa64_to_int (input_buf[13]) << 6
11171 | itoa64_to_int (input_buf[14]) << 12
11172 | itoa64_to_int (input_buf[15]) << 18;
11173
11174 digest[0] -= MD5M_A;
11175 digest[1] -= MD5M_B;
11176 digest[2] -= MD5M_C;
11177 digest[3] -= MD5M_D;
11178
11179 digest[0] &= 0x00ffffff;
11180 digest[1] &= 0x00ffffff;
11181 digest[2] &= 0x00ffffff;
11182 digest[3] &= 0x00ffffff;
11183
11184 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11185
11186 uint salt_len = input_len - 16 - 1;
11187
11188 char *salt_buf = input_buf + 16 + 1;
11189
11190 char *salt_buf_ptr = (char *) salt->salt_buf;
11191
11192 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11193
11194 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11195
11196 salt->salt_len = salt_len;
11197
11198 return (PARSER_OK);
11199 }
11200
11201 void transform_netntlmv1_key (const u8 *nthash, u8 *key)
11202 {
11203 key[0] = (nthash[0] >> 0);
11204 key[1] = (nthash[0] << 7) | (nthash[1] >> 1);
11205 key[2] = (nthash[1] << 6) | (nthash[2] >> 2);
11206 key[3] = (nthash[2] << 5) | (nthash[3] >> 3);
11207 key[4] = (nthash[3] << 4) | (nthash[4] >> 4);
11208 key[5] = (nthash[4] << 3) | (nthash[5] >> 5);
11209 key[6] = (nthash[5] << 2) | (nthash[6] >> 6);
11210 key[7] = (nthash[6] << 1);
11211
11212 key[0] |= 0x01;
11213 key[1] |= 0x01;
11214 key[2] |= 0x01;
11215 key[3] |= 0x01;
11216 key[4] |= 0x01;
11217 key[5] |= 0x01;
11218 key[6] |= 0x01;
11219 key[7] |= 0x01;
11220 }
11221
11222 int netntlmv1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11223 {
11224 if ((input_len < DISPLAY_LEN_MIN_5500) || (input_len > DISPLAY_LEN_MAX_5500)) return (PARSER_GLOBAL_LENGTH);
11225
11226 u32 *digest = (u32 *) hash_buf->digest;
11227
11228 salt_t *salt = hash_buf->salt;
11229
11230 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
11231
11232 /**
11233 * parse line
11234 */
11235
11236 char *user_pos = input_buf;
11237
11238 char *unused_pos = strchr (user_pos, ':');
11239
11240 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11241
11242 uint user_len = unused_pos - user_pos;
11243
11244 if (user_len > 60) return (PARSER_SALT_LENGTH);
11245
11246 unused_pos++;
11247
11248 char *domain_pos = strchr (unused_pos, ':');
11249
11250 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11251
11252 uint unused_len = domain_pos - unused_pos;
11253
11254 if (unused_len != 0) return (PARSER_SALT_LENGTH);
11255
11256 domain_pos++;
11257
11258 char *srvchall_pos = strchr (domain_pos, ':');
11259
11260 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11261
11262 uint domain_len = srvchall_pos - domain_pos;
11263
11264 if (domain_len > 45) return (PARSER_SALT_LENGTH);
11265
11266 srvchall_pos++;
11267
11268 char *hash_pos = strchr (srvchall_pos, ':');
11269
11270 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11271
11272 uint srvchall_len = hash_pos - srvchall_pos;
11273
11274 // if (srvchall_len != 0) return (PARSER_SALT_LENGTH);
11275
11276 hash_pos++;
11277
11278 char *clichall_pos = strchr (hash_pos, ':');
11279
11280 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11281
11282 uint hash_len = clichall_pos - hash_pos;
11283
11284 if (hash_len != 48) return (PARSER_HASH_LENGTH);
11285
11286 clichall_pos++;
11287
11288 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
11289
11290 if (clichall_len != 16) return (PARSER_SALT_LENGTH);
11291
11292 /**
11293 * store some data for later use
11294 */
11295
11296 netntlm->user_len = user_len * 2;
11297 netntlm->domain_len = domain_len * 2;
11298 netntlm->srvchall_len = srvchall_len / 2;
11299 netntlm->clichall_len = clichall_len / 2;
11300
11301 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
11302 char *chall_ptr = (char *) netntlm->chall_buf;
11303
11304 /**
11305 * handle username and domainname
11306 */
11307
11308 for (uint i = 0; i < user_len; i++)
11309 {
11310 *userdomain_ptr++ = user_pos[i];
11311 *userdomain_ptr++ = 0;
11312 }
11313
11314 for (uint i = 0; i < domain_len; i++)
11315 {
11316 *userdomain_ptr++ = domain_pos[i];
11317 *userdomain_ptr++ = 0;
11318 }
11319
11320 /**
11321 * handle server challenge encoding
11322 */
11323
11324 for (uint i = 0; i < srvchall_len; i += 2)
11325 {
11326 const char p0 = srvchall_pos[i + 0];
11327 const char p1 = srvchall_pos[i + 1];
11328
11329 *chall_ptr++ = hex_convert (p1) << 0
11330 | hex_convert (p0) << 4;
11331 }
11332
11333 /**
11334 * handle client challenge encoding
11335 */
11336
11337 for (uint i = 0; i < clichall_len; i += 2)
11338 {
11339 const char p0 = clichall_pos[i + 0];
11340 const char p1 = clichall_pos[i + 1];
11341
11342 *chall_ptr++ = hex_convert (p1) << 0
11343 | hex_convert (p0) << 4;
11344 }
11345
11346 /**
11347 * store data
11348 */
11349
11350 char *salt_buf_ptr = (char *) salt->salt_buf;
11351
11352 uint salt_len = parse_and_store_salt (salt_buf_ptr, clichall_pos, clichall_len);
11353
11354 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11355
11356 salt->salt_len = salt_len;
11357
11358 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11359 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11360 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11361 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11362
11363 digest[0] = byte_swap_32 (digest[0]);
11364 digest[1] = byte_swap_32 (digest[1]);
11365 digest[2] = byte_swap_32 (digest[2]);
11366 digest[3] = byte_swap_32 (digest[3]);
11367
11368 /* special case, last 8 byte do not need to be checked since they are brute-forced next */
11369
11370 uint digest_tmp[2] = { 0 };
11371
11372 digest_tmp[0] = hex_to_u32 ((const u8 *) &hash_pos[32]);
11373 digest_tmp[1] = hex_to_u32 ((const u8 *) &hash_pos[40]);
11374
11375 digest_tmp[0] = byte_swap_32 (digest_tmp[0]);
11376 digest_tmp[1] = byte_swap_32 (digest_tmp[1]);
11377
11378 /* special case 2: ESS */
11379
11380 if (srvchall_len == 48)
11381 {
11382 if ((netntlm->chall_buf[2] == 0) && (netntlm->chall_buf[3] == 0) && (netntlm->chall_buf[4] == 0) && (netntlm->chall_buf[5] == 0))
11383 {
11384 uint w[16] = { 0 };
11385
11386 w[ 0] = netntlm->chall_buf[6];
11387 w[ 1] = netntlm->chall_buf[7];
11388 w[ 2] = netntlm->chall_buf[0];
11389 w[ 3] = netntlm->chall_buf[1];
11390 w[ 4] = 0x80;
11391 w[14] = 16 * 8;
11392
11393 uint dgst[4] = { 0 };
11394
11395 dgst[0] = MAGIC_A;
11396 dgst[1] = MAGIC_B;
11397 dgst[2] = MAGIC_C;
11398 dgst[3] = MAGIC_D;
11399
11400 md5_64 (w, dgst);
11401
11402 salt->salt_buf[0] = dgst[0];
11403 salt->salt_buf[1] = dgst[1];
11404 }
11405 }
11406
11407 /* precompute netntlmv1 exploit start */
11408
11409 for (uint i = 0; i < 0x10000; i++)
11410 {
11411 uint key_md4[2] = { i, 0 };
11412 uint key_des[2] = { 0, 0 };
11413
11414 transform_netntlmv1_key ((u8 *) key_md4, (u8 *) key_des);
11415
11416 uint Kc[16] = { 0 };
11417 uint Kd[16] = { 0 };
11418
11419 _des_keysetup (key_des, Kc, Kd, c_skb);
11420
11421 uint data3[2] = { salt->salt_buf[0], salt->salt_buf[1] };
11422
11423 _des_encrypt (data3, Kc, Kd, c_SPtrans);
11424
11425 if (data3[0] != digest_tmp[0]) continue;
11426 if (data3[1] != digest_tmp[1]) continue;
11427
11428 salt->salt_buf[2] = i;
11429
11430 salt->salt_len = 24;
11431
11432 break;
11433 }
11434
11435 salt->salt_buf_pc[0] = digest_tmp[0];
11436 salt->salt_buf_pc[1] = digest_tmp[1];
11437
11438 /* precompute netntlmv1 exploit stop */
11439
11440 u32 tt;
11441
11442 IP (digest[0], digest[1], tt);
11443 IP (digest[2], digest[3], tt);
11444
11445 digest[0] = rotr32 (digest[0], 29);
11446 digest[1] = rotr32 (digest[1], 29);
11447 digest[2] = rotr32 (digest[2], 29);
11448 digest[3] = rotr32 (digest[3], 29);
11449
11450 IP (salt->salt_buf[0], salt->salt_buf[1], tt);
11451
11452 salt->salt_buf[0] = rotl32 (salt->salt_buf[0], 3);
11453 salt->salt_buf[1] = rotl32 (salt->salt_buf[1], 3);
11454
11455 return (PARSER_OK);
11456 }
11457
11458 int netntlmv2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11459 {
11460 if ((input_len < DISPLAY_LEN_MIN_5600) || (input_len > DISPLAY_LEN_MAX_5600)) return (PARSER_GLOBAL_LENGTH);
11461
11462 u32 *digest = (u32 *) hash_buf->digest;
11463
11464 salt_t *salt = hash_buf->salt;
11465
11466 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
11467
11468 /**
11469 * parse line
11470 */
11471
11472 char *user_pos = input_buf;
11473
11474 char *unused_pos = strchr (user_pos, ':');
11475
11476 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11477
11478 uint user_len = unused_pos - user_pos;
11479
11480 if (user_len > 60) return (PARSER_SALT_LENGTH);
11481
11482 unused_pos++;
11483
11484 char *domain_pos = strchr (unused_pos, ':');
11485
11486 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11487
11488 uint unused_len = domain_pos - unused_pos;
11489
11490 if (unused_len != 0) return (PARSER_SALT_LENGTH);
11491
11492 domain_pos++;
11493
11494 char *srvchall_pos = strchr (domain_pos, ':');
11495
11496 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11497
11498 uint domain_len = srvchall_pos - domain_pos;
11499
11500 if (domain_len > 45) return (PARSER_SALT_LENGTH);
11501
11502 srvchall_pos++;
11503
11504 char *hash_pos = strchr (srvchall_pos, ':');
11505
11506 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11507
11508 uint srvchall_len = hash_pos - srvchall_pos;
11509
11510 if (srvchall_len != 16) return (PARSER_SALT_LENGTH);
11511
11512 hash_pos++;
11513
11514 char *clichall_pos = strchr (hash_pos, ':');
11515
11516 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11517
11518 uint hash_len = clichall_pos - hash_pos;
11519
11520 if (hash_len != 32) return (PARSER_HASH_LENGTH);
11521
11522 clichall_pos++;
11523
11524 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
11525
11526 if (clichall_len > 1024) return (PARSER_SALT_LENGTH);
11527
11528 if (clichall_len % 2) return (PARSER_SALT_VALUE);
11529
11530 /**
11531 * store some data for later use
11532 */
11533
11534 netntlm->user_len = user_len * 2;
11535 netntlm->domain_len = domain_len * 2;
11536 netntlm->srvchall_len = srvchall_len / 2;
11537 netntlm->clichall_len = clichall_len / 2;
11538
11539 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
11540 char *chall_ptr = (char *) netntlm->chall_buf;
11541
11542 /**
11543 * handle username and domainname
11544 */
11545
11546 for (uint i = 0; i < user_len; i++)
11547 {
11548 *userdomain_ptr++ = toupper (user_pos[i]);
11549 *userdomain_ptr++ = 0;
11550 }
11551
11552 for (uint i = 0; i < domain_len; i++)
11553 {
11554 *userdomain_ptr++ = domain_pos[i];
11555 *userdomain_ptr++ = 0;
11556 }
11557
11558 *userdomain_ptr++ = 0x80;
11559
11560 /**
11561 * handle server challenge encoding
11562 */
11563
11564 for (uint i = 0; i < srvchall_len; i += 2)
11565 {
11566 const char p0 = srvchall_pos[i + 0];
11567 const char p1 = srvchall_pos[i + 1];
11568
11569 *chall_ptr++ = hex_convert (p1) << 0
11570 | hex_convert (p0) << 4;
11571 }
11572
11573 /**
11574 * handle client challenge encoding
11575 */
11576
11577 for (uint i = 0; i < clichall_len; i += 2)
11578 {
11579 const char p0 = clichall_pos[i + 0];
11580 const char p1 = clichall_pos[i + 1];
11581
11582 *chall_ptr++ = hex_convert (p1) << 0
11583 | hex_convert (p0) << 4;
11584 }
11585
11586 *chall_ptr++ = 0x80;
11587
11588 /**
11589 * handle hash itself
11590 */
11591
11592 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11593 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11594 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11595 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11596
11597 digest[0] = byte_swap_32 (digest[0]);
11598 digest[1] = byte_swap_32 (digest[1]);
11599 digest[2] = byte_swap_32 (digest[2]);
11600 digest[3] = byte_swap_32 (digest[3]);
11601
11602 /**
11603 * reuse challange data as salt_buf, its the buffer that is most likely unique
11604 */
11605
11606 salt->salt_buf[0] = 0;
11607 salt->salt_buf[1] = 0;
11608 salt->salt_buf[2] = 0;
11609 salt->salt_buf[3] = 0;
11610 salt->salt_buf[4] = 0;
11611 salt->salt_buf[5] = 0;
11612 salt->salt_buf[6] = 0;
11613 salt->salt_buf[7] = 0;
11614
11615 uint *uptr;
11616
11617 uptr = (uint *) netntlm->userdomain_buf;
11618
11619 for (uint i = 0; i < 16; i += 16)
11620 {
11621 md5_64 (uptr, salt->salt_buf);
11622 }
11623
11624 uptr = (uint *) netntlm->chall_buf;
11625
11626 for (uint i = 0; i < 256; i += 16)
11627 {
11628 md5_64 (uptr, salt->salt_buf);
11629 }
11630
11631 salt->salt_len = 16;
11632
11633 return (PARSER_OK);
11634 }
11635
11636 int joomla_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11637 {
11638 if (data.opts_type & OPTS_TYPE_ST_HEX)
11639 {
11640 if ((input_len < DISPLAY_LEN_MIN_11H) || (input_len > DISPLAY_LEN_MAX_11H)) return (PARSER_GLOBAL_LENGTH);
11641 }
11642 else
11643 {
11644 if ((input_len < DISPLAY_LEN_MIN_11) || (input_len > DISPLAY_LEN_MAX_11)) return (PARSER_GLOBAL_LENGTH);
11645 }
11646
11647 u32 *digest = (u32 *) hash_buf->digest;
11648
11649 salt_t *salt = hash_buf->salt;
11650
11651 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11652 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11653 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11654 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11655
11656 digest[0] = byte_swap_32 (digest[0]);
11657 digest[1] = byte_swap_32 (digest[1]);
11658 digest[2] = byte_swap_32 (digest[2]);
11659 digest[3] = byte_swap_32 (digest[3]);
11660
11661 digest[0] -= MD5M_A;
11662 digest[1] -= MD5M_B;
11663 digest[2] -= MD5M_C;
11664 digest[3] -= MD5M_D;
11665
11666 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11667
11668 uint salt_len = input_len - 32 - 1;
11669
11670 char *salt_buf = input_buf + 32 + 1;
11671
11672 char *salt_buf_ptr = (char *) salt->salt_buf;
11673
11674 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11675
11676 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11677
11678 salt->salt_len = salt_len;
11679
11680 return (PARSER_OK);
11681 }
11682
11683 int postgresql_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11684 {
11685 if (data.opts_type & OPTS_TYPE_ST_HEX)
11686 {
11687 if ((input_len < DISPLAY_LEN_MIN_12H) || (input_len > DISPLAY_LEN_MAX_12H)) return (PARSER_GLOBAL_LENGTH);
11688 }
11689 else
11690 {
11691 if ((input_len < DISPLAY_LEN_MIN_12) || (input_len > DISPLAY_LEN_MAX_12)) return (PARSER_GLOBAL_LENGTH);
11692 }
11693
11694 u32 *digest = (u32 *) hash_buf->digest;
11695
11696 salt_t *salt = hash_buf->salt;
11697
11698 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11699 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11700 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11701 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11702
11703 digest[0] = byte_swap_32 (digest[0]);
11704 digest[1] = byte_swap_32 (digest[1]);
11705 digest[2] = byte_swap_32 (digest[2]);
11706 digest[3] = byte_swap_32 (digest[3]);
11707
11708 digest[0] -= MD5M_A;
11709 digest[1] -= MD5M_B;
11710 digest[2] -= MD5M_C;
11711 digest[3] -= MD5M_D;
11712
11713 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11714
11715 uint salt_len = input_len - 32 - 1;
11716
11717 char *salt_buf = input_buf + 32 + 1;
11718
11719 char *salt_buf_ptr = (char *) salt->salt_buf;
11720
11721 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11722
11723 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11724
11725 salt->salt_len = salt_len;
11726
11727 return (PARSER_OK);
11728 }
11729
11730 int md5md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11731 {
11732 if ((input_len < DISPLAY_LEN_MIN_2600) || (input_len > DISPLAY_LEN_MAX_2600)) return (PARSER_GLOBAL_LENGTH);
11733
11734 u32 *digest = (u32 *) hash_buf->digest;
11735
11736 salt_t *salt = hash_buf->salt;
11737
11738 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11739 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11740 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11741 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11742
11743 digest[0] = byte_swap_32 (digest[0]);
11744 digest[1] = byte_swap_32 (digest[1]);
11745 digest[2] = byte_swap_32 (digest[2]);
11746 digest[3] = byte_swap_32 (digest[3]);
11747
11748 digest[0] -= MD5M_A;
11749 digest[1] -= MD5M_B;
11750 digest[2] -= MD5M_C;
11751 digest[3] -= MD5M_D;
11752
11753 /**
11754 * This is a virtual salt. While the algorithm is basically not salted
11755 * we can exploit the salt buffer to set the 0x80 and the w[14] value.
11756 * This way we can save a special md5md5 kernel and reuse the one from vbull.
11757 */
11758
11759 char *salt_buf_ptr = (char *) salt->salt_buf;
11760
11761 uint salt_len = parse_and_store_salt (salt_buf_ptr, (char *) "", 0);
11762
11763 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11764
11765 salt->salt_len = salt_len;
11766
11767 return (PARSER_OK);
11768 }
11769
11770 int vb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11771 {
11772 if (data.opts_type & OPTS_TYPE_ST_HEX)
11773 {
11774 if ((input_len < DISPLAY_LEN_MIN_2611H) || (input_len > DISPLAY_LEN_MAX_2611H)) return (PARSER_GLOBAL_LENGTH);
11775 }
11776 else
11777 {
11778 if ((input_len < DISPLAY_LEN_MIN_2611) || (input_len > DISPLAY_LEN_MAX_2611)) return (PARSER_GLOBAL_LENGTH);
11779 }
11780
11781 u32 *digest = (u32 *) hash_buf->digest;
11782
11783 salt_t *salt = hash_buf->salt;
11784
11785 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11786 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11787 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11788 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11789
11790 digest[0] = byte_swap_32 (digest[0]);
11791 digest[1] = byte_swap_32 (digest[1]);
11792 digest[2] = byte_swap_32 (digest[2]);
11793 digest[3] = byte_swap_32 (digest[3]);
11794
11795 digest[0] -= MD5M_A;
11796 digest[1] -= MD5M_B;
11797 digest[2] -= MD5M_C;
11798 digest[3] -= MD5M_D;
11799
11800 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11801
11802 uint salt_len = input_len - 32 - 1;
11803
11804 char *salt_buf = input_buf + 32 + 1;
11805
11806 char *salt_buf_ptr = (char *) salt->salt_buf;
11807
11808 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11809
11810 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11811
11812 salt->salt_len = salt_len;
11813
11814 return (PARSER_OK);
11815 }
11816
11817 int vb30_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11818 {
11819 if (data.opts_type & OPTS_TYPE_ST_HEX)
11820 {
11821 if ((input_len < DISPLAY_LEN_MIN_2711H) || (input_len > DISPLAY_LEN_MAX_2711H)) return (PARSER_GLOBAL_LENGTH);
11822 }
11823 else
11824 {
11825 if ((input_len < DISPLAY_LEN_MIN_2711) || (input_len > DISPLAY_LEN_MAX_2711)) return (PARSER_GLOBAL_LENGTH);
11826 }
11827
11828 u32 *digest = (u32 *) hash_buf->digest;
11829
11830 salt_t *salt = hash_buf->salt;
11831
11832 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11833 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11834 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11835 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11836
11837 digest[0] = byte_swap_32 (digest[0]);
11838 digest[1] = byte_swap_32 (digest[1]);
11839 digest[2] = byte_swap_32 (digest[2]);
11840 digest[3] = byte_swap_32 (digest[3]);
11841
11842 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11843
11844 uint salt_len = input_len - 32 - 1;
11845
11846 char *salt_buf = input_buf + 32 + 1;
11847
11848 char *salt_buf_ptr = (char *) salt->salt_buf;
11849
11850 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11851
11852 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11853
11854 salt->salt_len = salt_len;
11855
11856 return (PARSER_OK);
11857 }
11858
11859 int dcc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11860 {
11861 if (data.opts_type & OPTS_TYPE_ST_HEX)
11862 {
11863 if ((input_len < DISPLAY_LEN_MIN_1100H) || (input_len > DISPLAY_LEN_MAX_1100H)) return (PARSER_GLOBAL_LENGTH);
11864 }
11865 else
11866 {
11867 if ((input_len < DISPLAY_LEN_MIN_1100) || (input_len > DISPLAY_LEN_MAX_1100)) return (PARSER_GLOBAL_LENGTH);
11868 }
11869
11870 u32 *digest = (u32 *) hash_buf->digest;
11871
11872 salt_t *salt = hash_buf->salt;
11873
11874 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11875 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11876 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11877 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11878
11879 digest[0] = byte_swap_32 (digest[0]);
11880 digest[1] = byte_swap_32 (digest[1]);
11881 digest[2] = byte_swap_32 (digest[2]);
11882 digest[3] = byte_swap_32 (digest[3]);
11883
11884 digest[0] -= MD4M_A;
11885 digest[1] -= MD4M_B;
11886 digest[2] -= MD4M_C;
11887 digest[3] -= MD4M_D;
11888
11889 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11890
11891 uint salt_len = input_len - 32 - 1;
11892
11893 char *salt_buf = input_buf + 32 + 1;
11894
11895 char *salt_buf_ptr = (char *) salt->salt_buf;
11896
11897 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11898
11899 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11900
11901 salt->salt_len = salt_len;
11902
11903 return (PARSER_OK);
11904 }
11905
11906 int ipb2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11907 {
11908 if (data.opts_type & OPTS_TYPE_ST_HEX)
11909 {
11910 if ((input_len < DISPLAY_LEN_MIN_2811H) || (input_len > DISPLAY_LEN_MAX_2811H)) return (PARSER_GLOBAL_LENGTH);
11911 }
11912 else
11913 {
11914 if ((input_len < DISPLAY_LEN_MIN_2811) || (input_len > DISPLAY_LEN_MAX_2811)) return (PARSER_GLOBAL_LENGTH);
11915 }
11916
11917 u32 *digest = (u32 *) hash_buf->digest;
11918
11919 salt_t *salt = hash_buf->salt;
11920
11921 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11922 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11923 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11924 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11925
11926 digest[0] = byte_swap_32 (digest[0]);
11927 digest[1] = byte_swap_32 (digest[1]);
11928 digest[2] = byte_swap_32 (digest[2]);
11929 digest[3] = byte_swap_32 (digest[3]);
11930
11931 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11932
11933 uint salt_len = input_len - 32 - 1;
11934
11935 char *salt_buf = input_buf + 32 + 1;
11936
11937 uint salt_pc_block[16] = { 0 };
11938
11939 char *salt_pc_block_ptr = (char *) salt_pc_block;
11940
11941 salt_len = parse_and_store_salt (salt_pc_block_ptr, salt_buf, salt_len);
11942
11943 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11944
11945 salt_pc_block_ptr[salt_len] = (unsigned char) 0x80;
11946
11947 salt_pc_block[14] = salt_len * 8;
11948
11949 uint salt_pc_digest[4] = { MAGIC_A, MAGIC_B, MAGIC_C, MAGIC_D };
11950
11951 md5_64 (salt_pc_block, salt_pc_digest);
11952
11953 salt_pc_digest[0] = byte_swap_32 (salt_pc_digest[0]);
11954 salt_pc_digest[1] = byte_swap_32 (salt_pc_digest[1]);
11955 salt_pc_digest[2] = byte_swap_32 (salt_pc_digest[2]);
11956 salt_pc_digest[3] = byte_swap_32 (salt_pc_digest[3]);
11957
11958 u8 *salt_buf_ptr = (u8 *) salt->salt_buf;
11959
11960 memcpy (salt_buf_ptr, salt_buf, salt_len);
11961
11962 u8 *salt_buf_pc_ptr = (u8 *) salt->salt_buf_pc;
11963
11964 bin_to_hex_lower (salt_pc_digest[0], salt_buf_pc_ptr + 0);
11965 bin_to_hex_lower (salt_pc_digest[1], salt_buf_pc_ptr + 8);
11966 bin_to_hex_lower (salt_pc_digest[2], salt_buf_pc_ptr + 16);
11967 bin_to_hex_lower (salt_pc_digest[3], salt_buf_pc_ptr + 24);
11968
11969 salt->salt_len = 32; // changed, was salt_len before -- was a bug? 32 should be correct
11970
11971 return (PARSER_OK);
11972 }
11973
11974 int sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11975 {
11976 if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH);
11977
11978 u32 *digest = (u32 *) hash_buf->digest;
11979
11980 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11981 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11982 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11983 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11984 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11985
11986 digest[0] -= SHA1M_A;
11987 digest[1] -= SHA1M_B;
11988 digest[2] -= SHA1M_C;
11989 digest[3] -= SHA1M_D;
11990 digest[4] -= SHA1M_E;
11991
11992 return (PARSER_OK);
11993 }
11994
11995 int sha1linkedin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11996 {
11997 if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH);
11998
11999 u32 *digest = (u32 *) hash_buf->digest;
12000
12001 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12002 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12003 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12004 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12005 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12006
12007 return (PARSER_OK);
12008 }
12009
12010 int sha1axcrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12011 {
12012 if ((input_len < DISPLAY_LEN_MIN_13300) || (input_len > DISPLAY_LEN_MAX_13300)) return (PARSER_GLOBAL_LENGTH);
12013
12014 if (memcmp (SIGNATURE_AXCRYPT_SHA1, input_buf, 13)) return (PARSER_SIGNATURE_UNMATCHED);
12015
12016 u32 *digest = (u32 *) hash_buf->digest;
12017
12018 input_buf +=14;
12019
12020 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12021 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12022 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12023 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12024 digest[4] = 0x00000000;
12025
12026 return (PARSER_OK);
12027 }
12028
12029 int sha1s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12030 {
12031 if (data.opts_type & OPTS_TYPE_ST_HEX)
12032 {
12033 if ((input_len < DISPLAY_LEN_MIN_110H) || (input_len > DISPLAY_LEN_MAX_110H)) return (PARSER_GLOBAL_LENGTH);
12034 }
12035 else
12036 {
12037 if ((input_len < DISPLAY_LEN_MIN_110) || (input_len > DISPLAY_LEN_MAX_110)) return (PARSER_GLOBAL_LENGTH);
12038 }
12039
12040 u32 *digest = (u32 *) hash_buf->digest;
12041
12042 salt_t *salt = hash_buf->salt;
12043
12044 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12045 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12046 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12047 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12048 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12049
12050 digest[0] -= SHA1M_A;
12051 digest[1] -= SHA1M_B;
12052 digest[2] -= SHA1M_C;
12053 digest[3] -= SHA1M_D;
12054 digest[4] -= SHA1M_E;
12055
12056 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12057
12058 uint salt_len = input_len - 40 - 1;
12059
12060 char *salt_buf = input_buf + 40 + 1;
12061
12062 char *salt_buf_ptr = (char *) salt->salt_buf;
12063
12064 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12065
12066 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12067
12068 salt->salt_len = salt_len;
12069
12070 return (PARSER_OK);
12071 }
12072
12073 int pstoken_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12074 {
12075 if ((input_len < DISPLAY_LEN_MIN_13500) || (input_len > DISPLAY_LEN_MAX_13500)) return (PARSER_GLOBAL_LENGTH);
12076
12077 u32 *digest = (u32 *) hash_buf->digest;
12078
12079 salt_t *salt = hash_buf->salt;
12080
12081 pstoken_t *pstoken = (pstoken_t *) hash_buf->esalt;
12082
12083 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12084 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12085 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12086 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12087 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12088
12089 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12090
12091 uint salt_len = input_len - 40 - 1;
12092
12093 char *salt_buf = input_buf + 40 + 1;
12094
12095 if (salt_len == UINT_MAX || salt_len % 2 != 0) return (PARSER_SALT_LENGTH);
12096
12097 u8 *pstoken_ptr = (u8 *) pstoken->salt_buf;
12098
12099 for (uint i = 0, j = 0; i < salt_len; i += 2, j += 1)
12100 {
12101 pstoken_ptr[j] = hex_to_u8 ((const u8 *) &salt_buf[i]);
12102 }
12103
12104 pstoken->salt_len = salt_len / 2;
12105
12106 /* some fake salt for the sorting mechanisms */
12107
12108 salt->salt_buf[0] = pstoken->salt_buf[0];
12109 salt->salt_buf[1] = pstoken->salt_buf[1];
12110 salt->salt_buf[2] = pstoken->salt_buf[2];
12111 salt->salt_buf[3] = pstoken->salt_buf[3];
12112 salt->salt_buf[4] = pstoken->salt_buf[4];
12113 salt->salt_buf[5] = pstoken->salt_buf[5];
12114 salt->salt_buf[6] = pstoken->salt_buf[6];
12115 salt->salt_buf[7] = pstoken->salt_buf[7];
12116
12117 salt->salt_len = 32;
12118
12119 /* we need to check if we can precompute some of the data --
12120 this is possible since the scheme is badly designed */
12121
12122 pstoken->pc_digest[0] = SHA1M_A;
12123 pstoken->pc_digest[1] = SHA1M_B;
12124 pstoken->pc_digest[2] = SHA1M_C;
12125 pstoken->pc_digest[3] = SHA1M_D;
12126 pstoken->pc_digest[4] = SHA1M_E;
12127
12128 pstoken->pc_offset = 0;
12129
12130 for (int i = 0; i < (int) pstoken->salt_len - 64; i += 64)
12131 {
12132 uint w[16];
12133
12134 w[ 0] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 0]);
12135 w[ 1] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 1]);
12136 w[ 2] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 2]);
12137 w[ 3] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 3]);
12138 w[ 4] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 4]);
12139 w[ 5] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 5]);
12140 w[ 6] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 6]);
12141 w[ 7] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 7]);
12142 w[ 8] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 8]);
12143 w[ 9] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 9]);
12144 w[10] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 10]);
12145 w[11] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 11]);
12146 w[12] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 12]);
12147 w[13] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 13]);
12148 w[14] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 14]);
12149 w[15] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 15]);
12150
12151 sha1_64 (w, pstoken->pc_digest);
12152
12153 pstoken->pc_offset += 16;
12154 }
12155
12156 return (PARSER_OK);
12157 }
12158
12159 int sha1b64_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12160 {
12161 if ((input_len < DISPLAY_LEN_MIN_101) || (input_len > DISPLAY_LEN_MAX_101)) return (PARSER_GLOBAL_LENGTH);
12162
12163 if (memcmp (SIGNATURE_SHA1B64, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
12164
12165 u32 *digest = (u32 *) hash_buf->digest;
12166
12167 u8 tmp_buf[100] = { 0 };
12168
12169 base64_decode (base64_to_int, (const u8 *) input_buf + 5, input_len - 5, tmp_buf);
12170
12171 memcpy (digest, tmp_buf, 20);
12172
12173 digest[0] = byte_swap_32 (digest[0]);
12174 digest[1] = byte_swap_32 (digest[1]);
12175 digest[2] = byte_swap_32 (digest[2]);
12176 digest[3] = byte_swap_32 (digest[3]);
12177 digest[4] = byte_swap_32 (digest[4]);
12178
12179 digest[0] -= SHA1M_A;
12180 digest[1] -= SHA1M_B;
12181 digest[2] -= SHA1M_C;
12182 digest[3] -= SHA1M_D;
12183 digest[4] -= SHA1M_E;
12184
12185 return (PARSER_OK);
12186 }
12187
12188 int sha1b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12189 {
12190 if ((input_len < DISPLAY_LEN_MIN_111) || (input_len > DISPLAY_LEN_MAX_111)) return (PARSER_GLOBAL_LENGTH);
12191
12192 if (memcmp (SIGNATURE_SSHA1B64_lower, input_buf, 6) && memcmp (SIGNATURE_SSHA1B64_upper, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
12193
12194 u32 *digest = (u32 *) hash_buf->digest;
12195
12196 salt_t *salt = hash_buf->salt;
12197
12198 u8 tmp_buf[100] = { 0 };
12199
12200 int tmp_len = base64_decode (base64_to_int, (const u8 *) input_buf + 6, input_len - 6, tmp_buf);
12201
12202 if (tmp_len < 20) return (PARSER_HASH_LENGTH);
12203
12204 memcpy (digest, tmp_buf, 20);
12205
12206 int salt_len = tmp_len - 20;
12207
12208 if (salt_len < 0) return (PARSER_SALT_LENGTH);
12209
12210 salt->salt_len = salt_len;
12211
12212 memcpy (salt->salt_buf, tmp_buf + 20, salt->salt_len);
12213
12214 if (data.opts_type & OPTS_TYPE_ST_ADD80)
12215 {
12216 char *ptr = (char *) salt->salt_buf;
12217
12218 ptr[salt->salt_len] = 0x80;
12219 }
12220
12221 digest[0] = byte_swap_32 (digest[0]);
12222 digest[1] = byte_swap_32 (digest[1]);
12223 digest[2] = byte_swap_32 (digest[2]);
12224 digest[3] = byte_swap_32 (digest[3]);
12225 digest[4] = byte_swap_32 (digest[4]);
12226
12227 digest[0] -= SHA1M_A;
12228 digest[1] -= SHA1M_B;
12229 digest[2] -= SHA1M_C;
12230 digest[3] -= SHA1M_D;
12231 digest[4] -= SHA1M_E;
12232
12233 return (PARSER_OK);
12234 }
12235
12236 int mssql2000_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12237 {
12238 if ((input_len < DISPLAY_LEN_MIN_131) || (input_len > DISPLAY_LEN_MAX_131)) return (PARSER_GLOBAL_LENGTH);
12239
12240 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
12241
12242 u32 *digest = (u32 *) hash_buf->digest;
12243
12244 salt_t *salt = hash_buf->salt;
12245
12246 char *salt_buf = input_buf + 6;
12247
12248 uint salt_len = 8;
12249
12250 char *salt_buf_ptr = (char *) salt->salt_buf;
12251
12252 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12253
12254 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12255
12256 salt->salt_len = salt_len;
12257
12258 char *hash_pos = input_buf + 6 + 8 + 40;
12259
12260 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
12261 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
12262 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
12263 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
12264 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
12265
12266 digest[0] -= SHA1M_A;
12267 digest[1] -= SHA1M_B;
12268 digest[2] -= SHA1M_C;
12269 digest[3] -= SHA1M_D;
12270 digest[4] -= SHA1M_E;
12271
12272 return (PARSER_OK);
12273 }
12274
12275 int mssql2005_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12276 {
12277 if ((input_len < DISPLAY_LEN_MIN_132) || (input_len > DISPLAY_LEN_MAX_132)) return (PARSER_GLOBAL_LENGTH);
12278
12279 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
12280
12281 u32 *digest = (u32 *) hash_buf->digest;
12282
12283 salt_t *salt = hash_buf->salt;
12284
12285 char *salt_buf = input_buf + 6;
12286
12287 uint salt_len = 8;
12288
12289 char *salt_buf_ptr = (char *) salt->salt_buf;
12290
12291 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12292
12293 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12294
12295 salt->salt_len = salt_len;
12296
12297 char *hash_pos = input_buf + 6 + 8;
12298
12299 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
12300 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
12301 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
12302 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
12303 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
12304
12305 digest[0] -= SHA1M_A;
12306 digest[1] -= SHA1M_B;
12307 digest[2] -= SHA1M_C;
12308 digest[3] -= SHA1M_D;
12309 digest[4] -= SHA1M_E;
12310
12311 return (PARSER_OK);
12312 }
12313
12314 int mssql2012_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12315 {
12316 if ((input_len < DISPLAY_LEN_MIN_1731) || (input_len > DISPLAY_LEN_MAX_1731)) return (PARSER_GLOBAL_LENGTH);
12317
12318 if (memcmp (SIGNATURE_MSSQL2012, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
12319
12320 u64 *digest = (u64 *) hash_buf->digest;
12321
12322 salt_t *salt = hash_buf->salt;
12323
12324 char *salt_buf = input_buf + 6;
12325
12326 uint salt_len = 8;
12327
12328 char *salt_buf_ptr = (char *) salt->salt_buf;
12329
12330 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12331
12332 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12333
12334 salt->salt_len = salt_len;
12335
12336 char *hash_pos = input_buf + 6 + 8;
12337
12338 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
12339 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
12340 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
12341 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
12342 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
12343 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
12344 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
12345 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
12346
12347 digest[0] -= SHA512M_A;
12348 digest[1] -= SHA512M_B;
12349 digest[2] -= SHA512M_C;
12350 digest[3] -= SHA512M_D;
12351 digest[4] -= SHA512M_E;
12352 digest[5] -= SHA512M_F;
12353 digest[6] -= SHA512M_G;
12354 digest[7] -= SHA512M_H;
12355
12356 return (PARSER_OK);
12357 }
12358
12359 int oracleh_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12360 {
12361 if (data.opts_type & OPTS_TYPE_ST_HEX)
12362 {
12363 if ((input_len < DISPLAY_LEN_MIN_3100H) || (input_len > DISPLAY_LEN_MAX_3100H)) return (PARSER_GLOBAL_LENGTH);
12364 }
12365 else
12366 {
12367 if ((input_len < DISPLAY_LEN_MIN_3100) || (input_len > DISPLAY_LEN_MAX_3100)) return (PARSER_GLOBAL_LENGTH);
12368 }
12369
12370 u32 *digest = (u32 *) hash_buf->digest;
12371
12372 salt_t *salt = hash_buf->salt;
12373
12374 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12375 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12376 digest[2] = 0;
12377 digest[3] = 0;
12378
12379 digest[0] = byte_swap_32 (digest[0]);
12380 digest[1] = byte_swap_32 (digest[1]);
12381
12382 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12383
12384 uint salt_len = input_len - 16 - 1;
12385
12386 char *salt_buf = input_buf + 16 + 1;
12387
12388 char *salt_buf_ptr = (char *) salt->salt_buf;
12389
12390 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12391
12392 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12393
12394 salt->salt_len = salt_len;
12395
12396 return (PARSER_OK);
12397 }
12398
12399 int oracles_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12400 {
12401 if ((input_len < DISPLAY_LEN_MIN_112) || (input_len > DISPLAY_LEN_MAX_112)) return (PARSER_GLOBAL_LENGTH);
12402
12403 u32 *digest = (u32 *) hash_buf->digest;
12404
12405 salt_t *salt = hash_buf->salt;
12406
12407 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12408 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12409 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12410 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12411 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12412
12413 digest[0] -= SHA1M_A;
12414 digest[1] -= SHA1M_B;
12415 digest[2] -= SHA1M_C;
12416 digest[3] -= SHA1M_D;
12417 digest[4] -= SHA1M_E;
12418
12419 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12420
12421 uint salt_len = input_len - 40 - 1;
12422
12423 char *salt_buf = input_buf + 40 + 1;
12424
12425 char *salt_buf_ptr = (char *) salt->salt_buf;
12426
12427 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12428
12429 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12430
12431 salt->salt_len = salt_len;
12432
12433 return (PARSER_OK);
12434 }
12435
12436 int oraclet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12437 {
12438 if ((input_len < DISPLAY_LEN_MIN_12300) || (input_len > DISPLAY_LEN_MAX_12300)) return (PARSER_GLOBAL_LENGTH);
12439
12440 u32 *digest = (u32 *) hash_buf->digest;
12441
12442 salt_t *salt = hash_buf->salt;
12443
12444 char *hash_pos = input_buf;
12445
12446 digest[ 0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
12447 digest[ 1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
12448 digest[ 2] = hex_to_u32 ((const u8 *) &hash_pos[ 16]);
12449 digest[ 3] = hex_to_u32 ((const u8 *) &hash_pos[ 24]);
12450 digest[ 4] = hex_to_u32 ((const u8 *) &hash_pos[ 32]);
12451 digest[ 5] = hex_to_u32 ((const u8 *) &hash_pos[ 40]);
12452 digest[ 6] = hex_to_u32 ((const u8 *) &hash_pos[ 48]);
12453 digest[ 7] = hex_to_u32 ((const u8 *) &hash_pos[ 56]);
12454 digest[ 8] = hex_to_u32 ((const u8 *) &hash_pos[ 64]);
12455 digest[ 9] = hex_to_u32 ((const u8 *) &hash_pos[ 72]);
12456 digest[10] = hex_to_u32 ((const u8 *) &hash_pos[ 80]);
12457 digest[11] = hex_to_u32 ((const u8 *) &hash_pos[ 88]);
12458 digest[12] = hex_to_u32 ((const u8 *) &hash_pos[ 96]);
12459 digest[13] = hex_to_u32 ((const u8 *) &hash_pos[104]);
12460 digest[14] = hex_to_u32 ((const u8 *) &hash_pos[112]);
12461 digest[15] = hex_to_u32 ((const u8 *) &hash_pos[120]);
12462
12463 char *salt_pos = input_buf + 128;
12464
12465 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
12466 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
12467 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
12468 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
12469
12470 salt->salt_iter = ROUNDS_ORACLET - 1;
12471 salt->salt_len = 16;
12472
12473 return (PARSER_OK);
12474 }
12475
12476 int sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12477 {
12478 if ((input_len < DISPLAY_LEN_MIN_1400) || (input_len > DISPLAY_LEN_MAX_1400)) return (PARSER_GLOBAL_LENGTH);
12479
12480 u32 *digest = (u32 *) hash_buf->digest;
12481
12482 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12483 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12484 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12485 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12486 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12487 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
12488 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
12489 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
12490
12491 digest[0] -= SHA256M_A;
12492 digest[1] -= SHA256M_B;
12493 digest[2] -= SHA256M_C;
12494 digest[3] -= SHA256M_D;
12495 digest[4] -= SHA256M_E;
12496 digest[5] -= SHA256M_F;
12497 digest[6] -= SHA256M_G;
12498 digest[7] -= SHA256M_H;
12499
12500 return (PARSER_OK);
12501 }
12502
12503 int sha256s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12504 {
12505 if (data.opts_type & OPTS_TYPE_ST_HEX)
12506 {
12507 if ((input_len < DISPLAY_LEN_MIN_1410H) || (input_len > DISPLAY_LEN_MAX_1410H)) return (PARSER_GLOBAL_LENGTH);
12508 }
12509 else
12510 {
12511 if ((input_len < DISPLAY_LEN_MIN_1410) || (input_len > DISPLAY_LEN_MAX_1410)) return (PARSER_GLOBAL_LENGTH);
12512 }
12513
12514 u32 *digest = (u32 *) hash_buf->digest;
12515
12516 salt_t *salt = hash_buf->salt;
12517
12518 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12519 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12520 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12521 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12522 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12523 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
12524 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
12525 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
12526
12527 digest[0] -= SHA256M_A;
12528 digest[1] -= SHA256M_B;
12529 digest[2] -= SHA256M_C;
12530 digest[3] -= SHA256M_D;
12531 digest[4] -= SHA256M_E;
12532 digest[5] -= SHA256M_F;
12533 digest[6] -= SHA256M_G;
12534 digest[7] -= SHA256M_H;
12535
12536 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12537
12538 uint salt_len = input_len - 64 - 1;
12539
12540 char *salt_buf = input_buf + 64 + 1;
12541
12542 char *salt_buf_ptr = (char *) salt->salt_buf;
12543
12544 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12545
12546 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12547
12548 salt->salt_len = salt_len;
12549
12550 return (PARSER_OK);
12551 }
12552
12553 int sha384_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12554 {
12555 if ((input_len < DISPLAY_LEN_MIN_10800) || (input_len > DISPLAY_LEN_MAX_10800)) return (PARSER_GLOBAL_LENGTH);
12556
12557 u64 *digest = (u64 *) hash_buf->digest;
12558
12559 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
12560 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
12561 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
12562 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
12563 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
12564 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
12565 digest[6] = 0;
12566 digest[7] = 0;
12567
12568 digest[0] -= SHA384M_A;
12569 digest[1] -= SHA384M_B;
12570 digest[2] -= SHA384M_C;
12571 digest[3] -= SHA384M_D;
12572 digest[4] -= SHA384M_E;
12573 digest[5] -= SHA384M_F;
12574 digest[6] -= 0;
12575 digest[7] -= 0;
12576
12577 return (PARSER_OK);
12578 }
12579
12580 int sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12581 {
12582 if ((input_len < DISPLAY_LEN_MIN_1700) || (input_len > DISPLAY_LEN_MAX_1700)) return (PARSER_GLOBAL_LENGTH);
12583
12584 u64 *digest = (u64 *) hash_buf->digest;
12585
12586 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
12587 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
12588 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
12589 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
12590 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
12591 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
12592 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
12593 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
12594
12595 digest[0] -= SHA512M_A;
12596 digest[1] -= SHA512M_B;
12597 digest[2] -= SHA512M_C;
12598 digest[3] -= SHA512M_D;
12599 digest[4] -= SHA512M_E;
12600 digest[5] -= SHA512M_F;
12601 digest[6] -= SHA512M_G;
12602 digest[7] -= SHA512M_H;
12603
12604 return (PARSER_OK);
12605 }
12606
12607 int sha512s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12608 {
12609 if (data.opts_type & OPTS_TYPE_ST_HEX)
12610 {
12611 if ((input_len < DISPLAY_LEN_MIN_1710H) || (input_len > DISPLAY_LEN_MAX_1710H)) return (PARSER_GLOBAL_LENGTH);
12612 }
12613 else
12614 {
12615 if ((input_len < DISPLAY_LEN_MIN_1710) || (input_len > DISPLAY_LEN_MAX_1710)) return (PARSER_GLOBAL_LENGTH);
12616 }
12617
12618 u64 *digest = (u64 *) hash_buf->digest;
12619
12620 salt_t *salt = hash_buf->salt;
12621
12622 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
12623 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
12624 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
12625 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
12626 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
12627 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
12628 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
12629 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
12630
12631 digest[0] -= SHA512M_A;
12632 digest[1] -= SHA512M_B;
12633 digest[2] -= SHA512M_C;
12634 digest[3] -= SHA512M_D;
12635 digest[4] -= SHA512M_E;
12636 digest[5] -= SHA512M_F;
12637 digest[6] -= SHA512M_G;
12638 digest[7] -= SHA512M_H;
12639
12640 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12641
12642 uint salt_len = input_len - 128 - 1;
12643
12644 char *salt_buf = input_buf + 128 + 1;
12645
12646 char *salt_buf_ptr = (char *) salt->salt_buf;
12647
12648 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12649
12650 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12651
12652 salt->salt_len = salt_len;
12653
12654 return (PARSER_OK);
12655 }
12656
12657 int sha512crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12658 {
12659 if (memcmp (SIGNATURE_SHA512CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
12660
12661 u64 *digest = (u64 *) hash_buf->digest;
12662
12663 salt_t *salt = hash_buf->salt;
12664
12665 char *salt_pos = input_buf + 3;
12666
12667 uint iterations_len = 0;
12668
12669 if (memcmp (salt_pos, "rounds=", 7) == 0)
12670 {
12671 salt_pos += 7;
12672
12673 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
12674
12675 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
12676 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
12677
12678 salt_pos[0] = 0x0;
12679
12680 salt->salt_iter = atoi (salt_pos - iterations_len);
12681
12682 salt_pos += 1;
12683
12684 iterations_len += 8;
12685 }
12686 else
12687 {
12688 salt->salt_iter = ROUNDS_SHA512CRYPT;
12689 }
12690
12691 if ((input_len < DISPLAY_LEN_MIN_1800) || (input_len > DISPLAY_LEN_MAX_1800 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
12692
12693 char *hash_pos = strchr (salt_pos, '$');
12694
12695 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12696
12697 uint salt_len = hash_pos - salt_pos;
12698
12699 if (salt_len > 16) return (PARSER_SALT_LENGTH);
12700
12701 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12702
12703 salt->salt_len = salt_len;
12704
12705 hash_pos++;
12706
12707 sha512crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12708
12709 return (PARSER_OK);
12710 }
12711
12712 int keccak_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12713 {
12714 if ((input_len < DISPLAY_LEN_MIN_5000) || (input_len > DISPLAY_LEN_MAX_5000)) return (PARSER_GLOBAL_LENGTH);
12715
12716 if (input_len % 16) return (PARSER_GLOBAL_LENGTH);
12717
12718 u64 *digest = (u64 *) hash_buf->digest;
12719
12720 salt_t *salt = hash_buf->salt;
12721
12722 uint keccak_mdlen = input_len / 2;
12723
12724 for (uint i = 0; i < keccak_mdlen / 8; i++)
12725 {
12726 digest[i] = hex_to_u64 ((const u8 *) &input_buf[i * 16]);
12727
12728 digest[i] = byte_swap_64 (digest[i]);
12729 }
12730
12731 salt->keccak_mdlen = keccak_mdlen;
12732
12733 return (PARSER_OK);
12734 }
12735
12736 int ikepsk_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12737 {
12738 if ((input_len < DISPLAY_LEN_MIN_5300) || (input_len > DISPLAY_LEN_MAX_5300)) return (PARSER_GLOBAL_LENGTH);
12739
12740 u32 *digest = (u32 *) hash_buf->digest;
12741
12742 salt_t *salt = hash_buf->salt;
12743
12744 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
12745
12746 /**
12747 * Parse that strange long line
12748 */
12749
12750 char *in_off[9];
12751
12752 size_t in_len[9] = { 0 };
12753
12754 in_off[0] = strtok (input_buf, ":");
12755
12756 if (in_off[0] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12757
12758 in_len[0] = strlen (in_off[0]);
12759
12760 size_t i;
12761
12762 for (i = 1; i < 9; i++)
12763 {
12764 in_off[i] = strtok (NULL, ":");
12765
12766 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12767
12768 in_len[i] = strlen (in_off[i]);
12769 }
12770
12771 char *ptr = (char *) ikepsk->msg_buf;
12772
12773 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[0] + i);
12774 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[1] + i);
12775 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[2] + i);
12776 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[3] + i);
12777 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[4] + i);
12778 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[5] + i);
12779
12780 *ptr = 0x80;
12781
12782 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
12783
12784 ptr = (char *) ikepsk->nr_buf;
12785
12786 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[6] + i);
12787 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[7] + i);
12788
12789 *ptr = 0x80;
12790
12791 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
12792
12793 /**
12794 * Store to database
12795 */
12796
12797 ptr = in_off[8];
12798
12799 digest[0] = hex_to_u32 ((const u8 *) &ptr[ 0]);
12800 digest[1] = hex_to_u32 ((const u8 *) &ptr[ 8]);
12801 digest[2] = hex_to_u32 ((const u8 *) &ptr[16]);
12802 digest[3] = hex_to_u32 ((const u8 *) &ptr[24]);
12803
12804 digest[0] = byte_swap_32 (digest[0]);
12805 digest[1] = byte_swap_32 (digest[1]);
12806 digest[2] = byte_swap_32 (digest[2]);
12807 digest[3] = byte_swap_32 (digest[3]);
12808
12809 salt->salt_len = 32;
12810
12811 salt->salt_buf[0] = ikepsk->nr_buf[0];
12812 salt->salt_buf[1] = ikepsk->nr_buf[1];
12813 salt->salt_buf[2] = ikepsk->nr_buf[2];
12814 salt->salt_buf[3] = ikepsk->nr_buf[3];
12815 salt->salt_buf[4] = ikepsk->nr_buf[4];
12816 salt->salt_buf[5] = ikepsk->nr_buf[5];
12817 salt->salt_buf[6] = ikepsk->nr_buf[6];
12818 salt->salt_buf[7] = ikepsk->nr_buf[7];
12819
12820 return (PARSER_OK);
12821 }
12822
12823 int ikepsk_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12824 {
12825 if ((input_len < DISPLAY_LEN_MIN_5400) || (input_len > DISPLAY_LEN_MAX_5400)) return (PARSER_GLOBAL_LENGTH);
12826
12827 u32 *digest = (u32 *) hash_buf->digest;
12828
12829 salt_t *salt = hash_buf->salt;
12830
12831 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
12832
12833 /**
12834 * Parse that strange long line
12835 */
12836
12837 char *in_off[9];
12838
12839 size_t in_len[9] = { 0 };
12840
12841 in_off[0] = strtok (input_buf, ":");
12842
12843 if (in_off[0] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12844
12845 in_len[0] = strlen (in_off[0]);
12846
12847 size_t i;
12848
12849 for (i = 1; i < 9; i++)
12850 {
12851 in_off[i] = strtok (NULL, ":");
12852
12853 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12854
12855 in_len[i] = strlen (in_off[i]);
12856 }
12857
12858 char *ptr = (char *) ikepsk->msg_buf;
12859
12860 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[0] + i);
12861 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[1] + i);
12862 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[2] + i);
12863 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[3] + i);
12864 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[4] + i);
12865 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[5] + i);
12866
12867 *ptr = 0x80;
12868
12869 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
12870
12871 ptr = (char *) ikepsk->nr_buf;
12872
12873 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[6] + i);
12874 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[7] + i);
12875
12876 *ptr = 0x80;
12877
12878 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
12879
12880 /**
12881 * Store to database
12882 */
12883
12884 ptr = in_off[8];
12885
12886 digest[0] = hex_to_u32 ((const u8 *) &ptr[ 0]);
12887 digest[1] = hex_to_u32 ((const u8 *) &ptr[ 8]);
12888 digest[2] = hex_to_u32 ((const u8 *) &ptr[16]);
12889 digest[3] = hex_to_u32 ((const u8 *) &ptr[24]);
12890 digest[4] = hex_to_u32 ((const u8 *) &ptr[32]);
12891
12892 salt->salt_len = 32;
12893
12894 salt->salt_buf[0] = ikepsk->nr_buf[0];
12895 salt->salt_buf[1] = ikepsk->nr_buf[1];
12896 salt->salt_buf[2] = ikepsk->nr_buf[2];
12897 salt->salt_buf[3] = ikepsk->nr_buf[3];
12898 salt->salt_buf[4] = ikepsk->nr_buf[4];
12899 salt->salt_buf[5] = ikepsk->nr_buf[5];
12900 salt->salt_buf[6] = ikepsk->nr_buf[6];
12901 salt->salt_buf[7] = ikepsk->nr_buf[7];
12902
12903 return (PARSER_OK);
12904 }
12905
12906 int ripemd160_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12907 {
12908 if ((input_len < DISPLAY_LEN_MIN_6000) || (input_len > DISPLAY_LEN_MAX_6000)) return (PARSER_GLOBAL_LENGTH);
12909
12910 u32 *digest = (u32 *) hash_buf->digest;
12911
12912 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12913 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12914 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12915 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12916 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12917
12918 digest[0] = byte_swap_32 (digest[0]);
12919 digest[1] = byte_swap_32 (digest[1]);
12920 digest[2] = byte_swap_32 (digest[2]);
12921 digest[3] = byte_swap_32 (digest[3]);
12922 digest[4] = byte_swap_32 (digest[4]);
12923
12924 return (PARSER_OK);
12925 }
12926
12927 int whirlpool_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12928 {
12929 if ((input_len < DISPLAY_LEN_MIN_6100) || (input_len > DISPLAY_LEN_MAX_6100)) return (PARSER_GLOBAL_LENGTH);
12930
12931 u32 *digest = (u32 *) hash_buf->digest;
12932
12933 digest[ 0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12934 digest[ 1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12935 digest[ 2] = hex_to_u32 ((const u8 *) &input_buf[ 16]);
12936 digest[ 3] = hex_to_u32 ((const u8 *) &input_buf[ 24]);
12937 digest[ 4] = hex_to_u32 ((const u8 *) &input_buf[ 32]);
12938 digest[ 5] = hex_to_u32 ((const u8 *) &input_buf[ 40]);
12939 digest[ 6] = hex_to_u32 ((const u8 *) &input_buf[ 48]);
12940 digest[ 7] = hex_to_u32 ((const u8 *) &input_buf[ 56]);
12941 digest[ 8] = hex_to_u32 ((const u8 *) &input_buf[ 64]);
12942 digest[ 9] = hex_to_u32 ((const u8 *) &input_buf[ 72]);
12943 digest[10] = hex_to_u32 ((const u8 *) &input_buf[ 80]);
12944 digest[11] = hex_to_u32 ((const u8 *) &input_buf[ 88]);
12945 digest[12] = hex_to_u32 ((const u8 *) &input_buf[ 96]);
12946 digest[13] = hex_to_u32 ((const u8 *) &input_buf[104]);
12947 digest[14] = hex_to_u32 ((const u8 *) &input_buf[112]);
12948 digest[15] = hex_to_u32 ((const u8 *) &input_buf[120]);
12949
12950 return (PARSER_OK);
12951 }
12952
12953 int androidpin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12954 {
12955 if ((input_len < DISPLAY_LEN_MIN_5800) || (input_len > DISPLAY_LEN_MAX_5800)) return (PARSER_GLOBAL_LENGTH);
12956
12957 u32 *digest = (u32 *) hash_buf->digest;
12958
12959 salt_t *salt = hash_buf->salt;
12960
12961 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12962 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12963 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12964 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12965 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12966
12967 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12968
12969 uint salt_len = input_len - 40 - 1;
12970
12971 char *salt_buf = input_buf + 40 + 1;
12972
12973 char *salt_buf_ptr = (char *) salt->salt_buf;
12974
12975 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12976
12977 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12978
12979 salt->salt_len = salt_len;
12980
12981 salt->salt_iter = ROUNDS_ANDROIDPIN - 1;
12982
12983 return (PARSER_OK);
12984 }
12985
12986 int truecrypt_parse_hash_1k (char *input_buf, uint input_len, hash_t *hash_buf)
12987 {
12988 u32 *digest = (u32 *) hash_buf->digest;
12989
12990 salt_t *salt = hash_buf->salt;
12991
12992 tc_t *tc = (tc_t *) hash_buf->esalt;
12993
12994 if (input_len == 0)
12995 {
12996 log_error ("TrueCrypt container not specified");
12997
12998 exit (-1);
12999 }
13000
13001 FILE *fp = fopen (input_buf, "rb");
13002
13003 if (fp == NULL)
13004 {
13005 log_error ("%s: %s", input_buf, strerror (errno));
13006
13007 exit (-1);
13008 }
13009
13010 char buf[512] = { 0 };
13011
13012 int n = fread (buf, 1, sizeof (buf), fp);
13013
13014 fclose (fp);
13015
13016 if (n != 512) return (PARSER_TC_FILE_SIZE);
13017
13018 memcpy (tc->salt_buf, buf, 64);
13019
13020 memcpy (tc->data_buf, buf + 64, 512 - 64);
13021
13022 salt->salt_buf[0] = tc->salt_buf[0];
13023
13024 salt->salt_len = 4;
13025
13026 salt->salt_iter = ROUNDS_TRUECRYPT_1K - 1;
13027
13028 tc->signature = 0x45555254; // "TRUE"
13029
13030 digest[0] = tc->data_buf[0];
13031
13032 return (PARSER_OK);
13033 }
13034
13035 int truecrypt_parse_hash_2k (char *input_buf, uint input_len, hash_t *hash_buf)
13036 {
13037 u32 *digest = (u32 *) hash_buf->digest;
13038
13039 salt_t *salt = hash_buf->salt;
13040
13041 tc_t *tc = (tc_t *) hash_buf->esalt;
13042
13043 if (input_len == 0)
13044 {
13045 log_error ("TrueCrypt container not specified");
13046
13047 exit (-1);
13048 }
13049
13050 FILE *fp = fopen (input_buf, "rb");
13051
13052 if (fp == NULL)
13053 {
13054 log_error ("%s: %s", input_buf, strerror (errno));
13055
13056 exit (-1);
13057 }
13058
13059 char buf[512] = { 0 };
13060
13061 int n = fread (buf, 1, sizeof (buf), fp);
13062
13063 fclose (fp);
13064
13065 if (n != 512) return (PARSER_TC_FILE_SIZE);
13066
13067 memcpy (tc->salt_buf, buf, 64);
13068
13069 memcpy (tc->data_buf, buf + 64, 512 - 64);
13070
13071 salt->salt_buf[0] = tc->salt_buf[0];
13072
13073 salt->salt_len = 4;
13074
13075 salt->salt_iter = ROUNDS_TRUECRYPT_2K - 1;
13076
13077 tc->signature = 0x45555254; // "TRUE"
13078
13079 digest[0] = tc->data_buf[0];
13080
13081 return (PARSER_OK);
13082 }
13083
13084 int veracrypt_parse_hash_200000 (char *input_buf, uint input_len, hash_t *hash_buf)
13085 {
13086 u32 *digest = (u32 *) hash_buf->digest;
13087
13088 salt_t *salt = hash_buf->salt;
13089
13090 tc_t *tc = (tc_t *) hash_buf->esalt;
13091
13092 if (input_len == 0)
13093 {
13094 log_error ("VeraCrypt container not specified");
13095
13096 exit (-1);
13097 }
13098
13099 FILE *fp = fopen (input_buf, "rb");
13100
13101 if (fp == NULL)
13102 {
13103 log_error ("%s: %s", input_buf, strerror (errno));
13104
13105 exit (-1);
13106 }
13107
13108 char buf[512] = { 0 };
13109
13110 int n = fread (buf, 1, sizeof (buf), fp);
13111
13112 fclose (fp);
13113
13114 if (n != 512) return (PARSER_VC_FILE_SIZE);
13115
13116 memcpy (tc->salt_buf, buf, 64);
13117
13118 memcpy (tc->data_buf, buf + 64, 512 - 64);
13119
13120 salt->salt_buf[0] = tc->salt_buf[0];
13121
13122 salt->salt_len = 4;
13123
13124 salt->salt_iter = ROUNDS_VERACRYPT_200000 - 1;
13125
13126 tc->signature = 0x41524556; // "VERA"
13127
13128 digest[0] = tc->data_buf[0];
13129
13130 return (PARSER_OK);
13131 }
13132
13133 int veracrypt_parse_hash_500000 (char *input_buf, uint input_len, hash_t *hash_buf)
13134 {
13135 u32 *digest = (u32 *) hash_buf->digest;
13136
13137 salt_t *salt = hash_buf->salt;
13138
13139 tc_t *tc = (tc_t *) hash_buf->esalt;
13140
13141 if (input_len == 0)
13142 {
13143 log_error ("VeraCrypt container not specified");
13144
13145 exit (-1);
13146 }
13147
13148 FILE *fp = fopen (input_buf, "rb");
13149
13150 if (fp == NULL)
13151 {
13152 log_error ("%s: %s", input_buf, strerror (errno));
13153
13154 exit (-1);
13155 }
13156
13157 char buf[512] = { 0 };
13158
13159 int n = fread (buf, 1, sizeof (buf), fp);
13160
13161 fclose (fp);
13162
13163 if (n != 512) return (PARSER_VC_FILE_SIZE);
13164
13165 memcpy (tc->salt_buf, buf, 64);
13166
13167 memcpy (tc->data_buf, buf + 64, 512 - 64);
13168
13169 salt->salt_buf[0] = tc->salt_buf[0];
13170
13171 salt->salt_len = 4;
13172
13173 salt->salt_iter = ROUNDS_VERACRYPT_500000 - 1;
13174
13175 tc->signature = 0x41524556; // "VERA"
13176
13177 digest[0] = tc->data_buf[0];
13178
13179 return (PARSER_OK);
13180 }
13181
13182 int veracrypt_parse_hash_327661 (char *input_buf, uint input_len, hash_t *hash_buf)
13183 {
13184 u32 *digest = (u32 *) hash_buf->digest;
13185
13186 salt_t *salt = hash_buf->salt;
13187
13188 tc_t *tc = (tc_t *) hash_buf->esalt;
13189
13190 if (input_len == 0)
13191 {
13192 log_error ("VeraCrypt container not specified");
13193
13194 exit (-1);
13195 }
13196
13197 FILE *fp = fopen (input_buf, "rb");
13198
13199 if (fp == NULL)
13200 {
13201 log_error ("%s: %s", input_buf, strerror (errno));
13202
13203 exit (-1);
13204 }
13205
13206 char buf[512] = { 0 };
13207
13208 int n = fread (buf, 1, sizeof (buf), fp);
13209
13210 fclose (fp);
13211
13212 if (n != 512) return (PARSER_VC_FILE_SIZE);
13213
13214 memcpy (tc->salt_buf, buf, 64);
13215
13216 memcpy (tc->data_buf, buf + 64, 512 - 64);
13217
13218 salt->salt_buf[0] = tc->salt_buf[0];
13219
13220 salt->salt_len = 4;
13221
13222 salt->salt_iter = ROUNDS_VERACRYPT_327661 - 1;
13223
13224 tc->signature = 0x41524556; // "VERA"
13225
13226 digest[0] = tc->data_buf[0];
13227
13228 return (PARSER_OK);
13229 }
13230
13231 int veracrypt_parse_hash_655331 (char *input_buf, uint input_len, hash_t *hash_buf)
13232 {
13233 u32 *digest = (u32 *) hash_buf->digest;
13234
13235 salt_t *salt = hash_buf->salt;
13236
13237 tc_t *tc = (tc_t *) hash_buf->esalt;
13238
13239 if (input_len == 0)
13240 {
13241 log_error ("VeraCrypt container not specified");
13242
13243 exit (-1);
13244 }
13245
13246 FILE *fp = fopen (input_buf, "rb");
13247
13248 if (fp == NULL)
13249 {
13250 log_error ("%s: %s", input_buf, strerror (errno));
13251
13252 exit (-1);
13253 }
13254
13255 char buf[512] = { 0 };
13256
13257 int n = fread (buf, 1, sizeof (buf), fp);
13258
13259 fclose (fp);
13260
13261 if (n != 512) return (PARSER_VC_FILE_SIZE);
13262
13263 memcpy (tc->salt_buf, buf, 64);
13264
13265 memcpy (tc->data_buf, buf + 64, 512 - 64);
13266
13267 salt->salt_buf[0] = tc->salt_buf[0];
13268
13269 salt->salt_len = 4;
13270
13271 salt->salt_iter = ROUNDS_VERACRYPT_655331 - 1;
13272
13273 tc->signature = 0x41524556; // "VERA"
13274
13275 digest[0] = tc->data_buf[0];
13276
13277 return (PARSER_OK);
13278 }
13279
13280 int md5aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13281 {
13282 if ((input_len < DISPLAY_LEN_MIN_6300) || (input_len > DISPLAY_LEN_MAX_6300)) return (PARSER_GLOBAL_LENGTH);
13283
13284 if (memcmp (SIGNATURE_MD5AIX, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
13285
13286 u32 *digest = (u32 *) hash_buf->digest;
13287
13288 salt_t *salt = hash_buf->salt;
13289
13290 char *salt_pos = input_buf + 6;
13291
13292 char *hash_pos = strchr (salt_pos, '$');
13293
13294 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13295
13296 uint salt_len = hash_pos - salt_pos;
13297
13298 if (salt_len < 8) return (PARSER_SALT_LENGTH);
13299
13300 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13301
13302 salt->salt_len = salt_len;
13303
13304 salt->salt_iter = 1000;
13305
13306 hash_pos++;
13307
13308 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13309
13310 return (PARSER_OK);
13311 }
13312
13313 int sha1aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13314 {
13315 if ((input_len < DISPLAY_LEN_MIN_6700) || (input_len > DISPLAY_LEN_MAX_6700)) return (PARSER_GLOBAL_LENGTH);
13316
13317 if (memcmp (SIGNATURE_SHA1AIX, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
13318
13319 u32 *digest = (u32 *) hash_buf->digest;
13320
13321 salt_t *salt = hash_buf->salt;
13322
13323 char *iter_pos = input_buf + 7;
13324
13325 char *salt_pos = strchr (iter_pos, '$');
13326
13327 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13328
13329 salt_pos++;
13330
13331 char *hash_pos = strchr (salt_pos, '$');
13332
13333 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13334
13335 uint salt_len = hash_pos - salt_pos;
13336
13337 if (salt_len < 16) return (PARSER_SALT_LENGTH);
13338
13339 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13340
13341 salt->salt_len = salt_len;
13342
13343 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
13344
13345 salt->salt_sign[0] = atoi (salt_iter);
13346
13347 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
13348
13349 hash_pos++;
13350
13351 sha1aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13352
13353 digest[0] = byte_swap_32 (digest[0]);
13354 digest[1] = byte_swap_32 (digest[1]);
13355 digest[2] = byte_swap_32 (digest[2]);
13356 digest[3] = byte_swap_32 (digest[3]);
13357 digest[4] = byte_swap_32 (digest[4]);
13358
13359 return (PARSER_OK);
13360 }
13361
13362 int sha256aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13363 {
13364 if ((input_len < DISPLAY_LEN_MIN_6400) || (input_len > DISPLAY_LEN_MAX_6400)) return (PARSER_GLOBAL_LENGTH);
13365
13366 if (memcmp (SIGNATURE_SHA256AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
13367
13368 u32 *digest = (u32 *) hash_buf->digest;
13369
13370 salt_t *salt = hash_buf->salt;
13371
13372 char *iter_pos = input_buf + 9;
13373
13374 char *salt_pos = strchr (iter_pos, '$');
13375
13376 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13377
13378 salt_pos++;
13379
13380 char *hash_pos = strchr (salt_pos, '$');
13381
13382 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13383
13384 uint salt_len = hash_pos - salt_pos;
13385
13386 if (salt_len < 16) return (PARSER_SALT_LENGTH);
13387
13388 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13389
13390 salt->salt_len = salt_len;
13391
13392 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
13393
13394 salt->salt_sign[0] = atoi (salt_iter);
13395
13396 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
13397
13398 hash_pos++;
13399
13400 sha256aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13401
13402 digest[0] = byte_swap_32 (digest[0]);
13403 digest[1] = byte_swap_32 (digest[1]);
13404 digest[2] = byte_swap_32 (digest[2]);
13405 digest[3] = byte_swap_32 (digest[3]);
13406 digest[4] = byte_swap_32 (digest[4]);
13407 digest[5] = byte_swap_32 (digest[5]);
13408 digest[6] = byte_swap_32 (digest[6]);
13409 digest[7] = byte_swap_32 (digest[7]);
13410
13411 return (PARSER_OK);
13412 }
13413
13414 int sha512aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13415 {
13416 if ((input_len < DISPLAY_LEN_MIN_6500) || (input_len > DISPLAY_LEN_MAX_6500)) return (PARSER_GLOBAL_LENGTH);
13417
13418 if (memcmp (SIGNATURE_SHA512AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
13419
13420 u64 *digest = (u64 *) hash_buf->digest;
13421
13422 salt_t *salt = hash_buf->salt;
13423
13424 char *iter_pos = input_buf + 9;
13425
13426 char *salt_pos = strchr (iter_pos, '$');
13427
13428 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13429
13430 salt_pos++;
13431
13432 char *hash_pos = strchr (salt_pos, '$');
13433
13434 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13435
13436 uint salt_len = hash_pos - salt_pos;
13437
13438 if (salt_len < 16) return (PARSER_SALT_LENGTH);
13439
13440 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13441
13442 salt->salt_len = salt_len;
13443
13444 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
13445
13446 salt->salt_sign[0] = atoi (salt_iter);
13447
13448 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
13449
13450 hash_pos++;
13451
13452 sha512aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13453
13454 digest[0] = byte_swap_64 (digest[0]);
13455 digest[1] = byte_swap_64 (digest[1]);
13456 digest[2] = byte_swap_64 (digest[2]);
13457 digest[3] = byte_swap_64 (digest[3]);
13458 digest[4] = byte_swap_64 (digest[4]);
13459 digest[5] = byte_swap_64 (digest[5]);
13460 digest[6] = byte_swap_64 (digest[6]);
13461 digest[7] = byte_swap_64 (digest[7]);
13462
13463 return (PARSER_OK);
13464 }
13465
13466 int agilekey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13467 {
13468 if ((input_len < DISPLAY_LEN_MIN_6600) || (input_len > DISPLAY_LEN_MAX_6600)) return (PARSER_GLOBAL_LENGTH);
13469
13470 u32 *digest = (u32 *) hash_buf->digest;
13471
13472 salt_t *salt = hash_buf->salt;
13473
13474 agilekey_t *agilekey = (agilekey_t *) hash_buf->esalt;
13475
13476 /**
13477 * parse line
13478 */
13479
13480 char *iterations_pos = input_buf;
13481
13482 char *saltbuf_pos = strchr (iterations_pos, ':');
13483
13484 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13485
13486 uint iterations_len = saltbuf_pos - iterations_pos;
13487
13488 if (iterations_len > 6) return (PARSER_SALT_LENGTH);
13489
13490 saltbuf_pos++;
13491
13492 char *cipherbuf_pos = strchr (saltbuf_pos, ':');
13493
13494 if (cipherbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13495
13496 uint saltbuf_len = cipherbuf_pos - saltbuf_pos;
13497
13498 if (saltbuf_len != 16) return (PARSER_SALT_LENGTH);
13499
13500 uint cipherbuf_len = input_len - iterations_len - 1 - saltbuf_len - 1;
13501
13502 if (cipherbuf_len != 2080) return (PARSER_HASH_LENGTH);
13503
13504 cipherbuf_pos++;
13505
13506 /**
13507 * pbkdf2 iterations
13508 */
13509
13510 salt->salt_iter = atoi (iterations_pos) - 1;
13511
13512 /**
13513 * handle salt encoding
13514 */
13515
13516 char *saltbuf_ptr = (char *) salt->salt_buf;
13517
13518 for (uint i = 0; i < saltbuf_len; i += 2)
13519 {
13520 const char p0 = saltbuf_pos[i + 0];
13521 const char p1 = saltbuf_pos[i + 1];
13522
13523 *saltbuf_ptr++ = hex_convert (p1) << 0
13524 | hex_convert (p0) << 4;
13525 }
13526
13527 salt->salt_len = saltbuf_len / 2;
13528
13529 /**
13530 * handle cipher encoding
13531 */
13532
13533 uint *tmp = (uint *) mymalloc (32);
13534
13535 char *cipherbuf_ptr = (char *) tmp;
13536
13537 for (uint i = 2016; i < cipherbuf_len; i += 2)
13538 {
13539 const char p0 = cipherbuf_pos[i + 0];
13540 const char p1 = cipherbuf_pos[i + 1];
13541
13542 *cipherbuf_ptr++ = hex_convert (p1) << 0
13543 | hex_convert (p0) << 4;
13544 }
13545
13546 // iv is stored at salt_buf 4 (length 16)
13547 // data is stored at salt_buf 8 (length 16)
13548
13549 salt->salt_buf[ 4] = byte_swap_32 (tmp[0]);
13550 salt->salt_buf[ 5] = byte_swap_32 (tmp[1]);
13551 salt->salt_buf[ 6] = byte_swap_32 (tmp[2]);
13552 salt->salt_buf[ 7] = byte_swap_32 (tmp[3]);
13553
13554 salt->salt_buf[ 8] = byte_swap_32 (tmp[4]);
13555 salt->salt_buf[ 9] = byte_swap_32 (tmp[5]);
13556 salt->salt_buf[10] = byte_swap_32 (tmp[6]);
13557 salt->salt_buf[11] = byte_swap_32 (tmp[7]);
13558
13559 free (tmp);
13560
13561 for (uint i = 0, j = 0; i < 1040; i += 1, j += 2)
13562 {
13563 const char p0 = cipherbuf_pos[j + 0];
13564 const char p1 = cipherbuf_pos[j + 1];
13565
13566 agilekey->cipher[i] = hex_convert (p1) << 0
13567 | hex_convert (p0) << 4;
13568 }
13569
13570 /**
13571 * digest buf
13572 */
13573
13574 digest[0] = 0x10101010;
13575 digest[1] = 0x10101010;
13576 digest[2] = 0x10101010;
13577 digest[3] = 0x10101010;
13578
13579 return (PARSER_OK);
13580 }
13581
13582 int lastpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13583 {
13584 if ((input_len < DISPLAY_LEN_MIN_6800) || (input_len > DISPLAY_LEN_MAX_6800)) return (PARSER_GLOBAL_LENGTH);
13585
13586 u32 *digest = (u32 *) hash_buf->digest;
13587
13588 salt_t *salt = hash_buf->salt;
13589
13590 char *hashbuf_pos = input_buf;
13591
13592 char *iterations_pos = strchr (hashbuf_pos, ':');
13593
13594 if (iterations_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13595
13596 uint hash_len = iterations_pos - hashbuf_pos;
13597
13598 if ((hash_len != 32) && (hash_len != 64)) return (PARSER_HASH_LENGTH);
13599
13600 iterations_pos++;
13601
13602 char *saltbuf_pos = strchr (iterations_pos, ':');
13603
13604 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13605
13606 uint iterations_len = saltbuf_pos - iterations_pos;
13607
13608 saltbuf_pos++;
13609
13610 uint salt_len = input_len - hash_len - 1 - iterations_len - 1;
13611
13612 if (salt_len > 32) return (PARSER_SALT_LENGTH);
13613
13614 char *salt_buf_ptr = (char *) salt->salt_buf;
13615
13616 salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, salt_len);
13617
13618 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13619
13620 salt->salt_len = salt_len;
13621
13622 salt->salt_iter = atoi (iterations_pos) - 1;
13623
13624 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
13625 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
13626 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
13627 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
13628
13629 return (PARSER_OK);
13630 }
13631
13632 int gost_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13633 {
13634 if ((input_len < DISPLAY_LEN_MIN_6900) || (input_len > DISPLAY_LEN_MAX_6900)) return (PARSER_GLOBAL_LENGTH);
13635
13636 u32 *digest = (u32 *) hash_buf->digest;
13637
13638 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13639 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13640 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13641 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13642 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
13643 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
13644 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
13645 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
13646
13647 digest[0] = byte_swap_32 (digest[0]);
13648 digest[1] = byte_swap_32 (digest[1]);
13649 digest[2] = byte_swap_32 (digest[2]);
13650 digest[3] = byte_swap_32 (digest[3]);
13651 digest[4] = byte_swap_32 (digest[4]);
13652 digest[5] = byte_swap_32 (digest[5]);
13653 digest[6] = byte_swap_32 (digest[6]);
13654 digest[7] = byte_swap_32 (digest[7]);
13655
13656 return (PARSER_OK);
13657 }
13658
13659 int sha256crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13660 {
13661 if (memcmp (SIGNATURE_SHA256CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
13662
13663 u32 *digest = (u32 *) hash_buf->digest;
13664
13665 salt_t *salt = hash_buf->salt;
13666
13667 char *salt_pos = input_buf + 3;
13668
13669 uint iterations_len = 0;
13670
13671 if (memcmp (salt_pos, "rounds=", 7) == 0)
13672 {
13673 salt_pos += 7;
13674
13675 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
13676
13677 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
13678 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
13679
13680 salt_pos[0] = 0x0;
13681
13682 salt->salt_iter = atoi (salt_pos - iterations_len);
13683
13684 salt_pos += 1;
13685
13686 iterations_len += 8;
13687 }
13688 else
13689 {
13690 salt->salt_iter = ROUNDS_SHA256CRYPT;
13691 }
13692
13693 if ((input_len < DISPLAY_LEN_MIN_7400) || (input_len > DISPLAY_LEN_MAX_7400 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
13694
13695 char *hash_pos = strchr (salt_pos, '$');
13696
13697 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13698
13699 uint salt_len = hash_pos - salt_pos;
13700
13701 if (salt_len > 16) return (PARSER_SALT_LENGTH);
13702
13703 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13704
13705 salt->salt_len = salt_len;
13706
13707 hash_pos++;
13708
13709 sha256crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13710
13711 return (PARSER_OK);
13712 }
13713
13714 int sha512osx_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13715 {
13716 uint max_len = DISPLAY_LEN_MAX_7100 + (2 * 128);
13717
13718 if ((input_len < DISPLAY_LEN_MIN_7100) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
13719
13720 if (memcmp (SIGNATURE_SHA512OSX, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
13721
13722 u64 *digest = (u64 *) hash_buf->digest;
13723
13724 salt_t *salt = hash_buf->salt;
13725
13726 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
13727
13728 char *iter_pos = input_buf + 4;
13729
13730 char *salt_pos = strchr (iter_pos, '$');
13731
13732 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13733
13734 salt_pos++;
13735
13736 char *hash_pos = strchr (salt_pos, '$');
13737
13738 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13739
13740 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
13741
13742 hash_pos++;
13743
13744 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
13745 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
13746 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
13747 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
13748 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
13749 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
13750 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
13751 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
13752
13753 uint salt_len = hash_pos - salt_pos - 1;
13754
13755 if ((salt_len % 2) != 0) return (PARSER_SALT_LENGTH);
13756
13757 salt->salt_len = salt_len / 2;
13758
13759 pbkdf2_sha512->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
13760 pbkdf2_sha512->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
13761 pbkdf2_sha512->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
13762 pbkdf2_sha512->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
13763 pbkdf2_sha512->salt_buf[4] = hex_to_u32 ((const u8 *) &salt_pos[32]);
13764 pbkdf2_sha512->salt_buf[5] = hex_to_u32 ((const u8 *) &salt_pos[40]);
13765 pbkdf2_sha512->salt_buf[6] = hex_to_u32 ((const u8 *) &salt_pos[48]);
13766 pbkdf2_sha512->salt_buf[7] = hex_to_u32 ((const u8 *) &salt_pos[56]);
13767
13768 pbkdf2_sha512->salt_buf[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]);
13769 pbkdf2_sha512->salt_buf[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]);
13770 pbkdf2_sha512->salt_buf[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]);
13771 pbkdf2_sha512->salt_buf[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]);
13772 pbkdf2_sha512->salt_buf[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]);
13773 pbkdf2_sha512->salt_buf[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]);
13774 pbkdf2_sha512->salt_buf[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]);
13775 pbkdf2_sha512->salt_buf[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]);
13776 pbkdf2_sha512->salt_buf[8] = 0x01000000;
13777 pbkdf2_sha512->salt_buf[9] = 0x80;
13778
13779 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
13780
13781 salt->salt_iter = atoi (iter_pos) - 1;
13782
13783 return (PARSER_OK);
13784 }
13785
13786 int episerver4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13787 {
13788 if ((input_len < DISPLAY_LEN_MIN_1441) || (input_len > DISPLAY_LEN_MAX_1441)) return (PARSER_GLOBAL_LENGTH);
13789
13790 if (memcmp (SIGNATURE_EPISERVER4, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
13791
13792 u32 *digest = (u32 *) hash_buf->digest;
13793
13794 salt_t *salt = hash_buf->salt;
13795
13796 char *salt_pos = input_buf + 14;
13797
13798 char *hash_pos = strchr (salt_pos, '*');
13799
13800 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13801
13802 hash_pos++;
13803
13804 uint salt_len = hash_pos - salt_pos - 1;
13805
13806 char *salt_buf_ptr = (char *) salt->salt_buf;
13807
13808 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13809
13810 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13811
13812 salt->salt_len = salt_len;
13813
13814 u8 tmp_buf[100] = { 0 };
13815
13816 base64_decode (base64_to_int, (const u8 *) hash_pos, 43, tmp_buf);
13817
13818 memcpy (digest, tmp_buf, 32);
13819
13820 digest[0] = byte_swap_32 (digest[0]);
13821 digest[1] = byte_swap_32 (digest[1]);
13822 digest[2] = byte_swap_32 (digest[2]);
13823 digest[3] = byte_swap_32 (digest[3]);
13824 digest[4] = byte_swap_32 (digest[4]);
13825 digest[5] = byte_swap_32 (digest[5]);
13826 digest[6] = byte_swap_32 (digest[6]);
13827 digest[7] = byte_swap_32 (digest[7]);
13828
13829 digest[0] -= SHA256M_A;
13830 digest[1] -= SHA256M_B;
13831 digest[2] -= SHA256M_C;
13832 digest[3] -= SHA256M_D;
13833 digest[4] -= SHA256M_E;
13834 digest[5] -= SHA256M_F;
13835 digest[6] -= SHA256M_G;
13836 digest[7] -= SHA256M_H;
13837
13838 return (PARSER_OK);
13839 }
13840
13841 int sha512grub_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13842 {
13843 uint max_len = DISPLAY_LEN_MAX_7200 + (8 * 128);
13844
13845 if ((input_len < DISPLAY_LEN_MIN_7200) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
13846
13847 if (memcmp (SIGNATURE_SHA512GRUB, input_buf, 19)) return (PARSER_SIGNATURE_UNMATCHED);
13848
13849 u64 *digest = (u64 *) hash_buf->digest;
13850
13851 salt_t *salt = hash_buf->salt;
13852
13853 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
13854
13855 char *iter_pos = input_buf + 19;
13856
13857 char *salt_pos = strchr (iter_pos, '.');
13858
13859 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13860
13861 salt_pos++;
13862
13863 char *hash_pos = strchr (salt_pos, '.');
13864
13865 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13866
13867 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
13868
13869 hash_pos++;
13870
13871 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
13872 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
13873 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
13874 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
13875 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
13876 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
13877 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
13878 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
13879
13880 uint salt_len = hash_pos - salt_pos - 1;
13881
13882 salt_len /= 2;
13883
13884 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
13885
13886 uint i;
13887
13888 for (i = 0; i < salt_len; i++)
13889 {
13890 salt_buf_ptr[i] = hex_to_u8 ((const u8 *) &salt_pos[i * 2]);
13891 }
13892
13893 salt_buf_ptr[salt_len + 3] = 0x01;
13894 salt_buf_ptr[salt_len + 4] = 0x80;
13895
13896 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
13897
13898 salt->salt_len = salt_len;
13899
13900 salt->salt_iter = atoi (iter_pos) - 1;
13901
13902 return (PARSER_OK);
13903 }
13904
13905 int sha512b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13906 {
13907 if ((input_len < DISPLAY_LEN_MIN_1711) || (input_len > DISPLAY_LEN_MAX_1711)) return (PARSER_GLOBAL_LENGTH);
13908
13909 if (memcmp (SIGNATURE_SHA512B64S, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
13910
13911 u64 *digest = (u64 *) hash_buf->digest;
13912
13913 salt_t *salt = hash_buf->salt;
13914
13915 u8 tmp_buf[120] = { 0 };
13916
13917 int tmp_len = base64_decode (base64_to_int, (const u8 *) input_buf + 9, input_len - 9, tmp_buf);
13918
13919 if (tmp_len < 64) return (PARSER_HASH_LENGTH);
13920
13921 memcpy (digest, tmp_buf, 64);
13922
13923 digest[0] = byte_swap_64 (digest[0]);
13924 digest[1] = byte_swap_64 (digest[1]);
13925 digest[2] = byte_swap_64 (digest[2]);
13926 digest[3] = byte_swap_64 (digest[3]);
13927 digest[4] = byte_swap_64 (digest[4]);
13928 digest[5] = byte_swap_64 (digest[5]);
13929 digest[6] = byte_swap_64 (digest[6]);
13930 digest[7] = byte_swap_64 (digest[7]);
13931
13932 digest[0] -= SHA512M_A;
13933 digest[1] -= SHA512M_B;
13934 digest[2] -= SHA512M_C;
13935 digest[3] -= SHA512M_D;
13936 digest[4] -= SHA512M_E;
13937 digest[5] -= SHA512M_F;
13938 digest[6] -= SHA512M_G;
13939 digest[7] -= SHA512M_H;
13940
13941 int salt_len = tmp_len - 64;
13942
13943 if (salt_len < 0) return (PARSER_SALT_LENGTH);
13944
13945 salt->salt_len = salt_len;
13946
13947 memcpy (salt->salt_buf, tmp_buf + 64, salt->salt_len);
13948
13949 if (data.opts_type & OPTS_TYPE_ST_ADD80)
13950 {
13951 char *ptr = (char *) salt->salt_buf;
13952
13953 ptr[salt->salt_len] = 0x80;
13954 }
13955
13956 return (PARSER_OK);
13957 }
13958
13959 int hmacmd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13960 {
13961 if (data.opts_type & OPTS_TYPE_ST_HEX)
13962 {
13963 if ((input_len < DISPLAY_LEN_MIN_50H) || (input_len > DISPLAY_LEN_MAX_50H)) return (PARSER_GLOBAL_LENGTH);
13964 }
13965 else
13966 {
13967 if ((input_len < DISPLAY_LEN_MIN_50) || (input_len > DISPLAY_LEN_MAX_50)) return (PARSER_GLOBAL_LENGTH);
13968 }
13969
13970 u32 *digest = (u32 *) hash_buf->digest;
13971
13972 salt_t *salt = hash_buf->salt;
13973
13974 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13975 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13976 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13977 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13978
13979 digest[0] = byte_swap_32 (digest[0]);
13980 digest[1] = byte_swap_32 (digest[1]);
13981 digest[2] = byte_swap_32 (digest[2]);
13982 digest[3] = byte_swap_32 (digest[3]);
13983
13984 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13985
13986 uint salt_len = input_len - 32 - 1;
13987
13988 char *salt_buf = input_buf + 32 + 1;
13989
13990 char *salt_buf_ptr = (char *) salt->salt_buf;
13991
13992 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13993
13994 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13995
13996 salt->salt_len = salt_len;
13997
13998 return (PARSER_OK);
13999 }
14000
14001 int hmacsha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14002 {
14003 if (data.opts_type & OPTS_TYPE_ST_HEX)
14004 {
14005 if ((input_len < DISPLAY_LEN_MIN_150H) || (input_len > DISPLAY_LEN_MAX_150H)) return (PARSER_GLOBAL_LENGTH);
14006 }
14007 else
14008 {
14009 if ((input_len < DISPLAY_LEN_MIN_150) || (input_len > DISPLAY_LEN_MAX_150)) return (PARSER_GLOBAL_LENGTH);
14010 }
14011
14012 u32 *digest = (u32 *) hash_buf->digest;
14013
14014 salt_t *salt = hash_buf->salt;
14015
14016 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14017 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14018 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14019 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14020 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
14021
14022 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14023
14024 uint salt_len = input_len - 40 - 1;
14025
14026 char *salt_buf = input_buf + 40 + 1;
14027
14028 char *salt_buf_ptr = (char *) salt->salt_buf;
14029
14030 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14031
14032 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14033
14034 salt->salt_len = salt_len;
14035
14036 return (PARSER_OK);
14037 }
14038
14039 int hmacsha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14040 {
14041 if (data.opts_type & OPTS_TYPE_ST_HEX)
14042 {
14043 if ((input_len < DISPLAY_LEN_MIN_1450H) || (input_len > DISPLAY_LEN_MAX_1450H)) return (PARSER_GLOBAL_LENGTH);
14044 }
14045 else
14046 {
14047 if ((input_len < DISPLAY_LEN_MIN_1450) || (input_len > DISPLAY_LEN_MAX_1450)) return (PARSER_GLOBAL_LENGTH);
14048 }
14049
14050 u32 *digest = (u32 *) hash_buf->digest;
14051
14052 salt_t *salt = hash_buf->salt;
14053
14054 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14055 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14056 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14057 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14058 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
14059 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
14060 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
14061 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
14062
14063 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14064
14065 uint salt_len = input_len - 64 - 1;
14066
14067 char *salt_buf = input_buf + 64 + 1;
14068
14069 char *salt_buf_ptr = (char *) salt->salt_buf;
14070
14071 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14072
14073 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14074
14075 salt->salt_len = salt_len;
14076
14077 return (PARSER_OK);
14078 }
14079
14080 int hmacsha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14081 {
14082 if (data.opts_type & OPTS_TYPE_ST_HEX)
14083 {
14084 if ((input_len < DISPLAY_LEN_MIN_1750H) || (input_len > DISPLAY_LEN_MAX_1750H)) return (PARSER_GLOBAL_LENGTH);
14085 }
14086 else
14087 {
14088 if ((input_len < DISPLAY_LEN_MIN_1750) || (input_len > DISPLAY_LEN_MAX_1750)) return (PARSER_GLOBAL_LENGTH);
14089 }
14090
14091 u64 *digest = (u64 *) hash_buf->digest;
14092
14093 salt_t *salt = hash_buf->salt;
14094
14095 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
14096 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
14097 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
14098 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
14099 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
14100 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
14101 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
14102 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
14103
14104 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14105
14106 uint salt_len = input_len - 128 - 1;
14107
14108 char *salt_buf = input_buf + 128 + 1;
14109
14110 char *salt_buf_ptr = (char *) salt->salt_buf;
14111
14112 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14113
14114 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14115
14116 salt->salt_len = salt_len;
14117
14118 return (PARSER_OK);
14119 }
14120
14121 int krb5pa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14122 {
14123 if ((input_len < DISPLAY_LEN_MIN_7500) || (input_len > DISPLAY_LEN_MAX_7500)) return (PARSER_GLOBAL_LENGTH);
14124
14125 if (memcmp (SIGNATURE_KRB5PA, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
14126
14127 u32 *digest = (u32 *) hash_buf->digest;
14128
14129 salt_t *salt = hash_buf->salt;
14130
14131 krb5pa_t *krb5pa = (krb5pa_t *) hash_buf->esalt;
14132
14133 /**
14134 * parse line
14135 */
14136
14137 char *user_pos = input_buf + 10 + 1;
14138
14139 char *realm_pos = strchr (user_pos, '$');
14140
14141 if (realm_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14142
14143 uint user_len = realm_pos - user_pos;
14144
14145 if (user_len >= 64) return (PARSER_SALT_LENGTH);
14146
14147 realm_pos++;
14148
14149 char *salt_pos = strchr (realm_pos, '$');
14150
14151 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14152
14153 uint realm_len = salt_pos - realm_pos;
14154
14155 if (realm_len >= 64) return (PARSER_SALT_LENGTH);
14156
14157 salt_pos++;
14158
14159 char *data_pos = strchr (salt_pos, '$');
14160
14161 if (data_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14162
14163 uint salt_len = data_pos - salt_pos;
14164
14165 if (salt_len >= 128) return (PARSER_SALT_LENGTH);
14166
14167 data_pos++;
14168
14169 uint data_len = input_len - 10 - 1 - user_len - 1 - realm_len - 1 - salt_len - 1;
14170
14171 if (data_len != ((36 + 16) * 2)) return (PARSER_SALT_LENGTH);
14172
14173 /**
14174 * copy data
14175 */
14176
14177 memcpy (krb5pa->user, user_pos, user_len);
14178 memcpy (krb5pa->realm, realm_pos, realm_len);
14179 memcpy (krb5pa->salt, salt_pos, salt_len);
14180
14181 char *timestamp_ptr = (char *) krb5pa->timestamp;
14182
14183 for (uint i = 0; i < (36 * 2); i += 2)
14184 {
14185 const char p0 = data_pos[i + 0];
14186 const char p1 = data_pos[i + 1];
14187
14188 *timestamp_ptr++ = hex_convert (p1) << 0
14189 | hex_convert (p0) << 4;
14190 }
14191
14192 char *checksum_ptr = (char *) krb5pa->checksum;
14193
14194 for (uint i = (36 * 2); i < ((36 + 16) * 2); i += 2)
14195 {
14196 const char p0 = data_pos[i + 0];
14197 const char p1 = data_pos[i + 1];
14198
14199 *checksum_ptr++ = hex_convert (p1) << 0
14200 | hex_convert (p0) << 4;
14201 }
14202
14203 /**
14204 * copy some data to generic buffers to make sorting happy
14205 */
14206
14207 salt->salt_buf[0] = krb5pa->timestamp[0];
14208 salt->salt_buf[1] = krb5pa->timestamp[1];
14209 salt->salt_buf[2] = krb5pa->timestamp[2];
14210 salt->salt_buf[3] = krb5pa->timestamp[3];
14211 salt->salt_buf[4] = krb5pa->timestamp[4];
14212 salt->salt_buf[5] = krb5pa->timestamp[5];
14213 salt->salt_buf[6] = krb5pa->timestamp[6];
14214 salt->salt_buf[7] = krb5pa->timestamp[7];
14215 salt->salt_buf[8] = krb5pa->timestamp[8];
14216
14217 salt->salt_len = 36;
14218
14219 digest[0] = krb5pa->checksum[0];
14220 digest[1] = krb5pa->checksum[1];
14221 digest[2] = krb5pa->checksum[2];
14222 digest[3] = krb5pa->checksum[3];
14223
14224 return (PARSER_OK);
14225 }
14226
14227 int sapb_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14228 {
14229 if ((input_len < DISPLAY_LEN_MIN_7700) || (input_len > DISPLAY_LEN_MAX_7700)) return (PARSER_GLOBAL_LENGTH);
14230
14231 u32 *digest = (u32 *) hash_buf->digest;
14232
14233 salt_t *salt = hash_buf->salt;
14234
14235 /**
14236 * parse line
14237 */
14238
14239 char *salt_pos = input_buf;
14240
14241 char *hash_pos = strchr (salt_pos, '$');
14242
14243 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14244
14245 uint salt_len = hash_pos - salt_pos;
14246
14247 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
14248
14249 hash_pos++;
14250
14251 uint hash_len = input_len - 1 - salt_len;
14252
14253 if (hash_len != 16) return (PARSER_HASH_LENGTH);
14254
14255 /**
14256 * valid some data
14257 */
14258
14259 uint user_len = 0;
14260
14261 for (uint i = 0; i < salt_len; i++)
14262 {
14263 if (salt_pos[i] == ' ') continue;
14264
14265 user_len++;
14266 }
14267
14268 // SAP user names cannot be longer than 12 characters
14269 if (user_len > 12) return (PARSER_SALT_LENGTH);
14270
14271 // SAP user name cannot start with ! or ?
14272 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
14273
14274 /**
14275 * copy data
14276 */
14277
14278 char *salt_buf_ptr = (char *) salt->salt_buf;
14279
14280 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
14281
14282 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14283
14284 salt->salt_len = salt_len;
14285
14286 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[0]);
14287 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[8]);
14288 digest[2] = 0;
14289 digest[3] = 0;
14290
14291 digest[0] = byte_swap_32 (digest[0]);
14292 digest[1] = byte_swap_32 (digest[1]);
14293
14294 return (PARSER_OK);
14295 }
14296
14297 int sapg_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14298 {
14299 if ((input_len < DISPLAY_LEN_MIN_7800) || (input_len > DISPLAY_LEN_MAX_7800)) return (PARSER_GLOBAL_LENGTH);
14300
14301 u32 *digest = (u32 *) hash_buf->digest;
14302
14303 salt_t *salt = hash_buf->salt;
14304
14305 /**
14306 * parse line
14307 */
14308
14309 char *salt_pos = input_buf;
14310
14311 char *hash_pos = strchr (salt_pos, '$');
14312
14313 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14314
14315 uint salt_len = hash_pos - salt_pos;
14316
14317 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
14318
14319 hash_pos++;
14320
14321 uint hash_len = input_len - 1 - salt_len;
14322
14323 if (hash_len != 40) return (PARSER_HASH_LENGTH);
14324
14325 /**
14326 * valid some data
14327 */
14328
14329 uint user_len = 0;
14330
14331 for (uint i = 0; i < salt_len; i++)
14332 {
14333 if (salt_pos[i] == ' ') continue;
14334
14335 user_len++;
14336 }
14337
14338 // SAP user names cannot be longer than 12 characters
14339 // this is kinda buggy. if the username is in utf the length can be up to length 12*3
14340 // so far nobody complained so we stay with this because it helps in optimization
14341 // final string can have a max size of 32 (password) + (10 * 5) = lengthMagicArray + 12 (max salt) + 1 (the 0x80)
14342
14343 if (user_len > 12) return (PARSER_SALT_LENGTH);
14344
14345 // SAP user name cannot start with ! or ?
14346 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
14347
14348 /**
14349 * copy data
14350 */
14351
14352 char *salt_buf_ptr = (char *) salt->salt_buf;
14353
14354 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
14355
14356 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14357
14358 salt->salt_len = salt_len;
14359
14360 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
14361 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
14362 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
14363 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
14364 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
14365
14366 return (PARSER_OK);
14367 }
14368
14369 int drupal7_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14370 {
14371 if ((input_len < DISPLAY_LEN_MIN_7900) || (input_len > DISPLAY_LEN_MAX_7900)) return (PARSER_GLOBAL_LENGTH);
14372
14373 if (memcmp (SIGNATURE_DRUPAL7, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14374
14375 u64 *digest = (u64 *) hash_buf->digest;
14376
14377 salt_t *salt = hash_buf->salt;
14378
14379 char *iter_pos = input_buf + 3;
14380
14381 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
14382
14383 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
14384
14385 memcpy ((char *) salt->salt_sign, input_buf, 4);
14386
14387 salt->salt_iter = salt_iter;
14388
14389 char *salt_pos = iter_pos + 1;
14390
14391 uint salt_len = 8;
14392
14393 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
14394
14395 salt->salt_len = salt_len;
14396
14397 char *hash_pos = salt_pos + salt_len;
14398
14399 drupal7_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
14400
14401 // ugly hack start
14402
14403 char *tmp = (char *) salt->salt_buf_pc;
14404
14405 tmp[0] = hash_pos[42];
14406
14407 // ugly hack end
14408
14409 digest[ 0] = byte_swap_64 (digest[ 0]);
14410 digest[ 1] = byte_swap_64 (digest[ 1]);
14411 digest[ 2] = byte_swap_64 (digest[ 2]);
14412 digest[ 3] = byte_swap_64 (digest[ 3]);
14413 digest[ 4] = 0;
14414 digest[ 5] = 0;
14415 digest[ 6] = 0;
14416 digest[ 7] = 0;
14417
14418 return (PARSER_OK);
14419 }
14420
14421 int sybasease_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14422 {
14423 if ((input_len < DISPLAY_LEN_MIN_8000) || (input_len > DISPLAY_LEN_MAX_8000)) return (PARSER_GLOBAL_LENGTH);
14424
14425 if (memcmp (SIGNATURE_SYBASEASE, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14426
14427 u32 *digest = (u32 *) hash_buf->digest;
14428
14429 salt_t *salt = hash_buf->salt;
14430
14431 char *salt_buf = input_buf + 6;
14432
14433 uint salt_len = 16;
14434
14435 char *salt_buf_ptr = (char *) salt->salt_buf;
14436
14437 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14438
14439 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14440
14441 salt->salt_len = salt_len;
14442
14443 char *hash_pos = input_buf + 6 + 16;
14444
14445 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
14446 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
14447 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
14448 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
14449 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
14450 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
14451 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
14452 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
14453
14454 return (PARSER_OK);
14455 }
14456
14457 int mysql323_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14458 {
14459 if ((input_len < DISPLAY_LEN_MIN_200) || (input_len > DISPLAY_LEN_MAX_200)) return (PARSER_GLOBAL_LENGTH);
14460
14461 u32 *digest = (u32 *) hash_buf->digest;
14462
14463 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14464 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14465 digest[2] = 0;
14466 digest[3] = 0;
14467
14468 return (PARSER_OK);
14469 }
14470
14471 int rakp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14472 {
14473 if ((input_len < DISPLAY_LEN_MIN_7300) || (input_len > DISPLAY_LEN_MAX_7300)) return (PARSER_GLOBAL_LENGTH);
14474
14475 u32 *digest = (u32 *) hash_buf->digest;
14476
14477 salt_t *salt = hash_buf->salt;
14478
14479 rakp_t *rakp = (rakp_t *) hash_buf->esalt;
14480
14481 char *saltbuf_pos = input_buf;
14482
14483 char *hashbuf_pos = strchr (saltbuf_pos, ':');
14484
14485 if (hashbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14486
14487 uint saltbuf_len = hashbuf_pos - saltbuf_pos;
14488
14489 if (saltbuf_len < 64) return (PARSER_SALT_LENGTH);
14490 if (saltbuf_len > 512) return (PARSER_SALT_LENGTH);
14491
14492 if (saltbuf_len & 1) return (PARSER_SALT_LENGTH); // muss gerade sein wegen hex
14493
14494 hashbuf_pos++;
14495
14496 uint hashbuf_len = input_len - saltbuf_len - 1;
14497
14498 if (hashbuf_len != 40) return (PARSER_HASH_LENGTH);
14499
14500 char *salt_ptr = (char *) saltbuf_pos;
14501 char *rakp_ptr = (char *) rakp->salt_buf;
14502
14503 uint i;
14504 uint j;
14505
14506 for (i = 0, j = 0; i < saltbuf_len; i += 2, j += 1)
14507 {
14508 rakp_ptr[j] = hex_to_u8 ((const u8 *) &salt_ptr[i]);
14509 }
14510
14511 rakp_ptr[j] = 0x80;
14512
14513 rakp->salt_len = j;
14514
14515 for (i = 0; i < 64; i++)
14516 {
14517 rakp->salt_buf[i] = byte_swap_32 (rakp->salt_buf[i]);
14518 }
14519
14520 salt->salt_buf[0] = rakp->salt_buf[0];
14521 salt->salt_buf[1] = rakp->salt_buf[1];
14522 salt->salt_buf[2] = rakp->salt_buf[2];
14523 salt->salt_buf[3] = rakp->salt_buf[3];
14524 salt->salt_buf[4] = rakp->salt_buf[4];
14525 salt->salt_buf[5] = rakp->salt_buf[5];
14526 salt->salt_buf[6] = rakp->salt_buf[6];
14527 salt->salt_buf[7] = rakp->salt_buf[7];
14528
14529 salt->salt_len = 32; // muss min. 32 haben
14530
14531 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
14532 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
14533 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
14534 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
14535 digest[4] = hex_to_u32 ((const u8 *) &hashbuf_pos[32]);
14536
14537 return (PARSER_OK);
14538 }
14539
14540 int netscaler_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14541 {
14542 if ((input_len < DISPLAY_LEN_MIN_8100) || (input_len > DISPLAY_LEN_MAX_8100)) return (PARSER_GLOBAL_LENGTH);
14543
14544 u32 *digest = (u32 *) hash_buf->digest;
14545
14546 salt_t *salt = hash_buf->salt;
14547
14548 if (memcmp (SIGNATURE_NETSCALER, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
14549
14550 char *salt_pos = input_buf + 1;
14551
14552 memcpy (salt->salt_buf, salt_pos, 8);
14553
14554 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
14555 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
14556
14557 salt->salt_len = 8;
14558
14559 char *hash_pos = salt_pos + 8;
14560
14561 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
14562 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
14563 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
14564 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
14565 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
14566
14567 digest[0] -= SHA1M_A;
14568 digest[1] -= SHA1M_B;
14569 digest[2] -= SHA1M_C;
14570 digest[3] -= SHA1M_D;
14571 digest[4] -= SHA1M_E;
14572
14573 return (PARSER_OK);
14574 }
14575
14576 int chap_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14577 {
14578 if ((input_len < DISPLAY_LEN_MIN_4800) || (input_len > DISPLAY_LEN_MAX_4800)) return (PARSER_GLOBAL_LENGTH);
14579
14580 u32 *digest = (u32 *) hash_buf->digest;
14581
14582 salt_t *salt = hash_buf->salt;
14583
14584 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14585 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14586 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14587 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14588
14589 digest[0] = byte_swap_32 (digest[0]);
14590 digest[1] = byte_swap_32 (digest[1]);
14591 digest[2] = byte_swap_32 (digest[2]);
14592 digest[3] = byte_swap_32 (digest[3]);
14593
14594 digest[0] -= MD5M_A;
14595 digest[1] -= MD5M_B;
14596 digest[2] -= MD5M_C;
14597 digest[3] -= MD5M_D;
14598
14599 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14600
14601 char *salt_buf_ptr = input_buf + 32 + 1;
14602
14603 u32 *salt_buf = salt->salt_buf;
14604
14605 salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf_ptr[ 0]);
14606 salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf_ptr[ 8]);
14607 salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf_ptr[16]);
14608 salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf_ptr[24]);
14609
14610 salt_buf[0] = byte_swap_32 (salt_buf[0]);
14611 salt_buf[1] = byte_swap_32 (salt_buf[1]);
14612 salt_buf[2] = byte_swap_32 (salt_buf[2]);
14613 salt_buf[3] = byte_swap_32 (salt_buf[3]);
14614
14615 salt->salt_len = 16 + 1;
14616
14617 if (input_buf[65] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14618
14619 char *idbyte_buf_ptr = input_buf + 32 + 1 + 32 + 1;
14620
14621 salt_buf[4] = hex_to_u8 ((const u8 *) &idbyte_buf_ptr[0]) & 0xff;
14622
14623 return (PARSER_OK);
14624 }
14625
14626 int cloudkey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14627 {
14628 if ((input_len < DISPLAY_LEN_MIN_8200) || (input_len > DISPLAY_LEN_MAX_8200)) return (PARSER_GLOBAL_LENGTH);
14629
14630 u32 *digest = (u32 *) hash_buf->digest;
14631
14632 salt_t *salt = hash_buf->salt;
14633
14634 cloudkey_t *cloudkey = (cloudkey_t *) hash_buf->esalt;
14635
14636 /**
14637 * parse line
14638 */
14639
14640 char *hashbuf_pos = input_buf;
14641
14642 char *saltbuf_pos = strchr (hashbuf_pos, ':');
14643
14644 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14645
14646 const uint hashbuf_len = saltbuf_pos - hashbuf_pos;
14647
14648 if (hashbuf_len != 64) return (PARSER_HASH_LENGTH);
14649
14650 saltbuf_pos++;
14651
14652 char *iteration_pos = strchr (saltbuf_pos, ':');
14653
14654 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14655
14656 const uint saltbuf_len = iteration_pos - saltbuf_pos;
14657
14658 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
14659
14660 iteration_pos++;
14661
14662 char *databuf_pos = strchr (iteration_pos, ':');
14663
14664 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14665
14666 const uint iteration_len = databuf_pos - iteration_pos;
14667
14668 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
14669 if (iteration_len > 8) return (PARSER_SALT_ITERATION);
14670
14671 const uint databuf_len = input_len - hashbuf_len - 1 - saltbuf_len - 1 - iteration_len - 1;
14672
14673 if (databuf_len < 1) return (PARSER_SALT_LENGTH);
14674 if (databuf_len > 2048) return (PARSER_SALT_LENGTH);
14675
14676 databuf_pos++;
14677
14678 // digest
14679
14680 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
14681 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
14682 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
14683 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
14684 digest[4] = hex_to_u32 ((const u8 *) &hashbuf_pos[32]);
14685 digest[5] = hex_to_u32 ((const u8 *) &hashbuf_pos[40]);
14686 digest[6] = hex_to_u32 ((const u8 *) &hashbuf_pos[48]);
14687 digest[7] = hex_to_u32 ((const u8 *) &hashbuf_pos[56]);
14688
14689 // salt
14690
14691 char *saltbuf_ptr = (char *) salt->salt_buf;
14692
14693 for (uint i = 0; i < saltbuf_len; i += 2)
14694 {
14695 const char p0 = saltbuf_pos[i + 0];
14696 const char p1 = saltbuf_pos[i + 1];
14697
14698 *saltbuf_ptr++ = hex_convert (p1) << 0
14699 | hex_convert (p0) << 4;
14700 }
14701
14702 salt->salt_buf[4] = 0x01000000;
14703 salt->salt_buf[5] = 0x80;
14704
14705 salt->salt_len = saltbuf_len / 2;
14706
14707 // iteration
14708
14709 salt->salt_iter = atoi (iteration_pos) - 1;
14710
14711 // data
14712
14713 char *databuf_ptr = (char *) cloudkey->data_buf;
14714
14715 for (uint i = 0; i < databuf_len; i += 2)
14716 {
14717 const char p0 = databuf_pos[i + 0];
14718 const char p1 = databuf_pos[i + 1];
14719
14720 *databuf_ptr++ = hex_convert (p1) << 0
14721 | hex_convert (p0) << 4;
14722 }
14723
14724 *databuf_ptr++ = 0x80;
14725
14726 for (uint i = 0; i < 512; i++)
14727 {
14728 cloudkey->data_buf[i] = byte_swap_32 (cloudkey->data_buf[i]);
14729 }
14730
14731 cloudkey->data_len = databuf_len / 2;
14732
14733 return (PARSER_OK);
14734 }
14735
14736 int nsec3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14737 {
14738 if ((input_len < DISPLAY_LEN_MIN_8300) || (input_len > DISPLAY_LEN_MAX_8300)) return (PARSER_GLOBAL_LENGTH);
14739
14740 u32 *digest = (u32 *) hash_buf->digest;
14741
14742 salt_t *salt = hash_buf->salt;
14743
14744 /**
14745 * parse line
14746 */
14747
14748 char *hashbuf_pos = input_buf;
14749
14750 char *domainbuf_pos = strchr (hashbuf_pos, ':');
14751
14752 if (domainbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14753
14754 const uint hashbuf_len = domainbuf_pos - hashbuf_pos;
14755
14756 if (hashbuf_len != 32) return (PARSER_HASH_LENGTH);
14757
14758 domainbuf_pos++;
14759
14760 if (domainbuf_pos[0] != '.') return (PARSER_SALT_VALUE);
14761
14762 char *saltbuf_pos = strchr (domainbuf_pos, ':');
14763
14764 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14765
14766 const uint domainbuf_len = saltbuf_pos - domainbuf_pos;
14767
14768 if (domainbuf_len >= 32) return (PARSER_SALT_LENGTH);
14769
14770 saltbuf_pos++;
14771
14772 char *iteration_pos = strchr (saltbuf_pos, ':');
14773
14774 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14775
14776 const uint saltbuf_len = iteration_pos - saltbuf_pos;
14777
14778 if (saltbuf_len >= 28) return (PARSER_SALT_LENGTH); // 28 = 32 - 4; 4 = length
14779
14780 if ((domainbuf_len + saltbuf_len) >= 48) return (PARSER_SALT_LENGTH);
14781
14782 iteration_pos++;
14783
14784 const uint iteration_len = input_len - hashbuf_len - 1 - domainbuf_len - 1 - saltbuf_len - 1;
14785
14786 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
14787 if (iteration_len > 5) return (PARSER_SALT_ITERATION);
14788
14789 // ok, the plan for this algorithm is the following:
14790 // we have 2 salts here, the domain-name and a random salt
14791 // while both are used in the initial transformation,
14792 // only the random salt is used in the following iterations
14793 // so we create two buffer, one that includes domain-name (stored into salt_buf_pc[])
14794 // and one that includes only the real salt (stored into salt_buf[]).
14795 // the domain-name length is put into array position 7 of salt_buf_pc[] since there is not salt_pc_len
14796
14797 u8 tmp_buf[100] = { 0 };
14798
14799 base32_decode (itoa32_to_int, (const u8 *) hashbuf_pos, 32, tmp_buf);
14800
14801 memcpy (digest, tmp_buf, 20);
14802
14803 digest[0] = byte_swap_32 (digest[0]);
14804 digest[1] = byte_swap_32 (digest[1]);
14805 digest[2] = byte_swap_32 (digest[2]);
14806 digest[3] = byte_swap_32 (digest[3]);
14807 digest[4] = byte_swap_32 (digest[4]);
14808
14809 // domain
14810
14811 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
14812
14813 memcpy (salt_buf_pc_ptr, domainbuf_pos, domainbuf_len);
14814
14815 char *len_ptr = NULL;
14816
14817 for (uint i = 0; i < domainbuf_len; i++)
14818 {
14819 if (salt_buf_pc_ptr[i] == '.')
14820 {
14821 len_ptr = &salt_buf_pc_ptr[i];
14822
14823 *len_ptr = 0;
14824 }
14825 else
14826 {
14827 *len_ptr += 1;
14828 }
14829 }
14830
14831 salt->salt_buf_pc[7] = domainbuf_len;
14832
14833 // "real" salt
14834
14835 char *salt_buf_ptr = (char *) salt->salt_buf;
14836
14837 const uint salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, saltbuf_len);
14838
14839 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14840
14841 salt->salt_len = salt_len;
14842
14843 // iteration
14844
14845 salt->salt_iter = atoi (iteration_pos);
14846
14847 return (PARSER_OK);
14848 }
14849
14850 int wbb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14851 {
14852 if ((input_len < DISPLAY_LEN_MIN_8400) || (input_len > DISPLAY_LEN_MAX_8400)) return (PARSER_GLOBAL_LENGTH);
14853
14854 u32 *digest = (u32 *) hash_buf->digest;
14855
14856 salt_t *salt = hash_buf->salt;
14857
14858 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14859 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14860 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14861 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14862 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
14863
14864 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14865
14866 uint salt_len = input_len - 40 - 1;
14867
14868 char *salt_buf = input_buf + 40 + 1;
14869
14870 char *salt_buf_ptr = (char *) salt->salt_buf;
14871
14872 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14873
14874 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14875
14876 salt->salt_len = salt_len;
14877
14878 return (PARSER_OK);
14879 }
14880
14881 int racf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14882 {
14883 const u8 ascii_to_ebcdic[] =
14884 {
14885 0x00, 0x01, 0x02, 0x03, 0x37, 0x2d, 0x2e, 0x2f, 0x16, 0x05, 0x25, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
14886 0x10, 0x11, 0x12, 0x13, 0x3c, 0x3d, 0x32, 0x26, 0x18, 0x19, 0x3f, 0x27, 0x1c, 0x1d, 0x1e, 0x1f,
14887 0x40, 0x4f, 0x7f, 0x7b, 0x5b, 0x6c, 0x50, 0x7d, 0x4d, 0x5d, 0x5c, 0x4e, 0x6b, 0x60, 0x4b, 0x61,
14888 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0x7a, 0x5e, 0x4c, 0x7e, 0x6e, 0x6f,
14889 0x7c, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6,
14890 0xd7, 0xd8, 0xd9, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0x4a, 0xe0, 0x5a, 0x5f, 0x6d,
14891 0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
14892 0x97, 0x98, 0x99, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xc0, 0x6a, 0xd0, 0xa1, 0x07,
14893 0x20, 0x21, 0x22, 0x23, 0x24, 0x15, 0x06, 0x17, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x09, 0x0a, 0x1b,
14894 0x30, 0x31, 0x1a, 0x33, 0x34, 0x35, 0x36, 0x08, 0x38, 0x39, 0x3a, 0x3b, 0x04, 0x14, 0x3e, 0xe1,
14895 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
14896 0x58, 0x59, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75,
14897 0x76, 0x77, 0x78, 0x80, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e,
14898 0x9f, 0xa0, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
14899 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xda, 0xdb,
14900 0xdc, 0xdd, 0xde, 0xdf, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
14901 };
14902
14903 if ((input_len < DISPLAY_LEN_MIN_8500) || (input_len > DISPLAY_LEN_MAX_8500)) return (PARSER_GLOBAL_LENGTH);
14904
14905 if (memcmp (SIGNATURE_RACF, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14906
14907 u32 *digest = (u32 *) hash_buf->digest;
14908
14909 salt_t *salt = hash_buf->salt;
14910
14911 char *salt_pos = input_buf + 6 + 1;
14912
14913 char *digest_pos = strchr (salt_pos, '*');
14914
14915 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14916
14917 uint salt_len = digest_pos - salt_pos;
14918
14919 if (salt_len > 8) return (PARSER_SALT_LENGTH);
14920
14921 uint hash_len = input_len - 1 - salt_len - 1 - 6;
14922
14923 if (hash_len != 16) return (PARSER_HASH_LENGTH);
14924
14925 digest_pos++;
14926
14927 char *salt_buf_ptr = (char *) salt->salt_buf;
14928 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
14929
14930 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
14931
14932 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14933
14934 salt->salt_len = salt_len;
14935
14936 for (uint i = 0; i < salt_len; i++)
14937 {
14938 salt_buf_pc_ptr[i] = ascii_to_ebcdic[(int) salt_buf_ptr[i]];
14939 }
14940 for (uint i = salt_len; i < 8; i++)
14941 {
14942 salt_buf_pc_ptr[i] = 0x40;
14943 }
14944
14945 uint tt;
14946
14947 IP (salt->salt_buf_pc[0], salt->salt_buf_pc[1], tt);
14948
14949 salt->salt_buf_pc[0] = rotl32 (salt->salt_buf_pc[0], 3u);
14950 salt->salt_buf_pc[1] = rotl32 (salt->salt_buf_pc[1], 3u);
14951
14952 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
14953 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
14954
14955 digest[0] = byte_swap_32 (digest[0]);
14956 digest[1] = byte_swap_32 (digest[1]);
14957
14958 IP (digest[0], digest[1], tt);
14959
14960 digest[0] = rotr32 (digest[0], 29);
14961 digest[1] = rotr32 (digest[1], 29);
14962 digest[2] = 0;
14963 digest[3] = 0;
14964
14965 return (PARSER_OK);
14966 }
14967
14968 int lotus5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14969 {
14970 if ((input_len < DISPLAY_LEN_MIN_8600) || (input_len > DISPLAY_LEN_MAX_8600)) return (PARSER_GLOBAL_LENGTH);
14971
14972 u32 *digest = (u32 *) hash_buf->digest;
14973
14974 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14975 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14976 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14977 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14978
14979 digest[0] = byte_swap_32 (digest[0]);
14980 digest[1] = byte_swap_32 (digest[1]);
14981 digest[2] = byte_swap_32 (digest[2]);
14982 digest[3] = byte_swap_32 (digest[3]);
14983
14984 return (PARSER_OK);
14985 }
14986
14987 int lotus6_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14988 {
14989 if ((input_len < DISPLAY_LEN_MIN_8700) || (input_len > DISPLAY_LEN_MAX_8700)) return (PARSER_GLOBAL_LENGTH);
14990
14991 if ((input_buf[0] != '(') || (input_buf[1] != 'G') || (input_buf[21] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
14992
14993 u32 *digest = (u32 *) hash_buf->digest;
14994
14995 salt_t *salt = hash_buf->salt;
14996
14997 u8 tmp_buf[120] = { 0 };
14998
14999 base64_decode (lotus64_to_int, (const u8 *) input_buf + 2, input_len - 3, tmp_buf);
15000
15001 tmp_buf[3] += -4; // dont ask!
15002
15003 memcpy (salt->salt_buf, tmp_buf, 5);
15004
15005 salt->salt_len = 5;
15006
15007 memcpy (digest, tmp_buf + 5, 9);
15008
15009 // yes, only 9 byte are needed to crack, but 10 to display
15010
15011 salt->salt_buf_pc[7] = input_buf[20];
15012
15013 return (PARSER_OK);
15014 }
15015
15016 int lotus8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15017 {
15018 if ((input_len < DISPLAY_LEN_MIN_9100) || (input_len > DISPLAY_LEN_MAX_9100)) return (PARSER_GLOBAL_LENGTH);
15019
15020 if ((input_buf[0] != '(') || (input_buf[1] != 'H') || (input_buf[DISPLAY_LEN_MAX_9100 - 1] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
15021
15022 u32 *digest = (u32 *) hash_buf->digest;
15023
15024 salt_t *salt = hash_buf->salt;
15025
15026 u8 tmp_buf[120] = { 0 };
15027
15028 base64_decode (lotus64_to_int, (const u8 *) input_buf + 2, input_len - 3, tmp_buf);
15029
15030 tmp_buf[3] += -4; // dont ask!
15031
15032 // salt
15033
15034 memcpy (salt->salt_buf, tmp_buf, 16);
15035
15036 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)
15037
15038 // iteration
15039
15040 char tmp_iter_buf[11] = { 0 };
15041
15042 memcpy (tmp_iter_buf, tmp_buf + 16, 10);
15043
15044 tmp_iter_buf[10] = 0;
15045
15046 salt->salt_iter = atoi (tmp_iter_buf);
15047
15048 if (salt->salt_iter < 1) // well, the limit hopefully is much higher
15049 {
15050 return (PARSER_SALT_ITERATION);
15051 }
15052
15053 salt->salt_iter--; // first round in init
15054
15055 // 2 additional bytes for display only
15056
15057 salt->salt_buf_pc[0] = tmp_buf[26];
15058 salt->salt_buf_pc[1] = tmp_buf[27];
15059
15060 // digest
15061
15062 memcpy (digest, tmp_buf + 28, 8);
15063
15064 digest[0] = byte_swap_32 (digest[0]);
15065 digest[1] = byte_swap_32 (digest[1]);
15066 digest[2] = 0;
15067 digest[3] = 0;
15068
15069 return (PARSER_OK);
15070 }
15071
15072 int hmailserver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15073 {
15074 if ((input_len < DISPLAY_LEN_MIN_1421) || (input_len > DISPLAY_LEN_MAX_1421)) return (PARSER_GLOBAL_LENGTH);
15075
15076 u32 *digest = (u32 *) hash_buf->digest;
15077
15078 salt_t *salt = hash_buf->salt;
15079
15080 char *salt_buf_pos = input_buf;
15081
15082 char *hash_buf_pos = salt_buf_pos + 6;
15083
15084 digest[0] = hex_to_u32 ((const u8 *) &hash_buf_pos[ 0]);
15085 digest[1] = hex_to_u32 ((const u8 *) &hash_buf_pos[ 8]);
15086 digest[2] = hex_to_u32 ((const u8 *) &hash_buf_pos[16]);
15087 digest[3] = hex_to_u32 ((const u8 *) &hash_buf_pos[24]);
15088 digest[4] = hex_to_u32 ((const u8 *) &hash_buf_pos[32]);
15089 digest[5] = hex_to_u32 ((const u8 *) &hash_buf_pos[40]);
15090 digest[6] = hex_to_u32 ((const u8 *) &hash_buf_pos[48]);
15091 digest[7] = hex_to_u32 ((const u8 *) &hash_buf_pos[56]);
15092
15093 digest[0] -= SHA256M_A;
15094 digest[1] -= SHA256M_B;
15095 digest[2] -= SHA256M_C;
15096 digest[3] -= SHA256M_D;
15097 digest[4] -= SHA256M_E;
15098 digest[5] -= SHA256M_F;
15099 digest[6] -= SHA256M_G;
15100 digest[7] -= SHA256M_H;
15101
15102 char *salt_buf_ptr = (char *) salt->salt_buf;
15103
15104 const uint salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf_pos, 6);
15105
15106 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
15107
15108 salt->salt_len = salt_len;
15109
15110 return (PARSER_OK);
15111 }
15112
15113 int phps_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15114 {
15115 if ((input_len < DISPLAY_LEN_MIN_2612) || (input_len > DISPLAY_LEN_MAX_2612)) return (PARSER_GLOBAL_LENGTH);
15116
15117 u32 *digest = (u32 *) hash_buf->digest;
15118
15119 if (memcmp (SIGNATURE_PHPS, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
15120
15121 salt_t *salt = hash_buf->salt;
15122
15123 char *salt_buf = input_buf + 6;
15124
15125 char *digest_buf = strchr (salt_buf, '$');
15126
15127 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15128
15129 uint salt_len = digest_buf - salt_buf;
15130
15131 digest_buf++; // skip the '$' symbol
15132
15133 char *salt_buf_ptr = (char *) salt->salt_buf;
15134
15135 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
15136
15137 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
15138
15139 salt->salt_len = salt_len;
15140
15141 digest[0] = hex_to_u32 ((const u8 *) &digest_buf[ 0]);
15142 digest[1] = hex_to_u32 ((const u8 *) &digest_buf[ 8]);
15143 digest[2] = hex_to_u32 ((const u8 *) &digest_buf[16]);
15144 digest[3] = hex_to_u32 ((const u8 *) &digest_buf[24]);
15145
15146 digest[0] = byte_swap_32 (digest[0]);
15147 digest[1] = byte_swap_32 (digest[1]);
15148 digest[2] = byte_swap_32 (digest[2]);
15149 digest[3] = byte_swap_32 (digest[3]);
15150
15151 digest[0] -= MD5M_A;
15152 digest[1] -= MD5M_B;
15153 digest[2] -= MD5M_C;
15154 digest[3] -= MD5M_D;
15155
15156 return (PARSER_OK);
15157 }
15158
15159 int mediawiki_b_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15160 {
15161 if ((input_len < DISPLAY_LEN_MIN_3711) || (input_len > DISPLAY_LEN_MAX_3711)) return (PARSER_GLOBAL_LENGTH);
15162
15163 if (memcmp (SIGNATURE_MEDIAWIKI_B, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
15164
15165 u32 *digest = (u32 *) hash_buf->digest;
15166
15167 salt_t *salt = hash_buf->salt;
15168
15169 char *salt_buf = input_buf + 3;
15170
15171 char *digest_buf = strchr (salt_buf, '$');
15172
15173 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15174
15175 uint salt_len = digest_buf - salt_buf;
15176
15177 digest_buf++; // skip the '$' symbol
15178
15179 char *salt_buf_ptr = (char *) salt->salt_buf;
15180
15181 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
15182
15183 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
15184
15185 salt_buf_ptr[salt_len] = 0x2d;
15186
15187 salt->salt_len = salt_len + 1;
15188
15189 digest[0] = hex_to_u32 ((const u8 *) &digest_buf[ 0]);
15190 digest[1] = hex_to_u32 ((const u8 *) &digest_buf[ 8]);
15191 digest[2] = hex_to_u32 ((const u8 *) &digest_buf[16]);
15192 digest[3] = hex_to_u32 ((const u8 *) &digest_buf[24]);
15193
15194 digest[0] = byte_swap_32 (digest[0]);
15195 digest[1] = byte_swap_32 (digest[1]);
15196 digest[2] = byte_swap_32 (digest[2]);
15197 digest[3] = byte_swap_32 (digest[3]);
15198
15199 digest[0] -= MD5M_A;
15200 digest[1] -= MD5M_B;
15201 digest[2] -= MD5M_C;
15202 digest[3] -= MD5M_D;
15203
15204 return (PARSER_OK);
15205 }
15206
15207 int peoplesoft_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15208 {
15209 if ((input_len < DISPLAY_LEN_MIN_133) || (input_len > DISPLAY_LEN_MAX_133)) return (PARSER_GLOBAL_LENGTH);
15210
15211 u32 *digest = (u32 *) hash_buf->digest;
15212
15213 salt_t *salt = hash_buf->salt;
15214
15215 u8 tmp_buf[100] = { 0 };
15216
15217 base64_decode (base64_to_int, (const u8 *) input_buf, input_len, tmp_buf);
15218
15219 memcpy (digest, tmp_buf, 20);
15220
15221 digest[0] = byte_swap_32 (digest[0]);
15222 digest[1] = byte_swap_32 (digest[1]);
15223 digest[2] = byte_swap_32 (digest[2]);
15224 digest[3] = byte_swap_32 (digest[3]);
15225 digest[4] = byte_swap_32 (digest[4]);
15226
15227 digest[0] -= SHA1M_A;
15228 digest[1] -= SHA1M_B;
15229 digest[2] -= SHA1M_C;
15230 digest[3] -= SHA1M_D;
15231 digest[4] -= SHA1M_E;
15232
15233 salt->salt_buf[0] = 0x80;
15234
15235 salt->salt_len = 0;
15236
15237 return (PARSER_OK);
15238 }
15239
15240 int skype_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15241 {
15242 if ((input_len < DISPLAY_LEN_MIN_23) || (input_len > DISPLAY_LEN_MAX_23)) return (PARSER_GLOBAL_LENGTH);
15243
15244 u32 *digest = (u32 *) hash_buf->digest;
15245
15246 salt_t *salt = hash_buf->salt;
15247
15248 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
15249 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
15250 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
15251 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
15252
15253 digest[0] = byte_swap_32 (digest[0]);
15254 digest[1] = byte_swap_32 (digest[1]);
15255 digest[2] = byte_swap_32 (digest[2]);
15256 digest[3] = byte_swap_32 (digest[3]);
15257
15258 digest[0] -= MD5M_A;
15259 digest[1] -= MD5M_B;
15260 digest[2] -= MD5M_C;
15261 digest[3] -= MD5M_D;
15262
15263 if (input_buf[32] != ':') return (PARSER_SEPARATOR_UNMATCHED);
15264
15265 uint salt_len = input_len - 32 - 1;
15266
15267 char *salt_buf = input_buf + 32 + 1;
15268
15269 char *salt_buf_ptr = (char *) salt->salt_buf;
15270
15271 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
15272
15273 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
15274
15275 /*
15276 * add static "salt" part
15277 */
15278
15279 memcpy (salt_buf_ptr + salt_len, "\nskyper\n", 8);
15280
15281 salt_len += 8;
15282
15283 salt->salt_len = salt_len;
15284
15285 return (PARSER_OK);
15286 }
15287
15288 int androidfde_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15289 {
15290 if ((input_len < DISPLAY_LEN_MIN_8800) || (input_len > DISPLAY_LEN_MAX_8800)) return (PARSER_GLOBAL_LENGTH);
15291
15292 if (memcmp (SIGNATURE_ANDROIDFDE, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
15293
15294 u32 *digest = (u32 *) hash_buf->digest;
15295
15296 salt_t *salt = hash_buf->salt;
15297
15298 androidfde_t *androidfde = (androidfde_t *) hash_buf->esalt;
15299
15300 /**
15301 * parse line
15302 */
15303
15304 char *saltlen_pos = input_buf + 1 + 3 + 1;
15305
15306 char *saltbuf_pos = strchr (saltlen_pos, '$');
15307
15308 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15309
15310 uint saltlen_len = saltbuf_pos - saltlen_pos;
15311
15312 if (saltlen_len != 2) return (PARSER_SALT_LENGTH);
15313
15314 saltbuf_pos++;
15315
15316 char *keylen_pos = strchr (saltbuf_pos, '$');
15317
15318 if (keylen_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15319
15320 uint saltbuf_len = keylen_pos - saltbuf_pos;
15321
15322 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
15323
15324 keylen_pos++;
15325
15326 char *keybuf_pos = strchr (keylen_pos, '$');
15327
15328 if (keybuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15329
15330 uint keylen_len = keybuf_pos - keylen_pos;
15331
15332 if (keylen_len != 2) return (PARSER_SALT_LENGTH);
15333
15334 keybuf_pos++;
15335
15336 char *databuf_pos = strchr (keybuf_pos, '$');
15337
15338 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15339
15340 uint keybuf_len = databuf_pos - keybuf_pos;
15341
15342 if (keybuf_len != 32) return (PARSER_SALT_LENGTH);
15343
15344 databuf_pos++;
15345
15346 uint data_len = input_len - 1 - 3 - 1 - saltlen_len - 1 - saltbuf_len - 1 - keylen_len - 1 - keybuf_len - 1;
15347
15348 if (data_len != 3072) return (PARSER_SALT_LENGTH);
15349
15350 /**
15351 * copy data
15352 */
15353
15354 digest[0] = hex_to_u32 ((const u8 *) &keybuf_pos[ 0]);
15355 digest[1] = hex_to_u32 ((const u8 *) &keybuf_pos[ 8]);
15356 digest[2] = hex_to_u32 ((const u8 *) &keybuf_pos[16]);
15357 digest[3] = hex_to_u32 ((const u8 *) &keybuf_pos[24]);
15358
15359 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &saltbuf_pos[ 0]);
15360 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &saltbuf_pos[ 8]);
15361 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &saltbuf_pos[16]);
15362 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &saltbuf_pos[24]);
15363
15364 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15365 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15366 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15367 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15368
15369 salt->salt_len = 16;
15370 salt->salt_iter = ROUNDS_ANDROIDFDE - 1;
15371
15372 for (uint i = 0, j = 0; i < 3072; i += 8, j += 1)
15373 {
15374 androidfde->data[j] = hex_to_u32 ((const u8 *) &databuf_pos[i]);
15375 }
15376
15377 return (PARSER_OK);
15378 }
15379
15380 int scrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15381 {
15382 if ((input_len < DISPLAY_LEN_MIN_8900) || (input_len > DISPLAY_LEN_MAX_8900)) return (PARSER_GLOBAL_LENGTH);
15383
15384 if (memcmp (SIGNATURE_SCRYPT, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
15385
15386 u32 *digest = (u32 *) hash_buf->digest;
15387
15388 salt_t *salt = hash_buf->salt;
15389
15390 /**
15391 * parse line
15392 */
15393
15394 // first is the N salt parameter
15395
15396 char *N_pos = input_buf + 6;
15397
15398 if (N_pos[0] != ':') return (PARSER_SEPARATOR_UNMATCHED);
15399
15400 N_pos++;
15401
15402 salt->scrypt_N = atoi (N_pos);
15403
15404 // r
15405
15406 char *r_pos = strchr (N_pos, ':');
15407
15408 if (r_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15409
15410 r_pos++;
15411
15412 salt->scrypt_r = atoi (r_pos);
15413
15414 // p
15415
15416 char *p_pos = strchr (r_pos, ':');
15417
15418 if (p_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15419
15420 p_pos++;
15421
15422 salt->scrypt_p = atoi (p_pos);
15423
15424 // salt
15425
15426 char *saltbuf_pos = strchr (p_pos, ':');
15427
15428 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15429
15430 saltbuf_pos++;
15431
15432 char *hash_pos = strchr (saltbuf_pos, ':');
15433
15434 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15435
15436 hash_pos++;
15437
15438 // base64 decode
15439
15440 int salt_len_base64 = hash_pos - saltbuf_pos;
15441
15442 if (salt_len_base64 > 45) return (PARSER_SALT_LENGTH);
15443
15444 u8 tmp_buf[33] = { 0 };
15445
15446 int tmp_len = base64_decode (base64_to_int, (const u8 *) saltbuf_pos, salt_len_base64, tmp_buf);
15447
15448 char *salt_buf_ptr = (char *) salt->salt_buf;
15449
15450 memcpy (salt_buf_ptr, tmp_buf, tmp_len);
15451
15452 salt->salt_len = tmp_len;
15453 salt->salt_iter = 1;
15454
15455 // digest - base64 decode
15456
15457 memset (tmp_buf, 0, sizeof (tmp_buf));
15458
15459 tmp_len = input_len - (hash_pos - input_buf);
15460
15461 if (tmp_len != 44) return (PARSER_GLOBAL_LENGTH);
15462
15463 base64_decode (base64_to_int, (const u8 *) hash_pos, tmp_len, tmp_buf);
15464
15465 memcpy (digest, tmp_buf, 32);
15466
15467 return (PARSER_OK);
15468 }
15469
15470 int juniper_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15471 {
15472 if ((input_len < DISPLAY_LEN_MIN_501) || (input_len > DISPLAY_LEN_MAX_501)) return (PARSER_GLOBAL_LENGTH);
15473
15474 u32 *digest = (u32 *) hash_buf->digest;
15475
15476 salt_t *salt = hash_buf->salt;
15477
15478 /**
15479 * parse line
15480 */
15481
15482 char decrypted[76] = { 0 }; // iv + hash
15483
15484 juniper_decrypt_hash (input_buf, decrypted);
15485
15486 char *md5crypt_hash = decrypted + 12;
15487
15488 if (memcmp (md5crypt_hash, "$1$danastre$", 12)) return (PARSER_SALT_VALUE);
15489
15490 salt->salt_iter = ROUNDS_MD5CRYPT;
15491
15492 char *salt_pos = md5crypt_hash + 3;
15493
15494 char *hash_pos = strchr (salt_pos, '$'); // or simply salt_pos + 8
15495
15496 salt->salt_len = hash_pos - salt_pos; // should be 8
15497
15498 memcpy ((char *) salt->salt_buf, salt_pos, salt->salt_len);
15499
15500 hash_pos++;
15501
15502 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
15503
15504 return (PARSER_OK);
15505 }
15506
15507 int cisco8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15508 {
15509 if ((input_len < DISPLAY_LEN_MIN_9200) || (input_len > DISPLAY_LEN_MAX_9200)) return (PARSER_GLOBAL_LENGTH);
15510
15511 if (memcmp (SIGNATURE_CISCO8, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
15512
15513 u32 *digest = (u32 *) hash_buf->digest;
15514
15515 salt_t *salt = hash_buf->salt;
15516
15517 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
15518
15519 /**
15520 * parse line
15521 */
15522
15523 // first is *raw* salt
15524
15525 char *salt_pos = input_buf + 3;
15526
15527 char *hash_pos = strchr (salt_pos, '$');
15528
15529 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15530
15531 uint salt_len = hash_pos - salt_pos;
15532
15533 if (salt_len != 14) return (PARSER_SALT_LENGTH);
15534
15535 hash_pos++;
15536
15537 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
15538
15539 memcpy (salt_buf_ptr, salt_pos, 14);
15540
15541 salt_buf_ptr[17] = 0x01;
15542 salt_buf_ptr[18] = 0x80;
15543
15544 // add some stuff to normal salt to make sorted happy
15545
15546 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
15547 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
15548 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
15549 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
15550
15551 salt->salt_len = salt_len;
15552 salt->salt_iter = ROUNDS_CISCO8 - 1;
15553
15554 // base64 decode hash
15555
15556 u8 tmp_buf[100] = { 0 };
15557
15558 uint hash_len = input_len - 3 - salt_len - 1;
15559
15560 int tmp_len = base64_decode (itoa64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
15561
15562 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
15563
15564 memcpy (digest, tmp_buf, 32);
15565
15566 digest[0] = byte_swap_32 (digest[0]);
15567 digest[1] = byte_swap_32 (digest[1]);
15568 digest[2] = byte_swap_32 (digest[2]);
15569 digest[3] = byte_swap_32 (digest[3]);
15570 digest[4] = byte_swap_32 (digest[4]);
15571 digest[5] = byte_swap_32 (digest[5]);
15572 digest[6] = byte_swap_32 (digest[6]);
15573 digest[7] = byte_swap_32 (digest[7]);
15574
15575 return (PARSER_OK);
15576 }
15577
15578 int cisco9_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15579 {
15580 if ((input_len < DISPLAY_LEN_MIN_9300) || (input_len > DISPLAY_LEN_MAX_9300)) return (PARSER_GLOBAL_LENGTH);
15581
15582 if (memcmp (SIGNATURE_CISCO9, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
15583
15584 u32 *digest = (u32 *) hash_buf->digest;
15585
15586 salt_t *salt = hash_buf->salt;
15587
15588 /**
15589 * parse line
15590 */
15591
15592 // first is *raw* salt
15593
15594 char *salt_pos = input_buf + 3;
15595
15596 char *hash_pos = strchr (salt_pos, '$');
15597
15598 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15599
15600 uint salt_len = hash_pos - salt_pos;
15601
15602 if (salt_len != 14) return (PARSER_SALT_LENGTH);
15603
15604 salt->salt_len = salt_len;
15605 hash_pos++;
15606
15607 char *salt_buf_ptr = (char *) salt->salt_buf;
15608
15609 memcpy (salt_buf_ptr, salt_pos, salt_len);
15610 salt_buf_ptr[salt_len] = 0;
15611
15612 // base64 decode hash
15613
15614 u8 tmp_buf[100] = { 0 };
15615
15616 uint hash_len = input_len - 3 - salt_len - 1;
15617
15618 int tmp_len = base64_decode (itoa64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
15619
15620 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
15621
15622 memcpy (digest, tmp_buf, 32);
15623
15624 // fixed:
15625 salt->scrypt_N = 16384;
15626 salt->scrypt_r = 1;
15627 salt->scrypt_p = 1;
15628 salt->salt_iter = 1;
15629
15630 return (PARSER_OK);
15631 }
15632
15633 int office2007_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15634 {
15635 if ((input_len < DISPLAY_LEN_MIN_9400) || (input_len > DISPLAY_LEN_MAX_9400)) return (PARSER_GLOBAL_LENGTH);
15636
15637 if (memcmp (SIGNATURE_OFFICE2007, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
15638
15639 u32 *digest = (u32 *) hash_buf->digest;
15640
15641 salt_t *salt = hash_buf->salt;
15642
15643 office2007_t *office2007 = (office2007_t *) hash_buf->esalt;
15644
15645 /**
15646 * parse line
15647 */
15648
15649 char *version_pos = input_buf + 8 + 1;
15650
15651 char *verifierHashSize_pos = strchr (version_pos, '*');
15652
15653 if (verifierHashSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15654
15655 u32 version_len = verifierHashSize_pos - version_pos;
15656
15657 if (version_len != 4) return (PARSER_SALT_LENGTH);
15658
15659 verifierHashSize_pos++;
15660
15661 char *keySize_pos = strchr (verifierHashSize_pos, '*');
15662
15663 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15664
15665 u32 verifierHashSize_len = keySize_pos - verifierHashSize_pos;
15666
15667 if (verifierHashSize_len != 2) return (PARSER_SALT_LENGTH);
15668
15669 keySize_pos++;
15670
15671 char *saltSize_pos = strchr (keySize_pos, '*');
15672
15673 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15674
15675 u32 keySize_len = saltSize_pos - keySize_pos;
15676
15677 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
15678
15679 saltSize_pos++;
15680
15681 char *osalt_pos = strchr (saltSize_pos, '*');
15682
15683 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15684
15685 u32 saltSize_len = osalt_pos - saltSize_pos;
15686
15687 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
15688
15689 osalt_pos++;
15690
15691 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15692
15693 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15694
15695 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15696
15697 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15698
15699 encryptedVerifier_pos++;
15700
15701 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15702
15703 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15704
15705 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15706
15707 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15708
15709 encryptedVerifierHash_pos++;
15710
15711 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;
15712
15713 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
15714
15715 const uint version = atoi (version_pos);
15716
15717 if (version != 2007) return (PARSER_SALT_VALUE);
15718
15719 const uint verifierHashSize = atoi (verifierHashSize_pos);
15720
15721 if (verifierHashSize != 20) return (PARSER_SALT_VALUE);
15722
15723 const uint keySize = atoi (keySize_pos);
15724
15725 if ((keySize != 128) && (keySize != 256)) return (PARSER_SALT_VALUE);
15726
15727 office2007->keySize = keySize;
15728
15729 const uint saltSize = atoi (saltSize_pos);
15730
15731 if (saltSize != 16) return (PARSER_SALT_VALUE);
15732
15733 /**
15734 * salt
15735 */
15736
15737 salt->salt_len = 16;
15738 salt->salt_iter = ROUNDS_OFFICE2007;
15739
15740 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15741 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15742 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15743 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15744
15745 /**
15746 * esalt
15747 */
15748
15749 office2007->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15750 office2007->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15751 office2007->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15752 office2007->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15753
15754 office2007->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15755 office2007->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15756 office2007->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15757 office2007->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15758 office2007->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15759
15760 /**
15761 * digest
15762 */
15763
15764 digest[0] = office2007->encryptedVerifierHash[0];
15765 digest[1] = office2007->encryptedVerifierHash[1];
15766 digest[2] = office2007->encryptedVerifierHash[2];
15767 digest[3] = office2007->encryptedVerifierHash[3];
15768
15769 return (PARSER_OK);
15770 }
15771
15772 int office2010_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15773 {
15774 if ((input_len < DISPLAY_LEN_MIN_9500) || (input_len > DISPLAY_LEN_MAX_9500)) return (PARSER_GLOBAL_LENGTH);
15775
15776 if (memcmp (SIGNATURE_OFFICE2010, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
15777
15778 u32 *digest = (u32 *) hash_buf->digest;
15779
15780 salt_t *salt = hash_buf->salt;
15781
15782 office2010_t *office2010 = (office2010_t *) hash_buf->esalt;
15783
15784 /**
15785 * parse line
15786 */
15787
15788 char *version_pos = input_buf + 8 + 1;
15789
15790 char *spinCount_pos = strchr (version_pos, '*');
15791
15792 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15793
15794 u32 version_len = spinCount_pos - version_pos;
15795
15796 if (version_len != 4) return (PARSER_SALT_LENGTH);
15797
15798 spinCount_pos++;
15799
15800 char *keySize_pos = strchr (spinCount_pos, '*');
15801
15802 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15803
15804 u32 spinCount_len = keySize_pos - spinCount_pos;
15805
15806 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
15807
15808 keySize_pos++;
15809
15810 char *saltSize_pos = strchr (keySize_pos, '*');
15811
15812 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15813
15814 u32 keySize_len = saltSize_pos - keySize_pos;
15815
15816 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
15817
15818 saltSize_pos++;
15819
15820 char *osalt_pos = strchr (saltSize_pos, '*');
15821
15822 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15823
15824 u32 saltSize_len = osalt_pos - saltSize_pos;
15825
15826 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
15827
15828 osalt_pos++;
15829
15830 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15831
15832 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15833
15834 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15835
15836 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15837
15838 encryptedVerifier_pos++;
15839
15840 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15841
15842 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15843
15844 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15845
15846 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15847
15848 encryptedVerifierHash_pos++;
15849
15850 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;
15851
15852 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
15853
15854 const uint version = atoi (version_pos);
15855
15856 if (version != 2010) return (PARSER_SALT_VALUE);
15857
15858 const uint spinCount = atoi (spinCount_pos);
15859
15860 if (spinCount != 100000) return (PARSER_SALT_VALUE);
15861
15862 const uint keySize = atoi (keySize_pos);
15863
15864 if (keySize != 128) return (PARSER_SALT_VALUE);
15865
15866 const uint saltSize = atoi (saltSize_pos);
15867
15868 if (saltSize != 16) return (PARSER_SALT_VALUE);
15869
15870 /**
15871 * salt
15872 */
15873
15874 salt->salt_len = 16;
15875 salt->salt_iter = spinCount;
15876
15877 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15878 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15879 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15880 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15881
15882 /**
15883 * esalt
15884 */
15885
15886 office2010->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15887 office2010->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15888 office2010->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15889 office2010->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15890
15891 office2010->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15892 office2010->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15893 office2010->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15894 office2010->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15895 office2010->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15896 office2010->encryptedVerifierHash[5] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[40]);
15897 office2010->encryptedVerifierHash[6] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[48]);
15898 office2010->encryptedVerifierHash[7] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[56]);
15899
15900 /**
15901 * digest
15902 */
15903
15904 digest[0] = office2010->encryptedVerifierHash[0];
15905 digest[1] = office2010->encryptedVerifierHash[1];
15906 digest[2] = office2010->encryptedVerifierHash[2];
15907 digest[3] = office2010->encryptedVerifierHash[3];
15908
15909 return (PARSER_OK);
15910 }
15911
15912 int office2013_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15913 {
15914 if ((input_len < DISPLAY_LEN_MIN_9600) || (input_len > DISPLAY_LEN_MAX_9600)) return (PARSER_GLOBAL_LENGTH);
15915
15916 if (memcmp (SIGNATURE_OFFICE2013, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
15917
15918 u32 *digest = (u32 *) hash_buf->digest;
15919
15920 salt_t *salt = hash_buf->salt;
15921
15922 office2013_t *office2013 = (office2013_t *) hash_buf->esalt;
15923
15924 /**
15925 * parse line
15926 */
15927
15928 char *version_pos = input_buf + 8 + 1;
15929
15930 char *spinCount_pos = strchr (version_pos, '*');
15931
15932 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15933
15934 u32 version_len = spinCount_pos - version_pos;
15935
15936 if (version_len != 4) return (PARSER_SALT_LENGTH);
15937
15938 spinCount_pos++;
15939
15940 char *keySize_pos = strchr (spinCount_pos, '*');
15941
15942 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15943
15944 u32 spinCount_len = keySize_pos - spinCount_pos;
15945
15946 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
15947
15948 keySize_pos++;
15949
15950 char *saltSize_pos = strchr (keySize_pos, '*');
15951
15952 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15953
15954 u32 keySize_len = saltSize_pos - keySize_pos;
15955
15956 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
15957
15958 saltSize_pos++;
15959
15960 char *osalt_pos = strchr (saltSize_pos, '*');
15961
15962 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15963
15964 u32 saltSize_len = osalt_pos - saltSize_pos;
15965
15966 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
15967
15968 osalt_pos++;
15969
15970 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15971
15972 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15973
15974 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15975
15976 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15977
15978 encryptedVerifier_pos++;
15979
15980 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15981
15982 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15983
15984 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15985
15986 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15987
15988 encryptedVerifierHash_pos++;
15989
15990 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;
15991
15992 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
15993
15994 const uint version = atoi (version_pos);
15995
15996 if (version != 2013) return (PARSER_SALT_VALUE);
15997
15998 const uint spinCount = atoi (spinCount_pos);
15999
16000 if (spinCount != 100000) return (PARSER_SALT_VALUE);
16001
16002 const uint keySize = atoi (keySize_pos);
16003
16004 if (keySize != 256) return (PARSER_SALT_VALUE);
16005
16006 const uint saltSize = atoi (saltSize_pos);
16007
16008 if (saltSize != 16) return (PARSER_SALT_VALUE);
16009
16010 /**
16011 * salt
16012 */
16013
16014 salt->salt_len = 16;
16015 salt->salt_iter = spinCount;
16016
16017 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
16018 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
16019 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
16020 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
16021
16022 /**
16023 * esalt
16024 */
16025
16026 office2013->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
16027 office2013->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
16028 office2013->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
16029 office2013->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
16030
16031 office2013->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
16032 office2013->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
16033 office2013->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
16034 office2013->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
16035 office2013->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
16036 office2013->encryptedVerifierHash[5] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[40]);
16037 office2013->encryptedVerifierHash[6] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[48]);
16038 office2013->encryptedVerifierHash[7] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[56]);
16039
16040 /**
16041 * digest
16042 */
16043
16044 digest[0] = office2013->encryptedVerifierHash[0];
16045 digest[1] = office2013->encryptedVerifierHash[1];
16046 digest[2] = office2013->encryptedVerifierHash[2];
16047 digest[3] = office2013->encryptedVerifierHash[3];
16048
16049 return (PARSER_OK);
16050 }
16051
16052 int oldoffice01_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16053 {
16054 if ((input_len < DISPLAY_LEN_MIN_9700) || (input_len > DISPLAY_LEN_MAX_9700)) return (PARSER_GLOBAL_LENGTH);
16055
16056 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
16057
16058 u32 *digest = (u32 *) hash_buf->digest;
16059
16060 salt_t *salt = hash_buf->salt;
16061
16062 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
16063
16064 /**
16065 * parse line
16066 */
16067
16068 char *version_pos = input_buf + 11;
16069
16070 char *osalt_pos = strchr (version_pos, '*');
16071
16072 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16073
16074 u32 version_len = osalt_pos - version_pos;
16075
16076 if (version_len != 1) return (PARSER_SALT_LENGTH);
16077
16078 osalt_pos++;
16079
16080 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
16081
16082 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16083
16084 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
16085
16086 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
16087
16088 encryptedVerifier_pos++;
16089
16090 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
16091
16092 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16093
16094 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
16095
16096 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
16097
16098 encryptedVerifierHash_pos++;
16099
16100 u32 encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
16101
16102 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
16103
16104 const uint version = *version_pos - 0x30;
16105
16106 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
16107
16108 /**
16109 * esalt
16110 */
16111
16112 oldoffice01->version = version;
16113
16114 oldoffice01->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
16115 oldoffice01->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
16116 oldoffice01->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
16117 oldoffice01->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
16118
16119 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
16120 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
16121 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
16122 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
16123
16124 oldoffice01->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
16125 oldoffice01->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
16126 oldoffice01->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
16127 oldoffice01->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
16128
16129 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
16130 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
16131 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
16132 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
16133
16134 /**
16135 * salt
16136 */
16137
16138 salt->salt_len = 16;
16139
16140 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
16141 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
16142 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
16143 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
16144
16145 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
16146 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
16147 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
16148 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
16149
16150 // this is a workaround as office produces multiple documents with the same salt
16151
16152 salt->salt_len += 32;
16153
16154 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
16155 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
16156 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
16157 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
16158 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
16159 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
16160 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
16161 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
16162
16163 /**
16164 * digest
16165 */
16166
16167 digest[0] = oldoffice01->encryptedVerifierHash[0];
16168 digest[1] = oldoffice01->encryptedVerifierHash[1];
16169 digest[2] = oldoffice01->encryptedVerifierHash[2];
16170 digest[3] = oldoffice01->encryptedVerifierHash[3];
16171
16172 return (PARSER_OK);
16173 }
16174
16175 int oldoffice01cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16176 {
16177 return oldoffice01_parse_hash (input_buf, input_len, hash_buf);
16178 }
16179
16180 int oldoffice01cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16181 {
16182 if ((input_len < DISPLAY_LEN_MIN_9720) || (input_len > DISPLAY_LEN_MAX_9720)) return (PARSER_GLOBAL_LENGTH);
16183
16184 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
16185
16186 u32 *digest = (u32 *) hash_buf->digest;
16187
16188 salt_t *salt = hash_buf->salt;
16189
16190 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
16191
16192 /**
16193 * parse line
16194 */
16195
16196 char *version_pos = input_buf + 11;
16197
16198 char *osalt_pos = strchr (version_pos, '*');
16199
16200 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16201
16202 u32 version_len = osalt_pos - version_pos;
16203
16204 if (version_len != 1) return (PARSER_SALT_LENGTH);
16205
16206 osalt_pos++;
16207
16208 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
16209
16210 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16211
16212 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
16213
16214 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
16215
16216 encryptedVerifier_pos++;
16217
16218 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
16219
16220 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16221
16222 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
16223
16224 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
16225
16226 encryptedVerifierHash_pos++;
16227
16228 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
16229
16230 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16231
16232 u32 encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
16233
16234 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
16235
16236 rc4key_pos++;
16237
16238 u32 rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
16239
16240 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
16241
16242 const uint version = *version_pos - 0x30;
16243
16244 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
16245
16246 /**
16247 * esalt
16248 */
16249
16250 oldoffice01->version = version;
16251
16252 oldoffice01->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
16253 oldoffice01->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
16254 oldoffice01->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
16255 oldoffice01->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
16256
16257 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
16258 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
16259 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
16260 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
16261
16262 oldoffice01->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
16263 oldoffice01->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
16264 oldoffice01->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
16265 oldoffice01->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
16266
16267 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
16268 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
16269 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
16270 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
16271
16272 oldoffice01->rc4key[1] = 0;
16273 oldoffice01->rc4key[0] = 0;
16274
16275 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
16276 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
16277 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
16278 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
16279 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
16280 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
16281 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
16282 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
16283 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
16284 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
16285
16286 oldoffice01->rc4key[0] = byte_swap_32 (oldoffice01->rc4key[0]);
16287 oldoffice01->rc4key[1] = byte_swap_32 (oldoffice01->rc4key[1]);
16288
16289 /**
16290 * salt
16291 */
16292
16293 salt->salt_len = 16;
16294
16295 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
16296 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
16297 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
16298 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
16299
16300 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
16301 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
16302 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
16303 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
16304
16305 // this is a workaround as office produces multiple documents with the same salt
16306
16307 salt->salt_len += 32;
16308
16309 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
16310 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
16311 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
16312 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
16313 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
16314 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
16315 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
16316 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
16317
16318 /**
16319 * digest
16320 */
16321
16322 digest[0] = oldoffice01->rc4key[0];
16323 digest[1] = oldoffice01->rc4key[1];
16324 digest[2] = 0;
16325 digest[3] = 0;
16326
16327 return (PARSER_OK);
16328 }
16329
16330 int oldoffice34_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16331 {
16332 if ((input_len < DISPLAY_LEN_MIN_9800) || (input_len > DISPLAY_LEN_MAX_9800)) return (PARSER_GLOBAL_LENGTH);
16333
16334 if ((memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE4, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
16335
16336 u32 *digest = (u32 *) hash_buf->digest;
16337
16338 salt_t *salt = hash_buf->salt;
16339
16340 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
16341
16342 /**
16343 * parse line
16344 */
16345
16346 char *version_pos = input_buf + 11;
16347
16348 char *osalt_pos = strchr (version_pos, '*');
16349
16350 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16351
16352 u32 version_len = osalt_pos - version_pos;
16353
16354 if (version_len != 1) return (PARSER_SALT_LENGTH);
16355
16356 osalt_pos++;
16357
16358 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
16359
16360 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16361
16362 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
16363
16364 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
16365
16366 encryptedVerifier_pos++;
16367
16368 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
16369
16370 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16371
16372 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
16373
16374 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
16375
16376 encryptedVerifierHash_pos++;
16377
16378 u32 encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
16379
16380 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
16381
16382 const uint version = *version_pos - 0x30;
16383
16384 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
16385
16386 /**
16387 * esalt
16388 */
16389
16390 oldoffice34->version = version;
16391
16392 oldoffice34->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
16393 oldoffice34->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
16394 oldoffice34->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
16395 oldoffice34->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
16396
16397 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
16398 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
16399 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
16400 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
16401
16402 oldoffice34->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
16403 oldoffice34->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
16404 oldoffice34->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
16405 oldoffice34->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
16406 oldoffice34->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
16407
16408 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
16409 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
16410 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
16411 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
16412 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
16413
16414 /**
16415 * salt
16416 */
16417
16418 salt->salt_len = 16;
16419
16420 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
16421 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
16422 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
16423 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
16424
16425 // this is a workaround as office produces multiple documents with the same salt
16426
16427 salt->salt_len += 32;
16428
16429 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
16430 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
16431 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
16432 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
16433 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
16434 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
16435 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
16436 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
16437
16438 /**
16439 * digest
16440 */
16441
16442 digest[0] = oldoffice34->encryptedVerifierHash[0];
16443 digest[1] = oldoffice34->encryptedVerifierHash[1];
16444 digest[2] = oldoffice34->encryptedVerifierHash[2];
16445 digest[3] = oldoffice34->encryptedVerifierHash[3];
16446
16447 return (PARSER_OK);
16448 }
16449
16450 int oldoffice34cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16451 {
16452 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
16453
16454 return oldoffice34_parse_hash (input_buf, input_len, hash_buf);
16455 }
16456
16457 int oldoffice34cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16458 {
16459 if ((input_len < DISPLAY_LEN_MIN_9820) || (input_len > DISPLAY_LEN_MAX_9820)) return (PARSER_GLOBAL_LENGTH);
16460
16461 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
16462
16463 u32 *digest = (u32 *) hash_buf->digest;
16464
16465 salt_t *salt = hash_buf->salt;
16466
16467 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
16468
16469 /**
16470 * parse line
16471 */
16472
16473 char *version_pos = input_buf + 11;
16474
16475 char *osalt_pos = strchr (version_pos, '*');
16476
16477 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16478
16479 u32 version_len = osalt_pos - version_pos;
16480
16481 if (version_len != 1) return (PARSER_SALT_LENGTH);
16482
16483 osalt_pos++;
16484
16485 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
16486
16487 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16488
16489 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
16490
16491 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
16492
16493 encryptedVerifier_pos++;
16494
16495 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
16496
16497 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16498
16499 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
16500
16501 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
16502
16503 encryptedVerifierHash_pos++;
16504
16505 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
16506
16507 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16508
16509 u32 encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
16510
16511 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
16512
16513 rc4key_pos++;
16514
16515 u32 rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
16516
16517 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
16518
16519 const uint version = *version_pos - 0x30;
16520
16521 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
16522
16523 /**
16524 * esalt
16525 */
16526
16527 oldoffice34->version = version;
16528
16529 oldoffice34->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
16530 oldoffice34->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
16531 oldoffice34->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
16532 oldoffice34->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
16533
16534 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
16535 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
16536 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
16537 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
16538
16539 oldoffice34->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
16540 oldoffice34->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
16541 oldoffice34->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
16542 oldoffice34->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
16543 oldoffice34->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
16544
16545 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
16546 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
16547 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
16548 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
16549 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
16550
16551 oldoffice34->rc4key[1] = 0;
16552 oldoffice34->rc4key[0] = 0;
16553
16554 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
16555 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
16556 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
16557 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
16558 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
16559 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
16560 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
16561 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
16562 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
16563 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
16564
16565 oldoffice34->rc4key[0] = byte_swap_32 (oldoffice34->rc4key[0]);
16566 oldoffice34->rc4key[1] = byte_swap_32 (oldoffice34->rc4key[1]);
16567
16568 /**
16569 * salt
16570 */
16571
16572 salt->salt_len = 16;
16573
16574 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
16575 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
16576 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
16577 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
16578
16579 // this is a workaround as office produces multiple documents with the same salt
16580
16581 salt->salt_len += 32;
16582
16583 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
16584 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
16585 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
16586 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
16587 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
16588 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
16589 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
16590 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
16591
16592 /**
16593 * digest
16594 */
16595
16596 digest[0] = oldoffice34->rc4key[0];
16597 digest[1] = oldoffice34->rc4key[1];
16598 digest[2] = 0;
16599 digest[3] = 0;
16600
16601 return (PARSER_OK);
16602 }
16603
16604 int radmin2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16605 {
16606 if ((input_len < DISPLAY_LEN_MIN_9900) || (input_len > DISPLAY_LEN_MAX_9900)) return (PARSER_GLOBAL_LENGTH);
16607
16608 u32 *digest = (u32 *) hash_buf->digest;
16609
16610 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
16611 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
16612 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
16613 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
16614
16615 digest[0] = byte_swap_32 (digest[0]);
16616 digest[1] = byte_swap_32 (digest[1]);
16617 digest[2] = byte_swap_32 (digest[2]);
16618 digest[3] = byte_swap_32 (digest[3]);
16619
16620 return (PARSER_OK);
16621 }
16622
16623 int djangosha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16624 {
16625 if ((input_len < DISPLAY_LEN_MIN_124) || (input_len > DISPLAY_LEN_MAX_124)) return (PARSER_GLOBAL_LENGTH);
16626
16627 if ((memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5)) && (memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16628
16629 u32 *digest = (u32 *) hash_buf->digest;
16630
16631 salt_t *salt = hash_buf->salt;
16632
16633 char *signature_pos = input_buf;
16634
16635 char *salt_pos = strchr (signature_pos, '$');
16636
16637 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16638
16639 u32 signature_len = salt_pos - signature_pos;
16640
16641 if (signature_len != 4) return (PARSER_SIGNATURE_UNMATCHED);
16642
16643 salt_pos++;
16644
16645 char *hash_pos = strchr (salt_pos, '$');
16646
16647 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16648
16649 u32 salt_len = hash_pos - salt_pos;
16650
16651 if (salt_len > 32) return (PARSER_SALT_LENGTH);
16652
16653 hash_pos++;
16654
16655 u32 hash_len = input_len - signature_len - 1 - salt_len - 1;
16656
16657 if (hash_len != 40) return (PARSER_SALT_LENGTH);
16658
16659 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
16660 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
16661 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
16662 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
16663 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
16664
16665 digest[0] -= SHA1M_A;
16666 digest[1] -= SHA1M_B;
16667 digest[2] -= SHA1M_C;
16668 digest[3] -= SHA1M_D;
16669 digest[4] -= SHA1M_E;
16670
16671 char *salt_buf_ptr = (char *) salt->salt_buf;
16672
16673 memcpy (salt_buf_ptr, salt_pos, salt_len);
16674
16675 salt->salt_len = salt_len;
16676
16677 return (PARSER_OK);
16678 }
16679
16680 int djangopbkdf2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16681 {
16682 if ((input_len < DISPLAY_LEN_MIN_10000) || (input_len > DISPLAY_LEN_MAX_10000)) return (PARSER_GLOBAL_LENGTH);
16683
16684 if (memcmp (SIGNATURE_DJANGOPBKDF2, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
16685
16686 u32 *digest = (u32 *) hash_buf->digest;
16687
16688 salt_t *salt = hash_buf->salt;
16689
16690 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
16691
16692 /**
16693 * parse line
16694 */
16695
16696 char *iter_pos = input_buf + 14;
16697
16698 const int iter = atoi (iter_pos);
16699
16700 if (iter < 1) return (PARSER_SALT_ITERATION);
16701
16702 salt->salt_iter = iter - 1;
16703
16704 char *salt_pos = strchr (iter_pos, '$');
16705
16706 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16707
16708 salt_pos++;
16709
16710 char *hash_pos = strchr (salt_pos, '$');
16711
16712 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16713
16714 const uint salt_len = hash_pos - salt_pos;
16715
16716 hash_pos++;
16717
16718 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
16719
16720 memcpy (salt_buf_ptr, salt_pos, salt_len);
16721
16722 salt->salt_len = salt_len;
16723
16724 salt_buf_ptr[salt_len + 3] = 0x01;
16725 salt_buf_ptr[salt_len + 4] = 0x80;
16726
16727 // add some stuff to normal salt to make sorted happy
16728
16729 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
16730 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
16731 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
16732 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
16733 salt->salt_buf[4] = salt->salt_iter;
16734
16735 // base64 decode hash
16736
16737 u8 tmp_buf[100] = { 0 };
16738
16739 uint hash_len = input_len - (hash_pos - input_buf);
16740
16741 if (hash_len != 44) return (PARSER_HASH_LENGTH);
16742
16743 base64_decode (base64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
16744
16745 memcpy (digest, tmp_buf, 32);
16746
16747 digest[0] = byte_swap_32 (digest[0]);
16748 digest[1] = byte_swap_32 (digest[1]);
16749 digest[2] = byte_swap_32 (digest[2]);
16750 digest[3] = byte_swap_32 (digest[3]);
16751 digest[4] = byte_swap_32 (digest[4]);
16752 digest[5] = byte_swap_32 (digest[5]);
16753 digest[6] = byte_swap_32 (digest[6]);
16754 digest[7] = byte_swap_32 (digest[7]);
16755
16756 return (PARSER_OK);
16757 }
16758
16759 int siphash_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16760 {
16761 if ((input_len < DISPLAY_LEN_MIN_10100) || (input_len > DISPLAY_LEN_MAX_10100)) return (PARSER_GLOBAL_LENGTH);
16762
16763 u32 *digest = (u32 *) hash_buf->digest;
16764
16765 salt_t *salt = hash_buf->salt;
16766
16767 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
16768 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
16769 digest[2] = 0;
16770 digest[3] = 0;
16771
16772 digest[0] = byte_swap_32 (digest[0]);
16773 digest[1] = byte_swap_32 (digest[1]);
16774
16775 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16776 if (input_buf[18] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16777 if (input_buf[20] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16778
16779 char iter_c = input_buf[17];
16780 char iter_d = input_buf[19];
16781
16782 // atm only defaults, let's see if there's more request
16783 if (iter_c != '2') return (PARSER_SALT_ITERATION);
16784 if (iter_d != '4') return (PARSER_SALT_ITERATION);
16785
16786 char *salt_buf = input_buf + 16 + 1 + 1 + 1 + 1 + 1;
16787
16788 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
16789 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
16790 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
16791 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf[24]);
16792
16793 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
16794 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
16795 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
16796 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
16797
16798 salt->salt_len = 16;
16799
16800 return (PARSER_OK);
16801 }
16802
16803 int crammd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16804 {
16805 if ((input_len < DISPLAY_LEN_MIN_10200) || (input_len > DISPLAY_LEN_MAX_10200)) return (PARSER_GLOBAL_LENGTH);
16806
16807 if (memcmp (SIGNATURE_CRAM_MD5, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
16808
16809 u32 *digest = (u32 *) hash_buf->digest;
16810
16811 cram_md5_t *cram_md5 = (cram_md5_t *) hash_buf->esalt;
16812
16813 salt_t *salt = hash_buf->salt;
16814
16815 char *salt_pos = input_buf + 10;
16816
16817 char *hash_pos = strchr (salt_pos, '$');
16818
16819 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16820
16821 uint salt_len = hash_pos - salt_pos;
16822
16823 hash_pos++;
16824
16825 uint hash_len = input_len - 10 - salt_len - 1;
16826
16827 // base64 decode salt
16828
16829 if (salt_len > 133) return (PARSER_SALT_LENGTH);
16830
16831 u8 tmp_buf[100] = { 0 };
16832
16833 salt_len = base64_decode (base64_to_int, (const u8 *) salt_pos, salt_len, tmp_buf);
16834
16835 if (salt_len > 55) return (PARSER_SALT_LENGTH);
16836
16837 tmp_buf[salt_len] = 0x80;
16838
16839 memcpy (&salt->salt_buf, tmp_buf, salt_len + 1);
16840
16841 salt->salt_len = salt_len;
16842
16843 // base64 decode hash
16844
16845 if (hash_len > 133) return (PARSER_HASH_LENGTH);
16846
16847 memset (tmp_buf, 0, sizeof (tmp_buf));
16848
16849 hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
16850
16851 if (hash_len < 32 + 1) return (PARSER_SALT_LENGTH);
16852
16853 uint user_len = hash_len - 32;
16854
16855 const u8 *tmp_hash = tmp_buf + user_len;
16856
16857 user_len--; // skip the trailing space
16858
16859 digest[0] = hex_to_u32 (&tmp_hash[ 0]);
16860 digest[1] = hex_to_u32 (&tmp_hash[ 8]);
16861 digest[2] = hex_to_u32 (&tmp_hash[16]);
16862 digest[3] = hex_to_u32 (&tmp_hash[24]);
16863
16864 digest[0] = byte_swap_32 (digest[0]);
16865 digest[1] = byte_swap_32 (digest[1]);
16866 digest[2] = byte_swap_32 (digest[2]);
16867 digest[3] = byte_swap_32 (digest[3]);
16868
16869 // store username for host only (output hash if cracked)
16870
16871 memset (cram_md5->user, 0, sizeof (cram_md5->user));
16872 memcpy (cram_md5->user, tmp_buf, user_len);
16873
16874 return (PARSER_OK);
16875 }
16876
16877 int saph_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16878 {
16879 if ((input_len < DISPLAY_LEN_MIN_10300) || (input_len > DISPLAY_LEN_MAX_10300)) return (PARSER_GLOBAL_LENGTH);
16880
16881 if (memcmp (SIGNATURE_SAPH_SHA1, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
16882
16883 u32 *digest = (u32 *) hash_buf->digest;
16884
16885 salt_t *salt = hash_buf->salt;
16886
16887 char *iter_pos = input_buf + 10;
16888
16889 u32 iter = atoi (iter_pos);
16890
16891 if (iter < 1)
16892 {
16893 return (PARSER_SALT_ITERATION);
16894 }
16895
16896 iter--; // first iteration is special
16897
16898 salt->salt_iter = iter;
16899
16900 char *base64_pos = strchr (iter_pos, '}');
16901
16902 if (base64_pos == NULL)
16903 {
16904 return (PARSER_SIGNATURE_UNMATCHED);
16905 }
16906
16907 base64_pos++;
16908
16909 // base64 decode salt
16910
16911 u32 base64_len = input_len - (base64_pos - input_buf);
16912
16913 u8 tmp_buf[100] = { 0 };
16914
16915 u32 decoded_len = base64_decode (base64_to_int, (const u8 *) base64_pos, base64_len, tmp_buf);
16916
16917 if (decoded_len < 24)
16918 {
16919 return (PARSER_SALT_LENGTH);
16920 }
16921
16922 // copy the salt
16923
16924 uint salt_len = decoded_len - 20;
16925
16926 if (salt_len < 4) return (PARSER_SALT_LENGTH);
16927 if (salt_len > 16) return (PARSER_SALT_LENGTH);
16928
16929 memcpy (&salt->salt_buf, tmp_buf + 20, salt_len);
16930
16931 salt->salt_len = salt_len;
16932
16933 // set digest
16934
16935 u32 *digest_ptr = (u32*) tmp_buf;
16936
16937 digest[0] = byte_swap_32 (digest_ptr[0]);
16938 digest[1] = byte_swap_32 (digest_ptr[1]);
16939 digest[2] = byte_swap_32 (digest_ptr[2]);
16940 digest[3] = byte_swap_32 (digest_ptr[3]);
16941 digest[4] = byte_swap_32 (digest_ptr[4]);
16942
16943 return (PARSER_OK);
16944 }
16945
16946 int redmine_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16947 {
16948 if ((input_len < DISPLAY_LEN_MIN_7600) || (input_len > DISPLAY_LEN_MAX_7600)) return (PARSER_GLOBAL_LENGTH);
16949
16950 u32 *digest = (u32 *) hash_buf->digest;
16951
16952 salt_t *salt = hash_buf->salt;
16953
16954 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
16955 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
16956 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
16957 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
16958 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
16959
16960 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16961
16962 uint salt_len = input_len - 40 - 1;
16963
16964 char *salt_buf = input_buf + 40 + 1;
16965
16966 char *salt_buf_ptr = (char *) salt->salt_buf;
16967
16968 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
16969
16970 if (salt_len != 32) return (PARSER_SALT_LENGTH);
16971
16972 salt->salt_len = salt_len;
16973
16974 return (PARSER_OK);
16975 }
16976
16977 int pdf11_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16978 {
16979 if ((input_len < DISPLAY_LEN_MIN_10400) || (input_len > DISPLAY_LEN_MAX_10400)) return (PARSER_GLOBAL_LENGTH);
16980
16981 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16982
16983 u32 *digest = (u32 *) hash_buf->digest;
16984
16985 salt_t *salt = hash_buf->salt;
16986
16987 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16988
16989 /**
16990 * parse line
16991 */
16992
16993 char *V_pos = input_buf + 5;
16994
16995 char *R_pos = strchr (V_pos, '*');
16996
16997 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16998
16999 u32 V_len = R_pos - V_pos;
17000
17001 R_pos++;
17002
17003 char *bits_pos = strchr (R_pos, '*');
17004
17005 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17006
17007 u32 R_len = bits_pos - R_pos;
17008
17009 bits_pos++;
17010
17011 char *P_pos = strchr (bits_pos, '*');
17012
17013 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17014
17015 u32 bits_len = P_pos - bits_pos;
17016
17017 P_pos++;
17018
17019 char *enc_md_pos = strchr (P_pos, '*');
17020
17021 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17022
17023 u32 P_len = enc_md_pos - P_pos;
17024
17025 enc_md_pos++;
17026
17027 char *id_len_pos = strchr (enc_md_pos, '*');
17028
17029 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17030
17031 u32 enc_md_len = id_len_pos - enc_md_pos;
17032
17033 id_len_pos++;
17034
17035 char *id_buf_pos = strchr (id_len_pos, '*');
17036
17037 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17038
17039 u32 id_len_len = id_buf_pos - id_len_pos;
17040
17041 id_buf_pos++;
17042
17043 char *u_len_pos = strchr (id_buf_pos, '*');
17044
17045 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17046
17047 u32 id_buf_len = u_len_pos - id_buf_pos;
17048
17049 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
17050
17051 u_len_pos++;
17052
17053 char *u_buf_pos = strchr (u_len_pos, '*');
17054
17055 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17056
17057 u32 u_len_len = u_buf_pos - u_len_pos;
17058
17059 u_buf_pos++;
17060
17061 char *o_len_pos = strchr (u_buf_pos, '*');
17062
17063 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17064
17065 u32 u_buf_len = o_len_pos - u_buf_pos;
17066
17067 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
17068
17069 o_len_pos++;
17070
17071 char *o_buf_pos = strchr (o_len_pos, '*');
17072
17073 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17074
17075 u32 o_len_len = o_buf_pos - o_len_pos;
17076
17077 o_buf_pos++;
17078
17079 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;
17080
17081 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
17082
17083 // validate data
17084
17085 const int V = atoi (V_pos);
17086 const int R = atoi (R_pos);
17087 const int P = atoi (P_pos);
17088
17089 if (V != 1) return (PARSER_SALT_VALUE);
17090 if (R != 2) return (PARSER_SALT_VALUE);
17091
17092 const int enc_md = atoi (enc_md_pos);
17093
17094 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
17095
17096 const int id_len = atoi (id_len_pos);
17097 const int u_len = atoi (u_len_pos);
17098 const int o_len = atoi (o_len_pos);
17099
17100 if (id_len != 16) return (PARSER_SALT_VALUE);
17101 if (u_len != 32) return (PARSER_SALT_VALUE);
17102 if (o_len != 32) return (PARSER_SALT_VALUE);
17103
17104 const int bits = atoi (bits_pos);
17105
17106 if (bits != 40) return (PARSER_SALT_VALUE);
17107
17108 // copy data to esalt
17109
17110 pdf->V = V;
17111 pdf->R = R;
17112 pdf->P = P;
17113
17114 pdf->enc_md = enc_md;
17115
17116 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
17117 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
17118 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
17119 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
17120 pdf->id_len = id_len;
17121
17122 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
17123 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
17124 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
17125 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
17126 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
17127 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
17128 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
17129 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
17130 pdf->u_len = u_len;
17131
17132 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
17133 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
17134 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
17135 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
17136 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
17137 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
17138 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
17139 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
17140 pdf->o_len = o_len;
17141
17142 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
17143 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
17144 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
17145 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
17146
17147 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
17148 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
17149 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
17150 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
17151 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
17152 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
17153 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
17154 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
17155
17156 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
17157 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
17158 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
17159 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
17160 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
17161 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
17162 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
17163 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
17164
17165 // we use ID for salt, maybe needs to change, we will see...
17166
17167 salt->salt_buf[0] = pdf->id_buf[0];
17168 salt->salt_buf[1] = pdf->id_buf[1];
17169 salt->salt_buf[2] = pdf->id_buf[2];
17170 salt->salt_buf[3] = pdf->id_buf[3];
17171 salt->salt_len = pdf->id_len;
17172
17173 digest[0] = pdf->u_buf[0];
17174 digest[1] = pdf->u_buf[1];
17175 digest[2] = pdf->u_buf[2];
17176 digest[3] = pdf->u_buf[3];
17177
17178 return (PARSER_OK);
17179 }
17180
17181 int pdf11cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17182 {
17183 return pdf11_parse_hash (input_buf, input_len, hash_buf);
17184 }
17185
17186 int pdf11cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17187 {
17188 if ((input_len < DISPLAY_LEN_MIN_10420) || (input_len > DISPLAY_LEN_MAX_10420)) return (PARSER_GLOBAL_LENGTH);
17189
17190 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
17191
17192 u32 *digest = (u32 *) hash_buf->digest;
17193
17194 salt_t *salt = hash_buf->salt;
17195
17196 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
17197
17198 /**
17199 * parse line
17200 */
17201
17202 char *V_pos = input_buf + 5;
17203
17204 char *R_pos = strchr (V_pos, '*');
17205
17206 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17207
17208 u32 V_len = R_pos - V_pos;
17209
17210 R_pos++;
17211
17212 char *bits_pos = strchr (R_pos, '*');
17213
17214 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17215
17216 u32 R_len = bits_pos - R_pos;
17217
17218 bits_pos++;
17219
17220 char *P_pos = strchr (bits_pos, '*');
17221
17222 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17223
17224 u32 bits_len = P_pos - bits_pos;
17225
17226 P_pos++;
17227
17228 char *enc_md_pos = strchr (P_pos, '*');
17229
17230 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17231
17232 u32 P_len = enc_md_pos - P_pos;
17233
17234 enc_md_pos++;
17235
17236 char *id_len_pos = strchr (enc_md_pos, '*');
17237
17238 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17239
17240 u32 enc_md_len = id_len_pos - enc_md_pos;
17241
17242 id_len_pos++;
17243
17244 char *id_buf_pos = strchr (id_len_pos, '*');
17245
17246 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17247
17248 u32 id_len_len = id_buf_pos - id_len_pos;
17249
17250 id_buf_pos++;
17251
17252 char *u_len_pos = strchr (id_buf_pos, '*');
17253
17254 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17255
17256 u32 id_buf_len = u_len_pos - id_buf_pos;
17257
17258 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
17259
17260 u_len_pos++;
17261
17262 char *u_buf_pos = strchr (u_len_pos, '*');
17263
17264 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17265
17266 u32 u_len_len = u_buf_pos - u_len_pos;
17267
17268 u_buf_pos++;
17269
17270 char *o_len_pos = strchr (u_buf_pos, '*');
17271
17272 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17273
17274 u32 u_buf_len = o_len_pos - u_buf_pos;
17275
17276 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
17277
17278 o_len_pos++;
17279
17280 char *o_buf_pos = strchr (o_len_pos, '*');
17281
17282 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17283
17284 u32 o_len_len = o_buf_pos - o_len_pos;
17285
17286 o_buf_pos++;
17287
17288 char *rc4key_pos = strchr (o_buf_pos, ':');
17289
17290 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17291
17292 u32 o_buf_len = rc4key_pos - o_buf_pos;
17293
17294 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
17295
17296 rc4key_pos++;
17297
17298 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;
17299
17300 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
17301
17302 // validate data
17303
17304 const int V = atoi (V_pos);
17305 const int R = atoi (R_pos);
17306 const int P = atoi (P_pos);
17307
17308 if (V != 1) return (PARSER_SALT_VALUE);
17309 if (R != 2) return (PARSER_SALT_VALUE);
17310
17311 const int enc_md = atoi (enc_md_pos);
17312
17313 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
17314
17315 const int id_len = atoi (id_len_pos);
17316 const int u_len = atoi (u_len_pos);
17317 const int o_len = atoi (o_len_pos);
17318
17319 if (id_len != 16) return (PARSER_SALT_VALUE);
17320 if (u_len != 32) return (PARSER_SALT_VALUE);
17321 if (o_len != 32) return (PARSER_SALT_VALUE);
17322
17323 const int bits = atoi (bits_pos);
17324
17325 if (bits != 40) return (PARSER_SALT_VALUE);
17326
17327 // copy data to esalt
17328
17329 pdf->V = V;
17330 pdf->R = R;
17331 pdf->P = P;
17332
17333 pdf->enc_md = enc_md;
17334
17335 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
17336 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
17337 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
17338 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
17339 pdf->id_len = id_len;
17340
17341 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
17342 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
17343 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
17344 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
17345 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
17346 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
17347 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
17348 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
17349 pdf->u_len = u_len;
17350
17351 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
17352 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
17353 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
17354 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
17355 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
17356 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
17357 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
17358 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
17359 pdf->o_len = o_len;
17360
17361 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
17362 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
17363 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
17364 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
17365
17366 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
17367 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
17368 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
17369 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
17370 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
17371 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
17372 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
17373 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
17374
17375 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
17376 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
17377 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
17378 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
17379 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
17380 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
17381 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
17382 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
17383
17384 pdf->rc4key[1] = 0;
17385 pdf->rc4key[0] = 0;
17386
17387 pdf->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
17388 pdf->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
17389 pdf->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
17390 pdf->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
17391 pdf->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
17392 pdf->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
17393 pdf->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
17394 pdf->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
17395 pdf->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
17396 pdf->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
17397
17398 pdf->rc4key[0] = byte_swap_32 (pdf->rc4key[0]);
17399 pdf->rc4key[1] = byte_swap_32 (pdf->rc4key[1]);
17400
17401 // we use ID for salt, maybe needs to change, we will see...
17402
17403 salt->salt_buf[0] = pdf->id_buf[0];
17404 salt->salt_buf[1] = pdf->id_buf[1];
17405 salt->salt_buf[2] = pdf->id_buf[2];
17406 salt->salt_buf[3] = pdf->id_buf[3];
17407 salt->salt_buf[4] = pdf->u_buf[0];
17408 salt->salt_buf[5] = pdf->u_buf[1];
17409 salt->salt_buf[6] = pdf->o_buf[0];
17410 salt->salt_buf[7] = pdf->o_buf[1];
17411 salt->salt_len = pdf->id_len + 16;
17412
17413 digest[0] = pdf->rc4key[0];
17414 digest[1] = pdf->rc4key[1];
17415 digest[2] = 0;
17416 digest[3] = 0;
17417
17418 return (PARSER_OK);
17419 }
17420
17421 int pdf14_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17422 {
17423 if ((input_len < DISPLAY_LEN_MIN_10500) || (input_len > DISPLAY_LEN_MAX_10500)) return (PARSER_GLOBAL_LENGTH);
17424
17425 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
17426
17427 u32 *digest = (u32 *) hash_buf->digest;
17428
17429 salt_t *salt = hash_buf->salt;
17430
17431 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
17432
17433 /**
17434 * parse line
17435 */
17436
17437 char *V_pos = input_buf + 5;
17438
17439 char *R_pos = strchr (V_pos, '*');
17440
17441 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17442
17443 u32 V_len = R_pos - V_pos;
17444
17445 R_pos++;
17446
17447 char *bits_pos = strchr (R_pos, '*');
17448
17449 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17450
17451 u32 R_len = bits_pos - R_pos;
17452
17453 bits_pos++;
17454
17455 char *P_pos = strchr (bits_pos, '*');
17456
17457 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17458
17459 u32 bits_len = P_pos - bits_pos;
17460
17461 P_pos++;
17462
17463 char *enc_md_pos = strchr (P_pos, '*');
17464
17465 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17466
17467 u32 P_len = enc_md_pos - P_pos;
17468
17469 enc_md_pos++;
17470
17471 char *id_len_pos = strchr (enc_md_pos, '*');
17472
17473 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17474
17475 u32 enc_md_len = id_len_pos - enc_md_pos;
17476
17477 id_len_pos++;
17478
17479 char *id_buf_pos = strchr (id_len_pos, '*');
17480
17481 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17482
17483 u32 id_len_len = id_buf_pos - id_len_pos;
17484
17485 id_buf_pos++;
17486
17487 char *u_len_pos = strchr (id_buf_pos, '*');
17488
17489 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17490
17491 u32 id_buf_len = u_len_pos - id_buf_pos;
17492
17493 if ((id_buf_len != 32) && (id_buf_len != 64)) return (PARSER_SALT_LENGTH);
17494
17495 u_len_pos++;
17496
17497 char *u_buf_pos = strchr (u_len_pos, '*');
17498
17499 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17500
17501 u32 u_len_len = u_buf_pos - u_len_pos;
17502
17503 u_buf_pos++;
17504
17505 char *o_len_pos = strchr (u_buf_pos, '*');
17506
17507 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17508
17509 u32 u_buf_len = o_len_pos - u_buf_pos;
17510
17511 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
17512
17513 o_len_pos++;
17514
17515 char *o_buf_pos = strchr (o_len_pos, '*');
17516
17517 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17518
17519 u32 o_len_len = o_buf_pos - o_len_pos;
17520
17521 o_buf_pos++;
17522
17523 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;
17524
17525 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
17526
17527 // validate data
17528
17529 const int V = atoi (V_pos);
17530 const int R = atoi (R_pos);
17531 const int P = atoi (P_pos);
17532
17533 int vr_ok = 0;
17534
17535 if ((V == 2) && (R == 3)) vr_ok = 1;
17536 if ((V == 4) && (R == 4)) vr_ok = 1;
17537
17538 if (vr_ok == 0) return (PARSER_SALT_VALUE);
17539
17540 const int id_len = atoi (id_len_pos);
17541 const int u_len = atoi (u_len_pos);
17542 const int o_len = atoi (o_len_pos);
17543
17544 if ((id_len != 16) && (id_len != 32)) return (PARSER_SALT_VALUE);
17545
17546 if (u_len != 32) return (PARSER_SALT_VALUE);
17547 if (o_len != 32) return (PARSER_SALT_VALUE);
17548
17549 const int bits = atoi (bits_pos);
17550
17551 if (bits != 128) return (PARSER_SALT_VALUE);
17552
17553 int enc_md = 1;
17554
17555 if (R >= 4)
17556 {
17557 enc_md = atoi (enc_md_pos);
17558 }
17559
17560 // copy data to esalt
17561
17562 pdf->V = V;
17563 pdf->R = R;
17564 pdf->P = P;
17565
17566 pdf->enc_md = enc_md;
17567
17568 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
17569 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
17570 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
17571 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
17572
17573 if (id_len == 32)
17574 {
17575 pdf->id_buf[4] = hex_to_u32 ((const u8 *) &id_buf_pos[32]);
17576 pdf->id_buf[5] = hex_to_u32 ((const u8 *) &id_buf_pos[40]);
17577 pdf->id_buf[6] = hex_to_u32 ((const u8 *) &id_buf_pos[48]);
17578 pdf->id_buf[7] = hex_to_u32 ((const u8 *) &id_buf_pos[56]);
17579 }
17580
17581 pdf->id_len = id_len;
17582
17583 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
17584 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
17585 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
17586 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
17587 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
17588 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
17589 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
17590 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
17591 pdf->u_len = u_len;
17592
17593 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
17594 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
17595 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
17596 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
17597 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
17598 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
17599 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
17600 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
17601 pdf->o_len = o_len;
17602
17603 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
17604 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
17605 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
17606 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
17607
17608 if (id_len == 32)
17609 {
17610 pdf->id_buf[4] = byte_swap_32 (pdf->id_buf[4]);
17611 pdf->id_buf[5] = byte_swap_32 (pdf->id_buf[5]);
17612 pdf->id_buf[6] = byte_swap_32 (pdf->id_buf[6]);
17613 pdf->id_buf[7] = byte_swap_32 (pdf->id_buf[7]);
17614 }
17615
17616 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
17617 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
17618 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
17619 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
17620 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
17621 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
17622 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
17623 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
17624
17625 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
17626 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
17627 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
17628 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
17629 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
17630 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
17631 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
17632 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
17633
17634 // precompute rc4 data for later use
17635
17636 uint padding[8] =
17637 {
17638 0x5e4ebf28,
17639 0x418a754e,
17640 0x564e0064,
17641 0x0801faff,
17642 0xb6002e2e,
17643 0x803e68d0,
17644 0xfea90c2f,
17645 0x7a695364
17646 };
17647
17648 // md5
17649
17650 uint salt_pc_block[32] = { 0 };
17651
17652 char *salt_pc_ptr = (char *) salt_pc_block;
17653
17654 memcpy (salt_pc_ptr, padding, 32);
17655 memcpy (salt_pc_ptr + 32, pdf->id_buf, pdf->id_len);
17656
17657 uint salt_pc_digest[4] = { 0 };
17658
17659 md5_complete_no_limit (salt_pc_digest, salt_pc_block, 32 + pdf->id_len);
17660
17661 pdf->rc4data[0] = salt_pc_digest[0];
17662 pdf->rc4data[1] = salt_pc_digest[1];
17663
17664 // we use ID for salt, maybe needs to change, we will see...
17665
17666 salt->salt_buf[0] = pdf->id_buf[0];
17667 salt->salt_buf[1] = pdf->id_buf[1];
17668 salt->salt_buf[2] = pdf->id_buf[2];
17669 salt->salt_buf[3] = pdf->id_buf[3];
17670 salt->salt_buf[4] = pdf->u_buf[0];
17671 salt->salt_buf[5] = pdf->u_buf[1];
17672 salt->salt_buf[6] = pdf->o_buf[0];
17673 salt->salt_buf[7] = pdf->o_buf[1];
17674 salt->salt_len = pdf->id_len + 16;
17675
17676 salt->salt_iter = ROUNDS_PDF14;
17677
17678 digest[0] = pdf->u_buf[0];
17679 digest[1] = pdf->u_buf[1];
17680 digest[2] = 0;
17681 digest[3] = 0;
17682
17683 return (PARSER_OK);
17684 }
17685
17686 int pdf17l3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17687 {
17688 int ret = pdf17l8_parse_hash (input_buf, input_len, hash_buf);
17689
17690 if (ret != PARSER_OK)
17691 {
17692 return ret;
17693 }
17694
17695 u32 *digest = (u32 *) hash_buf->digest;
17696
17697 salt_t *salt = hash_buf->salt;
17698
17699 digest[0] -= SHA256M_A;
17700 digest[1] -= SHA256M_B;
17701 digest[2] -= SHA256M_C;
17702 digest[3] -= SHA256M_D;
17703 digest[4] -= SHA256M_E;
17704 digest[5] -= SHA256M_F;
17705 digest[6] -= SHA256M_G;
17706 digest[7] -= SHA256M_H;
17707
17708 salt->salt_buf[2] = 0x80;
17709
17710 return (PARSER_OK);
17711 }
17712
17713 int pdf17l8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17714 {
17715 if ((input_len < DISPLAY_LEN_MIN_10600) || (input_len > DISPLAY_LEN_MAX_10600)) return (PARSER_GLOBAL_LENGTH);
17716
17717 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
17718
17719 u32 *digest = (u32 *) hash_buf->digest;
17720
17721 salt_t *salt = hash_buf->salt;
17722
17723 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
17724
17725 /**
17726 * parse line
17727 */
17728
17729 char *V_pos = input_buf + 5;
17730
17731 char *R_pos = strchr (V_pos, '*');
17732
17733 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17734
17735 u32 V_len = R_pos - V_pos;
17736
17737 R_pos++;
17738
17739 char *bits_pos = strchr (R_pos, '*');
17740
17741 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17742
17743 u32 R_len = bits_pos - R_pos;
17744
17745 bits_pos++;
17746
17747 char *P_pos = strchr (bits_pos, '*');
17748
17749 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17750
17751 u32 bits_len = P_pos - bits_pos;
17752
17753 P_pos++;
17754
17755 char *enc_md_pos = strchr (P_pos, '*');
17756
17757 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17758
17759 u32 P_len = enc_md_pos - P_pos;
17760
17761 enc_md_pos++;
17762
17763 char *id_len_pos = strchr (enc_md_pos, '*');
17764
17765 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17766
17767 u32 enc_md_len = id_len_pos - enc_md_pos;
17768
17769 id_len_pos++;
17770
17771 char *id_buf_pos = strchr (id_len_pos, '*');
17772
17773 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17774
17775 u32 id_len_len = id_buf_pos - id_len_pos;
17776
17777 id_buf_pos++;
17778
17779 char *u_len_pos = strchr (id_buf_pos, '*');
17780
17781 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17782
17783 u32 id_buf_len = u_len_pos - id_buf_pos;
17784
17785 u_len_pos++;
17786
17787 char *u_buf_pos = strchr (u_len_pos, '*');
17788
17789 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17790
17791 u32 u_len_len = u_buf_pos - u_len_pos;
17792
17793 u_buf_pos++;
17794
17795 char *o_len_pos = strchr (u_buf_pos, '*');
17796
17797 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17798
17799 u32 u_buf_len = o_len_pos - u_buf_pos;
17800
17801 o_len_pos++;
17802
17803 char *o_buf_pos = strchr (o_len_pos, '*');
17804
17805 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17806
17807 u32 o_len_len = o_buf_pos - o_len_pos;
17808
17809 o_buf_pos++;
17810
17811 char *last = strchr (o_buf_pos, '*');
17812
17813 if (last == NULL) last = input_buf + input_len;
17814
17815 u32 o_buf_len = last - o_buf_pos;
17816
17817 // validate data
17818
17819 const int V = atoi (V_pos);
17820 const int R = atoi (R_pos);
17821
17822 int vr_ok = 0;
17823
17824 if ((V == 5) && (R == 5)) vr_ok = 1;
17825 if ((V == 5) && (R == 6)) vr_ok = 1;
17826
17827 if (vr_ok == 0) return (PARSER_SALT_VALUE);
17828
17829 const int bits = atoi (bits_pos);
17830
17831 if (bits != 256) return (PARSER_SALT_VALUE);
17832
17833 int enc_md = atoi (enc_md_pos);
17834
17835 if (enc_md != 1) return (PARSER_SALT_VALUE);
17836
17837 const uint id_len = atoi (id_len_pos);
17838 const uint u_len = atoi (u_len_pos);
17839 const uint o_len = atoi (o_len_pos);
17840
17841 if (V_len > 6) return (PARSER_SALT_LENGTH);
17842 if (R_len > 6) return (PARSER_SALT_LENGTH);
17843 if (P_len > 6) return (PARSER_SALT_LENGTH);
17844 if (id_len_len > 6) return (PARSER_SALT_LENGTH);
17845 if (u_len_len > 6) return (PARSER_SALT_LENGTH);
17846 if (o_len_len > 6) return (PARSER_SALT_LENGTH);
17847 if (bits_len > 6) return (PARSER_SALT_LENGTH);
17848 if (enc_md_len > 6) return (PARSER_SALT_LENGTH);
17849
17850 if ((id_len * 2) != id_buf_len) return (PARSER_SALT_VALUE);
17851 if ((u_len * 2) != u_buf_len) return (PARSER_SALT_VALUE);
17852 if ((o_len * 2) != o_buf_len) return (PARSER_SALT_VALUE);
17853
17854 // copy data to esalt
17855
17856 if (u_len < 40) return (PARSER_SALT_VALUE);
17857
17858 for (int i = 0, j = 0; i < 8 + 2; i += 1, j += 8)
17859 {
17860 pdf->u_buf[i] = hex_to_u32 ((const u8 *) &u_buf_pos[j]);
17861 }
17862
17863 salt->salt_buf[0] = pdf->u_buf[8];
17864 salt->salt_buf[1] = pdf->u_buf[9];
17865
17866 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
17867 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
17868
17869 salt->salt_len = 8;
17870 salt->salt_iter = ROUNDS_PDF17L8;
17871
17872 digest[0] = pdf->u_buf[0];
17873 digest[1] = pdf->u_buf[1];
17874 digest[2] = pdf->u_buf[2];
17875 digest[3] = pdf->u_buf[3];
17876 digest[4] = pdf->u_buf[4];
17877 digest[5] = pdf->u_buf[5];
17878 digest[6] = pdf->u_buf[6];
17879 digest[7] = pdf->u_buf[7];
17880
17881 return (PARSER_OK);
17882 }
17883
17884 int pbkdf2_sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17885 {
17886 if ((input_len < DISPLAY_LEN_MIN_10900) || (input_len > DISPLAY_LEN_MAX_10900)) return (PARSER_GLOBAL_LENGTH);
17887
17888 if (memcmp (SIGNATURE_PBKDF2_SHA256, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
17889
17890 u32 *digest = (u32 *) hash_buf->digest;
17891
17892 salt_t *salt = hash_buf->salt;
17893
17894 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
17895
17896 /**
17897 * parse line
17898 */
17899
17900 // iterations
17901
17902 char *iter_pos = input_buf + 7;
17903
17904 u32 iter = atoi (iter_pos);
17905
17906 if (iter < 1) return (PARSER_SALT_ITERATION);
17907 if (iter > 999999) return (PARSER_SALT_ITERATION);
17908
17909 // first is *raw* salt
17910
17911 char *salt_pos = strchr (iter_pos, ':');
17912
17913 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17914
17915 salt_pos++;
17916
17917 char *hash_pos = strchr (salt_pos, ':');
17918
17919 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17920
17921 u32 salt_len = hash_pos - salt_pos;
17922
17923 if (salt_len > 64) return (PARSER_SALT_LENGTH);
17924
17925 hash_pos++;
17926
17927 u32 hash_b64_len = input_len - (hash_pos - input_buf);
17928
17929 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
17930
17931 // decode salt
17932
17933 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
17934
17935 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
17936
17937 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17938
17939 salt_buf_ptr[salt_len + 3] = 0x01;
17940 salt_buf_ptr[salt_len + 4] = 0x80;
17941
17942 salt->salt_len = salt_len;
17943 salt->salt_iter = iter - 1;
17944
17945 // decode hash
17946
17947 u8 tmp_buf[100] = { 0 };
17948
17949 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
17950
17951 if (hash_len < 16) return (PARSER_HASH_LENGTH);
17952
17953 memcpy (digest, tmp_buf, 16);
17954
17955 digest[0] = byte_swap_32 (digest[0]);
17956 digest[1] = byte_swap_32 (digest[1]);
17957 digest[2] = byte_swap_32 (digest[2]);
17958 digest[3] = byte_swap_32 (digest[3]);
17959
17960 // add some stuff to normal salt to make sorted happy
17961
17962 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
17963 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
17964 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
17965 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
17966 salt->salt_buf[4] = salt->salt_iter;
17967
17968 return (PARSER_OK);
17969 }
17970
17971 int prestashop_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17972 {
17973 if ((input_len < DISPLAY_LEN_MIN_11000) || (input_len > DISPLAY_LEN_MAX_11000)) return (PARSER_GLOBAL_LENGTH);
17974
17975 u32 *digest = (u32 *) hash_buf->digest;
17976
17977 salt_t *salt = hash_buf->salt;
17978
17979 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
17980 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
17981 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
17982 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
17983
17984 digest[0] = byte_swap_32 (digest[0]);
17985 digest[1] = byte_swap_32 (digest[1]);
17986 digest[2] = byte_swap_32 (digest[2]);
17987 digest[3] = byte_swap_32 (digest[3]);
17988
17989 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
17990
17991 uint salt_len = input_len - 32 - 1;
17992
17993 char *salt_buf = input_buf + 32 + 1;
17994
17995 char *salt_buf_ptr = (char *) salt->salt_buf;
17996
17997 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
17998
17999 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18000
18001 salt->salt_len = salt_len;
18002
18003 return (PARSER_OK);
18004 }
18005
18006 int postgresql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18007 {
18008 if ((input_len < DISPLAY_LEN_MIN_11100) || (input_len > DISPLAY_LEN_MAX_11100)) return (PARSER_GLOBAL_LENGTH);
18009
18010 if (memcmp (SIGNATURE_POSTGRESQL_AUTH, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
18011
18012 u32 *digest = (u32 *) hash_buf->digest;
18013
18014 salt_t *salt = hash_buf->salt;
18015
18016 char *user_pos = input_buf + 10;
18017
18018 char *salt_pos = strchr (user_pos, '*');
18019
18020 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18021
18022 salt_pos++;
18023
18024 char *hash_pos = strchr (salt_pos, '*');
18025
18026 hash_pos++;
18027
18028 uint hash_len = input_len - (hash_pos - input_buf);
18029
18030 if (hash_len != 32) return (PARSER_HASH_LENGTH);
18031
18032 uint user_len = salt_pos - user_pos - 1;
18033
18034 uint salt_len = hash_pos - salt_pos - 1;
18035
18036 if (salt_len != 8) return (PARSER_SALT_LENGTH);
18037
18038 /*
18039 * store digest
18040 */
18041
18042 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
18043 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
18044 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
18045 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
18046
18047 digest[0] = byte_swap_32 (digest[0]);
18048 digest[1] = byte_swap_32 (digest[1]);
18049 digest[2] = byte_swap_32 (digest[2]);
18050 digest[3] = byte_swap_32 (digest[3]);
18051
18052 digest[0] -= MD5M_A;
18053 digest[1] -= MD5M_B;
18054 digest[2] -= MD5M_C;
18055 digest[3] -= MD5M_D;
18056
18057 /*
18058 * store salt
18059 */
18060
18061 char *salt_buf_ptr = (char *) salt->salt_buf;
18062
18063 // first 4 bytes are the "challenge"
18064
18065 salt_buf_ptr[0] = hex_to_u8 ((const u8 *) &salt_pos[0]);
18066 salt_buf_ptr[1] = hex_to_u8 ((const u8 *) &salt_pos[2]);
18067 salt_buf_ptr[2] = hex_to_u8 ((const u8 *) &salt_pos[4]);
18068 salt_buf_ptr[3] = hex_to_u8 ((const u8 *) &salt_pos[6]);
18069
18070 // append the user name
18071
18072 user_len = parse_and_store_salt (salt_buf_ptr + 4, user_pos, user_len);
18073
18074 salt->salt_len = 4 + user_len;
18075
18076 return (PARSER_OK);
18077 }
18078
18079 int mysql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18080 {
18081 if ((input_len < DISPLAY_LEN_MIN_11200) || (input_len > DISPLAY_LEN_MAX_11200)) return (PARSER_GLOBAL_LENGTH);
18082
18083 if (memcmp (SIGNATURE_MYSQL_AUTH, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
18084
18085 u32 *digest = (u32 *) hash_buf->digest;
18086
18087 salt_t *salt = hash_buf->salt;
18088
18089 char *salt_pos = input_buf + 9;
18090
18091 char *hash_pos = strchr (salt_pos, '*');
18092
18093 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18094
18095 hash_pos++;
18096
18097 uint hash_len = input_len - (hash_pos - input_buf);
18098
18099 if (hash_len != 40) return (PARSER_HASH_LENGTH);
18100
18101 uint salt_len = hash_pos - salt_pos - 1;
18102
18103 if (salt_len != 40) return (PARSER_SALT_LENGTH);
18104
18105 /*
18106 * store digest
18107 */
18108
18109 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
18110 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
18111 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
18112 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
18113 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
18114
18115 /*
18116 * store salt
18117 */
18118
18119 char *salt_buf_ptr = (char *) salt->salt_buf;
18120
18121 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18122
18123 salt->salt_len = salt_len;
18124
18125 return (PARSER_OK);
18126 }
18127
18128 int bitcoin_wallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18129 {
18130 if ((input_len < DISPLAY_LEN_MIN_11300) || (input_len > DISPLAY_LEN_MAX_11300)) return (PARSER_GLOBAL_LENGTH);
18131
18132 if (memcmp (SIGNATURE_BITCOIN_WALLET, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
18133
18134 u32 *digest = (u32 *) hash_buf->digest;
18135
18136 salt_t *salt = hash_buf->salt;
18137
18138 bitcoin_wallet_t *bitcoin_wallet = (bitcoin_wallet_t *) hash_buf->esalt;
18139
18140 /**
18141 * parse line
18142 */
18143
18144 char *cry_master_len_pos = input_buf + 9;
18145
18146 char *cry_master_buf_pos = strchr (cry_master_len_pos, '$');
18147
18148 if (cry_master_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18149
18150 u32 cry_master_len_len = cry_master_buf_pos - cry_master_len_pos;
18151
18152 cry_master_buf_pos++;
18153
18154 char *cry_salt_len_pos = strchr (cry_master_buf_pos, '$');
18155
18156 if (cry_salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18157
18158 u32 cry_master_buf_len = cry_salt_len_pos - cry_master_buf_pos;
18159
18160 cry_salt_len_pos++;
18161
18162 char *cry_salt_buf_pos = strchr (cry_salt_len_pos, '$');
18163
18164 if (cry_salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18165
18166 u32 cry_salt_len_len = cry_salt_buf_pos - cry_salt_len_pos;
18167
18168 cry_salt_buf_pos++;
18169
18170 char *cry_rounds_pos = strchr (cry_salt_buf_pos, '$');
18171
18172 if (cry_rounds_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18173
18174 u32 cry_salt_buf_len = cry_rounds_pos - cry_salt_buf_pos;
18175
18176 cry_rounds_pos++;
18177
18178 char *ckey_len_pos = strchr (cry_rounds_pos, '$');
18179
18180 if (ckey_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18181
18182 u32 cry_rounds_len = ckey_len_pos - cry_rounds_pos;
18183
18184 ckey_len_pos++;
18185
18186 char *ckey_buf_pos = strchr (ckey_len_pos, '$');
18187
18188 if (ckey_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18189
18190 u32 ckey_len_len = ckey_buf_pos - ckey_len_pos;
18191
18192 ckey_buf_pos++;
18193
18194 char *public_key_len_pos = strchr (ckey_buf_pos, '$');
18195
18196 if (public_key_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18197
18198 u32 ckey_buf_len = public_key_len_pos - ckey_buf_pos;
18199
18200 public_key_len_pos++;
18201
18202 char *public_key_buf_pos = strchr (public_key_len_pos, '$');
18203
18204 if (public_key_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18205
18206 u32 public_key_len_len = public_key_buf_pos - public_key_len_pos;
18207
18208 public_key_buf_pos++;
18209
18210 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;
18211
18212 const uint cry_master_len = atoi (cry_master_len_pos);
18213 const uint cry_salt_len = atoi (cry_salt_len_pos);
18214 const uint ckey_len = atoi (ckey_len_pos);
18215 const uint public_key_len = atoi (public_key_len_pos);
18216
18217 if (cry_master_buf_len != cry_master_len) return (PARSER_SALT_VALUE);
18218 if (cry_salt_buf_len != cry_salt_len) return (PARSER_SALT_VALUE);
18219 if (ckey_buf_len != ckey_len) return (PARSER_SALT_VALUE);
18220 if (public_key_buf_len != public_key_len) return (PARSER_SALT_VALUE);
18221
18222 for (uint i = 0, j = 0; j < cry_master_len; i += 1, j += 8)
18223 {
18224 bitcoin_wallet->cry_master_buf[i] = hex_to_u32 ((const u8 *) &cry_master_buf_pos[j]);
18225
18226 bitcoin_wallet->cry_master_buf[i] = byte_swap_32 (bitcoin_wallet->cry_master_buf[i]);
18227 }
18228
18229 for (uint i = 0, j = 0; j < ckey_len; i += 1, j += 8)
18230 {
18231 bitcoin_wallet->ckey_buf[i] = hex_to_u32 ((const u8 *) &ckey_buf_pos[j]);
18232
18233 bitcoin_wallet->ckey_buf[i] = byte_swap_32 (bitcoin_wallet->ckey_buf[i]);
18234 }
18235
18236 for (uint i = 0, j = 0; j < public_key_len; i += 1, j += 8)
18237 {
18238 bitcoin_wallet->public_key_buf[i] = hex_to_u32 ((const u8 *) &public_key_buf_pos[j]);
18239
18240 bitcoin_wallet->public_key_buf[i] = byte_swap_32 (bitcoin_wallet->public_key_buf[i]);
18241 }
18242
18243 bitcoin_wallet->cry_master_len = cry_master_len / 2;
18244 bitcoin_wallet->ckey_len = ckey_len / 2;
18245 bitcoin_wallet->public_key_len = public_key_len / 2;
18246
18247 /*
18248 * store digest (should be unique enought, hopefully)
18249 */
18250
18251 digest[0] = bitcoin_wallet->cry_master_buf[0];
18252 digest[1] = bitcoin_wallet->cry_master_buf[1];
18253 digest[2] = bitcoin_wallet->cry_master_buf[2];
18254 digest[3] = bitcoin_wallet->cry_master_buf[3];
18255
18256 /*
18257 * store salt
18258 */
18259
18260 if (cry_rounds_len >= 7) return (PARSER_SALT_VALUE);
18261
18262 const uint cry_rounds = atoi (cry_rounds_pos);
18263
18264 salt->salt_iter = cry_rounds - 1;
18265
18266 char *salt_buf_ptr = (char *) salt->salt_buf;
18267
18268 const uint salt_len = parse_and_store_salt (salt_buf_ptr, cry_salt_buf_pos, cry_salt_buf_len);
18269
18270 salt->salt_len = salt_len;
18271
18272 return (PARSER_OK);
18273 }
18274
18275 int sip_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18276 {
18277 if ((input_len < DISPLAY_LEN_MIN_11400) || (input_len > DISPLAY_LEN_MAX_11400)) return (PARSER_GLOBAL_LENGTH);
18278
18279 if (memcmp (SIGNATURE_SIP_AUTH, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
18280
18281 u32 *digest = (u32 *) hash_buf->digest;
18282
18283 salt_t *salt = hash_buf->salt;
18284
18285 sip_t *sip = (sip_t *) hash_buf->esalt;
18286
18287 // work with a temporary copy of input_buf (s.t. we can manipulate it directly)
18288
18289 char *temp_input_buf = (char *) mymalloc (input_len + 1);
18290
18291 memcpy (temp_input_buf, input_buf, input_len);
18292
18293 // URI_server:
18294
18295 char *URI_server_pos = temp_input_buf + 6;
18296
18297 char *URI_client_pos = strchr (URI_server_pos, '*');
18298
18299 if (URI_client_pos == NULL)
18300 {
18301 myfree (temp_input_buf);
18302
18303 return (PARSER_SEPARATOR_UNMATCHED);
18304 }
18305
18306 URI_client_pos[0] = 0;
18307 URI_client_pos++;
18308
18309 uint URI_server_len = strlen (URI_server_pos);
18310
18311 if (URI_server_len > 512)
18312 {
18313 myfree (temp_input_buf);
18314
18315 return (PARSER_SALT_LENGTH);
18316 }
18317
18318 // URI_client:
18319
18320 char *user_pos = strchr (URI_client_pos, '*');
18321
18322 if (user_pos == NULL)
18323 {
18324 myfree (temp_input_buf);
18325
18326 return (PARSER_SEPARATOR_UNMATCHED);
18327 }
18328
18329 user_pos[0] = 0;
18330 user_pos++;
18331
18332 uint URI_client_len = strlen (URI_client_pos);
18333
18334 if (URI_client_len > 512)
18335 {
18336 myfree (temp_input_buf);
18337
18338 return (PARSER_SALT_LENGTH);
18339 }
18340
18341 // user:
18342
18343 char *realm_pos = strchr (user_pos, '*');
18344
18345 if (realm_pos == NULL)
18346 {
18347 myfree (temp_input_buf);
18348
18349 return (PARSER_SEPARATOR_UNMATCHED);
18350 }
18351
18352 realm_pos[0] = 0;
18353 realm_pos++;
18354
18355 uint user_len = strlen (user_pos);
18356
18357 if (user_len > 116)
18358 {
18359 myfree (temp_input_buf);
18360
18361 return (PARSER_SALT_LENGTH);
18362 }
18363
18364 // realm:
18365
18366 char *method_pos = strchr (realm_pos, '*');
18367
18368 if (method_pos == NULL)
18369 {
18370 myfree (temp_input_buf);
18371
18372 return (PARSER_SEPARATOR_UNMATCHED);
18373 }
18374
18375 method_pos[0] = 0;
18376 method_pos++;
18377
18378 uint realm_len = strlen (realm_pos);
18379
18380 if (realm_len > 116)
18381 {
18382 myfree (temp_input_buf);
18383
18384 return (PARSER_SALT_LENGTH);
18385 }
18386
18387 // method:
18388
18389 char *URI_prefix_pos = strchr (method_pos, '*');
18390
18391 if (URI_prefix_pos == NULL)
18392 {
18393 myfree (temp_input_buf);
18394
18395 return (PARSER_SEPARATOR_UNMATCHED);
18396 }
18397
18398 URI_prefix_pos[0] = 0;
18399 URI_prefix_pos++;
18400
18401 uint method_len = strlen (method_pos);
18402
18403 if (method_len > 246)
18404 {
18405 myfree (temp_input_buf);
18406
18407 return (PARSER_SALT_LENGTH);
18408 }
18409
18410 // URI_prefix:
18411
18412 char *URI_resource_pos = strchr (URI_prefix_pos, '*');
18413
18414 if (URI_resource_pos == NULL)
18415 {
18416 myfree (temp_input_buf);
18417
18418 return (PARSER_SEPARATOR_UNMATCHED);
18419 }
18420
18421 URI_resource_pos[0] = 0;
18422 URI_resource_pos++;
18423
18424 uint URI_prefix_len = strlen (URI_prefix_pos);
18425
18426 if (URI_prefix_len > 245)
18427 {
18428 myfree (temp_input_buf);
18429
18430 return (PARSER_SALT_LENGTH);
18431 }
18432
18433 // URI_resource:
18434
18435 char *URI_suffix_pos = strchr (URI_resource_pos, '*');
18436
18437 if (URI_suffix_pos == NULL)
18438 {
18439 myfree (temp_input_buf);
18440
18441 return (PARSER_SEPARATOR_UNMATCHED);
18442 }
18443
18444 URI_suffix_pos[0] = 0;
18445 URI_suffix_pos++;
18446
18447 uint URI_resource_len = strlen (URI_resource_pos);
18448
18449 if (URI_resource_len < 1 || URI_resource_len > 246)
18450 {
18451 myfree (temp_input_buf);
18452
18453 return (PARSER_SALT_LENGTH);
18454 }
18455
18456 // URI_suffix:
18457
18458 char *nonce_pos = strchr (URI_suffix_pos, '*');
18459
18460 if (nonce_pos == NULL)
18461 {
18462 myfree (temp_input_buf);
18463
18464 return (PARSER_SEPARATOR_UNMATCHED);
18465 }
18466
18467 nonce_pos[0] = 0;
18468 nonce_pos++;
18469
18470 uint URI_suffix_len = strlen (URI_suffix_pos);
18471
18472 if (URI_suffix_len > 245)
18473 {
18474 myfree (temp_input_buf);
18475
18476 return (PARSER_SALT_LENGTH);
18477 }
18478
18479 // nonce:
18480
18481 char *nonce_client_pos = strchr (nonce_pos, '*');
18482
18483 if (nonce_client_pos == NULL)
18484 {
18485 myfree (temp_input_buf);
18486
18487 return (PARSER_SEPARATOR_UNMATCHED);
18488 }
18489
18490 nonce_client_pos[0] = 0;
18491 nonce_client_pos++;
18492
18493 uint nonce_len = strlen (nonce_pos);
18494
18495 if (nonce_len < 1 || nonce_len > 50)
18496 {
18497 myfree (temp_input_buf);
18498
18499 return (PARSER_SALT_LENGTH);
18500 }
18501
18502 // nonce_client:
18503
18504 char *nonce_count_pos = strchr (nonce_client_pos, '*');
18505
18506 if (nonce_count_pos == NULL)
18507 {
18508 myfree (temp_input_buf);
18509
18510 return (PARSER_SEPARATOR_UNMATCHED);
18511 }
18512
18513 nonce_count_pos[0] = 0;
18514 nonce_count_pos++;
18515
18516 uint nonce_client_len = strlen (nonce_client_pos);
18517
18518 if (nonce_client_len > 50)
18519 {
18520 myfree (temp_input_buf);
18521
18522 return (PARSER_SALT_LENGTH);
18523 }
18524
18525 // nonce_count:
18526
18527 char *qop_pos = strchr (nonce_count_pos, '*');
18528
18529 if (qop_pos == NULL)
18530 {
18531 myfree (temp_input_buf);
18532
18533 return (PARSER_SEPARATOR_UNMATCHED);
18534 }
18535
18536 qop_pos[0] = 0;
18537 qop_pos++;
18538
18539 uint nonce_count_len = strlen (nonce_count_pos);
18540
18541 if (nonce_count_len > 50)
18542 {
18543 myfree (temp_input_buf);
18544
18545 return (PARSER_SALT_LENGTH);
18546 }
18547
18548 // qop:
18549
18550 char *directive_pos = strchr (qop_pos, '*');
18551
18552 if (directive_pos == NULL)
18553 {
18554 myfree (temp_input_buf);
18555
18556 return (PARSER_SEPARATOR_UNMATCHED);
18557 }
18558
18559 directive_pos[0] = 0;
18560 directive_pos++;
18561
18562 uint qop_len = strlen (qop_pos);
18563
18564 if (qop_len > 50)
18565 {
18566 myfree (temp_input_buf);
18567
18568 return (PARSER_SALT_LENGTH);
18569 }
18570
18571 // directive
18572
18573 char *digest_pos = strchr (directive_pos, '*');
18574
18575 if (digest_pos == NULL)
18576 {
18577 myfree (temp_input_buf);
18578
18579 return (PARSER_SEPARATOR_UNMATCHED);
18580 }
18581
18582 digest_pos[0] = 0;
18583 digest_pos++;
18584
18585 uint directive_len = strlen (directive_pos);
18586
18587 if (directive_len != 3)
18588 {
18589 myfree (temp_input_buf);
18590
18591 return (PARSER_SALT_LENGTH);
18592 }
18593
18594 if (memcmp (directive_pos, "MD5", 3))
18595 {
18596 log_info ("ERROR: only the MD5 directive is currently supported\n");
18597
18598 myfree (temp_input_buf);
18599
18600 return (PARSER_SIP_AUTH_DIRECTIVE);
18601 }
18602
18603 /*
18604 * first (pre-)compute: HA2 = md5 ($method . ":" . $uri)
18605 */
18606
18607 uint md5_len = 0;
18608
18609 uint md5_max_len = 4 * 64;
18610
18611 uint md5_remaining_len = md5_max_len;
18612
18613 uint tmp_md5_buf[64] = { 0 };
18614
18615 char *tmp_md5_ptr = (char *) tmp_md5_buf;
18616
18617 snprintf (tmp_md5_ptr, md5_remaining_len, "%s:", method_pos);
18618
18619 md5_len += method_len + 1;
18620 tmp_md5_ptr += method_len + 1;
18621
18622 if (URI_prefix_len > 0)
18623 {
18624 md5_remaining_len = md5_max_len - md5_len;
18625
18626 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s:", URI_prefix_pos);
18627
18628 md5_len += URI_prefix_len + 1;
18629 tmp_md5_ptr += URI_prefix_len + 1;
18630 }
18631
18632 md5_remaining_len = md5_max_len - md5_len;
18633
18634 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s", URI_resource_pos);
18635
18636 md5_len += URI_resource_len;
18637 tmp_md5_ptr += URI_resource_len;
18638
18639 if (URI_suffix_len > 0)
18640 {
18641 md5_remaining_len = md5_max_len - md5_len;
18642
18643 snprintf (tmp_md5_ptr, md5_remaining_len + 1, ":%s", URI_suffix_pos);
18644
18645 md5_len += 1 + URI_suffix_len;
18646 }
18647
18648 uint tmp_digest[4] = { 0 };
18649
18650 md5_complete_no_limit (tmp_digest, tmp_md5_buf, md5_len);
18651
18652 tmp_digest[0] = byte_swap_32 (tmp_digest[0]);
18653 tmp_digest[1] = byte_swap_32 (tmp_digest[1]);
18654 tmp_digest[2] = byte_swap_32 (tmp_digest[2]);
18655 tmp_digest[3] = byte_swap_32 (tmp_digest[3]);
18656
18657 /*
18658 * esalt
18659 */
18660
18661 char *esalt_buf_ptr = (char *) sip->esalt_buf;
18662
18663 uint esalt_len = 0;
18664
18665 uint max_esalt_len = sizeof (sip->esalt_buf); // 151 = (64 + 64 + 55) - 32, where 32 is the hexadecimal MD5 HA1 hash
18666
18667 // there are 2 possibilities for the esalt:
18668
18669 if ((strcmp (qop_pos, "auth") == 0) || (strcmp (qop_pos, "auth-int") == 0))
18670 {
18671 esalt_len = 1 + nonce_len + 1 + nonce_count_len + 1 + nonce_client_len + 1 + qop_len + 1 + 32;
18672
18673 if (esalt_len > max_esalt_len)
18674 {
18675 myfree (temp_input_buf);
18676
18677 return (PARSER_SALT_LENGTH);
18678 }
18679
18680 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%s:%s:%s:%08x%08x%08x%08x",
18681 nonce_pos,
18682 nonce_count_pos,
18683 nonce_client_pos,
18684 qop_pos,
18685 tmp_digest[0],
18686 tmp_digest[1],
18687 tmp_digest[2],
18688 tmp_digest[3]);
18689 }
18690 else
18691 {
18692 esalt_len = 1 + nonce_len + 1 + 32;
18693
18694 if (esalt_len > max_esalt_len)
18695 {
18696 myfree (temp_input_buf);
18697
18698 return (PARSER_SALT_LENGTH);
18699 }
18700
18701 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%08x%08x%08x%08x",
18702 nonce_pos,
18703 tmp_digest[0],
18704 tmp_digest[1],
18705 tmp_digest[2],
18706 tmp_digest[3]);
18707 }
18708
18709 // add 0x80 to esalt
18710
18711 esalt_buf_ptr[esalt_len] = 0x80;
18712
18713 sip->esalt_len = esalt_len;
18714
18715 /*
18716 * actual salt
18717 */
18718
18719 char *sip_salt_ptr = (char *) sip->salt_buf;
18720
18721 uint salt_len = user_len + 1 + realm_len + 1;
18722
18723 uint max_salt_len = 119;
18724
18725 if (salt_len > max_salt_len)
18726 {
18727 myfree (temp_input_buf);
18728
18729 return (PARSER_SALT_LENGTH);
18730 }
18731
18732 snprintf (sip_salt_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
18733
18734 sip->salt_len = salt_len;
18735
18736 /*
18737 * fake salt (for sorting)
18738 */
18739
18740 char *salt_buf_ptr = (char *) salt->salt_buf;
18741
18742 max_salt_len = 55;
18743
18744 uint fake_salt_len = salt_len;
18745
18746 if (fake_salt_len > max_salt_len)
18747 {
18748 fake_salt_len = max_salt_len;
18749 }
18750
18751 snprintf (salt_buf_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
18752
18753 salt->salt_len = fake_salt_len;
18754
18755 /*
18756 * digest
18757 */
18758
18759 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
18760 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
18761 digest[2] = hex_to_u32 ((const u8 *) &digest_pos[16]);
18762 digest[3] = hex_to_u32 ((const u8 *) &digest_pos[24]);
18763
18764 digest[0] = byte_swap_32 (digest[0]);
18765 digest[1] = byte_swap_32 (digest[1]);
18766 digest[2] = byte_swap_32 (digest[2]);
18767 digest[3] = byte_swap_32 (digest[3]);
18768
18769 myfree (temp_input_buf);
18770
18771 return (PARSER_OK);
18772 }
18773
18774 int crc32_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18775 {
18776 if ((input_len < DISPLAY_LEN_MIN_11500) || (input_len > DISPLAY_LEN_MAX_11500)) return (PARSER_GLOBAL_LENGTH);
18777
18778 if (input_buf[8] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
18779
18780 u32 *digest = (u32 *) hash_buf->digest;
18781
18782 salt_t *salt = hash_buf->salt;
18783
18784 // digest
18785
18786 char *digest_pos = input_buf;
18787
18788 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[0]);
18789 digest[1] = 0;
18790 digest[2] = 0;
18791 digest[3] = 0;
18792
18793 // salt
18794
18795 char *salt_buf = input_buf + 8 + 1;
18796
18797 uint salt_len = 8;
18798
18799 char *salt_buf_ptr = (char *) salt->salt_buf;
18800
18801 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
18802
18803 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18804
18805 salt->salt_len = salt_len;
18806
18807 return (PARSER_OK);
18808 }
18809
18810 int seven_zip_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18811 {
18812 if ((input_len < DISPLAY_LEN_MIN_11600) || (input_len > DISPLAY_LEN_MAX_11600)) return (PARSER_GLOBAL_LENGTH);
18813
18814 if (memcmp (SIGNATURE_SEVEN_ZIP, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
18815
18816 u32 *digest = (u32 *) hash_buf->digest;
18817
18818 salt_t *salt = hash_buf->salt;
18819
18820 seven_zip_t *seven_zip = (seven_zip_t *) hash_buf->esalt;
18821
18822 /**
18823 * parse line
18824 */
18825
18826 char *p_buf_pos = input_buf + 4;
18827
18828 char *NumCyclesPower_pos = strchr (p_buf_pos, '$');
18829
18830 if (NumCyclesPower_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18831
18832 u32 p_buf_len = NumCyclesPower_pos - p_buf_pos;
18833
18834 NumCyclesPower_pos++;
18835
18836 char *salt_len_pos = strchr (NumCyclesPower_pos, '$');
18837
18838 if (salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18839
18840 u32 NumCyclesPower_len = salt_len_pos - NumCyclesPower_pos;
18841
18842 salt_len_pos++;
18843
18844 char *salt_buf_pos = strchr (salt_len_pos, '$');
18845
18846 if (salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18847
18848 u32 salt_len_len = salt_buf_pos - salt_len_pos;
18849
18850 salt_buf_pos++;
18851
18852 char *iv_len_pos = strchr (salt_buf_pos, '$');
18853
18854 if (iv_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18855
18856 u32 salt_buf_len = iv_len_pos - salt_buf_pos;
18857
18858 iv_len_pos++;
18859
18860 char *iv_buf_pos = strchr (iv_len_pos, '$');
18861
18862 if (iv_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18863
18864 u32 iv_len_len = iv_buf_pos - iv_len_pos;
18865
18866 iv_buf_pos++;
18867
18868 char *crc_buf_pos = strchr (iv_buf_pos, '$');
18869
18870 if (crc_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18871
18872 u32 iv_buf_len = crc_buf_pos - iv_buf_pos;
18873
18874 crc_buf_pos++;
18875
18876 char *data_len_pos = strchr (crc_buf_pos, '$');
18877
18878 if (data_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18879
18880 u32 crc_buf_len = data_len_pos - crc_buf_pos;
18881
18882 data_len_pos++;
18883
18884 char *unpack_size_pos = strchr (data_len_pos, '$');
18885
18886 if (unpack_size_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18887
18888 u32 data_len_len = unpack_size_pos - data_len_pos;
18889
18890 unpack_size_pos++;
18891
18892 char *data_buf_pos = strchr (unpack_size_pos, '$');
18893
18894 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18895
18896 u32 unpack_size_len = data_buf_pos - unpack_size_pos;
18897
18898 data_buf_pos++;
18899
18900 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;
18901
18902 const uint iter = atoi (NumCyclesPower_pos);
18903 const uint crc = atoi (crc_buf_pos);
18904 const uint p_buf = atoi (p_buf_pos);
18905 const uint salt_len = atoi (salt_len_pos);
18906 const uint iv_len = atoi (iv_len_pos);
18907 const uint unpack_size = atoi (unpack_size_pos);
18908 const uint data_len = atoi (data_len_pos);
18909
18910 /**
18911 * verify some data
18912 */
18913
18914 if (p_buf != 0) return (PARSER_SALT_VALUE);
18915 if (salt_len != 0) return (PARSER_SALT_VALUE);
18916
18917 if ((data_len * 2) != data_buf_len) return (PARSER_SALT_VALUE);
18918
18919 if (data_len > 384) return (PARSER_SALT_VALUE);
18920
18921 if (unpack_size > data_len) return (PARSER_SALT_VALUE);
18922
18923 /**
18924 * store data
18925 */
18926
18927 seven_zip->iv_buf[0] = hex_to_u32 ((const u8 *) &iv_buf_pos[ 0]);
18928 seven_zip->iv_buf[1] = hex_to_u32 ((const u8 *) &iv_buf_pos[ 8]);
18929 seven_zip->iv_buf[2] = hex_to_u32 ((const u8 *) &iv_buf_pos[16]);
18930 seven_zip->iv_buf[3] = hex_to_u32 ((const u8 *) &iv_buf_pos[24]);
18931
18932 seven_zip->iv_len = iv_len;
18933
18934 memcpy (seven_zip->salt_buf, salt_buf_pos, salt_buf_len); // we just need that for later ascii_digest()
18935
18936 seven_zip->salt_len = 0;
18937
18938 seven_zip->crc = crc;
18939
18940 for (uint i = 0, j = 0; j < data_buf_len; i += 1, j += 8)
18941 {
18942 seven_zip->data_buf[i] = hex_to_u32 ((const u8 *) &data_buf_pos[j]);
18943
18944 seven_zip->data_buf[i] = byte_swap_32 (seven_zip->data_buf[i]);
18945 }
18946
18947 seven_zip->data_len = data_len;
18948
18949 seven_zip->unpack_size = unpack_size;
18950
18951 // real salt
18952
18953 salt->salt_buf[0] = seven_zip->data_buf[0];
18954 salt->salt_buf[1] = seven_zip->data_buf[1];
18955 salt->salt_buf[2] = seven_zip->data_buf[2];
18956 salt->salt_buf[3] = seven_zip->data_buf[3];
18957
18958 salt->salt_len = 16;
18959
18960 salt->salt_sign[0] = iter;
18961
18962 salt->salt_iter = 1 << iter;
18963
18964 /**
18965 * digest
18966 */
18967
18968 digest[0] = crc;
18969 digest[1] = 0;
18970 digest[2] = 0;
18971 digest[3] = 0;
18972
18973 return (PARSER_OK);
18974 }
18975
18976 int gost2012sbog_256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18977 {
18978 if ((input_len < DISPLAY_LEN_MIN_11700) || (input_len > DISPLAY_LEN_MAX_11700)) return (PARSER_GLOBAL_LENGTH);
18979
18980 u32 *digest = (u32 *) hash_buf->digest;
18981
18982 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
18983 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
18984 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
18985 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
18986 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
18987 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
18988 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
18989 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
18990
18991 digest[0] = byte_swap_32 (digest[0]);
18992 digest[1] = byte_swap_32 (digest[1]);
18993 digest[2] = byte_swap_32 (digest[2]);
18994 digest[3] = byte_swap_32 (digest[3]);
18995 digest[4] = byte_swap_32 (digest[4]);
18996 digest[5] = byte_swap_32 (digest[5]);
18997 digest[6] = byte_swap_32 (digest[6]);
18998 digest[7] = byte_swap_32 (digest[7]);
18999
19000 return (PARSER_OK);
19001 }
19002
19003 int gost2012sbog_512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19004 {
19005 if ((input_len < DISPLAY_LEN_MIN_11800) || (input_len > DISPLAY_LEN_MAX_11800)) return (PARSER_GLOBAL_LENGTH);
19006
19007 u32 *digest = (u32 *) hash_buf->digest;
19008
19009 digest[ 0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
19010 digest[ 1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
19011 digest[ 2] = hex_to_u32 ((const u8 *) &input_buf[ 16]);
19012 digest[ 3] = hex_to_u32 ((const u8 *) &input_buf[ 24]);
19013 digest[ 4] = hex_to_u32 ((const u8 *) &input_buf[ 32]);
19014 digest[ 5] = hex_to_u32 ((const u8 *) &input_buf[ 40]);
19015 digest[ 6] = hex_to_u32 ((const u8 *) &input_buf[ 48]);
19016 digest[ 7] = hex_to_u32 ((const u8 *) &input_buf[ 56]);
19017 digest[ 8] = hex_to_u32 ((const u8 *) &input_buf[ 64]);
19018 digest[ 9] = hex_to_u32 ((const u8 *) &input_buf[ 72]);
19019 digest[10] = hex_to_u32 ((const u8 *) &input_buf[ 80]);
19020 digest[11] = hex_to_u32 ((const u8 *) &input_buf[ 88]);
19021 digest[12] = hex_to_u32 ((const u8 *) &input_buf[ 96]);
19022 digest[13] = hex_to_u32 ((const u8 *) &input_buf[104]);
19023 digest[14] = hex_to_u32 ((const u8 *) &input_buf[112]);
19024 digest[15] = hex_to_u32 ((const u8 *) &input_buf[120]);
19025
19026 digest[ 0] = byte_swap_32 (digest[ 0]);
19027 digest[ 1] = byte_swap_32 (digest[ 1]);
19028 digest[ 2] = byte_swap_32 (digest[ 2]);
19029 digest[ 3] = byte_swap_32 (digest[ 3]);
19030 digest[ 4] = byte_swap_32 (digest[ 4]);
19031 digest[ 5] = byte_swap_32 (digest[ 5]);
19032 digest[ 6] = byte_swap_32 (digest[ 6]);
19033 digest[ 7] = byte_swap_32 (digest[ 7]);
19034 digest[ 8] = byte_swap_32 (digest[ 8]);
19035 digest[ 9] = byte_swap_32 (digest[ 9]);
19036 digest[10] = byte_swap_32 (digest[10]);
19037 digest[11] = byte_swap_32 (digest[11]);
19038 digest[12] = byte_swap_32 (digest[12]);
19039 digest[13] = byte_swap_32 (digest[13]);
19040 digest[14] = byte_swap_32 (digest[14]);
19041 digest[15] = byte_swap_32 (digest[15]);
19042
19043 return (PARSER_OK);
19044 }
19045
19046 int pbkdf2_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19047 {
19048 if ((input_len < DISPLAY_LEN_MIN_11900) || (input_len > DISPLAY_LEN_MAX_11900)) return (PARSER_GLOBAL_LENGTH);
19049
19050 if (memcmp (SIGNATURE_PBKDF2_MD5, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
19051
19052 u32 *digest = (u32 *) hash_buf->digest;
19053
19054 salt_t *salt = hash_buf->salt;
19055
19056 pbkdf2_md5_t *pbkdf2_md5 = (pbkdf2_md5_t *) hash_buf->esalt;
19057
19058 /**
19059 * parse line
19060 */
19061
19062 // iterations
19063
19064 char *iter_pos = input_buf + 4;
19065
19066 u32 iter = atoi (iter_pos);
19067
19068 if (iter < 1) return (PARSER_SALT_ITERATION);
19069 if (iter > 999999) return (PARSER_SALT_ITERATION);
19070
19071 // first is *raw* salt
19072
19073 char *salt_pos = strchr (iter_pos, ':');
19074
19075 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19076
19077 salt_pos++;
19078
19079 char *hash_pos = strchr (salt_pos, ':');
19080
19081 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19082
19083 u32 salt_len = hash_pos - salt_pos;
19084
19085 if (salt_len > 64) return (PARSER_SALT_LENGTH);
19086
19087 hash_pos++;
19088
19089 u32 hash_b64_len = input_len - (hash_pos - input_buf);
19090
19091 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
19092
19093 // decode salt
19094
19095 char *salt_buf_ptr = (char *) pbkdf2_md5->salt_buf;
19096
19097 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
19098
19099 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
19100
19101 salt_buf_ptr[salt_len + 3] = 0x01;
19102 salt_buf_ptr[salt_len + 4] = 0x80;
19103
19104 salt->salt_len = salt_len;
19105 salt->salt_iter = iter - 1;
19106
19107 // decode hash
19108
19109 u8 tmp_buf[100] = { 0 };
19110
19111 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
19112
19113 if (hash_len < 16) return (PARSER_HASH_LENGTH);
19114
19115 memcpy (digest, tmp_buf, 16);
19116
19117 // add some stuff to normal salt to make sorted happy
19118
19119 salt->salt_buf[0] = pbkdf2_md5->salt_buf[0];
19120 salt->salt_buf[1] = pbkdf2_md5->salt_buf[1];
19121 salt->salt_buf[2] = pbkdf2_md5->salt_buf[2];
19122 salt->salt_buf[3] = pbkdf2_md5->salt_buf[3];
19123 salt->salt_buf[4] = salt->salt_iter;
19124
19125 return (PARSER_OK);
19126 }
19127
19128 int pbkdf2_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19129 {
19130 if ((input_len < DISPLAY_LEN_MIN_12000) || (input_len > DISPLAY_LEN_MAX_12000)) return (PARSER_GLOBAL_LENGTH);
19131
19132 if (memcmp (SIGNATURE_PBKDF2_SHA1, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
19133
19134 u32 *digest = (u32 *) hash_buf->digest;
19135
19136 salt_t *salt = hash_buf->salt;
19137
19138 pbkdf2_sha1_t *pbkdf2_sha1 = (pbkdf2_sha1_t *) hash_buf->esalt;
19139
19140 /**
19141 * parse line
19142 */
19143
19144 // iterations
19145
19146 char *iter_pos = input_buf + 5;
19147
19148 u32 iter = atoi (iter_pos);
19149
19150 if (iter < 1) return (PARSER_SALT_ITERATION);
19151 if (iter > 999999) return (PARSER_SALT_ITERATION);
19152
19153 // first is *raw* salt
19154
19155 char *salt_pos = strchr (iter_pos, ':');
19156
19157 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19158
19159 salt_pos++;
19160
19161 char *hash_pos = strchr (salt_pos, ':');
19162
19163 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19164
19165 u32 salt_len = hash_pos - salt_pos;
19166
19167 if (salt_len > 64) return (PARSER_SALT_LENGTH);
19168
19169 hash_pos++;
19170
19171 u32 hash_b64_len = input_len - (hash_pos - input_buf);
19172
19173 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
19174
19175 // decode salt
19176
19177 char *salt_buf_ptr = (char *) pbkdf2_sha1->salt_buf;
19178
19179 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
19180
19181 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
19182
19183 salt_buf_ptr[salt_len + 3] = 0x01;
19184 salt_buf_ptr[salt_len + 4] = 0x80;
19185
19186 salt->salt_len = salt_len;
19187 salt->salt_iter = iter - 1;
19188
19189 // decode hash
19190
19191 u8 tmp_buf[100] = { 0 };
19192
19193 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
19194
19195 if (hash_len < 16) return (PARSER_HASH_LENGTH);
19196
19197 memcpy (digest, tmp_buf, 16);
19198
19199 digest[0] = byte_swap_32 (digest[0]);
19200 digest[1] = byte_swap_32 (digest[1]);
19201 digest[2] = byte_swap_32 (digest[2]);
19202 digest[3] = byte_swap_32 (digest[3]);
19203
19204 // add some stuff to normal salt to make sorted happy
19205
19206 salt->salt_buf[0] = pbkdf2_sha1->salt_buf[0];
19207 salt->salt_buf[1] = pbkdf2_sha1->salt_buf[1];
19208 salt->salt_buf[2] = pbkdf2_sha1->salt_buf[2];
19209 salt->salt_buf[3] = pbkdf2_sha1->salt_buf[3];
19210 salt->salt_buf[4] = salt->salt_iter;
19211
19212 return (PARSER_OK);
19213 }
19214
19215 int pbkdf2_sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19216 {
19217 if ((input_len < DISPLAY_LEN_MIN_12100) || (input_len > DISPLAY_LEN_MAX_12100)) return (PARSER_GLOBAL_LENGTH);
19218
19219 if (memcmp (SIGNATURE_PBKDF2_SHA512, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
19220
19221 u64 *digest = (u64 *) hash_buf->digest;
19222
19223 salt_t *salt = hash_buf->salt;
19224
19225 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
19226
19227 /**
19228 * parse line
19229 */
19230
19231 // iterations
19232
19233 char *iter_pos = input_buf + 7;
19234
19235 u32 iter = atoi (iter_pos);
19236
19237 if (iter < 1) return (PARSER_SALT_ITERATION);
19238 if (iter > 999999) return (PARSER_SALT_ITERATION);
19239
19240 // first is *raw* salt
19241
19242 char *salt_pos = strchr (iter_pos, ':');
19243
19244 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19245
19246 salt_pos++;
19247
19248 char *hash_pos = strchr (salt_pos, ':');
19249
19250 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19251
19252 u32 salt_len = hash_pos - salt_pos;
19253
19254 if (salt_len > 64) return (PARSER_SALT_LENGTH);
19255
19256 hash_pos++;
19257
19258 u32 hash_b64_len = input_len - (hash_pos - input_buf);
19259
19260 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
19261
19262 // decode salt
19263
19264 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
19265
19266 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
19267
19268 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
19269
19270 salt_buf_ptr[salt_len + 3] = 0x01;
19271 salt_buf_ptr[salt_len + 4] = 0x80;
19272
19273 salt->salt_len = salt_len;
19274 salt->salt_iter = iter - 1;
19275
19276 // decode hash
19277
19278 u8 tmp_buf[100] = { 0 };
19279
19280 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
19281
19282 if (hash_len < 16) return (PARSER_HASH_LENGTH);
19283
19284 memcpy (digest, tmp_buf, 64);
19285
19286 digest[0] = byte_swap_64 (digest[0]);
19287 digest[1] = byte_swap_64 (digest[1]);
19288 digest[2] = byte_swap_64 (digest[2]);
19289 digest[3] = byte_swap_64 (digest[3]);
19290 digest[4] = byte_swap_64 (digest[4]);
19291 digest[5] = byte_swap_64 (digest[5]);
19292 digest[6] = byte_swap_64 (digest[6]);
19293 digest[7] = byte_swap_64 (digest[7]);
19294
19295 // add some stuff to normal salt to make sorted happy
19296
19297 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
19298 salt->salt_buf[1] = pbkdf2_sha512->salt_buf[1];
19299 salt->salt_buf[2] = pbkdf2_sha512->salt_buf[2];
19300 salt->salt_buf[3] = pbkdf2_sha512->salt_buf[3];
19301 salt->salt_buf[4] = salt->salt_iter;
19302
19303 return (PARSER_OK);
19304 }
19305
19306 int ecryptfs_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19307 {
19308 if ((input_len < DISPLAY_LEN_MIN_12200) || (input_len > DISPLAY_LEN_MAX_12200)) return (PARSER_GLOBAL_LENGTH);
19309
19310 if (memcmp (SIGNATURE_ECRYPTFS, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
19311
19312 uint *digest = (uint *) hash_buf->digest;
19313
19314 salt_t *salt = hash_buf->salt;
19315
19316 /**
19317 * parse line
19318 */
19319
19320 char *salt_pos = input_buf + 10 + 2 + 2; // skip over "0$" and "1$"
19321
19322 char *hash_pos = strchr (salt_pos, '$');
19323
19324 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19325
19326 u32 salt_len = hash_pos - salt_pos;
19327
19328 if (salt_len != 16) return (PARSER_SALT_LENGTH);
19329
19330 hash_pos++;
19331
19332 u32 hash_len = input_len - 10 - 2 - 2 - salt_len - 1;
19333
19334 if (hash_len != 16) return (PARSER_HASH_LENGTH);
19335
19336 // decode hash
19337
19338 digest[ 0] = hex_to_u32 ((const u8 *) &hash_pos[0]);
19339 digest[ 1] = hex_to_u32 ((const u8 *) &hash_pos[8]);
19340 digest[ 2] = 0;
19341 digest[ 3] = 0;
19342 digest[ 4] = 0;
19343 digest[ 5] = 0;
19344 digest[ 6] = 0;
19345 digest[ 7] = 0;
19346 digest[ 8] = 0;
19347 digest[ 9] = 0;
19348 digest[10] = 0;
19349 digest[11] = 0;
19350 digest[12] = 0;
19351 digest[13] = 0;
19352 digest[14] = 0;
19353 digest[15] = 0;
19354
19355 // decode salt
19356
19357 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[0]);
19358 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[8]);
19359
19360 salt->salt_iter = ROUNDS_ECRYPTFS;
19361 salt->salt_len = 8;
19362
19363 return (PARSER_OK);
19364 }
19365
19366 int bsdicrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19367 {
19368 if ((input_len < DISPLAY_LEN_MIN_12400) || (input_len > DISPLAY_LEN_MAX_12400)) return (PARSER_GLOBAL_LENGTH);
19369
19370 if (memcmp (SIGNATURE_BSDICRYPT, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
19371
19372 unsigned char c19 = itoa64_to_int (input_buf[19]);
19373
19374 if (c19 & 3) return (PARSER_HASH_VALUE);
19375
19376 salt_t *salt = hash_buf->salt;
19377
19378 u32 *digest = (u32 *) hash_buf->digest;
19379
19380 // iteration count
19381
19382 salt->salt_iter = itoa64_to_int (input_buf[1])
19383 | itoa64_to_int (input_buf[2]) << 6
19384 | itoa64_to_int (input_buf[3]) << 12
19385 | itoa64_to_int (input_buf[4]) << 18;
19386
19387 // set salt
19388
19389 salt->salt_buf[0] = itoa64_to_int (input_buf[5])
19390 | itoa64_to_int (input_buf[6]) << 6
19391 | itoa64_to_int (input_buf[7]) << 12
19392 | itoa64_to_int (input_buf[8]) << 18;
19393
19394 salt->salt_len = 4;
19395
19396 u8 tmp_buf[100] = { 0 };
19397
19398 base64_decode (itoa64_to_int, (const u8 *) input_buf + 9, 11, tmp_buf);
19399
19400 memcpy (digest, tmp_buf, 8);
19401
19402 uint tt;
19403
19404 IP (digest[0], digest[1], tt);
19405
19406 digest[0] = rotr32 (digest[0], 31);
19407 digest[1] = rotr32 (digest[1], 31);
19408 digest[2] = 0;
19409 digest[3] = 0;
19410
19411 return (PARSER_OK);
19412 }
19413
19414 int rar3hp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19415 {
19416 if ((input_len < DISPLAY_LEN_MIN_12500) || (input_len > DISPLAY_LEN_MAX_12500)) return (PARSER_GLOBAL_LENGTH);
19417
19418 if (memcmp (SIGNATURE_RAR3, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
19419
19420 u32 *digest = (u32 *) hash_buf->digest;
19421
19422 salt_t *salt = hash_buf->salt;
19423
19424 /**
19425 * parse line
19426 */
19427
19428 char *type_pos = input_buf + 6 + 1;
19429
19430 char *salt_pos = strchr (type_pos, '*');
19431
19432 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19433
19434 u32 type_len = salt_pos - type_pos;
19435
19436 if (type_len != 1) return (PARSER_SALT_LENGTH);
19437
19438 salt_pos++;
19439
19440 char *crypted_pos = strchr (salt_pos, '*');
19441
19442 if (crypted_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19443
19444 u32 salt_len = crypted_pos - salt_pos;
19445
19446 if (salt_len != 16) return (PARSER_SALT_LENGTH);
19447
19448 crypted_pos++;
19449
19450 u32 crypted_len = input_len - 6 - 1 - type_len - 1 - salt_len - 1;
19451
19452 if (crypted_len != 32) return (PARSER_SALT_LENGTH);
19453
19454 /**
19455 * copy data
19456 */
19457
19458 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[0]);
19459 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[8]);
19460
19461 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
19462 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
19463
19464 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &crypted_pos[ 0]);
19465 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &crypted_pos[ 8]);
19466 salt->salt_buf[4] = hex_to_u32 ((const u8 *) &crypted_pos[16]);
19467 salt->salt_buf[5] = hex_to_u32 ((const u8 *) &crypted_pos[24]);
19468
19469 salt->salt_len = 24;
19470 salt->salt_iter = ROUNDS_RAR3;
19471
19472 // there's no hash for rar3. the data which is in crypted_pos is some encrypted data and
19473 // if it matches the value \xc4\x3d\x7b\x00\x40\x07\x00 after decrypt we know that we successfully cracked it.
19474
19475 digest[0] = 0xc43d7b00;
19476 digest[1] = 0x40070000;
19477 digest[2] = 0;
19478 digest[3] = 0;
19479
19480 return (PARSER_OK);
19481 }
19482
19483 int rar5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19484 {
19485 if ((input_len < DISPLAY_LEN_MIN_13000) || (input_len > DISPLAY_LEN_MAX_13000)) return (PARSER_GLOBAL_LENGTH);
19486
19487 if (memcmp (SIGNATURE_RAR5, input_buf, 1 + 4 + 1)) return (PARSER_SIGNATURE_UNMATCHED);
19488
19489 u32 *digest = (u32 *) hash_buf->digest;
19490
19491 salt_t *salt = hash_buf->salt;
19492
19493 rar5_t *rar5 = (rar5_t *) hash_buf->esalt;
19494
19495 /**
19496 * parse line
19497 */
19498
19499 char *param0_pos = input_buf + 1 + 4 + 1;
19500
19501 char *param1_pos = strchr (param0_pos, '$');
19502
19503 if (param1_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19504
19505 u32 param0_len = param1_pos - param0_pos;
19506
19507 param1_pos++;
19508
19509 char *param2_pos = strchr (param1_pos, '$');
19510
19511 if (param2_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19512
19513 u32 param1_len = param2_pos - param1_pos;
19514
19515 param2_pos++;
19516
19517 char *param3_pos = strchr (param2_pos, '$');
19518
19519 if (param3_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19520
19521 u32 param2_len = param3_pos - param2_pos;
19522
19523 param3_pos++;
19524
19525 char *param4_pos = strchr (param3_pos, '$');
19526
19527 if (param4_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19528
19529 u32 param3_len = param4_pos - param3_pos;
19530
19531 param4_pos++;
19532
19533 char *param5_pos = strchr (param4_pos, '$');
19534
19535 if (param5_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19536
19537 u32 param4_len = param5_pos - param4_pos;
19538
19539 param5_pos++;
19540
19541 u32 param5_len = input_len - 1 - 4 - 1 - param0_len - 1 - param1_len - 1 - param2_len - 1 - param3_len - 1 - param4_len - 1;
19542
19543 char *salt_buf = param1_pos;
19544 char *iv = param3_pos;
19545 char *pswcheck = param5_pos;
19546
19547 const uint salt_len = atoi (param0_pos);
19548 const uint iterations = atoi (param2_pos);
19549 const uint pswcheck_len = atoi (param4_pos);
19550
19551 /**
19552 * verify some data
19553 */
19554
19555 if (param1_len != 32) return (PARSER_SALT_VALUE);
19556 if (param3_len != 32) return (PARSER_SALT_VALUE);
19557 if (param5_len != 16) return (PARSER_SALT_VALUE);
19558
19559 if (salt_len != 16) return (PARSER_SALT_VALUE);
19560 if (iterations == 0) return (PARSER_SALT_VALUE);
19561 if (pswcheck_len != 8) return (PARSER_SALT_VALUE);
19562
19563 /**
19564 * store data
19565 */
19566
19567 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
19568 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
19569 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
19570 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf[24]);
19571
19572 rar5->iv[0] = hex_to_u32 ((const u8 *) &iv[ 0]);
19573 rar5->iv[1] = hex_to_u32 ((const u8 *) &iv[ 8]);
19574 rar5->iv[2] = hex_to_u32 ((const u8 *) &iv[16]);
19575 rar5->iv[3] = hex_to_u32 ((const u8 *) &iv[24]);
19576
19577 salt->salt_len = 16;
19578
19579 salt->salt_sign[0] = iterations;
19580
19581 salt->salt_iter = ((1 << iterations) + 32) - 1;
19582
19583 /**
19584 * digest buf
19585 */
19586
19587 digest[0] = hex_to_u32 ((const u8 *) &pswcheck[ 0]);
19588 digest[1] = hex_to_u32 ((const u8 *) &pswcheck[ 8]);
19589 digest[2] = 0;
19590 digest[3] = 0;
19591
19592 return (PARSER_OK);
19593 }
19594
19595 int krb5tgs_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19596 {
19597 if ((input_len < DISPLAY_LEN_MIN_13100) || (input_len > DISPLAY_LEN_MAX_13100)) return (PARSER_GLOBAL_LENGTH);
19598
19599 if (memcmp (SIGNATURE_KRB5TGS, input_buf, 11)) return (PARSER_SIGNATURE_UNMATCHED);
19600
19601 u32 *digest = (u32 *) hash_buf->digest;
19602
19603 salt_t *salt = hash_buf->salt;
19604
19605 krb5tgs_t *krb5tgs = (krb5tgs_t *) hash_buf->esalt;
19606
19607 /**
19608 * parse line
19609 */
19610
19611 /* Skip '$' */
19612 char *account_pos = input_buf + 11 + 1;
19613
19614 char *data_pos;
19615
19616 uint data_len;
19617
19618 if (account_pos[0] == '*')
19619 {
19620 account_pos++;
19621
19622 data_pos = strchr (account_pos, '*');
19623
19624 /* Skip '*' */
19625 data_pos++;
19626
19627 if (data_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19628
19629 uint account_len = data_pos - account_pos + 1;
19630
19631 if (account_len >= 512) return (PARSER_SALT_LENGTH);
19632
19633 /* Skip '$' */
19634 data_pos++;
19635
19636 data_len = input_len - 11 - 1 - account_len - 2;
19637
19638 memcpy (krb5tgs->account_info, account_pos - 1, account_len);
19639 }
19640 else
19641 {
19642 /* assume $krb5tgs$23$checksum$edata2 */
19643 data_pos = account_pos;
19644
19645 memcpy (krb5tgs->account_info, "**", 3);
19646
19647 data_len = input_len - 11 - 1 - 1;
19648 }
19649
19650 if (data_len < ((16 + 32) * 2)) return (PARSER_SALT_LENGTH);
19651
19652 char *checksum_ptr = (char *) krb5tgs->checksum;
19653
19654 for (uint i = 0; i < 16 * 2; i += 2)
19655 {
19656 const char p0 = data_pos[i + 0];
19657 const char p1 = data_pos[i + 1];
19658
19659 *checksum_ptr++ = hex_convert (p1) << 0
19660 | hex_convert (p0) << 4;
19661 }
19662
19663 char *edata_ptr = (char *) krb5tgs->edata2;
19664
19665 krb5tgs->edata2_len = (data_len - 32) / 2 ;
19666
19667 /* skip '$' */
19668 for (uint i = 16 * 2 + 1; i < (krb5tgs->edata2_len * 2) + (16 * 2 + 1); i += 2)
19669 {
19670 const char p0 = data_pos[i + 0];
19671 const char p1 = data_pos[i + 1];
19672 *edata_ptr++ = hex_convert (p1) << 0
19673 | hex_convert (p0) << 4;
19674 }
19675
19676 /* this is needed for hmac_md5 */
19677 *edata_ptr++ = 0x80;
19678
19679 salt->salt_buf[0] = krb5tgs->checksum[0];
19680 salt->salt_buf[1] = krb5tgs->checksum[1];
19681 salt->salt_buf[2] = krb5tgs->checksum[2];
19682 salt->salt_buf[3] = krb5tgs->checksum[3];
19683
19684 salt->salt_len = 32;
19685
19686 digest[0] = krb5tgs->checksum[0];
19687 digest[1] = krb5tgs->checksum[1];
19688 digest[2] = krb5tgs->checksum[2];
19689 digest[3] = krb5tgs->checksum[3];
19690
19691 return (PARSER_OK);
19692 }
19693
19694 int axcrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19695 {
19696 if ((input_len < DISPLAY_LEN_MIN_13200) || (input_len > DISPLAY_LEN_MAX_13200)) return (PARSER_GLOBAL_LENGTH);
19697
19698 if (memcmp (SIGNATURE_AXCRYPT, input_buf, 11)) return (PARSER_SIGNATURE_UNMATCHED);
19699
19700 u32 *digest = (u32 *) hash_buf->digest;
19701
19702 salt_t *salt = hash_buf->salt;
19703
19704 /**
19705 * parse line
19706 */
19707
19708 /* Skip '*' */
19709 char *wrapping_rounds_pos = input_buf + 11 + 1;
19710
19711 char *salt_pos;
19712
19713 char *wrapped_key_pos;
19714
19715 char *data_pos;
19716
19717 salt->salt_iter = atoi (wrapping_rounds_pos);
19718
19719 salt_pos = strchr (wrapping_rounds_pos, '*');
19720
19721 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19722
19723 uint wrapping_rounds_len = salt_pos - wrapping_rounds_pos;
19724
19725 /* Skip '*' */
19726 salt_pos++;
19727
19728 data_pos = salt_pos;
19729
19730 wrapped_key_pos = strchr (salt_pos, '*');
19731
19732 if (wrapped_key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19733
19734 uint salt_len = wrapped_key_pos - salt_pos;
19735
19736 if (salt_len != 32) return (PARSER_SALT_LENGTH);
19737
19738 /* Skip '*' */
19739 wrapped_key_pos++;
19740
19741 uint wrapped_key_len = input_len - 11 - 1 - wrapping_rounds_len - 1 - salt_len - 1;
19742
19743 if (wrapped_key_len != 48) return (PARSER_SALT_LENGTH);
19744
19745 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &data_pos[ 0]);
19746 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &data_pos[ 8]);
19747 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &data_pos[16]);
19748 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &data_pos[24]);
19749
19750 data_pos += 33;
19751
19752 salt->salt_buf[4] = hex_to_u32 ((const u8 *) &data_pos[ 0]);
19753 salt->salt_buf[5] = hex_to_u32 ((const u8 *) &data_pos[ 8]);
19754 salt->salt_buf[6] = hex_to_u32 ((const u8 *) &data_pos[16]);
19755 salt->salt_buf[7] = hex_to_u32 ((const u8 *) &data_pos[24]);
19756 salt->salt_buf[8] = hex_to_u32 ((const u8 *) &data_pos[32]);
19757 salt->salt_buf[9] = hex_to_u32 ((const u8 *) &data_pos[40]);
19758
19759 salt->salt_len = 40;
19760
19761 digest[0] = salt->salt_buf[0];
19762 digest[1] = salt->salt_buf[1];
19763 digest[2] = salt->salt_buf[2];
19764 digest[3] = salt->salt_buf[3];
19765
19766 return (PARSER_OK);
19767 }
19768
19769 int keepass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19770 {
19771 if ((input_len < DISPLAY_LEN_MIN_13400) || (input_len > DISPLAY_LEN_MAX_13400)) return (PARSER_GLOBAL_LENGTH);
19772
19773 if (memcmp (SIGNATURE_KEEPASS, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
19774
19775 u32 *digest = (u32 *) hash_buf->digest;
19776
19777 salt_t *salt = hash_buf->salt;
19778
19779 keepass_t *keepass = (keepass_t *) hash_buf->esalt;
19780
19781 /**
19782 * parse line
19783 */
19784
19785 char *version_pos;
19786
19787 char *rounds_pos;
19788
19789 char *algorithm_pos;
19790
19791 char *final_random_seed_pos;
19792 u32 final_random_seed_len;
19793
19794 char *transf_random_seed_pos;
19795 u32 transf_random_seed_len;
19796
19797 char *enc_iv_pos;
19798 u32 enc_iv_len;
19799
19800 /* default is no keyfile provided */
19801 char *keyfile_len_pos;
19802 u32 keyfile_len = 0;
19803 u32 is_keyfile_present = 0;
19804 char *keyfile_inline_pos;
19805 char *keyfile_pos;
19806
19807 /* specific to version 1 */
19808 char *contents_len_pos;
19809 u32 contents_len;
19810 char *contents_pos;
19811
19812 /* specific to version 2 */
19813 char *expected_bytes_pos;
19814 u32 expected_bytes_len;
19815
19816 char *contents_hash_pos;
19817 u32 contents_hash_len;
19818
19819 version_pos = input_buf + 8 + 1 + 1;
19820
19821 keepass->version = atoi (version_pos);
19822
19823 rounds_pos = strchr (version_pos, '*');
19824
19825 if (rounds_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19826
19827 rounds_pos++;
19828
19829 salt->salt_iter = (atoi (rounds_pos));
19830
19831 algorithm_pos = strchr (rounds_pos, '*');
19832
19833 if (algorithm_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19834
19835 algorithm_pos++;
19836
19837 keepass->algorithm = atoi (algorithm_pos);
19838
19839 final_random_seed_pos = strchr (algorithm_pos, '*');
19840
19841 if (final_random_seed_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19842
19843 final_random_seed_pos++;
19844
19845 keepass->final_random_seed[0] = hex_to_u32 ((const u8 *) &final_random_seed_pos[ 0]);
19846 keepass->final_random_seed[1] = hex_to_u32 ((const u8 *) &final_random_seed_pos[ 8]);
19847 keepass->final_random_seed[2] = hex_to_u32 ((const u8 *) &final_random_seed_pos[16]);
19848 keepass->final_random_seed[3] = hex_to_u32 ((const u8 *) &final_random_seed_pos[24]);
19849
19850 if (keepass->version == 2)
19851 {
19852 keepass->final_random_seed[4] = hex_to_u32 ((const u8 *) &final_random_seed_pos[32]);
19853 keepass->final_random_seed[5] = hex_to_u32 ((const u8 *) &final_random_seed_pos[40]);
19854 keepass->final_random_seed[6] = hex_to_u32 ((const u8 *) &final_random_seed_pos[48]);
19855 keepass->final_random_seed[7] = hex_to_u32 ((const u8 *) &final_random_seed_pos[56]);
19856 }
19857
19858 transf_random_seed_pos = strchr (final_random_seed_pos, '*');
19859
19860 if (transf_random_seed_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19861
19862 final_random_seed_len = transf_random_seed_pos - final_random_seed_pos;
19863
19864 if (keepass->version == 1 && final_random_seed_len != 32) return (PARSER_SALT_LENGTH);
19865 if (keepass->version == 2 && final_random_seed_len != 64) return (PARSER_SALT_LENGTH);
19866
19867 transf_random_seed_pos++;
19868
19869 keepass->transf_random_seed[0] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[ 0]);
19870 keepass->transf_random_seed[1] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[ 8]);
19871 keepass->transf_random_seed[2] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[16]);
19872 keepass->transf_random_seed[3] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[24]);
19873 keepass->transf_random_seed[4] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[32]);
19874 keepass->transf_random_seed[5] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[40]);
19875 keepass->transf_random_seed[6] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[48]);
19876 keepass->transf_random_seed[7] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[56]);
19877
19878 enc_iv_pos = strchr (transf_random_seed_pos, '*');
19879
19880 if (enc_iv_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19881
19882 transf_random_seed_len = enc_iv_pos - transf_random_seed_pos;
19883
19884 if (transf_random_seed_len != 64) return (PARSER_SALT_LENGTH);
19885
19886 enc_iv_pos++;
19887
19888 keepass->enc_iv[0] = hex_to_u32 ((const u8 *) &enc_iv_pos[ 0]);
19889 keepass->enc_iv[1] = hex_to_u32 ((const u8 *) &enc_iv_pos[ 8]);
19890 keepass->enc_iv[2] = hex_to_u32 ((const u8 *) &enc_iv_pos[16]);
19891 keepass->enc_iv[3] = hex_to_u32 ((const u8 *) &enc_iv_pos[24]);
19892
19893 if (keepass->version == 1)
19894 {
19895 contents_hash_pos = strchr (enc_iv_pos, '*');
19896
19897 if (contents_hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19898
19899 enc_iv_len = contents_hash_pos - enc_iv_pos;
19900
19901 if (enc_iv_len != 32) return (PARSER_SALT_LENGTH);
19902
19903 contents_hash_pos++;
19904
19905 keepass->contents_hash[0] = hex_to_u32 ((const u8 *) &contents_hash_pos[ 0]);
19906 keepass->contents_hash[1] = hex_to_u32 ((const u8 *) &contents_hash_pos[ 8]);
19907 keepass->contents_hash[2] = hex_to_u32 ((const u8 *) &contents_hash_pos[16]);
19908 keepass->contents_hash[3] = hex_to_u32 ((const u8 *) &contents_hash_pos[24]);
19909 keepass->contents_hash[4] = hex_to_u32 ((const u8 *) &contents_hash_pos[32]);
19910 keepass->contents_hash[5] = hex_to_u32 ((const u8 *) &contents_hash_pos[40]);
19911 keepass->contents_hash[6] = hex_to_u32 ((const u8 *) &contents_hash_pos[48]);
19912 keepass->contents_hash[7] = hex_to_u32 ((const u8 *) &contents_hash_pos[56]);
19913
19914 /* get length of contents following */
19915 char *inline_flag_pos = strchr (contents_hash_pos, '*');
19916
19917 if (inline_flag_pos == NULL) return (PARSER_SALT_LENGTH);
19918
19919 contents_hash_len = inline_flag_pos - contents_hash_pos;
19920
19921 if (contents_hash_len != 64) return (PARSER_SALT_LENGTH);
19922
19923 inline_flag_pos++;
19924
19925 u32 inline_flag = atoi (inline_flag_pos);
19926
19927 if (inline_flag != 1) return (PARSER_SALT_LENGTH);
19928
19929 contents_len_pos = strchr (inline_flag_pos, '*');
19930
19931 if (contents_len_pos == NULL) return (PARSER_SALT_LENGTH);
19932
19933 contents_len_pos++;
19934
19935 contents_len = atoi (contents_len_pos);
19936
19937 if (contents_len > 50000) return (PARSER_SALT_LENGTH);
19938
19939 contents_pos = strchr (contents_len_pos, '*');
19940
19941 if (contents_pos == NULL) return (PARSER_SALT_LENGTH);
19942
19943 contents_pos++;
19944
19945 u32 i;
19946
19947 keepass->contents_len = contents_len;
19948
19949 contents_len = contents_len / 4;
19950
19951 keyfile_inline_pos = strchr (contents_pos, '*');
19952
19953 u32 real_contents_len;
19954
19955 if (keyfile_inline_pos == NULL)
19956 real_contents_len = input_len - (contents_pos - input_buf);
19957 else
19958 {
19959 real_contents_len = keyfile_inline_pos - contents_pos;
19960 keyfile_inline_pos++;
19961 is_keyfile_present = 1;
19962 }
19963
19964 if (real_contents_len != keepass->contents_len * 2) return (PARSER_SALT_LENGTH);
19965
19966 for (i = 0; i < contents_len; i++)
19967 keepass->contents[i] = hex_to_u32 ((const u8 *) &contents_pos[i * 8]);
19968 }
19969 else if (keepass->version == 2)
19970 {
19971 expected_bytes_pos = strchr (enc_iv_pos, '*');
19972
19973 if (expected_bytes_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19974
19975 enc_iv_len = expected_bytes_pos - enc_iv_pos;
19976
19977 if (enc_iv_len != 32) return (PARSER_SALT_LENGTH);
19978
19979 expected_bytes_pos++;
19980
19981 keepass->expected_bytes[0] = hex_to_u32 ((const u8 *) &expected_bytes_pos[ 0]);
19982 keepass->expected_bytes[1] = hex_to_u32 ((const u8 *) &expected_bytes_pos[ 8]);
19983 keepass->expected_bytes[2] = hex_to_u32 ((const u8 *) &expected_bytes_pos[16]);
19984 keepass->expected_bytes[3] = hex_to_u32 ((const u8 *) &expected_bytes_pos[24]);
19985 keepass->expected_bytes[4] = hex_to_u32 ((const u8 *) &expected_bytes_pos[32]);
19986 keepass->expected_bytes[5] = hex_to_u32 ((const u8 *) &expected_bytes_pos[40]);
19987 keepass->expected_bytes[6] = hex_to_u32 ((const u8 *) &expected_bytes_pos[48]);
19988 keepass->expected_bytes[7] = hex_to_u32 ((const u8 *) &expected_bytes_pos[56]);
19989
19990 contents_hash_pos = strchr (expected_bytes_pos, '*');
19991
19992 if (contents_hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19993
19994 expected_bytes_len = contents_hash_pos - expected_bytes_pos;
19995
19996 if (expected_bytes_len != 64) return (PARSER_SALT_LENGTH);
19997
19998 contents_hash_pos++;
19999
20000 keepass->contents_hash[0] = hex_to_u32 ((const u8 *) &contents_hash_pos[ 0]);
20001 keepass->contents_hash[1] = hex_to_u32 ((const u8 *) &contents_hash_pos[ 8]);
20002 keepass->contents_hash[2] = hex_to_u32 ((const u8 *) &contents_hash_pos[16]);
20003 keepass->contents_hash[3] = hex_to_u32 ((const u8 *) &contents_hash_pos[24]);
20004 keepass->contents_hash[4] = hex_to_u32 ((const u8 *) &contents_hash_pos[32]);
20005 keepass->contents_hash[5] = hex_to_u32 ((const u8 *) &contents_hash_pos[40]);
20006 keepass->contents_hash[6] = hex_to_u32 ((const u8 *) &contents_hash_pos[48]);
20007 keepass->contents_hash[7] = hex_to_u32 ((const u8 *) &contents_hash_pos[56]);
20008
20009 keyfile_inline_pos = strchr (contents_hash_pos, '*');
20010
20011 if (keyfile_inline_pos == NULL)
20012 contents_hash_len = input_len - (int) (contents_hash_pos - input_buf);
20013 else
20014 {
20015 contents_hash_len = keyfile_inline_pos - contents_hash_pos;
20016 keyfile_inline_pos++;
20017 is_keyfile_present = 1;
20018 }
20019 if (contents_hash_len != 64) return (PARSER_SALT_LENGTH);
20020 }
20021
20022 if (is_keyfile_present != 0)
20023 {
20024 keyfile_len_pos = strchr (keyfile_inline_pos, '*');
20025
20026 keyfile_len_pos++;
20027
20028 keyfile_len = atoi (keyfile_len_pos);
20029
20030 keepass->keyfile_len = keyfile_len;
20031
20032 if (keyfile_len != 64) return (PARSER_SALT_LENGTH);
20033
20034 keyfile_pos = strchr (keyfile_len_pos, '*');
20035
20036 if (keyfile_pos == NULL) return (PARSER_SALT_LENGTH);
20037
20038 keyfile_pos++;
20039
20040 u32 real_keyfile_len = input_len - (keyfile_pos - input_buf);
20041
20042 if (real_keyfile_len != 64) return (PARSER_SALT_LENGTH);
20043
20044 keepass->keyfile[0] = hex_to_u32 ((const u8 *) &keyfile_pos[ 0]);
20045 keepass->keyfile[1] = hex_to_u32 ((const u8 *) &keyfile_pos[ 8]);
20046 keepass->keyfile[2] = hex_to_u32 ((const u8 *) &keyfile_pos[16]);
20047 keepass->keyfile[3] = hex_to_u32 ((const u8 *) &keyfile_pos[24]);
20048 keepass->keyfile[4] = hex_to_u32 ((const u8 *) &keyfile_pos[32]);
20049 keepass->keyfile[5] = hex_to_u32 ((const u8 *) &keyfile_pos[40]);
20050 keepass->keyfile[6] = hex_to_u32 ((const u8 *) &keyfile_pos[48]);
20051 keepass->keyfile[7] = hex_to_u32 ((const u8 *) &keyfile_pos[56]);
20052 }
20053
20054 digest[0] = keepass->enc_iv[0];
20055 digest[1] = keepass->enc_iv[1];
20056 digest[2] = keepass->enc_iv[2];
20057 digest[3] = keepass->enc_iv[3];
20058
20059 salt->salt_buf[0] = keepass->transf_random_seed[0];
20060 salt->salt_buf[1] = keepass->transf_random_seed[1];
20061 salt->salt_buf[2] = keepass->transf_random_seed[2];
20062 salt->salt_buf[3] = keepass->transf_random_seed[3];
20063 salt->salt_buf[4] = keepass->transf_random_seed[4];
20064 salt->salt_buf[5] = keepass->transf_random_seed[5];
20065 salt->salt_buf[6] = keepass->transf_random_seed[6];
20066 salt->salt_buf[7] = keepass->transf_random_seed[7];
20067
20068 return (PARSER_OK);
20069 }
20070
20071 int cf10_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
20072 {
20073 if ((input_len < DISPLAY_LEN_MIN_12600) || (input_len > DISPLAY_LEN_MAX_12600)) return (PARSER_GLOBAL_LENGTH);
20074
20075 u32 *digest = (u32 *) hash_buf->digest;
20076
20077 salt_t *salt = hash_buf->salt;
20078
20079 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
20080 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
20081 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
20082 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
20083 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
20084 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
20085 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
20086 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
20087
20088 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
20089
20090 uint salt_len = input_len - 64 - 1;
20091
20092 char *salt_buf = input_buf + 64 + 1;
20093
20094 char *salt_buf_ptr = (char *) salt->salt_buf;
20095
20096 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
20097
20098 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
20099
20100 salt->salt_len = salt_len;
20101
20102 /**
20103 * we can precompute the first sha256 transform
20104 */
20105
20106 uint w[16] = { 0 };
20107
20108 w[ 0] = byte_swap_32 (salt->salt_buf[ 0]);
20109 w[ 1] = byte_swap_32 (salt->salt_buf[ 1]);
20110 w[ 2] = byte_swap_32 (salt->salt_buf[ 2]);
20111 w[ 3] = byte_swap_32 (salt->salt_buf[ 3]);
20112 w[ 4] = byte_swap_32 (salt->salt_buf[ 4]);
20113 w[ 5] = byte_swap_32 (salt->salt_buf[ 5]);
20114 w[ 6] = byte_swap_32 (salt->salt_buf[ 6]);
20115 w[ 7] = byte_swap_32 (salt->salt_buf[ 7]);
20116 w[ 8] = byte_swap_32 (salt->salt_buf[ 8]);
20117 w[ 9] = byte_swap_32 (salt->salt_buf[ 9]);
20118 w[10] = byte_swap_32 (salt->salt_buf[10]);
20119 w[11] = byte_swap_32 (salt->salt_buf[11]);
20120 w[12] = byte_swap_32 (salt->salt_buf[12]);
20121 w[13] = byte_swap_32 (salt->salt_buf[13]);
20122 w[14] = byte_swap_32 (salt->salt_buf[14]);
20123 w[15] = byte_swap_32 (salt->salt_buf[15]);
20124
20125 uint pc256[8] = { SHA256M_A, SHA256M_B, SHA256M_C, SHA256M_D, SHA256M_E, SHA256M_F, SHA256M_G, SHA256M_H };
20126
20127 sha256_64 (w, pc256);
20128
20129 salt->salt_buf_pc[0] = pc256[0];
20130 salt->salt_buf_pc[1] = pc256[1];
20131 salt->salt_buf_pc[2] = pc256[2];
20132 salt->salt_buf_pc[3] = pc256[3];
20133 salt->salt_buf_pc[4] = pc256[4];
20134 salt->salt_buf_pc[5] = pc256[5];
20135 salt->salt_buf_pc[6] = pc256[6];
20136 salt->salt_buf_pc[7] = pc256[7];
20137
20138 digest[0] -= pc256[0];
20139 digest[1] -= pc256[1];
20140 digest[2] -= pc256[2];
20141 digest[3] -= pc256[3];
20142 digest[4] -= pc256[4];
20143 digest[5] -= pc256[5];
20144 digest[6] -= pc256[6];
20145 digest[7] -= pc256[7];
20146
20147 return (PARSER_OK);
20148 }
20149
20150 int mywallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
20151 {
20152 if ((input_len < DISPLAY_LEN_MIN_12700) || (input_len > DISPLAY_LEN_MAX_12700)) return (PARSER_GLOBAL_LENGTH);
20153
20154 if (memcmp (SIGNATURE_MYWALLET, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
20155
20156 u32 *digest = (u32 *) hash_buf->digest;
20157
20158 salt_t *salt = hash_buf->salt;
20159
20160 /**
20161 * parse line
20162 */
20163
20164 char *data_len_pos = input_buf + 1 + 10 + 1;
20165
20166 char *data_buf_pos = strchr (data_len_pos, '$');
20167
20168 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20169
20170 u32 data_len_len = data_buf_pos - data_len_pos;
20171
20172 if (data_len_len < 1) return (PARSER_SALT_LENGTH);
20173 if (data_len_len > 5) return (PARSER_SALT_LENGTH);
20174
20175 data_buf_pos++;
20176
20177 u32 data_buf_len = input_len - 1 - 10 - 1 - data_len_len - 1;
20178
20179 if (data_buf_len < 64) return (PARSER_HASH_LENGTH);
20180
20181 if (data_buf_len % 16) return (PARSER_HASH_LENGTH);
20182
20183 u32 data_len = atoi (data_len_pos);
20184
20185 if ((data_len * 2) != data_buf_len) return (PARSER_HASH_LENGTH);
20186
20187 /**
20188 * salt
20189 */
20190
20191 char *salt_pos = data_buf_pos;
20192
20193 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
20194 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
20195 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
20196 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
20197
20198 // this is actually the CT, which is also the hash later (if matched)
20199
20200 salt->salt_buf[4] = hex_to_u32 ((const u8 *) &salt_pos[32]);
20201 salt->salt_buf[5] = hex_to_u32 ((const u8 *) &salt_pos[40]);
20202 salt->salt_buf[6] = hex_to_u32 ((const u8 *) &salt_pos[48]);
20203 salt->salt_buf[7] = hex_to_u32 ((const u8 *) &salt_pos[56]);
20204
20205 salt->salt_len = 32; // note we need to fix this to 16 in kernel
20206
20207 salt->salt_iter = 10 - 1;
20208
20209 /**
20210 * digest buf
20211 */
20212
20213 digest[0] = salt->salt_buf[4];
20214 digest[1] = salt->salt_buf[5];
20215 digest[2] = salt->salt_buf[6];
20216 digest[3] = salt->salt_buf[7];
20217
20218 return (PARSER_OK);
20219 }
20220
20221 int ms_drsr_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
20222 {
20223 if ((input_len < DISPLAY_LEN_MIN_12800) || (input_len > DISPLAY_LEN_MAX_12800)) return (PARSER_GLOBAL_LENGTH);
20224
20225 if (memcmp (SIGNATURE_MS_DRSR, input_buf, 11)) return (PARSER_SIGNATURE_UNMATCHED);
20226
20227 u32 *digest = (u32 *) hash_buf->digest;
20228
20229 salt_t *salt = hash_buf->salt;
20230
20231 /**
20232 * parse line
20233 */
20234
20235 char *salt_pos = input_buf + 11 + 1;
20236
20237 char *iter_pos = strchr (salt_pos, ',');
20238
20239 if (iter_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20240
20241 u32 salt_len = iter_pos - salt_pos;
20242
20243 if (salt_len != 20) return (PARSER_SALT_LENGTH);
20244
20245 iter_pos++;
20246
20247 char *hash_pos = strchr (iter_pos, ',');
20248
20249 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20250
20251 u32 iter_len = hash_pos - iter_pos;
20252
20253 if (iter_len > 5) return (PARSER_SALT_LENGTH);
20254
20255 hash_pos++;
20256
20257 u32 hash_len = input_len - 11 - 1 - salt_len - 1 - iter_len - 1;
20258
20259 if (hash_len != 64) return (PARSER_HASH_LENGTH);
20260
20261 /**
20262 * salt
20263 */
20264
20265 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
20266 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
20267 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]) & 0xffff0000;
20268 salt->salt_buf[3] = 0x00018000;
20269
20270 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
20271 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
20272 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
20273 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
20274
20275 salt->salt_len = salt_len / 2;
20276
20277 salt->salt_iter = atoi (iter_pos) - 1;
20278
20279 /**
20280 * digest buf
20281 */
20282
20283 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
20284 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
20285 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
20286 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
20287 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
20288 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
20289 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
20290 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
20291
20292 return (PARSER_OK);
20293 }
20294
20295 int androidfde_samsung_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
20296 {
20297 if ((input_len < DISPLAY_LEN_MIN_12900) || (input_len > DISPLAY_LEN_MAX_12900)) return (PARSER_GLOBAL_LENGTH);
20298
20299 u32 *digest = (u32 *) hash_buf->digest;
20300
20301 salt_t *salt = hash_buf->salt;
20302
20303 /**
20304 * parse line
20305 */
20306
20307 char *hash_pos = input_buf + 64;
20308 char *salt1_pos = input_buf + 128;
20309 char *salt2_pos = input_buf;
20310
20311 /**
20312 * salt
20313 */
20314
20315 salt->salt_buf[ 0] = hex_to_u32 ((const u8 *) &salt1_pos[ 0]);
20316 salt->salt_buf[ 1] = hex_to_u32 ((const u8 *) &salt1_pos[ 8]);
20317 salt->salt_buf[ 2] = hex_to_u32 ((const u8 *) &salt1_pos[16]);
20318 salt->salt_buf[ 3] = hex_to_u32 ((const u8 *) &salt1_pos[24]);
20319
20320 salt->salt_buf[ 4] = hex_to_u32 ((const u8 *) &salt2_pos[ 0]);
20321 salt->salt_buf[ 5] = hex_to_u32 ((const u8 *) &salt2_pos[ 8]);
20322 salt->salt_buf[ 6] = hex_to_u32 ((const u8 *) &salt2_pos[16]);
20323 salt->salt_buf[ 7] = hex_to_u32 ((const u8 *) &salt2_pos[24]);
20324
20325 salt->salt_buf[ 8] = hex_to_u32 ((const u8 *) &salt2_pos[32]);
20326 salt->salt_buf[ 9] = hex_to_u32 ((const u8 *) &salt2_pos[40]);
20327 salt->salt_buf[10] = hex_to_u32 ((const u8 *) &salt2_pos[48]);
20328 salt->salt_buf[11] = hex_to_u32 ((const u8 *) &salt2_pos[56]);
20329
20330 salt->salt_len = 48;
20331
20332 salt->salt_iter = ROUNDS_ANDROIDFDE_SAMSUNG - 1;
20333
20334 /**
20335 * digest buf
20336 */
20337
20338 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
20339 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
20340 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
20341 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
20342 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
20343 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
20344 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
20345 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
20346
20347 return (PARSER_OK);
20348 }
20349
20350 int zip2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
20351 {
20352 if ((input_len < DISPLAY_LEN_MIN_13600) || (input_len > DISPLAY_LEN_MAX_13600)) return (PARSER_GLOBAL_LENGTH);
20353
20354 if (memcmp (SIGNATURE_ZIP2_START, input_buf , 6)) return (PARSER_SIGNATURE_UNMATCHED);
20355 if (memcmp (SIGNATURE_ZIP2_STOP , input_buf + input_len - 7, 7)) return (PARSER_SIGNATURE_UNMATCHED);
20356
20357 u32 *digest = (u32 *) hash_buf->digest;
20358
20359 salt_t *salt = hash_buf->salt;
20360
20361 zip2_t *zip2 = (zip2_t *) hash_buf->esalt;
20362
20363 /**
20364 * parse line
20365 */
20366
20367 char *param0_pos = input_buf + 6 + 1;
20368
20369 char *param1_pos = strchr (param0_pos, '*');
20370
20371 if (param1_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20372
20373 u32 param0_len = param1_pos - param0_pos;
20374
20375 param1_pos++;
20376
20377 char *param2_pos = strchr (param1_pos, '*');
20378
20379 if (param2_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20380
20381 u32 param1_len = param2_pos - param1_pos;
20382
20383 param2_pos++;
20384
20385 char *param3_pos = strchr (param2_pos, '*');
20386
20387 if (param3_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20388
20389 u32 param2_len = param3_pos - param2_pos;
20390
20391 param3_pos++;
20392
20393 char *param4_pos = strchr (param3_pos, '*');
20394
20395 if (param4_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20396
20397 u32 param3_len = param4_pos - param3_pos;
20398
20399 param4_pos++;
20400
20401 char *param5_pos = strchr (param4_pos, '*');
20402
20403 if (param5_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20404
20405 u32 param4_len = param5_pos - param4_pos;
20406
20407 param5_pos++;
20408
20409 char *param6_pos = strchr (param5_pos, '*');
20410
20411 if (param6_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20412
20413 u32 param5_len = param6_pos - param5_pos;
20414
20415 param6_pos++;
20416
20417 char *param7_pos = strchr (param6_pos, '*');
20418
20419 if (param7_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20420
20421 u32 param6_len = param7_pos - param6_pos;
20422
20423 param7_pos++;
20424
20425 char *param8_pos = strchr (param7_pos, '*');
20426
20427 if (param8_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20428
20429 u32 param7_len = param8_pos - param7_pos;
20430
20431 param8_pos++;
20432
20433 const uint type = atoi (param0_pos);
20434 const uint mode = atoi (param1_pos);
20435 const uint magic = atoi (param2_pos);
20436
20437 char *salt_buf = param3_pos;
20438
20439 uint verify_bytes; sscanf (param4_pos, "%4x*", &verify_bytes);
20440
20441 const uint compress_length = atoi (param5_pos);
20442
20443 char *data_buf = param6_pos;
20444 char *auth = param7_pos;
20445
20446 /**
20447 * verify some data
20448 */
20449
20450 if (param0_len != 1) return (PARSER_SALT_VALUE);
20451
20452 if (param1_len != 1) return (PARSER_SALT_VALUE);
20453
20454 if (param2_len != 1) return (PARSER_SALT_VALUE);
20455
20456 if ((param3_len != 16) && (param3_len != 24) && (param3_len != 32)) return (PARSER_SALT_VALUE);
20457
20458 if (param4_len >= 5) return (PARSER_SALT_VALUE);
20459
20460 if (param5_len >= 5) return (PARSER_SALT_VALUE);
20461
20462 if (param6_len >= 8192) return (PARSER_SALT_VALUE);
20463
20464 if (param6_len & 1) return (PARSER_SALT_VALUE);
20465
20466 if (param7_len != 20) return (PARSER_SALT_VALUE);
20467
20468 if (type != 0) return (PARSER_SALT_VALUE);
20469
20470 if ((mode != 1) && (mode != 2) && (mode != 3)) return (PARSER_SALT_VALUE);
20471
20472 if (magic != 0) return (PARSER_SALT_VALUE);
20473
20474 if (verify_bytes >= 0x10000) return (PARSER_SALT_VALUE);
20475
20476 /**
20477 * store data
20478 */
20479
20480 zip2->type = type;
20481 zip2->mode = mode;
20482 zip2->magic = magic;
20483
20484 if (mode == 1)
20485 {
20486 zip2->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
20487 zip2->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
20488 zip2->salt_buf[2] = 0;
20489 zip2->salt_buf[3] = 0;
20490
20491 zip2->salt_len = 8;
20492 }
20493 else if (mode == 2)
20494 {
20495 zip2->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
20496 zip2->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
20497 zip2->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
20498 zip2->salt_buf[3] = 0;
20499
20500 zip2->salt_len = 12;
20501 }
20502 else if (mode == 3)
20503 {
20504 zip2->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
20505 zip2->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
20506 zip2->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
20507 zip2->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf[24]);
20508
20509 zip2->salt_len = 16;
20510 }
20511
20512 zip2->salt_buf[0] = byte_swap_32 (zip2->salt_buf[0]);
20513 zip2->salt_buf[1] = byte_swap_32 (zip2->salt_buf[1]);
20514 zip2->salt_buf[2] = byte_swap_32 (zip2->salt_buf[2]);
20515 zip2->salt_buf[3] = byte_swap_32 (zip2->salt_buf[3]);
20516
20517 zip2->verify_bytes = verify_bytes;
20518
20519 zip2->compress_length = compress_length;
20520
20521 char *data_buf_ptr = (char *) zip2->data_buf;
20522
20523 for (uint i = 0; i < param6_len; i += 2)
20524 {
20525 const char p0 = data_buf[i + 0];
20526 const char p1 = data_buf[i + 1];
20527
20528 *data_buf_ptr++ = hex_convert (p1) << 0
20529 | hex_convert (p0) << 4;
20530
20531 zip2->data_len++;
20532 }
20533
20534 *data_buf_ptr = 0x80;
20535
20536 char *auth_ptr = (char *) zip2->auth_buf;
20537
20538 for (uint i = 0; i < param7_len; i += 2)
20539 {
20540 const char p0 = auth[i + 0];
20541 const char p1 = auth[i + 1];
20542
20543 *auth_ptr++ = hex_convert (p1) << 0
20544 | hex_convert (p0) << 4;
20545
20546 zip2->auth_len++;
20547 }
20548
20549 /**
20550 * salt buf (fake)
20551 */
20552
20553 salt->salt_buf[0] = zip2->salt_buf[0];
20554 salt->salt_buf[1] = zip2->salt_buf[1];
20555 salt->salt_buf[2] = zip2->salt_buf[2];
20556 salt->salt_buf[3] = zip2->salt_buf[3];
20557 salt->salt_buf[4] = zip2->data_buf[0];
20558 salt->salt_buf[5] = zip2->data_buf[1];
20559 salt->salt_buf[6] = zip2->data_buf[2];
20560 salt->salt_buf[7] = zip2->data_buf[3];
20561
20562 salt->salt_len = 32;
20563
20564 salt->salt_iter = ROUNDS_ZIP2 - 1;
20565
20566 /**
20567 * digest buf (fake)
20568 */
20569
20570 digest[0] = zip2->auth_buf[0];
20571 digest[1] = zip2->auth_buf[1];
20572 digest[2] = zip2->auth_buf[2];
20573 digest[3] = zip2->auth_buf[3];
20574
20575 return (PARSER_OK);
20576 }
20577
20578 /**
20579 * parallel running threads
20580 */
20581
20582 #ifdef WIN
20583
20584 BOOL WINAPI sigHandler_default (DWORD sig)
20585 {
20586 switch (sig)
20587 {
20588 case CTRL_CLOSE_EVENT:
20589
20590 /*
20591 * special case see: https://stackoverflow.com/questions/3640633/c-setconsolectrlhandler-routine-issue/5610042#5610042
20592 * if the user interacts w/ the user-interface (GUI/cmd), we need to do the finalization job within this signal handler
20593 * function otherwise it is too late (e.g. after returning from this function)
20594 */
20595
20596 myabort ();
20597
20598 SetConsoleCtrlHandler (NULL, TRUE);
20599
20600 hc_sleep (10);
20601
20602 return TRUE;
20603
20604 case CTRL_C_EVENT:
20605 case CTRL_LOGOFF_EVENT:
20606 case CTRL_SHUTDOWN_EVENT:
20607
20608 myabort ();
20609
20610 SetConsoleCtrlHandler (NULL, TRUE);
20611
20612 return TRUE;
20613 }
20614
20615 return FALSE;
20616 }
20617
20618 BOOL WINAPI sigHandler_benchmark (DWORD sig)
20619 {
20620 switch (sig)
20621 {
20622 case CTRL_CLOSE_EVENT:
20623
20624 myabort ();
20625
20626 SetConsoleCtrlHandler (NULL, TRUE);
20627
20628 hc_sleep (10);
20629
20630 return TRUE;
20631
20632 case CTRL_C_EVENT:
20633 case CTRL_LOGOFF_EVENT:
20634 case CTRL_SHUTDOWN_EVENT:
20635
20636 myquit ();
20637
20638 SetConsoleCtrlHandler (NULL, TRUE);
20639
20640 return TRUE;
20641 }
20642
20643 return FALSE;
20644 }
20645
20646 void hc_signal (BOOL WINAPI (callback) (DWORD))
20647 {
20648 if (callback == NULL)
20649 {
20650 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, FALSE);
20651 }
20652 else
20653 {
20654 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, TRUE);
20655 }
20656 }
20657
20658 #else
20659
20660 void sigHandler_default (int sig)
20661 {
20662 myabort ();
20663
20664 signal (sig, NULL);
20665 }
20666
20667 void sigHandler_benchmark (int sig)
20668 {
20669 myquit ();
20670
20671 signal (sig, NULL);
20672 }
20673
20674 void hc_signal (void (callback) (int))
20675 {
20676 if (callback == NULL) callback = SIG_DFL;
20677
20678 signal (SIGINT, callback);
20679 signal (SIGTERM, callback);
20680 signal (SIGABRT, callback);
20681 }
20682
20683 #endif
20684
20685 void status_display ();
20686
20687 void *thread_keypress (void *p)
20688 {
20689 int benchmark = *((int *) p);
20690
20691 uint quiet = data.quiet;
20692
20693 tty_break();
20694
20695 while ((data.devices_status != STATUS_EXHAUSTED) && (data.devices_status != STATUS_CRACKED) && (data.devices_status != STATUS_ABORTED) && (data.devices_status != STATUS_QUIT))
20696 {
20697 int ch = tty_getchar();
20698
20699 if (ch == -1) break;
20700
20701 if (ch == 0) continue;
20702
20703 //https://github.com/hashcat/hashcat/issues/302
20704 //#ifdef _POSIX
20705 //if (ch != '\n')
20706 //#endif
20707
20708 hc_thread_mutex_lock (mux_display);
20709
20710 log_info ("");
20711
20712 switch (ch)
20713 {
20714 case 's':
20715 case '\r':
20716 case '\n':
20717
20718 log_info ("");
20719
20720 status_display ();
20721
20722 log_info ("");
20723
20724 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
20725 if (quiet == 0) fflush (stdout);
20726
20727 break;
20728
20729 case 'b':
20730
20731 log_info ("");
20732
20733 bypass ();
20734
20735 log_info ("");
20736
20737 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
20738 if (quiet == 0) fflush (stdout);
20739
20740 break;
20741
20742 case 'p':
20743
20744 log_info ("");
20745
20746 SuspendThreads ();
20747
20748 log_info ("");
20749
20750 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
20751 if (quiet == 0) fflush (stdout);
20752
20753 break;
20754
20755 case 'r':
20756
20757 log_info ("");
20758
20759 ResumeThreads ();
20760
20761 log_info ("");
20762
20763 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
20764 if (quiet == 0) fflush (stdout);
20765
20766 break;
20767
20768 case 'c':
20769
20770 log_info ("");
20771
20772 if (benchmark == 1) break;
20773
20774 stop_at_checkpoint ();
20775
20776 log_info ("");
20777
20778 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
20779 if (quiet == 0) fflush (stdout);
20780
20781 break;
20782
20783 case 'q':
20784
20785 log_info ("");
20786
20787 if (benchmark == 1)
20788 {
20789 myquit ();
20790 }
20791 else
20792 {
20793 myabort ();
20794 }
20795
20796 break;
20797 }
20798
20799 //https://github.com/hashcat/hashcat/issues/302
20800 //#ifdef _POSIX
20801 //if (ch != '\n')
20802 //#endif
20803
20804 hc_thread_mutex_unlock (mux_display);
20805 }
20806
20807 tty_fix();
20808
20809 return (p);
20810 }
20811
20812 /**
20813 * rules common
20814 */
20815
20816 bool class_num (const u8 c)
20817 {
20818 return ((c >= '0') && (c <= '9'));
20819 }
20820
20821 bool class_lower (const u8 c)
20822 {
20823 return ((c >= 'a') && (c <= 'z'));
20824 }
20825
20826 bool class_upper (const u8 c)
20827 {
20828 return ((c >= 'A') && (c <= 'Z'));
20829 }
20830
20831 bool class_alpha (const u8 c)
20832 {
20833 return (class_lower (c) || class_upper (c));
20834 }
20835
20836 int conv_ctoi (const u8 c)
20837 {
20838 if (class_num (c))
20839 {
20840 return c - '0';
20841 }
20842 else if (class_upper (c))
20843 {
20844 return c - 'A' + 10;
20845 }
20846
20847 return -1;
20848 }
20849
20850 int conv_itoc (const u8 c)
20851 {
20852 if (c < 10)
20853 {
20854 return c + '0';
20855 }
20856 else if (c < 37)
20857 {
20858 return c + 'A' - 10;
20859 }
20860
20861 return -1;
20862 }
20863
20864 /**
20865 * device rules
20866 */
20867
20868 #define INCR_POS if (++rule_pos == rule_len) return (-1)
20869 #define SET_NAME(rule,val) (rule)->cmds[rule_cnt] = ((val) & 0xff) << 0
20870 #define SET_P0(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 8
20871 #define SET_P1(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 16
20872 #define MAX_KERNEL_RULES 255
20873 #define GET_NAME(rule) rule_cmd = (((rule)->cmds[rule_cnt] >> 0) & 0xff)
20874 #define GET_P0(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 8) & 0xff)
20875 #define GET_P1(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 16) & 0xff)
20876
20877 #define SET_P0_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 8
20878 #define SET_P1_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 16
20879 #define GET_P0_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 8) & 0xff)
20880 #define GET_P1_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 16) & 0xff)
20881
20882 int cpu_rule_to_kernel_rule (char *rule_buf, uint rule_len, kernel_rule_t *rule)
20883 {
20884 uint rule_pos;
20885 uint rule_cnt;
20886
20887 for (rule_pos = 0, rule_cnt = 0; rule_pos < rule_len && rule_cnt < MAX_KERNEL_RULES; rule_pos++, rule_cnt++)
20888 {
20889 switch (rule_buf[rule_pos])
20890 {
20891 case ' ':
20892 rule_cnt--;
20893 break;
20894
20895 case RULE_OP_MANGLE_NOOP:
20896 SET_NAME (rule, rule_buf[rule_pos]);
20897 break;
20898
20899 case RULE_OP_MANGLE_LREST:
20900 SET_NAME (rule, rule_buf[rule_pos]);
20901 break;
20902
20903 case RULE_OP_MANGLE_UREST:
20904 SET_NAME (rule, rule_buf[rule_pos]);
20905 break;
20906
20907 case RULE_OP_MANGLE_LREST_UFIRST:
20908 SET_NAME (rule, rule_buf[rule_pos]);
20909 break;
20910
20911 case RULE_OP_MANGLE_UREST_LFIRST:
20912 SET_NAME (rule, rule_buf[rule_pos]);
20913 break;
20914
20915 case RULE_OP_MANGLE_TREST:
20916 SET_NAME (rule, rule_buf[rule_pos]);
20917 break;
20918
20919 case RULE_OP_MANGLE_TOGGLE_AT:
20920 SET_NAME (rule, rule_buf[rule_pos]);
20921 SET_P0_CONV (rule, rule_buf[rule_pos]);
20922 break;
20923
20924 case RULE_OP_MANGLE_REVERSE:
20925 SET_NAME (rule, rule_buf[rule_pos]);
20926 break;
20927
20928 case RULE_OP_MANGLE_DUPEWORD:
20929 SET_NAME (rule, rule_buf[rule_pos]);
20930 break;
20931
20932 case RULE_OP_MANGLE_DUPEWORD_TIMES:
20933 SET_NAME (rule, rule_buf[rule_pos]);
20934 SET_P0_CONV (rule, rule_buf[rule_pos]);
20935 break;
20936
20937 case RULE_OP_MANGLE_REFLECT:
20938 SET_NAME (rule, rule_buf[rule_pos]);
20939 break;
20940
20941 case RULE_OP_MANGLE_ROTATE_LEFT:
20942 SET_NAME (rule, rule_buf[rule_pos]);
20943 break;
20944
20945 case RULE_OP_MANGLE_ROTATE_RIGHT:
20946 SET_NAME (rule, rule_buf[rule_pos]);
20947 break;
20948
20949 case RULE_OP_MANGLE_APPEND:
20950 SET_NAME (rule, rule_buf[rule_pos]);
20951 SET_P0 (rule, rule_buf[rule_pos]);
20952 break;
20953
20954 case RULE_OP_MANGLE_PREPEND:
20955 SET_NAME (rule, rule_buf[rule_pos]);
20956 SET_P0 (rule, rule_buf[rule_pos]);
20957 break;
20958
20959 case RULE_OP_MANGLE_DELETE_FIRST:
20960 SET_NAME (rule, rule_buf[rule_pos]);
20961 break;
20962
20963 case RULE_OP_MANGLE_DELETE_LAST:
20964 SET_NAME (rule, rule_buf[rule_pos]);
20965 break;
20966
20967 case RULE_OP_MANGLE_DELETE_AT:
20968 SET_NAME (rule, rule_buf[rule_pos]);
20969 SET_P0_CONV (rule, rule_buf[rule_pos]);
20970 break;
20971
20972 case RULE_OP_MANGLE_EXTRACT:
20973 SET_NAME (rule, rule_buf[rule_pos]);
20974 SET_P0_CONV (rule, rule_buf[rule_pos]);
20975 SET_P1_CONV (rule, rule_buf[rule_pos]);
20976 break;
20977
20978 case RULE_OP_MANGLE_OMIT:
20979 SET_NAME (rule, rule_buf[rule_pos]);
20980 SET_P0_CONV (rule, rule_buf[rule_pos]);
20981 SET_P1_CONV (rule, rule_buf[rule_pos]);
20982 break;
20983
20984 case RULE_OP_MANGLE_INSERT:
20985 SET_NAME (rule, rule_buf[rule_pos]);
20986 SET_P0_CONV (rule, rule_buf[rule_pos]);
20987 SET_P1 (rule, rule_buf[rule_pos]);
20988 break;
20989
20990 case RULE_OP_MANGLE_OVERSTRIKE:
20991 SET_NAME (rule, rule_buf[rule_pos]);
20992 SET_P0_CONV (rule, rule_buf[rule_pos]);
20993 SET_P1 (rule, rule_buf[rule_pos]);
20994 break;
20995
20996 case RULE_OP_MANGLE_TRUNCATE_AT:
20997 SET_NAME (rule, rule_buf[rule_pos]);
20998 SET_P0_CONV (rule, rule_buf[rule_pos]);
20999 break;
21000
21001 case RULE_OP_MANGLE_REPLACE:
21002 SET_NAME (rule, rule_buf[rule_pos]);
21003 SET_P0 (rule, rule_buf[rule_pos]);
21004 SET_P1 (rule, rule_buf[rule_pos]);
21005 break;
21006
21007 case RULE_OP_MANGLE_PURGECHAR:
21008 return (-1);
21009 break;
21010
21011 case RULE_OP_MANGLE_TOGGLECASE_REC:
21012 return (-1);
21013 break;
21014
21015 case RULE_OP_MANGLE_DUPECHAR_FIRST:
21016 SET_NAME (rule, rule_buf[rule_pos]);
21017 SET_P0_CONV (rule, rule_buf[rule_pos]);
21018 break;
21019
21020 case RULE_OP_MANGLE_DUPECHAR_LAST:
21021 SET_NAME (rule, rule_buf[rule_pos]);
21022 SET_P0_CONV (rule, rule_buf[rule_pos]);
21023 break;
21024
21025 case RULE_OP_MANGLE_DUPECHAR_ALL:
21026 SET_NAME (rule, rule_buf[rule_pos]);
21027 break;
21028
21029 case RULE_OP_MANGLE_SWITCH_FIRST:
21030 SET_NAME (rule, rule_buf[rule_pos]);
21031 break;
21032
21033 case RULE_OP_MANGLE_SWITCH_LAST:
21034 SET_NAME (rule, rule_buf[rule_pos]);
21035 break;
21036
21037 case RULE_OP_MANGLE_SWITCH_AT:
21038 SET_NAME (rule, rule_buf[rule_pos]);
21039 SET_P0_CONV (rule, rule_buf[rule_pos]);
21040 SET_P1_CONV (rule, rule_buf[rule_pos]);
21041 break;
21042
21043 case RULE_OP_MANGLE_CHR_SHIFTL:
21044 SET_NAME (rule, rule_buf[rule_pos]);
21045 SET_P0_CONV (rule, rule_buf[rule_pos]);
21046 break;
21047
21048 case RULE_OP_MANGLE_CHR_SHIFTR:
21049 SET_NAME (rule, rule_buf[rule_pos]);
21050 SET_P0_CONV (rule, rule_buf[rule_pos]);
21051 break;
21052
21053 case RULE_OP_MANGLE_CHR_INCR:
21054 SET_NAME (rule, rule_buf[rule_pos]);
21055 SET_P0_CONV (rule, rule_buf[rule_pos]);
21056 break;
21057
21058 case RULE_OP_MANGLE_CHR_DECR:
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_REPLACE_NP1:
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_REPLACE_NM1:
21069 SET_NAME (rule, rule_buf[rule_pos]);
21070 SET_P0_CONV (rule, rule_buf[rule_pos]);
21071 break;
21072
21073 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
21074 SET_NAME (rule, rule_buf[rule_pos]);
21075 SET_P0_CONV (rule, rule_buf[rule_pos]);
21076 break;
21077
21078 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
21079 SET_NAME (rule, rule_buf[rule_pos]);
21080 SET_P0_CONV (rule, rule_buf[rule_pos]);
21081 break;
21082
21083 case RULE_OP_MANGLE_TITLE:
21084 SET_NAME (rule, rule_buf[rule_pos]);
21085 break;
21086
21087 default:
21088 return (-1);
21089 break;
21090 }
21091 }
21092
21093 if (rule_pos < rule_len) return (-1);
21094
21095 return (0);
21096 }
21097
21098 int kernel_rule_to_cpu_rule (char *rule_buf, kernel_rule_t *rule)
21099 {
21100 uint rule_cnt;
21101 uint rule_pos;
21102 uint rule_len = HCBUFSIZ - 1; // maximum possible len
21103
21104 char rule_cmd;
21105
21106 for (rule_cnt = 0, rule_pos = 0; rule_pos < rule_len && rule_cnt < MAX_KERNEL_RULES; rule_pos++, rule_cnt++)
21107 {
21108 GET_NAME (rule);
21109
21110 if (rule_cnt > 0) rule_buf[rule_pos++] = ' ';
21111
21112 switch (rule_cmd)
21113 {
21114 case RULE_OP_MANGLE_NOOP:
21115 rule_buf[rule_pos] = rule_cmd;
21116 break;
21117
21118 case RULE_OP_MANGLE_LREST:
21119 rule_buf[rule_pos] = rule_cmd;
21120 break;
21121
21122 case RULE_OP_MANGLE_UREST:
21123 rule_buf[rule_pos] = rule_cmd;
21124 break;
21125
21126 case RULE_OP_MANGLE_LREST_UFIRST:
21127 rule_buf[rule_pos] = rule_cmd;
21128 break;
21129
21130 case RULE_OP_MANGLE_UREST_LFIRST:
21131 rule_buf[rule_pos] = rule_cmd;
21132 break;
21133
21134 case RULE_OP_MANGLE_TREST:
21135 rule_buf[rule_pos] = rule_cmd;
21136 break;
21137
21138 case RULE_OP_MANGLE_TOGGLE_AT:
21139 rule_buf[rule_pos] = rule_cmd;
21140 GET_P0_CONV (rule);
21141 break;
21142
21143 case RULE_OP_MANGLE_REVERSE:
21144 rule_buf[rule_pos] = rule_cmd;
21145 break;
21146
21147 case RULE_OP_MANGLE_DUPEWORD:
21148 rule_buf[rule_pos] = rule_cmd;
21149 break;
21150
21151 case RULE_OP_MANGLE_DUPEWORD_TIMES:
21152 rule_buf[rule_pos] = rule_cmd;
21153 GET_P0_CONV (rule);
21154 break;
21155
21156 case RULE_OP_MANGLE_REFLECT:
21157 rule_buf[rule_pos] = rule_cmd;
21158 break;
21159
21160 case RULE_OP_MANGLE_ROTATE_LEFT:
21161 rule_buf[rule_pos] = rule_cmd;
21162 break;
21163
21164 case RULE_OP_MANGLE_ROTATE_RIGHT:
21165 rule_buf[rule_pos] = rule_cmd;
21166 break;
21167
21168 case RULE_OP_MANGLE_APPEND:
21169 rule_buf[rule_pos] = rule_cmd;
21170 GET_P0 (rule);
21171 break;
21172
21173 case RULE_OP_MANGLE_PREPEND:
21174 rule_buf[rule_pos] = rule_cmd;
21175 GET_P0 (rule);
21176 break;
21177
21178 case RULE_OP_MANGLE_DELETE_FIRST:
21179 rule_buf[rule_pos] = rule_cmd;
21180 break;
21181
21182 case RULE_OP_MANGLE_DELETE_LAST:
21183 rule_buf[rule_pos] = rule_cmd;
21184 break;
21185
21186 case RULE_OP_MANGLE_DELETE_AT:
21187 rule_buf[rule_pos] = rule_cmd;
21188 GET_P0_CONV (rule);
21189 break;
21190
21191 case RULE_OP_MANGLE_EXTRACT:
21192 rule_buf[rule_pos] = rule_cmd;
21193 GET_P0_CONV (rule);
21194 GET_P1_CONV (rule);
21195 break;
21196
21197 case RULE_OP_MANGLE_OMIT:
21198 rule_buf[rule_pos] = rule_cmd;
21199 GET_P0_CONV (rule);
21200 GET_P1_CONV (rule);
21201 break;
21202
21203 case RULE_OP_MANGLE_INSERT:
21204 rule_buf[rule_pos] = rule_cmd;
21205 GET_P0_CONV (rule);
21206 GET_P1 (rule);
21207 break;
21208
21209 case RULE_OP_MANGLE_OVERSTRIKE:
21210 rule_buf[rule_pos] = rule_cmd;
21211 GET_P0_CONV (rule);
21212 GET_P1 (rule);
21213 break;
21214
21215 case RULE_OP_MANGLE_TRUNCATE_AT:
21216 rule_buf[rule_pos] = rule_cmd;
21217 GET_P0_CONV (rule);
21218 break;
21219
21220 case RULE_OP_MANGLE_REPLACE:
21221 rule_buf[rule_pos] = rule_cmd;
21222 GET_P0 (rule);
21223 GET_P1 (rule);
21224 break;
21225
21226 case RULE_OP_MANGLE_PURGECHAR:
21227 return (-1);
21228 break;
21229
21230 case RULE_OP_MANGLE_TOGGLECASE_REC:
21231 return (-1);
21232 break;
21233
21234 case RULE_OP_MANGLE_DUPECHAR_FIRST:
21235 rule_buf[rule_pos] = rule_cmd;
21236 GET_P0_CONV (rule);
21237 break;
21238
21239 case RULE_OP_MANGLE_DUPECHAR_LAST:
21240 rule_buf[rule_pos] = rule_cmd;
21241 GET_P0_CONV (rule);
21242 break;
21243
21244 case RULE_OP_MANGLE_DUPECHAR_ALL:
21245 rule_buf[rule_pos] = rule_cmd;
21246 break;
21247
21248 case RULE_OP_MANGLE_SWITCH_FIRST:
21249 rule_buf[rule_pos] = rule_cmd;
21250 break;
21251
21252 case RULE_OP_MANGLE_SWITCH_LAST:
21253 rule_buf[rule_pos] = rule_cmd;
21254 break;
21255
21256 case RULE_OP_MANGLE_SWITCH_AT:
21257 rule_buf[rule_pos] = rule_cmd;
21258 GET_P0_CONV (rule);
21259 GET_P1_CONV (rule);
21260 break;
21261
21262 case RULE_OP_MANGLE_CHR_SHIFTL:
21263 rule_buf[rule_pos] = rule_cmd;
21264 GET_P0_CONV (rule);
21265 break;
21266
21267 case RULE_OP_MANGLE_CHR_SHIFTR:
21268 rule_buf[rule_pos] = rule_cmd;
21269 GET_P0_CONV (rule);
21270 break;
21271
21272 case RULE_OP_MANGLE_CHR_INCR:
21273 rule_buf[rule_pos] = rule_cmd;
21274 GET_P0_CONV (rule);
21275 break;
21276
21277 case RULE_OP_MANGLE_CHR_DECR:
21278 rule_buf[rule_pos] = rule_cmd;
21279 GET_P0_CONV (rule);
21280 break;
21281
21282 case RULE_OP_MANGLE_REPLACE_NP1:
21283 rule_buf[rule_pos] = rule_cmd;
21284 GET_P0_CONV (rule);
21285 break;
21286
21287 case RULE_OP_MANGLE_REPLACE_NM1:
21288 rule_buf[rule_pos] = rule_cmd;
21289 GET_P0_CONV (rule);
21290 break;
21291
21292 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
21293 rule_buf[rule_pos] = rule_cmd;
21294 GET_P0_CONV (rule);
21295 break;
21296
21297 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
21298 rule_buf[rule_pos] = rule_cmd;
21299 GET_P0_CONV (rule);
21300 break;
21301
21302 case RULE_OP_MANGLE_TITLE:
21303 rule_buf[rule_pos] = rule_cmd;
21304 break;
21305
21306 case 0:
21307 return rule_pos - 1;
21308 break;
21309
21310 default:
21311 return (-1);
21312 break;
21313 }
21314 }
21315
21316 if (rule_cnt > 0)
21317 {
21318 return rule_pos;
21319 }
21320
21321 return (-1);
21322 }
21323
21324 /**
21325 * CPU rules : this is from hashcat sources, cpu based rules
21326 */
21327
21328 #define NEXT_RULEPOS(rp) if (++(rp) == rule_len) return (RULE_RC_SYNTAX_ERROR)
21329 #define NEXT_RPTOI(r,rp,up) if (((up) = conv_ctoi ((r)[(rp)])) == -1) return (RULE_RC_SYNTAX_ERROR)
21330
21331 #define MANGLE_TOGGLE_AT(a,p) if (class_alpha ((a)[(p)])) (a)[(p)] ^= 0x20
21332 #define MANGLE_LOWER_AT(a,p) if (class_upper ((a)[(p)])) (a)[(p)] ^= 0x20
21333 #define MANGLE_UPPER_AT(a,p) if (class_lower ((a)[(p)])) (a)[(p)] ^= 0x20
21334
21335 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); arr[(r)] = arr[(l)]; arr[(l)] = c; } */
21336 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); (a)[(r)] = (a)[(l)]; (a)[(l)] = c; } */
21337 #define MANGLE_SWITCH(a,l,r) { char c = (a)[(r)]; (a)[(r)] = (a)[(l)]; (a)[(l)] = c; }
21338
21339 int mangle_lrest (char arr[BLOCK_SIZE], int arr_len)
21340 {
21341 int pos;
21342
21343 for (pos = 0; pos < arr_len; pos++) MANGLE_LOWER_AT (arr, pos);
21344
21345 return (arr_len);
21346 }
21347
21348 int mangle_urest (char arr[BLOCK_SIZE], int arr_len)
21349 {
21350 int pos;
21351
21352 for (pos = 0; pos < arr_len; pos++) MANGLE_UPPER_AT (arr, pos);
21353
21354 return (arr_len);
21355 }
21356
21357 int mangle_trest (char arr[BLOCK_SIZE], int arr_len)
21358 {
21359 int pos;
21360
21361 for (pos = 0; pos < arr_len; pos++) MANGLE_TOGGLE_AT (arr, pos);
21362
21363 return (arr_len);
21364 }
21365
21366 int mangle_reverse (char arr[BLOCK_SIZE], int arr_len)
21367 {
21368 int l;
21369 int r;
21370
21371 for (l = 0; l < arr_len; l++)
21372 {
21373 r = arr_len - 1 - l;
21374
21375 if (l >= r) break;
21376
21377 MANGLE_SWITCH (arr, l, r);
21378 }
21379
21380 return (arr_len);
21381 }
21382
21383 int mangle_double (char arr[BLOCK_SIZE], int arr_len)
21384 {
21385 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
21386
21387 memcpy (&arr[arr_len], arr, (size_t) arr_len);
21388
21389 return (arr_len * 2);
21390 }
21391
21392 int mangle_double_times (char arr[BLOCK_SIZE], int arr_len, int times)
21393 {
21394 if (((arr_len * times) + arr_len) >= BLOCK_SIZE) return (arr_len);
21395
21396 int orig_len = arr_len;
21397
21398 int i;
21399
21400 for (i = 0; i < times; i++)
21401 {
21402 memcpy (&arr[arr_len], arr, orig_len);
21403
21404 arr_len += orig_len;
21405 }
21406
21407 return (arr_len);
21408 }
21409
21410 int mangle_reflect (char arr[BLOCK_SIZE], int arr_len)
21411 {
21412 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
21413
21414 mangle_double (arr, arr_len);
21415
21416 mangle_reverse (arr + arr_len, arr_len);
21417
21418 return (arr_len * 2);
21419 }
21420
21421 int mangle_rotate_left (char arr[BLOCK_SIZE], int arr_len)
21422 {
21423 int l;
21424 int r;
21425
21426 for (l = 0, r = arr_len - 1; r > 0; r--)
21427 {
21428 MANGLE_SWITCH (arr, l, r);
21429 }
21430
21431 return (arr_len);
21432 }
21433
21434 int mangle_rotate_right (char arr[BLOCK_SIZE], int arr_len)
21435 {
21436 int l;
21437 int r;
21438
21439 for (l = 0, r = arr_len - 1; l < r; l++)
21440 {
21441 MANGLE_SWITCH (arr, l, r);
21442 }
21443
21444 return (arr_len);
21445 }
21446
21447 int mangle_append (char arr[BLOCK_SIZE], int arr_len, char c)
21448 {
21449 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
21450
21451 arr[arr_len] = c;
21452
21453 return (arr_len + 1);
21454 }
21455
21456 int mangle_prepend (char arr[BLOCK_SIZE], int arr_len, char c)
21457 {
21458 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
21459
21460 int arr_pos;
21461
21462 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
21463 {
21464 arr[arr_pos + 1] = arr[arr_pos];
21465 }
21466
21467 arr[0] = c;
21468
21469 return (arr_len + 1);
21470 }
21471
21472 int mangle_delete_at (char arr[BLOCK_SIZE], int arr_len, int upos)
21473 {
21474 if (upos >= arr_len) return (arr_len);
21475
21476 int arr_pos;
21477
21478 for (arr_pos = upos; arr_pos < arr_len - 1; arr_pos++)
21479 {
21480 arr[arr_pos] = arr[arr_pos + 1];
21481 }
21482
21483 return (arr_len - 1);
21484 }
21485
21486 int mangle_extract (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
21487 {
21488 if (upos >= arr_len) return (arr_len);
21489
21490 if ((upos + ulen) > arr_len) return (arr_len);
21491
21492 int arr_pos;
21493
21494 for (arr_pos = 0; arr_pos < ulen; arr_pos++)
21495 {
21496 arr[arr_pos] = arr[upos + arr_pos];
21497 }
21498
21499 return (ulen);
21500 }
21501
21502 int mangle_omit (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
21503 {
21504 if (upos >= arr_len) return (arr_len);
21505
21506 if ((upos + ulen) >= arr_len) return (arr_len);
21507
21508 int arr_pos;
21509
21510 for (arr_pos = upos; arr_pos < arr_len - ulen; arr_pos++)
21511 {
21512 arr[arr_pos] = arr[arr_pos + ulen];
21513 }
21514
21515 return (arr_len - ulen);
21516 }
21517
21518 int mangle_insert (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
21519 {
21520 if (upos >= arr_len) return (arr_len);
21521
21522 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
21523
21524 int arr_pos;
21525
21526 for (arr_pos = arr_len - 1; arr_pos > upos - 1; arr_pos--)
21527 {
21528 arr[arr_pos + 1] = arr[arr_pos];
21529 }
21530
21531 arr[upos] = c;
21532
21533 return (arr_len + 1);
21534 }
21535
21536 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)
21537 {
21538 if ((arr_len + arr2_cpy) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
21539
21540 if (arr_pos > arr_len) return (RULE_RC_REJECT_ERROR);
21541
21542 if (arr2_pos > arr2_len) return (RULE_RC_REJECT_ERROR);
21543
21544 if ((arr2_pos + arr2_cpy) > arr2_len) return (RULE_RC_REJECT_ERROR);
21545
21546 if (arr2_cpy < 1) return (RULE_RC_SYNTAX_ERROR);
21547
21548 memcpy (arr2, arr2 + arr2_pos, arr2_len - arr2_pos);
21549
21550 memcpy (arr2 + arr2_cpy, arr + arr_pos, arr_len - arr_pos);
21551
21552 memcpy (arr + arr_pos, arr2, arr_len - arr_pos + arr2_cpy);
21553
21554 return (arr_len + arr2_cpy);
21555 }
21556
21557 int mangle_overstrike (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
21558 {
21559 if (upos >= arr_len) return (arr_len);
21560
21561 arr[upos] = c;
21562
21563 return (arr_len);
21564 }
21565
21566 int mangle_truncate_at (char arr[BLOCK_SIZE], int arr_len, int upos)
21567 {
21568 if (upos >= arr_len) return (arr_len);
21569
21570 memset (arr + upos, 0, arr_len - upos);
21571
21572 return (upos);
21573 }
21574
21575 int mangle_replace (char arr[BLOCK_SIZE], int arr_len, char oldc, char newc)
21576 {
21577 int arr_pos;
21578
21579 for (arr_pos = 0; arr_pos < arr_len; arr_pos++)
21580 {
21581 if (arr[arr_pos] != oldc) continue;
21582
21583 arr[arr_pos] = newc;
21584 }
21585
21586 return (arr_len);
21587 }
21588
21589 int mangle_purgechar (char arr[BLOCK_SIZE], int arr_len, char c)
21590 {
21591 int arr_pos;
21592
21593 int ret_len;
21594
21595 for (ret_len = 0, arr_pos = 0; arr_pos < arr_len; arr_pos++)
21596 {
21597 if (arr[arr_pos] == c) continue;
21598
21599 arr[ret_len] = arr[arr_pos];
21600
21601 ret_len++;
21602 }
21603
21604 return (ret_len);
21605 }
21606
21607 int mangle_dupeblock_prepend (char arr[BLOCK_SIZE], int arr_len, int ulen)
21608 {
21609 if (ulen > arr_len) return (arr_len);
21610
21611 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
21612
21613 char cs[100] = { 0 };
21614
21615 memcpy (cs, arr, ulen);
21616
21617 int i;
21618
21619 for (i = 0; i < ulen; i++)
21620 {
21621 char c = cs[i];
21622
21623 arr_len = mangle_insert (arr, arr_len, i, c);
21624 }
21625
21626 return (arr_len);
21627 }
21628
21629 int mangle_dupeblock_append (char arr[BLOCK_SIZE], int arr_len, int ulen)
21630 {
21631 if (ulen > arr_len) return (arr_len);
21632
21633 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
21634
21635 int upos = arr_len - ulen;
21636
21637 int i;
21638
21639 for (i = 0; i < ulen; i++)
21640 {
21641 char c = arr[upos + i];
21642
21643 arr_len = mangle_append (arr, arr_len, c);
21644 }
21645
21646 return (arr_len);
21647 }
21648
21649 int mangle_dupechar_at (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
21650 {
21651 if ( arr_len == 0) return (arr_len);
21652 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
21653
21654 char c = arr[upos];
21655
21656 int i;
21657
21658 for (i = 0; i < ulen; i++)
21659 {
21660 arr_len = mangle_insert (arr, arr_len, upos, c);
21661 }
21662
21663 return (arr_len);
21664 }
21665
21666 int mangle_dupechar (char arr[BLOCK_SIZE], int arr_len)
21667 {
21668 if ( arr_len == 0) return (arr_len);
21669 if ((arr_len + arr_len) >= BLOCK_SIZE) return (arr_len);
21670
21671 int arr_pos;
21672
21673 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
21674 {
21675 int new_pos = arr_pos * 2;
21676
21677 arr[new_pos] = arr[arr_pos];
21678
21679 arr[new_pos + 1] = arr[arr_pos];
21680 }
21681
21682 return (arr_len * 2);
21683 }
21684
21685 int mangle_switch_at_check (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
21686 {
21687 if (upos >= arr_len) return (arr_len);
21688 if (upos2 >= arr_len) return (arr_len);
21689
21690 MANGLE_SWITCH (arr, upos, upos2);
21691
21692 return (arr_len);
21693 }
21694
21695 int mangle_switch_at (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
21696 {
21697 MANGLE_SWITCH (arr, upos, upos2);
21698
21699 return (arr_len);
21700 }
21701
21702 int mangle_chr_shiftl (char arr[BLOCK_SIZE], int arr_len, int upos)
21703 {
21704 if (upos >= arr_len) return (arr_len);
21705
21706 arr[upos] <<= 1;
21707
21708 return (arr_len);
21709 }
21710
21711 int mangle_chr_shiftr (char arr[BLOCK_SIZE], int arr_len, int upos)
21712 {
21713 if (upos >= arr_len) return (arr_len);
21714
21715 arr[upos] >>= 1;
21716
21717 return (arr_len);
21718 }
21719
21720 int mangle_chr_incr (char arr[BLOCK_SIZE], int arr_len, int upos)
21721 {
21722 if (upos >= arr_len) return (arr_len);
21723
21724 arr[upos] += 1;
21725
21726 return (arr_len);
21727 }
21728
21729 int mangle_chr_decr (char arr[BLOCK_SIZE], int arr_len, int upos)
21730 {
21731 if (upos >= arr_len) return (arr_len);
21732
21733 arr[upos] -= 1;
21734
21735 return (arr_len);
21736 }
21737
21738 int mangle_title (char arr[BLOCK_SIZE], int arr_len)
21739 {
21740 int upper_next = 1;
21741
21742 int pos;
21743
21744 for (pos = 0; pos < arr_len; pos++)
21745 {
21746 if (arr[pos] == ' ')
21747 {
21748 upper_next = 1;
21749
21750 continue;
21751 }
21752
21753 if (upper_next)
21754 {
21755 upper_next = 0;
21756
21757 MANGLE_UPPER_AT (arr, pos);
21758 }
21759 else
21760 {
21761 MANGLE_LOWER_AT (arr, pos);
21762 }
21763 }
21764
21765 return (arr_len);
21766 }
21767
21768 int generate_random_rule (char rule_buf[RP_RULE_BUFSIZ], u32 rp_gen_func_min, u32 rp_gen_func_max)
21769 {
21770 u32 rp_gen_num = get_random_num (rp_gen_func_min, rp_gen_func_max);
21771
21772 u32 j;
21773
21774 u32 rule_pos = 0;
21775
21776 for (j = 0; j < rp_gen_num; j++)
21777 {
21778 u32 r = 0;
21779 u32 p1 = 0;
21780 u32 p2 = 0;
21781 u32 p3 = 0;
21782
21783 switch ((char) get_random_num (0, 9))
21784 {
21785 case 0:
21786 r = get_random_num (0, sizeof (grp_op_nop));
21787 rule_buf[rule_pos++] = grp_op_nop[r];
21788 break;
21789
21790 case 1:
21791 r = get_random_num (0, sizeof (grp_op_pos_p0));
21792 rule_buf[rule_pos++] = grp_op_pos_p0[r];
21793 p1 = get_random_num (0, sizeof (grp_pos));
21794 rule_buf[rule_pos++] = grp_pos[p1];
21795 break;
21796
21797 case 2:
21798 r = get_random_num (0, sizeof (grp_op_pos_p1));
21799 rule_buf[rule_pos++] = grp_op_pos_p1[r];
21800 p1 = get_random_num (1, 6);
21801 rule_buf[rule_pos++] = grp_pos[p1];
21802 break;
21803
21804 case 3:
21805 r = get_random_num (0, sizeof (grp_op_chr));
21806 rule_buf[rule_pos++] = grp_op_chr[r];
21807 p1 = get_random_num (0x20, 0x7e);
21808 rule_buf[rule_pos++] = (char) p1;
21809 break;
21810
21811 case 4:
21812 r = get_random_num (0, sizeof (grp_op_chr_chr));
21813 rule_buf[rule_pos++] = grp_op_chr_chr[r];
21814 p1 = get_random_num (0x20, 0x7e);
21815 rule_buf[rule_pos++] = (char) p1;
21816 p2 = get_random_num (0x20, 0x7e);
21817 while (p1 == p2)
21818 p2 = get_random_num (0x20, 0x7e);
21819 rule_buf[rule_pos++] = (char) p2;
21820 break;
21821
21822 case 5:
21823 r = get_random_num (0, sizeof (grp_op_pos_chr));
21824 rule_buf[rule_pos++] = grp_op_pos_chr[r];
21825 p1 = get_random_num (0, sizeof (grp_pos));
21826 rule_buf[rule_pos++] = grp_pos[p1];
21827 p2 = get_random_num (0x20, 0x7e);
21828 rule_buf[rule_pos++] = (char) p2;
21829 break;
21830
21831 case 6:
21832 r = get_random_num (0, sizeof (grp_op_pos_pos0));
21833 rule_buf[rule_pos++] = grp_op_pos_pos0[r];
21834 p1 = get_random_num (0, sizeof (grp_pos));
21835 rule_buf[rule_pos++] = grp_pos[p1];
21836 p2 = get_random_num (0, sizeof (grp_pos));
21837 while (p1 == p2)
21838 p2 = get_random_num (0, sizeof (grp_pos));
21839 rule_buf[rule_pos++] = grp_pos[p2];
21840 break;
21841
21842 case 7:
21843 r = get_random_num (0, sizeof (grp_op_pos_pos1));
21844 rule_buf[rule_pos++] = grp_op_pos_pos1[r];
21845 p1 = get_random_num (0, sizeof (grp_pos));
21846 rule_buf[rule_pos++] = grp_pos[p1];
21847 p2 = get_random_num (1, sizeof (grp_pos));
21848 while (p1 == p2)
21849 p2 = get_random_num (1, sizeof (grp_pos));
21850 rule_buf[rule_pos++] = grp_pos[p2];
21851 break;
21852
21853 case 8:
21854 r = get_random_num (0, sizeof (grp_op_pos1_pos2_pos3));
21855 rule_buf[rule_pos++] = grp_op_pos1_pos2_pos3[r];
21856 p1 = get_random_num (0, sizeof (grp_pos));
21857 rule_buf[rule_pos++] = grp_pos[p1];
21858 p2 = get_random_num (1, sizeof (grp_pos));
21859 rule_buf[rule_pos++] = grp_pos[p1];
21860 p3 = get_random_num (0, sizeof (grp_pos));
21861 rule_buf[rule_pos++] = grp_pos[p3];
21862 break;
21863 }
21864 }
21865
21866 return (rule_pos);
21867 }
21868
21869 int _old_apply_rule (char *rule, int rule_len, char in[BLOCK_SIZE], int in_len, char out[BLOCK_SIZE])
21870 {
21871 char mem[BLOCK_SIZE] = { 0 };
21872
21873 if (in == NULL) return (RULE_RC_REJECT_ERROR);
21874
21875 if (out == NULL) return (RULE_RC_REJECT_ERROR);
21876
21877 if (in_len < 1 || in_len > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
21878
21879 if (rule_len < 1) return (RULE_RC_REJECT_ERROR);
21880
21881 int out_len = in_len;
21882 int mem_len = in_len;
21883
21884 memcpy (out, in, out_len);
21885
21886 int rule_pos;
21887
21888 for (rule_pos = 0; rule_pos < rule_len; rule_pos++)
21889 {
21890 int upos, upos2;
21891 int ulen;
21892
21893 switch (rule[rule_pos])
21894 {
21895 case ' ':
21896 break;
21897
21898 case RULE_OP_MANGLE_NOOP:
21899 break;
21900
21901 case RULE_OP_MANGLE_LREST:
21902 out_len = mangle_lrest (out, out_len);
21903 break;
21904
21905 case RULE_OP_MANGLE_UREST:
21906 out_len = mangle_urest (out, out_len);
21907 break;
21908
21909 case RULE_OP_MANGLE_LREST_UFIRST:
21910 out_len = mangle_lrest (out, out_len);
21911 if (out_len) MANGLE_UPPER_AT (out, 0);
21912 break;
21913
21914 case RULE_OP_MANGLE_UREST_LFIRST:
21915 out_len = mangle_urest (out, out_len);
21916 if (out_len) MANGLE_LOWER_AT (out, 0);
21917 break;
21918
21919 case RULE_OP_MANGLE_TREST:
21920 out_len = mangle_trest (out, out_len);
21921 break;
21922
21923 case RULE_OP_MANGLE_TOGGLE_AT:
21924 NEXT_RULEPOS (rule_pos);
21925 NEXT_RPTOI (rule, rule_pos, upos);
21926 if (upos < out_len) MANGLE_TOGGLE_AT (out, upos);
21927 break;
21928
21929 case RULE_OP_MANGLE_REVERSE:
21930 out_len = mangle_reverse (out, out_len);
21931 break;
21932
21933 case RULE_OP_MANGLE_DUPEWORD:
21934 out_len = mangle_double (out, out_len);
21935 break;
21936
21937 case RULE_OP_MANGLE_DUPEWORD_TIMES:
21938 NEXT_RULEPOS (rule_pos);
21939 NEXT_RPTOI (rule, rule_pos, ulen);
21940 out_len = mangle_double_times (out, out_len, ulen);
21941 break;
21942
21943 case RULE_OP_MANGLE_REFLECT:
21944 out_len = mangle_reflect (out, out_len);
21945 break;
21946
21947 case RULE_OP_MANGLE_ROTATE_LEFT:
21948 mangle_rotate_left (out, out_len);
21949 break;
21950
21951 case RULE_OP_MANGLE_ROTATE_RIGHT:
21952 mangle_rotate_right (out, out_len);
21953 break;
21954
21955 case RULE_OP_MANGLE_APPEND:
21956 NEXT_RULEPOS (rule_pos);
21957 out_len = mangle_append (out, out_len, rule[rule_pos]);
21958 break;
21959
21960 case RULE_OP_MANGLE_PREPEND:
21961 NEXT_RULEPOS (rule_pos);
21962 out_len = mangle_prepend (out, out_len, rule[rule_pos]);
21963 break;
21964
21965 case RULE_OP_MANGLE_DELETE_FIRST:
21966 out_len = mangle_delete_at (out, out_len, 0);
21967 break;
21968
21969 case RULE_OP_MANGLE_DELETE_LAST:
21970 out_len = mangle_delete_at (out, out_len, (out_len) ? out_len - 1 : 0);
21971 break;
21972
21973 case RULE_OP_MANGLE_DELETE_AT:
21974 NEXT_RULEPOS (rule_pos);
21975 NEXT_RPTOI (rule, rule_pos, upos);
21976 out_len = mangle_delete_at (out, out_len, upos);
21977 break;
21978
21979 case RULE_OP_MANGLE_EXTRACT:
21980 NEXT_RULEPOS (rule_pos);
21981 NEXT_RPTOI (rule, rule_pos, upos);
21982 NEXT_RULEPOS (rule_pos);
21983 NEXT_RPTOI (rule, rule_pos, ulen);
21984 out_len = mangle_extract (out, out_len, upos, ulen);
21985 break;
21986
21987 case RULE_OP_MANGLE_OMIT:
21988 NEXT_RULEPOS (rule_pos);
21989 NEXT_RPTOI (rule, rule_pos, upos);
21990 NEXT_RULEPOS (rule_pos);
21991 NEXT_RPTOI (rule, rule_pos, ulen);
21992 out_len = mangle_omit (out, out_len, upos, ulen);
21993 break;
21994
21995 case RULE_OP_MANGLE_INSERT:
21996 NEXT_RULEPOS (rule_pos);
21997 NEXT_RPTOI (rule, rule_pos, upos);
21998 NEXT_RULEPOS (rule_pos);
21999 out_len = mangle_insert (out, out_len, upos, rule[rule_pos]);
22000 break;
22001
22002 case RULE_OP_MANGLE_OVERSTRIKE:
22003 NEXT_RULEPOS (rule_pos);
22004 NEXT_RPTOI (rule, rule_pos, upos);
22005 NEXT_RULEPOS (rule_pos);
22006 out_len = mangle_overstrike (out, out_len, upos, rule[rule_pos]);
22007 break;
22008
22009 case RULE_OP_MANGLE_TRUNCATE_AT:
22010 NEXT_RULEPOS (rule_pos);
22011 NEXT_RPTOI (rule, rule_pos, upos);
22012 out_len = mangle_truncate_at (out, out_len, upos);
22013 break;
22014
22015 case RULE_OP_MANGLE_REPLACE:
22016 NEXT_RULEPOS (rule_pos);
22017 NEXT_RULEPOS (rule_pos);
22018 out_len = mangle_replace (out, out_len, rule[rule_pos - 1], rule[rule_pos]);
22019 break;
22020
22021 case RULE_OP_MANGLE_PURGECHAR:
22022 NEXT_RULEPOS (rule_pos);
22023 out_len = mangle_purgechar (out, out_len, rule[rule_pos]);
22024 break;
22025
22026 case RULE_OP_MANGLE_TOGGLECASE_REC:
22027 /* todo */
22028 break;
22029
22030 case RULE_OP_MANGLE_DUPECHAR_FIRST:
22031 NEXT_RULEPOS (rule_pos);
22032 NEXT_RPTOI (rule, rule_pos, ulen);
22033 out_len = mangle_dupechar_at (out, out_len, 0, ulen);
22034 break;
22035
22036 case RULE_OP_MANGLE_DUPECHAR_LAST:
22037 NEXT_RULEPOS (rule_pos);
22038 NEXT_RPTOI (rule, rule_pos, ulen);
22039 out_len = mangle_dupechar_at (out, out_len, out_len - 1, ulen);
22040 break;
22041
22042 case RULE_OP_MANGLE_DUPECHAR_ALL:
22043 out_len = mangle_dupechar (out, out_len);
22044 break;
22045
22046 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
22047 NEXT_RULEPOS (rule_pos);
22048 NEXT_RPTOI (rule, rule_pos, ulen);
22049 out_len = mangle_dupeblock_prepend (out, out_len, ulen);
22050 break;
22051
22052 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
22053 NEXT_RULEPOS (rule_pos);
22054 NEXT_RPTOI (rule, rule_pos, ulen);
22055 out_len = mangle_dupeblock_append (out, out_len, ulen);
22056 break;
22057
22058 case RULE_OP_MANGLE_SWITCH_FIRST:
22059 if (out_len >= 2) mangle_switch_at (out, out_len, 0, 1);
22060 break;
22061
22062 case RULE_OP_MANGLE_SWITCH_LAST:
22063 if (out_len >= 2) mangle_switch_at (out, out_len, out_len - 1, out_len - 2);
22064 break;
22065
22066 case RULE_OP_MANGLE_SWITCH_AT:
22067 NEXT_RULEPOS (rule_pos);
22068 NEXT_RPTOI (rule, rule_pos, upos);
22069 NEXT_RULEPOS (rule_pos);
22070 NEXT_RPTOI (rule, rule_pos, upos2);
22071 out_len = mangle_switch_at_check (out, out_len, upos, upos2);
22072 break;
22073
22074 case RULE_OP_MANGLE_CHR_SHIFTL:
22075 NEXT_RULEPOS (rule_pos);
22076 NEXT_RPTOI (rule, rule_pos, upos);
22077 mangle_chr_shiftl (out, out_len, upos);
22078 break;
22079
22080 case RULE_OP_MANGLE_CHR_SHIFTR:
22081 NEXT_RULEPOS (rule_pos);
22082 NEXT_RPTOI (rule, rule_pos, upos);
22083 mangle_chr_shiftr (out, out_len, upos);
22084 break;
22085
22086 case RULE_OP_MANGLE_CHR_INCR:
22087 NEXT_RULEPOS (rule_pos);
22088 NEXT_RPTOI (rule, rule_pos, upos);
22089 mangle_chr_incr (out, out_len, upos);
22090 break;
22091
22092 case RULE_OP_MANGLE_CHR_DECR:
22093 NEXT_RULEPOS (rule_pos);
22094 NEXT_RPTOI (rule, rule_pos, upos);
22095 mangle_chr_decr (out, out_len, upos);
22096 break;
22097
22098 case RULE_OP_MANGLE_REPLACE_NP1:
22099 NEXT_RULEPOS (rule_pos);
22100 NEXT_RPTOI (rule, rule_pos, upos);
22101 if ((upos >= 0) && ((upos + 1) < out_len)) mangle_overstrike (out, out_len, upos, out[upos + 1]);
22102 break;
22103
22104 case RULE_OP_MANGLE_REPLACE_NM1:
22105 NEXT_RULEPOS (rule_pos);
22106 NEXT_RPTOI (rule, rule_pos, upos);
22107 if ((upos >= 1) && ((upos + 0) < out_len)) mangle_overstrike (out, out_len, upos, out[upos - 1]);
22108 break;
22109
22110 case RULE_OP_MANGLE_TITLE:
22111 out_len = mangle_title (out, out_len);
22112 break;
22113
22114 case RULE_OP_MANGLE_EXTRACT_MEMORY:
22115 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
22116 NEXT_RULEPOS (rule_pos);
22117 NEXT_RPTOI (rule, rule_pos, upos);
22118 NEXT_RULEPOS (rule_pos);
22119 NEXT_RPTOI (rule, rule_pos, ulen);
22120 NEXT_RULEPOS (rule_pos);
22121 NEXT_RPTOI (rule, rule_pos, upos2);
22122 if ((out_len = mangle_insert_multi (out, out_len, upos2, mem, mem_len, upos, ulen)) < 1) return (out_len);
22123 break;
22124
22125 case RULE_OP_MANGLE_APPEND_MEMORY:
22126 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
22127 if ((out_len + mem_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
22128 memcpy (out + out_len, mem, mem_len);
22129 out_len += mem_len;
22130 break;
22131
22132 case RULE_OP_MANGLE_PREPEND_MEMORY:
22133 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
22134 if ((mem_len + out_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
22135 memcpy (mem + mem_len, out, out_len);
22136 out_len += mem_len;
22137 memcpy (out, mem, out_len);
22138 break;
22139
22140 case RULE_OP_MEMORIZE_WORD:
22141 memcpy (mem, out, out_len);
22142 mem_len = out_len;
22143 break;
22144
22145 case RULE_OP_REJECT_LESS:
22146 NEXT_RULEPOS (rule_pos);
22147 NEXT_RPTOI (rule, rule_pos, upos);
22148 if (out_len > upos) return (RULE_RC_REJECT_ERROR);
22149 break;
22150
22151 case RULE_OP_REJECT_GREATER:
22152 NEXT_RULEPOS (rule_pos);
22153 NEXT_RPTOI (rule, rule_pos, upos);
22154 if (out_len < upos) return (RULE_RC_REJECT_ERROR);
22155 break;
22156
22157 case RULE_OP_REJECT_CONTAIN:
22158 NEXT_RULEPOS (rule_pos);
22159 if (strchr (out, rule[rule_pos]) != NULL) return (RULE_RC_REJECT_ERROR);
22160 break;
22161
22162 case RULE_OP_REJECT_NOT_CONTAIN:
22163 NEXT_RULEPOS (rule_pos);
22164 if (strchr (out, rule[rule_pos]) == NULL) return (RULE_RC_REJECT_ERROR);
22165 break;
22166
22167 case RULE_OP_REJECT_EQUAL_FIRST:
22168 NEXT_RULEPOS (rule_pos);
22169 if (out[0] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
22170 break;
22171
22172 case RULE_OP_REJECT_EQUAL_LAST:
22173 NEXT_RULEPOS (rule_pos);
22174 if (out[out_len - 1] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
22175 break;
22176
22177 case RULE_OP_REJECT_EQUAL_AT:
22178 NEXT_RULEPOS (rule_pos);
22179 NEXT_RPTOI (rule, rule_pos, upos);
22180 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
22181 NEXT_RULEPOS (rule_pos);
22182 if (out[upos] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
22183 break;
22184
22185 case RULE_OP_REJECT_CONTAINS:
22186 NEXT_RULEPOS (rule_pos);
22187 NEXT_RPTOI (rule, rule_pos, upos);
22188 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
22189 NEXT_RULEPOS (rule_pos);
22190 int c; int cnt; for (c = 0, cnt = 0; c < out_len; c++) if (out[c] == rule[rule_pos]) cnt++;
22191 if (cnt < upos) return (RULE_RC_REJECT_ERROR);
22192 break;
22193
22194 case RULE_OP_REJECT_MEMORY:
22195 if ((out_len == mem_len) && (memcmp (out, mem, out_len) == 0)) return (RULE_RC_REJECT_ERROR);
22196 break;
22197
22198 default:
22199 return (RULE_RC_SYNTAX_ERROR);
22200 break;
22201 }
22202 }
22203
22204 memset (out + out_len, 0, BLOCK_SIZE - out_len);
22205
22206 return (out_len);
22207 }