cd60e258563956e9537af0a328547db1f2870130
[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_buslanes_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.iCurrentBusLanes;
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 unsigned int currLinkWidth;
3260
3261 hm_NVML_nvmlDeviceGetCurrPcieLinkWidth (data.hm_nv, data.hm_device[device_id].adapter_index.nv, &currLinkWidth);
3262
3263 return currLinkWidth;
3264 #endif
3265
3266 #if defined(WIN) && defined(HAVE_NVAPI)
3267
3268 #endif
3269 }
3270 #endif // HAVE_NVML || HAVE_NVAPI
3271
3272 return -1;
3273 }
3274
3275 int hm_get_utilization_with_device_id (const uint device_id)
3276 {
3277 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3278
3279 #ifdef HAVE_ADL
3280 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_AMD)
3281 {
3282 if (data.hm_amd)
3283 {
3284 ADLPMActivity PMActivity;
3285
3286 PMActivity.iSize = sizeof (ADLPMActivity);
3287
3288 if (hm_ADL_Overdrive_CurrentActivity_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, &PMActivity) != ADL_OK) return -1;
3289
3290 return PMActivity.iActivityPercent;
3291 }
3292 }
3293 #endif // HAVE_ADL
3294
3295 #if defined(HAVE_NVML) || defined(HAVE_NVAPI)
3296 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_NV)
3297 {
3298 #if defined(LINUX) && defined(HAVE_NVML)
3299 nvmlUtilization_t utilization;
3300
3301 hm_NVML_nvmlDeviceGetUtilizationRates (data.hm_nv, data.hm_device[device_id].adapter_index.nv, &utilization);
3302
3303 return utilization.gpu;
3304 #endif
3305
3306 #if defined(WIN) && defined(HAVE_NVAPI)
3307 NV_GPU_DYNAMIC_PSTATES_INFO_EX pDynamicPstatesInfoEx;
3308
3309 pDynamicPstatesInfoEx.version = NV_GPU_DYNAMIC_PSTATES_INFO_EX_VER;
3310
3311 if (hm_NvAPI_GPU_GetDynamicPstatesInfoEx (data.hm_nv, data.hm_device[device_id].adapter_index.nv, &pDynamicPstatesInfoEx) != NVAPI_OK) return -1;
3312
3313 return pDynamicPstatesInfoEx.utilization[0].percentage;
3314 #endif
3315 }
3316 #endif // HAVE_NVML || HAVE_NVAPI
3317
3318 return -1;
3319 }
3320
3321 int hm_get_memoryspeed_with_device_id (const uint device_id)
3322 {
3323 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3324
3325 #ifdef HAVE_ADL
3326 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_AMD)
3327 {
3328 if (data.hm_amd)
3329 {
3330 ADLPMActivity PMActivity;
3331
3332 PMActivity.iSize = sizeof (ADLPMActivity);
3333
3334 if (hm_ADL_Overdrive_CurrentActivity_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, &PMActivity) != ADL_OK) return -1;
3335
3336 return PMActivity.iMemoryClock / 100;
3337 }
3338 }
3339 #endif // HAVE_ADL
3340
3341 #if defined(HAVE_NVML) || defined(HAVE_NVAPI)
3342 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_NV)
3343 {
3344 #if defined(LINUX) && defined(HAVE_NVML)
3345 unsigned int clock;
3346
3347 hm_NVML_nvmlDeviceGetClockInfo (data.hm_nv, data.hm_device[device_id].adapter_index.nv, NVML_CLOCK_MEM, &clock);
3348
3349 return clock;
3350 #endif
3351
3352 #if defined(WIN) && defined(HAVE_NVAPI)
3353 NV_GPU_CLOCK_FREQUENCIES pClkFreqs = { 0 };
3354
3355 pClkFreqs.version = NV_GPU_CLOCK_FREQUENCIES_VER;
3356 pClkFreqs.ClockType = NV_GPU_CLOCK_FREQUENCIES_CURRENT_FREQ;
3357
3358 if (hm_NvAPI_GPU_GetAllClockFrequencies (data.hm_nv, data.hm_device[device_id].adapter_index.nv, &pClkFreqs) != NVAPI_OK) return -1;
3359
3360 return pClkFreqs.domain[NVAPI_GPU_PUBLIC_CLOCK_MEMORY].frequency / 1000;
3361 #endif
3362 }
3363 #endif // HAVE_NVML || HAVE_NVAPI
3364
3365 return -1;
3366 }
3367
3368 int hm_get_corespeed_with_device_id (const uint device_id)
3369 {
3370 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3371
3372 #ifdef HAVE_ADL
3373 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_AMD)
3374 {
3375 if (data.hm_amd)
3376 {
3377 ADLPMActivity PMActivity;
3378
3379 PMActivity.iSize = sizeof (ADLPMActivity);
3380
3381 if (hm_ADL_Overdrive_CurrentActivity_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, &PMActivity) != ADL_OK) return -1;
3382
3383 return PMActivity.iEngineClock / 100;
3384 }
3385 }
3386 #endif // HAVE_ADL
3387
3388 #if defined(HAVE_NVML) || defined(HAVE_NVAPI)
3389 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_NV)
3390 {
3391 #if defined(LINUX) && defined(HAVE_NVML)
3392 unsigned int clock;
3393
3394 hm_NVML_nvmlDeviceGetClockInfo (data.hm_nv, data.hm_device[device_id].adapter_index.nv, NVML_CLOCK_SM, &clock);
3395
3396 return clock;
3397 #endif
3398
3399 #if defined(WIN) && defined(HAVE_NVAPI)
3400 NV_GPU_CLOCK_FREQUENCIES pClkFreqs = { 0 };
3401
3402 pClkFreqs.version = NV_GPU_CLOCK_FREQUENCIES_VER;
3403 pClkFreqs.ClockType = NV_GPU_CLOCK_FREQUENCIES_CURRENT_FREQ;
3404
3405 if (hm_NvAPI_GPU_GetAllClockFrequencies (data.hm_nv, data.hm_device[device_id].adapter_index.nv, &pClkFreqs) != NVAPI_OK) return -1;
3406
3407 return pClkFreqs.domain[NVAPI_GPU_PUBLIC_CLOCK_GRAPHICS].frequency / 1000;
3408 #endif
3409 }
3410 #endif // HAVE_NVML || HAVE_NVAPI
3411
3412 return -1;
3413 }
3414
3415 #ifdef HAVE_ADL
3416 int hm_set_fanspeed_with_device_id_amd (const uint device_id, const int fanspeed)
3417 {
3418 if (data.hm_device[device_id].fan_supported == 1)
3419 {
3420 if (data.hm_amd)
3421 {
3422 if (data.hm_device[device_id].od_version == 5)
3423 {
3424 ADLFanSpeedValue lpFanSpeedValue;
3425
3426 memset (&lpFanSpeedValue, 0, sizeof (lpFanSpeedValue));
3427
3428 lpFanSpeedValue.iSize = sizeof (lpFanSpeedValue);
3429 lpFanSpeedValue.iSpeedType = ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
3430 lpFanSpeedValue.iFlags = ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED;
3431 lpFanSpeedValue.iFanSpeed = fanspeed;
3432
3433 if (hm_ADL_Overdrive5_FanSpeed_Set (data.hm_amd, data.hm_device[device_id].adapter_index.amd, 0, &lpFanSpeedValue) != ADL_OK) return -1;
3434
3435 return 0;
3436 }
3437 else // od_version == 6
3438 {
3439 ADLOD6FanSpeedValue fan_speed_value;
3440
3441 memset (&fan_speed_value, 0, sizeof (fan_speed_value));
3442
3443 fan_speed_value.iSpeedType = ADL_OD6_FANSPEED_TYPE_PERCENT;
3444 fan_speed_value.iFanSpeed = fanspeed;
3445
3446 if (hm_ADL_Overdrive6_FanSpeed_Set (data.hm_amd, data.hm_device[device_id].adapter_index.amd, &fan_speed_value) != ADL_OK) return -1;
3447
3448 return 0;
3449 }
3450 }
3451 }
3452
3453 return -1;
3454 }
3455 #endif
3456
3457 // helper function for status display
3458
3459 void hm_device_val_to_str (char *target_buf, int max_buf_size, char *suffix, int value)
3460 {
3461 #define VALUE_NOT_AVAILABLE "N/A"
3462
3463 if (value == -1)
3464 {
3465 snprintf (target_buf, max_buf_size, VALUE_NOT_AVAILABLE);
3466 }
3467 else
3468 {
3469 snprintf (target_buf, max_buf_size, "%2d%s", value, suffix);
3470 }
3471 }
3472 #endif // HAVE_HWMON
3473
3474 /**
3475 * maskprocessor
3476 */
3477
3478 void mp_css_to_uniq_tbl (uint css_cnt, cs_t *css, uint uniq_tbls[SP_PW_MAX][CHARSIZ])
3479 {
3480 /* generates a lookup table where key is the char itself for fastest possible lookup performance */
3481
3482 if (css_cnt > SP_PW_MAX)
3483 {
3484 log_error ("ERROR: mask length is too long");
3485
3486 exit (-1);
3487 }
3488
3489 for (uint css_pos = 0; css_pos < css_cnt; css_pos++)
3490 {
3491 uint *uniq_tbl = uniq_tbls[css_pos];
3492
3493 uint *cs_buf = css[css_pos].cs_buf;
3494 uint cs_len = css[css_pos].cs_len;
3495
3496 for (uint cs_pos = 0; cs_pos < cs_len; cs_pos++)
3497 {
3498 uint c = cs_buf[cs_pos] & 0xff;
3499
3500 uniq_tbl[c] = 1;
3501 }
3502 }
3503 }
3504
3505 void mp_add_cs_buf (uint *in_buf, size_t in_len, cs_t *css, int css_cnt)
3506 {
3507 cs_t *cs = &css[css_cnt];
3508
3509 size_t css_uniq_sz = CHARSIZ * sizeof (uint);
3510
3511 uint *css_uniq = (uint *) mymalloc (css_uniq_sz);
3512
3513 size_t i;
3514
3515 for (i = 0; i < cs->cs_len; i++)
3516 {
3517 const uint u = cs->cs_buf[i];
3518
3519 css_uniq[u] = 1;
3520 }
3521
3522 for (i = 0; i < in_len; i++)
3523 {
3524 uint u = in_buf[i] & 0xff;
3525
3526 if (data.opts_type & OPTS_TYPE_PT_UPPER) u = toupper (u);
3527
3528 if (css_uniq[u] == 1) continue;
3529
3530 css_uniq[u] = 1;
3531
3532 cs->cs_buf[cs->cs_len] = u;
3533
3534 cs->cs_len++;
3535 }
3536
3537 myfree (css_uniq);
3538 }
3539
3540 void mp_expand (char *in_buf, size_t in_len, cs_t *mp_sys, cs_t *mp_usr, int mp_usr_offset, int interpret)
3541 {
3542 size_t in_pos;
3543
3544 for (in_pos = 0; in_pos < in_len; in_pos++)
3545 {
3546 uint p0 = in_buf[in_pos] & 0xff;
3547
3548 if (interpret == 1 && p0 == '?')
3549 {
3550 in_pos++;
3551
3552 if (in_pos == in_len) break;
3553
3554 uint p1 = in_buf[in_pos] & 0xff;
3555
3556 switch (p1)
3557 {
3558 case 'l': mp_add_cs_buf (mp_sys[0].cs_buf, mp_sys[0].cs_len, mp_usr, mp_usr_offset);
3559 break;
3560 case 'u': mp_add_cs_buf (mp_sys[1].cs_buf, mp_sys[1].cs_len, mp_usr, mp_usr_offset);
3561 break;
3562 case 'd': mp_add_cs_buf (mp_sys[2].cs_buf, mp_sys[2].cs_len, mp_usr, mp_usr_offset);
3563 break;
3564 case 's': mp_add_cs_buf (mp_sys[3].cs_buf, mp_sys[3].cs_len, mp_usr, mp_usr_offset);
3565 break;
3566 case 'a': mp_add_cs_buf (mp_sys[4].cs_buf, mp_sys[4].cs_len, mp_usr, mp_usr_offset);
3567 break;
3568 case 'b': mp_add_cs_buf (mp_sys[5].cs_buf, mp_sys[5].cs_len, mp_usr, mp_usr_offset);
3569 break;
3570 case '1': if (mp_usr[0].cs_len == 0) { log_error ("ERROR: Custom-charset 1 is undefined\n"); exit (-1); }
3571 mp_add_cs_buf (mp_usr[0].cs_buf, mp_usr[0].cs_len, mp_usr, mp_usr_offset);
3572 break;
3573 case '2': if (mp_usr[1].cs_len == 0) { log_error ("ERROR: Custom-charset 2 is undefined\n"); exit (-1); }
3574 mp_add_cs_buf (mp_usr[1].cs_buf, mp_usr[1].cs_len, mp_usr, mp_usr_offset);
3575 break;
3576 case '3': if (mp_usr[2].cs_len == 0) { log_error ("ERROR: Custom-charset 3 is undefined\n"); exit (-1); }
3577 mp_add_cs_buf (mp_usr[2].cs_buf, mp_usr[2].cs_len, mp_usr, mp_usr_offset);
3578 break;
3579 case '4': if (mp_usr[3].cs_len == 0) { log_error ("ERROR: Custom-charset 4 is undefined\n"); exit (-1); }
3580 mp_add_cs_buf (mp_usr[3].cs_buf, mp_usr[3].cs_len, mp_usr, mp_usr_offset);
3581 break;
3582 case '?': mp_add_cs_buf (&p0, 1, mp_usr, mp_usr_offset);
3583 break;
3584 default: log_error ("Syntax error: %s", in_buf);
3585 exit (-1);
3586 }
3587 }
3588 else
3589 {
3590 if (data.hex_charset)
3591 {
3592 in_pos++;
3593
3594 if (in_pos == in_len)
3595 {
3596 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", in_buf);
3597
3598 exit (-1);
3599 }
3600
3601 uint p1 = in_buf[in_pos] & 0xff;
3602
3603 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3604 {
3605 log_error ("ERROR: invalid hex character detected in mask %s", in_buf);
3606
3607 exit (-1);
3608 }
3609
3610 uint chr = 0;
3611
3612 chr = hex_convert (p1) << 0;
3613 chr |= hex_convert (p0) << 4;
3614
3615 mp_add_cs_buf (&chr, 1, mp_usr, mp_usr_offset);
3616 }
3617 else
3618 {
3619 uint chr = p0;
3620
3621 mp_add_cs_buf (&chr, 1, mp_usr, mp_usr_offset);
3622 }
3623 }
3624 }
3625 }
3626
3627 u64 mp_get_sum (uint css_cnt, cs_t *css)
3628 {
3629 u64 sum = 1;
3630
3631 for (uint css_pos = 0; css_pos < css_cnt; css_pos++)
3632 {
3633 sum *= css[css_pos].cs_len;
3634 }
3635
3636 return (sum);
3637 }
3638
3639 cs_t *mp_gen_css (char *mask_buf, size_t mask_len, cs_t *mp_sys, cs_t *mp_usr, uint *css_cnt)
3640 {
3641 cs_t *css = (cs_t *) mycalloc (256, sizeof (cs_t));
3642
3643 uint mask_pos;
3644 uint css_pos;
3645
3646 for (mask_pos = 0, css_pos = 0; mask_pos < mask_len; mask_pos++, css_pos++)
3647 {
3648 char p0 = mask_buf[mask_pos];
3649
3650 if (p0 == '?')
3651 {
3652 mask_pos++;
3653
3654 if (mask_pos == mask_len) break;
3655
3656 char p1 = mask_buf[mask_pos];
3657
3658 uint chr = p1;
3659
3660 switch (p1)
3661 {
3662 case 'l': mp_add_cs_buf (mp_sys[0].cs_buf, mp_sys[0].cs_len, css, css_pos);
3663 break;
3664 case 'u': mp_add_cs_buf (mp_sys[1].cs_buf, mp_sys[1].cs_len, css, css_pos);
3665 break;
3666 case 'd': mp_add_cs_buf (mp_sys[2].cs_buf, mp_sys[2].cs_len, css, css_pos);
3667 break;
3668 case 's': mp_add_cs_buf (mp_sys[3].cs_buf, mp_sys[3].cs_len, css, css_pos);
3669 break;
3670 case 'a': mp_add_cs_buf (mp_sys[4].cs_buf, mp_sys[4].cs_len, css, css_pos);
3671 break;
3672 case 'b': mp_add_cs_buf (mp_sys[5].cs_buf, mp_sys[5].cs_len, css, css_pos);
3673 break;
3674 case '1': if (mp_usr[0].cs_len == 0) { log_error ("ERROR: Custom-charset 1 is undefined\n"); exit (-1); }
3675 mp_add_cs_buf (mp_usr[0].cs_buf, mp_usr[0].cs_len, css, css_pos);
3676 break;
3677 case '2': if (mp_usr[1].cs_len == 0) { log_error ("ERROR: Custom-charset 2 is undefined\n"); exit (-1); }
3678 mp_add_cs_buf (mp_usr[1].cs_buf, mp_usr[1].cs_len, css, css_pos);
3679 break;
3680 case '3': if (mp_usr[2].cs_len == 0) { log_error ("ERROR: Custom-charset 3 is undefined\n"); exit (-1); }
3681 mp_add_cs_buf (mp_usr[2].cs_buf, mp_usr[2].cs_len, css, css_pos);
3682 break;
3683 case '4': if (mp_usr[3].cs_len == 0) { log_error ("ERROR: Custom-charset 4 is undefined\n"); exit (-1); }
3684 mp_add_cs_buf (mp_usr[3].cs_buf, mp_usr[3].cs_len, css, css_pos);
3685 break;
3686 case '?': mp_add_cs_buf (&chr, 1, css, css_pos);
3687 break;
3688 default: log_error ("ERROR: syntax error: %s", mask_buf);
3689 exit (-1);
3690 }
3691 }
3692 else
3693 {
3694 if (data.hex_charset)
3695 {
3696 mask_pos++;
3697
3698 // if there is no 2nd hex character, show an error:
3699
3700 if (mask_pos == mask_len)
3701 {
3702 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", mask_buf);
3703
3704 exit (-1);
3705 }
3706
3707 char p1 = mask_buf[mask_pos];
3708
3709 // if they are not valid hex character, show an error:
3710
3711 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3712 {
3713 log_error ("ERROR: invalid hex character detected in mask %s", mask_buf);
3714
3715 exit (-1);
3716 }
3717
3718 uint chr = 0;
3719
3720 chr |= hex_convert (p1) << 0;
3721 chr |= hex_convert (p0) << 4;
3722
3723 mp_add_cs_buf (&chr, 1, css, css_pos);
3724 }
3725 else
3726 {
3727 uint chr = p0;
3728
3729 mp_add_cs_buf (&chr, 1, css, css_pos);
3730 }
3731 }
3732 }
3733
3734 if (css_pos == 0)
3735 {
3736 log_error ("ERROR: invalid mask length (0)");
3737
3738 exit (-1);
3739 }
3740
3741 *css_cnt = css_pos;
3742
3743 return (css);
3744 }
3745
3746 void mp_exec (u64 val, char *buf, cs_t *css, int css_cnt)
3747 {
3748 for (int i = 0; i < css_cnt; i++)
3749 {
3750 uint len = css[i].cs_len;
3751 u64 next = val / len;
3752 uint pos = val % len;
3753 buf[i] = (char) css[i].cs_buf[pos] & 0xff;
3754 val = next;
3755 }
3756 }
3757
3758 void mp_cut_at (char *mask, uint max)
3759 {
3760 uint i;
3761 uint j;
3762 uint mask_len = strlen (mask);
3763
3764 for (i = 0, j = 0; i < mask_len && j < max; i++, j++)
3765 {
3766 if (mask[i] == '?') i++;
3767 }
3768
3769 mask[i] = 0;
3770 }
3771
3772 void mp_setup_sys (cs_t *mp_sys)
3773 {
3774 uint pos;
3775 uint chr;
3776 uint donec[CHARSIZ] = { 0 };
3777
3778 for (pos = 0, chr = 'a'; chr <= 'z'; chr++) { donec[chr] = 1;
3779 mp_sys[0].cs_buf[pos++] = chr;
3780 mp_sys[0].cs_len = pos; }
3781
3782 for (pos = 0, chr = 'A'; chr <= 'Z'; chr++) { donec[chr] = 1;
3783 mp_sys[1].cs_buf[pos++] = chr;
3784 mp_sys[1].cs_len = pos; }
3785
3786 for (pos = 0, chr = '0'; chr <= '9'; chr++) { donec[chr] = 1;
3787 mp_sys[2].cs_buf[pos++] = chr;
3788 mp_sys[2].cs_len = pos; }
3789
3790 for (pos = 0, chr = 0x20; chr <= 0x7e; chr++) { if (donec[chr]) continue;
3791 mp_sys[3].cs_buf[pos++] = chr;
3792 mp_sys[3].cs_len = pos; }
3793
3794 for (pos = 0, chr = 0x20; chr <= 0x7e; chr++) { mp_sys[4].cs_buf[pos++] = chr;
3795 mp_sys[4].cs_len = pos; }
3796
3797 for (pos = 0, chr = 0x00; chr <= 0xff; chr++) { mp_sys[5].cs_buf[pos++] = chr;
3798 mp_sys[5].cs_len = pos; }
3799 }
3800
3801 void mp_setup_usr (cs_t *mp_sys, cs_t *mp_usr, char *buf, uint index)
3802 {
3803 FILE *fp = fopen (buf, "rb");
3804
3805 if (fp == NULL || feof (fp)) // feof() in case if file is empty
3806 {
3807 mp_expand (buf, strlen (buf), mp_sys, mp_usr, index, 1);
3808 }
3809 else
3810 {
3811 char mp_file[1024] = { 0 };
3812
3813 size_t len = fread (mp_file, 1, sizeof (mp_file) - 1, fp);
3814
3815 fclose (fp);
3816
3817 len = in_superchop (mp_file);
3818
3819 if (len == 0)
3820 {
3821 log_info ("WARNING: charset file corrupted");
3822
3823 mp_expand (buf, strlen (buf), mp_sys, mp_usr, index, 1);
3824 }
3825 else
3826 {
3827 mp_expand (mp_file, len, mp_sys, mp_usr, index, 0);
3828 }
3829 }
3830 }
3831
3832 void mp_reset_usr (cs_t *mp_usr, uint index)
3833 {
3834 mp_usr[index].cs_len = 0;
3835
3836 memset (mp_usr[index].cs_buf, 0, sizeof (mp_usr[index].cs_buf));
3837 }
3838
3839 char *mp_get_truncated_mask (char *mask_buf, size_t mask_len, uint len)
3840 {
3841 char *new_mask_buf = (char *) mymalloc (256);
3842
3843 uint mask_pos;
3844
3845 uint css_pos;
3846
3847 for (mask_pos = 0, css_pos = 0; mask_pos < mask_len; mask_pos++, css_pos++)
3848 {
3849 if (css_pos == len) break;
3850
3851 char p0 = mask_buf[mask_pos];
3852
3853 new_mask_buf[mask_pos] = p0;
3854
3855 if (p0 == '?')
3856 {
3857 mask_pos++;
3858
3859 if (mask_pos == mask_len) break;
3860
3861 new_mask_buf[mask_pos] = mask_buf[mask_pos];
3862 }
3863 else
3864 {
3865 if (data.hex_charset)
3866 {
3867 mask_pos++;
3868
3869 if (mask_pos == mask_len)
3870 {
3871 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", mask_buf);
3872
3873 exit (-1);
3874 }
3875
3876 char p1 = mask_buf[mask_pos];
3877
3878 // if they are not valid hex character, show an error:
3879
3880 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3881 {
3882 log_error ("ERROR: invalid hex character detected in mask: %s", mask_buf);
3883
3884 exit (-1);
3885 }
3886
3887 new_mask_buf[mask_pos] = p1;
3888 }
3889 }
3890 }
3891
3892 if (css_pos == len) return (new_mask_buf);
3893
3894 myfree (new_mask_buf);
3895
3896 return (NULL);
3897 }
3898
3899 /**
3900 * statprocessor
3901 */
3902
3903 u64 sp_get_sum (uint start, uint stop, cs_t *root_css_buf)
3904 {
3905 u64 sum = 1;
3906
3907 uint i;
3908
3909 for (i = start; i < stop; i++)
3910 {
3911 sum *= root_css_buf[i].cs_len;
3912 }
3913
3914 return (sum);
3915 }
3916
3917 void sp_exec (u64 ctx, char *pw_buf, cs_t *root_css_buf, cs_t *markov_css_buf, uint start, uint stop)
3918 {
3919 u64 v = ctx;
3920
3921 cs_t *cs = &root_css_buf[start];
3922
3923 uint i;
3924
3925 for (i = start; i < stop; i++)
3926 {
3927 const u64 m = v % cs->cs_len;
3928 const u64 d = v / cs->cs_len;
3929
3930 v = d;
3931
3932 const uint k = cs->cs_buf[m];
3933
3934 pw_buf[i - start] = (char) k;
3935
3936 cs = &markov_css_buf[(i * CHARSIZ) + k];
3937 }
3938 }
3939
3940 int sp_comp_val (const void *p1, const void *p2)
3941 {
3942 hcstat_table_t *b1 = (hcstat_table_t *) p1;
3943 hcstat_table_t *b2 = (hcstat_table_t *) p2;
3944
3945 return b2->val - b1->val;
3946 }
3947
3948 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)
3949 {
3950 uint i;
3951 uint j;
3952 uint k;
3953
3954 /**
3955 * Initialize hcstats
3956 */
3957
3958 u64 *root_stats_buf = (u64 *) mycalloc (SP_ROOT_CNT, sizeof (u64));
3959
3960 u64 *root_stats_ptr = root_stats_buf;
3961
3962 u64 *root_stats_buf_by_pos[SP_PW_MAX];
3963
3964 for (i = 0; i < SP_PW_MAX; i++)
3965 {
3966 root_stats_buf_by_pos[i] = root_stats_ptr;
3967
3968 root_stats_ptr += CHARSIZ;
3969 }
3970
3971 u64 *markov_stats_buf = (u64 *) mycalloc (SP_MARKOV_CNT, sizeof (u64));
3972
3973 u64 *markov_stats_ptr = markov_stats_buf;
3974
3975 u64 *markov_stats_buf_by_key[SP_PW_MAX][CHARSIZ];
3976
3977 for (i = 0; i < SP_PW_MAX; i++)
3978 {
3979 for (j = 0; j < CHARSIZ; j++)
3980 {
3981 markov_stats_buf_by_key[i][j] = markov_stats_ptr;
3982
3983 markov_stats_ptr += CHARSIZ;
3984 }
3985 }
3986
3987 /**
3988 * Load hcstats File
3989 */
3990
3991 if (hcstat == NULL)
3992 {
3993 char hcstat_tmp[256] = { 0 };
3994
3995 snprintf (hcstat_tmp, sizeof (hcstat_tmp) - 1, "%s/%s", shared_dir, SP_HCSTAT);
3996
3997 hcstat = hcstat_tmp;
3998 }
3999
4000 FILE *fd = fopen (hcstat, "rb");
4001
4002 if (fd == NULL)
4003 {
4004 log_error ("%s: %s", hcstat, strerror (errno));
4005
4006 exit (-1);
4007 }
4008
4009 if (fread (root_stats_buf, sizeof (u64), SP_ROOT_CNT, fd) != SP_ROOT_CNT)
4010 {
4011 log_error ("%s: Could not load data", hcstat);
4012
4013 fclose (fd);
4014
4015 exit (-1);
4016 }
4017
4018 if (fread (markov_stats_buf, sizeof (u64), SP_MARKOV_CNT, fd) != SP_MARKOV_CNT)
4019 {
4020 log_error ("%s: Could not load data", hcstat);
4021
4022 fclose (fd);
4023
4024 exit (-1);
4025 }
4026
4027 fclose (fd);
4028
4029 /**
4030 * Markov modifier of hcstat_table on user request
4031 */
4032
4033 if (disable)
4034 {
4035 memset (root_stats_buf, 0, SP_ROOT_CNT * sizeof (u64));
4036 memset (markov_stats_buf, 0, SP_MARKOV_CNT * sizeof (u64));
4037 }
4038
4039 if (classic)
4040 {
4041 /* Add all stats to first position */
4042
4043 for (i = 1; i < SP_PW_MAX; i++)
4044 {
4045 u64 *out = root_stats_buf_by_pos[0];
4046 u64 *in = root_stats_buf_by_pos[i];
4047
4048 for (j = 0; j < CHARSIZ; j++)
4049 {
4050 *out++ += *in++;
4051 }
4052 }
4053
4054 for (i = 1; i < SP_PW_MAX; i++)
4055 {
4056 u64 *out = markov_stats_buf_by_key[0][0];
4057 u64 *in = markov_stats_buf_by_key[i][0];
4058
4059 for (j = 0; j < CHARSIZ; j++)
4060 {
4061 for (k = 0; k < CHARSIZ; k++)
4062 {
4063 *out++ += *in++;
4064 }
4065 }
4066 }
4067
4068 /* copy them to all pw_positions */
4069
4070 for (i = 1; i < SP_PW_MAX; i++)
4071 {
4072 memcpy (root_stats_buf_by_pos[i], root_stats_buf_by_pos[0], CHARSIZ * sizeof (u64));
4073 }
4074
4075 for (i = 1; i < SP_PW_MAX; i++)
4076 {
4077 memcpy (markov_stats_buf_by_key[i][0], markov_stats_buf_by_key[0][0], CHARSIZ * CHARSIZ * sizeof (u64));
4078 }
4079 }
4080
4081 /**
4082 * Initialize tables
4083 */
4084
4085 hcstat_table_t *root_table_ptr = root_table_buf;
4086
4087 hcstat_table_t *root_table_buf_by_pos[SP_PW_MAX];
4088
4089 for (i = 0; i < SP_PW_MAX; i++)
4090 {
4091 root_table_buf_by_pos[i] = root_table_ptr;
4092
4093 root_table_ptr += CHARSIZ;
4094 }
4095
4096 hcstat_table_t *markov_table_ptr = markov_table_buf;
4097
4098 hcstat_table_t *markov_table_buf_by_key[SP_PW_MAX][CHARSIZ];
4099
4100 for (i = 0; i < SP_PW_MAX; i++)
4101 {
4102 for (j = 0; j < CHARSIZ; j++)
4103 {
4104 markov_table_buf_by_key[i][j] = markov_table_ptr;
4105
4106 markov_table_ptr += CHARSIZ;
4107 }
4108 }
4109
4110 /**
4111 * Convert hcstat to tables
4112 */
4113
4114 for (i = 0; i < SP_ROOT_CNT; i++)
4115 {
4116 uint key = i % CHARSIZ;
4117
4118 root_table_buf[i].key = key;
4119 root_table_buf[i].val = root_stats_buf[i];
4120 }
4121
4122 for (i = 0; i < SP_MARKOV_CNT; i++)
4123 {
4124 uint key = i % CHARSIZ;
4125
4126 markov_table_buf[i].key = key;
4127 markov_table_buf[i].val = markov_stats_buf[i];
4128 }
4129
4130 myfree (root_stats_buf);
4131 myfree (markov_stats_buf);
4132
4133 /**
4134 * Finally sort them
4135 */
4136
4137 for (i = 0; i < SP_PW_MAX; i++)
4138 {
4139 qsort (root_table_buf_by_pos[i], CHARSIZ, sizeof (hcstat_table_t), sp_comp_val);
4140 }
4141
4142 for (i = 0; i < SP_PW_MAX; i++)
4143 {
4144 for (j = 0; j < CHARSIZ; j++)
4145 {
4146 qsort (markov_table_buf_by_key[i][j], CHARSIZ, sizeof (hcstat_table_t), sp_comp_val);
4147 }
4148 }
4149 }
4150
4151 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])
4152 {
4153 /**
4154 * Convert tables to css
4155 */
4156
4157 for (uint i = 0; i < SP_ROOT_CNT; i++)
4158 {
4159 uint pw_pos = i / CHARSIZ;
4160
4161 cs_t *cs = &root_css_buf[pw_pos];
4162
4163 if (cs->cs_len == threshold) continue;
4164
4165 uint key = root_table_buf[i].key;
4166
4167 if (uniq_tbls[pw_pos][key] == 0) continue;
4168
4169 cs->cs_buf[cs->cs_len] = key;
4170
4171 cs->cs_len++;
4172 }
4173
4174 /**
4175 * Convert table to css
4176 */
4177
4178 for (uint i = 0; i < SP_MARKOV_CNT; i++)
4179 {
4180 uint c = i / CHARSIZ;
4181
4182 cs_t *cs = &markov_css_buf[c];
4183
4184 if (cs->cs_len == threshold) continue;
4185
4186 uint pw_pos = c / CHARSIZ;
4187
4188 uint key = markov_table_buf[i].key;
4189
4190 if ((pw_pos + 1) < SP_PW_MAX) if (uniq_tbls[pw_pos + 1][key] == 0) continue;
4191
4192 cs->cs_buf[cs->cs_len] = key;
4193
4194 cs->cs_len++;
4195 }
4196
4197 /*
4198 for (uint i = 0; i < 8; i++)
4199 {
4200 for (uint j = 0x20; j < 0x80; j++)
4201 {
4202 cs_t *ptr = &markov_css_buf[(i * CHARSIZ) + j];
4203
4204 printf ("pos:%u key:%u len:%u\n", i, j, ptr->cs_len);
4205
4206 for (uint k = 0; k < 10; k++)
4207 {
4208 printf (" %u\n", ptr->cs_buf[k]);
4209 }
4210 }
4211 }
4212 */
4213 }
4214
4215 void sp_stretch_root (hcstat_table_t *in, hcstat_table_t *out)
4216 {
4217 for (uint i = 0; i < SP_PW_MAX; i += 2)
4218 {
4219 memcpy (out, in, CHARSIZ * sizeof (hcstat_table_t));
4220
4221 out += CHARSIZ;
4222 in += CHARSIZ;
4223
4224 out->key = 0;
4225 out->val = 1;
4226
4227 out++;
4228
4229 for (uint j = 1; j < CHARSIZ; j++)
4230 {
4231 out->key = j;
4232 out->val = 0;
4233
4234 out++;
4235 }
4236 }
4237 }
4238
4239 void sp_stretch_markov (hcstat_table_t *in, hcstat_table_t *out)
4240 {
4241 for (uint i = 0; i < SP_PW_MAX; i += 2)
4242 {
4243 memcpy (out, in, CHARSIZ * CHARSIZ * sizeof (hcstat_table_t));
4244
4245 out += CHARSIZ * CHARSIZ;
4246 in += CHARSIZ * CHARSIZ;
4247
4248 for (uint j = 0; j < CHARSIZ; j++)
4249 {
4250 out->key = 0;
4251 out->val = 1;
4252
4253 out++;
4254
4255 for (uint k = 1; k < CHARSIZ; k++)
4256 {
4257 out->key = k;
4258 out->val = 0;
4259
4260 out++;
4261 }
4262 }
4263 }
4264 }
4265
4266 /**
4267 * mixed shared functions
4268 */
4269
4270 void dump_hex (const u8 *s, const int sz)
4271 {
4272 for (int i = 0; i < sz; i++)
4273 {
4274 log_info_nn ("%02x ", s[i]);
4275 }
4276
4277 log_info ("");
4278 }
4279
4280 void usage_mini_print (const char *progname)
4281 {
4282 for (uint i = 0; USAGE_MINI[i] != NULL; i++) log_info (USAGE_MINI[i], progname);
4283 }
4284
4285 void usage_big_print (const char *progname)
4286 {
4287 for (uint i = 0; USAGE_BIG[i] != NULL; i++) log_info (USAGE_BIG[i], progname);
4288 }
4289
4290 char *get_exec_path ()
4291 {
4292 int exec_path_len = 1024;
4293
4294 char *exec_path = (char *) mymalloc (exec_path_len);
4295
4296 #ifdef LINUX
4297
4298 char tmp[32] = { 0 };
4299
4300 snprintf (tmp, sizeof (tmp) - 1, "/proc/%d/exe", getpid ());
4301
4302 const int len = readlink (tmp, exec_path, exec_path_len - 1);
4303
4304 #elif WIN
4305
4306 const int len = GetModuleFileName (NULL, exec_path, exec_path_len - 1);
4307
4308 #elif OSX
4309
4310 uint size = exec_path_len;
4311
4312 if (_NSGetExecutablePath (exec_path, &size) != 0)
4313 {
4314 log_error("! executable path buffer too small\n");
4315
4316 exit (-1);
4317 }
4318
4319 const int len = strlen (exec_path);
4320
4321 #else
4322 #error Your Operating System is not supported or detected
4323 #endif
4324
4325 exec_path[len] = 0;
4326
4327 return exec_path;
4328 }
4329
4330 char *get_install_dir (const char *progname)
4331 {
4332 char *install_dir = mystrdup (progname);
4333 char *last_slash = NULL;
4334
4335 if ((last_slash = strrchr (install_dir, '/')) != NULL)
4336 {
4337 *last_slash = 0;
4338 }
4339 else if ((last_slash = strrchr (install_dir, '\\')) != NULL)
4340 {
4341 *last_slash = 0;
4342 }
4343 else
4344 {
4345 install_dir[0] = '.';
4346 install_dir[1] = 0;
4347 }
4348
4349 return (install_dir);
4350 }
4351
4352 char *get_profile_dir (const char *homedir)
4353 {
4354 #define DOT_HASHCAT ".hashcat"
4355
4356 size_t len = strlen (homedir) + 1 + strlen (DOT_HASHCAT) + 1;
4357
4358 char *profile_dir = (char *) mymalloc (len + 1);
4359
4360 snprintf (profile_dir, len, "%s/%s", homedir, DOT_HASHCAT);
4361
4362 return profile_dir;
4363 }
4364
4365 char *get_session_dir (const char *profile_dir)
4366 {
4367 #define SESSIONS_FOLDER "sessions"
4368
4369 size_t len = strlen (profile_dir) + 1 + strlen (SESSIONS_FOLDER) + 1;
4370
4371 char *session_dir = (char *) mymalloc (len + 1);
4372
4373 snprintf (session_dir, len, "%s/%s", profile_dir, SESSIONS_FOLDER);
4374
4375 return session_dir;
4376 }
4377
4378 uint count_lines (FILE *fd)
4379 {
4380 uint cnt = 0;
4381
4382 char *buf = (char *) mymalloc (HCBUFSIZ + 1);
4383
4384 char prev = '\n';
4385
4386 while (!feof (fd))
4387 {
4388 size_t nread = fread (buf, sizeof (char), HCBUFSIZ, fd);
4389
4390 if (nread < 1) continue;
4391
4392 size_t i;
4393
4394 for (i = 0; i < nread; i++)
4395 {
4396 if (prev == '\n') cnt++;
4397
4398 prev = buf[i];
4399 }
4400 }
4401
4402 myfree (buf);
4403
4404 return cnt;
4405 }
4406
4407 void truecrypt_crc32 (const char *filename, u8 keytab[64])
4408 {
4409 uint crc = ~0;
4410
4411 FILE *fd = fopen (filename, "rb");
4412
4413 if (fd == NULL)
4414 {
4415 log_error ("%s: %s", filename, strerror (errno));
4416
4417 exit (-1);
4418 }
4419
4420 #define MAX_KEY_SIZE (1024 * 1024)
4421
4422 u8 *buf = (u8 *) mymalloc (MAX_KEY_SIZE + 1);
4423
4424 int nread = fread (buf, sizeof (u8), MAX_KEY_SIZE, fd);
4425
4426 fclose (fd);
4427
4428 int kpos = 0;
4429
4430 for (int fpos = 0; fpos < nread; fpos++)
4431 {
4432 crc = crc32tab[(crc ^ buf[fpos]) & 0xff] ^ (crc >> 8);
4433
4434 keytab[kpos++] += (crc >> 24) & 0xff;
4435 keytab[kpos++] += (crc >> 16) & 0xff;
4436 keytab[kpos++] += (crc >> 8) & 0xff;
4437 keytab[kpos++] += (crc >> 0) & 0xff;
4438
4439 if (kpos >= 64) kpos = 0;
4440 }
4441
4442 myfree (buf);
4443 }
4444
4445 #ifdef OSX
4446 int pthread_setaffinity_np (pthread_t thread, size_t cpu_size, cpu_set_t *cpu_set)
4447 {
4448 int core;
4449
4450 for (core = 0; core < (8 * (int)cpu_size); core++)
4451 if (CPU_ISSET(core, cpu_set)) break;
4452
4453 thread_affinity_policy_data_t policy = { core };
4454
4455 const int rc = thread_policy_set (pthread_mach_thread_np (thread), THREAD_AFFINITY_POLICY, (thread_policy_t) &policy, 1);
4456
4457 if (data.quiet == 0)
4458 {
4459 if (rc != KERN_SUCCESS)
4460 {
4461 log_error ("ERROR: %s : %d", "thread_policy_set()", rc);
4462 }
4463 }
4464
4465 return rc;
4466 }
4467 #endif
4468
4469 void set_cpu_affinity (char *cpu_affinity)
4470 {
4471 #ifdef WIN
4472 DWORD_PTR aff_mask = 0;
4473 #elif _POSIX
4474 cpu_set_t cpuset;
4475 CPU_ZERO (&cpuset);
4476 #endif
4477
4478 if (cpu_affinity)
4479 {
4480 char *devices = strdup (cpu_affinity);
4481
4482 char *next = strtok (devices, ",");
4483
4484 do
4485 {
4486 uint cpu_id = atoi (next);
4487
4488 if (cpu_id == 0)
4489 {
4490 #ifdef WIN
4491 aff_mask = 0;
4492 #elif _POSIX
4493 CPU_ZERO (&cpuset);
4494 #endif
4495
4496 break;
4497 }
4498
4499 if (cpu_id > 32)
4500 {
4501 log_error ("ERROR: invalid cpu_id %u specified", cpu_id);
4502
4503 exit (-1);
4504 }
4505
4506 #ifdef WIN
4507 aff_mask |= 1 << (cpu_id - 1);
4508 #elif _POSIX
4509 CPU_SET ((cpu_id - 1), &cpuset);
4510 #endif
4511
4512 } while ((next = strtok (NULL, ",")) != NULL);
4513
4514 free (devices);
4515 }
4516
4517 #ifdef WIN
4518 SetProcessAffinityMask (GetCurrentProcess (), aff_mask);
4519 SetThreadAffinityMask (GetCurrentThread (), aff_mask);
4520 #elif _POSIX
4521 pthread_t thread = pthread_self ();
4522 pthread_setaffinity_np (thread, sizeof (cpu_set_t), &cpuset);
4523 #endif
4524 }
4525
4526 void *rulefind (const void *key, void *base, int nmemb, size_t size, int (*compar) (const void *, const void *))
4527 {
4528 char *element, *end;
4529
4530 end = (char *) base + nmemb * size;
4531
4532 for (element = (char *) base; element < end; element += size)
4533 if (!compar (element, key))
4534 return element;
4535
4536 return NULL;
4537 }
4538
4539 int sort_by_u32 (const void *v1, const void *v2)
4540 {
4541 const u32 *s1 = (const u32 *) v1;
4542 const u32 *s2 = (const u32 *) v2;
4543
4544 return *s1 - *s2;
4545 }
4546
4547 int sort_by_salt (const void *v1, const void *v2)
4548 {
4549 const salt_t *s1 = (const salt_t *) v1;
4550 const salt_t *s2 = (const salt_t *) v2;
4551
4552 const int res1 = s1->salt_len - s2->salt_len;
4553
4554 if (res1 != 0) return (res1);
4555
4556 const int res2 = s1->salt_iter - s2->salt_iter;
4557
4558 if (res2 != 0) return (res2);
4559
4560 uint n;
4561
4562 n = 16;
4563
4564 while (n--)
4565 {
4566 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4567 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4568 }
4569
4570 n = 8;
4571
4572 while (n--)
4573 {
4574 if (s1->salt_buf_pc[n] > s2->salt_buf_pc[n]) return ( 1);
4575 if (s1->salt_buf_pc[n] < s2->salt_buf_pc[n]) return (-1);
4576 }
4577
4578 return (0);
4579 }
4580
4581 int sort_by_salt_buf (const void *v1, const void *v2)
4582 {
4583 const pot_t *p1 = (const pot_t *) v1;
4584 const pot_t *p2 = (const pot_t *) v2;
4585
4586 const hash_t *h1 = &p1->hash;
4587 const hash_t *h2 = &p2->hash;
4588
4589 const salt_t *s1 = h1->salt;
4590 const salt_t *s2 = h2->salt;
4591
4592 uint n = 16;
4593
4594 while (n--)
4595 {
4596 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4597 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4598 }
4599
4600 return 0;
4601 }
4602
4603 int sort_by_hash_t_salt (const void *v1, const void *v2)
4604 {
4605 const hash_t *h1 = (const hash_t *) v1;
4606 const hash_t *h2 = (const hash_t *) v2;
4607
4608 const salt_t *s1 = h1->salt;
4609 const salt_t *s2 = h2->salt;
4610
4611 // testphase: this should work
4612 uint n = 16;
4613
4614 while (n--)
4615 {
4616 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4617 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4618 }
4619
4620 /* original code, seems buggy since salt_len can be very big (had a case with 131 len)
4621 also it thinks salt_buf[x] is a char but its a uint so salt_len should be / 4
4622 if (s1->salt_len > s2->salt_len) return ( 1);
4623 if (s1->salt_len < s2->salt_len) return (-1);
4624
4625 uint n = s1->salt_len;
4626
4627 while (n--)
4628 {
4629 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4630 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4631 }
4632 */
4633
4634 return 0;
4635 }
4636
4637 int sort_by_hash_t_salt_hccap (const void *v1, const void *v2)
4638 {
4639 const hash_t *h1 = (const hash_t *) v1;
4640 const hash_t *h2 = (const hash_t *) v2;
4641
4642 const salt_t *s1 = h1->salt;
4643 const salt_t *s2 = h2->salt;
4644
4645 // 16 - 2 (since last 2 uints contain the digest)
4646 uint n = 14;
4647
4648 while (n--)
4649 {
4650 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4651 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4652 }
4653
4654 return 0;
4655 }
4656
4657 int sort_by_hash_no_salt (const void *v1, const void *v2)
4658 {
4659 const hash_t *h1 = (const hash_t *) v1;
4660 const hash_t *h2 = (const hash_t *) v2;
4661
4662 const void *d1 = h1->digest;
4663 const void *d2 = h2->digest;
4664
4665 return data.sort_by_digest (d1, d2);
4666 }
4667
4668 int sort_by_hash (const void *v1, const void *v2)
4669 {
4670 const hash_t *h1 = (const hash_t *) v1;
4671 const hash_t *h2 = (const hash_t *) v2;
4672
4673 if (data.isSalted)
4674 {
4675 const salt_t *s1 = h1->salt;
4676 const salt_t *s2 = h2->salt;
4677
4678 int res = sort_by_salt (s1, s2);
4679
4680 if (res != 0) return (res);
4681 }
4682
4683 const void *d1 = h1->digest;
4684 const void *d2 = h2->digest;
4685
4686 return data.sort_by_digest (d1, d2);
4687 }
4688
4689 int sort_by_pot (const void *v1, const void *v2)
4690 {
4691 const pot_t *p1 = (const pot_t *) v1;
4692 const pot_t *p2 = (const pot_t *) v2;
4693
4694 const hash_t *h1 = &p1->hash;
4695 const hash_t *h2 = &p2->hash;
4696
4697 return sort_by_hash (h1, h2);
4698 }
4699
4700 int sort_by_mtime (const void *p1, const void *p2)
4701 {
4702 const char **f1 = (const char **) p1;
4703 const char **f2 = (const char **) p2;
4704
4705 struct stat s1; stat (*f1, &s1);
4706 struct stat s2; stat (*f2, &s2);
4707
4708 return s2.st_mtime - s1.st_mtime;
4709 }
4710
4711 int sort_by_cpu_rule (const void *p1, const void *p2)
4712 {
4713 const cpu_rule_t *r1 = (const cpu_rule_t *) p1;
4714 const cpu_rule_t *r2 = (const cpu_rule_t *) p2;
4715
4716 return memcmp (r1, r2, sizeof (cpu_rule_t));
4717 }
4718
4719 int sort_by_kernel_rule (const void *p1, const void *p2)
4720 {
4721 const kernel_rule_t *r1 = (const kernel_rule_t *) p1;
4722 const kernel_rule_t *r2 = (const kernel_rule_t *) p2;
4723
4724 return memcmp (r1, r2, sizeof (kernel_rule_t));
4725 }
4726
4727 int sort_by_stringptr (const void *p1, const void *p2)
4728 {
4729 const char **s1 = (const char **) p1;
4730 const char **s2 = (const char **) p2;
4731
4732 return strcmp (*s1, *s2);
4733 }
4734
4735 int sort_by_dictstat (const void *s1, const void *s2)
4736 {
4737 dictstat_t *d1 = (dictstat_t *) s1;
4738 dictstat_t *d2 = (dictstat_t *) s2;
4739
4740 #ifdef LINUX
4741 d2->stat.st_atim = d1->stat.st_atim;
4742 #else
4743 d2->stat.st_atime = d1->stat.st_atime;
4744 #endif
4745
4746 return memcmp (&d1->stat, &d2->stat, sizeof (struct stat));
4747 }
4748
4749 int sort_by_bitmap (const void *p1, const void *p2)
4750 {
4751 const bitmap_result_t *b1 = (const bitmap_result_t *) p1;
4752 const bitmap_result_t *b2 = (const bitmap_result_t *) p2;
4753
4754 return b1->collisions - b2->collisions;
4755 }
4756
4757 int sort_by_digest_4_2 (const void *v1, const void *v2)
4758 {
4759 const u32 *d1 = (const u32 *) v1;
4760 const u32 *d2 = (const u32 *) v2;
4761
4762 uint n = 2;
4763
4764 while (n--)
4765 {
4766 if (d1[n] > d2[n]) return ( 1);
4767 if (d1[n] < d2[n]) return (-1);
4768 }
4769
4770 return (0);
4771 }
4772
4773 int sort_by_digest_4_4 (const void *v1, const void *v2)
4774 {
4775 const u32 *d1 = (const u32 *) v1;
4776 const u32 *d2 = (const u32 *) v2;
4777
4778 uint n = 4;
4779
4780 while (n--)
4781 {
4782 if (d1[n] > d2[n]) return ( 1);
4783 if (d1[n] < d2[n]) return (-1);
4784 }
4785
4786 return (0);
4787 }
4788
4789 int sort_by_digest_4_5 (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 = 5;
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_6 (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 = 6;
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_8 (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 = 8;
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_16 (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 = 16;
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_32 (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 = 32;
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_64 (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 = 64;
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_8_8 (const void *v1, const void *v2)
4886 {
4887 const u64 *d1 = (const u64 *) v1;
4888 const u64 *d2 = (const u64 *) v2;
4889
4890 uint n = 8;
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_8_16 (const void *v1, const void *v2)
4902 {
4903 const u64 *d1 = (const u64 *) v1;
4904 const u64 *d2 = (const u64 *) v2;
4905
4906 uint n = 16;
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_25 (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 = 25;
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_p0p1 (const void *v1, const void *v2)
4934 {
4935 const u32 *d1 = (const u32 *) v1;
4936 const u32 *d2 = (const u32 *) v2;
4937
4938 const uint dgst_pos0 = data.dgst_pos0;
4939 const uint dgst_pos1 = data.dgst_pos1;
4940 const uint dgst_pos2 = data.dgst_pos2;
4941 const uint dgst_pos3 = data.dgst_pos3;
4942
4943 if (d1[dgst_pos3] > d2[dgst_pos3]) return ( 1);
4944 if (d1[dgst_pos3] < d2[dgst_pos3]) return (-1);
4945 if (d1[dgst_pos2] > d2[dgst_pos2]) return ( 1);
4946 if (d1[dgst_pos2] < d2[dgst_pos2]) return (-1);
4947 if (d1[dgst_pos1] > d2[dgst_pos1]) return ( 1);
4948 if (d1[dgst_pos1] < d2[dgst_pos1]) return (-1);
4949 if (d1[dgst_pos0] > d2[dgst_pos0]) return ( 1);
4950 if (d1[dgst_pos0] < d2[dgst_pos0]) return (-1);
4951
4952 return (0);
4953 }
4954
4955 int sort_by_tuning_db_alias (const void *v1, const void *v2)
4956 {
4957 const tuning_db_alias_t *t1 = (const tuning_db_alias_t *) v1;
4958 const tuning_db_alias_t *t2 = (const tuning_db_alias_t *) v2;
4959
4960 const int res1 = strcmp (t1->device_name, t2->device_name);
4961
4962 if (res1 != 0) return (res1);
4963
4964 return 0;
4965 }
4966
4967 int sort_by_tuning_db_entry (const void *v1, const void *v2)
4968 {
4969 const tuning_db_entry_t *t1 = (const tuning_db_entry_t *) v1;
4970 const tuning_db_entry_t *t2 = (const tuning_db_entry_t *) v2;
4971
4972 const int res1 = strcmp (t1->device_name, t2->device_name);
4973
4974 if (res1 != 0) return (res1);
4975
4976 const int res2 = t1->attack_mode
4977 - t2->attack_mode;
4978
4979 if (res2 != 0) return (res2);
4980
4981 const int res3 = t1->hash_type
4982 - t2->hash_type;
4983
4984 if (res3 != 0) return (res3);
4985
4986 return 0;
4987 }
4988
4989 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)
4990 {
4991 uint outfile_autohex = data.outfile_autohex;
4992
4993 unsigned char *rule_ptr = (unsigned char *) rule_buf;
4994
4995 FILE *debug_fp = NULL;
4996
4997 if (debug_file != NULL)
4998 {
4999 debug_fp = fopen (debug_file, "ab");
5000
5001 lock_file (debug_fp);
5002 }
5003 else
5004 {
5005 debug_fp = stderr;
5006 }
5007
5008 if (debug_fp == NULL)
5009 {
5010 log_info ("WARNING: Could not open debug-file for writing");
5011 }
5012 else
5013 {
5014 if ((debug_mode == 2) || (debug_mode == 3) || (debug_mode == 4))
5015 {
5016 format_plain (debug_fp, orig_plain_ptr, orig_plain_len, outfile_autohex);
5017
5018 if ((debug_mode == 3) || (debug_mode == 4)) fputc (':', debug_fp);
5019 }
5020
5021 fwrite (rule_ptr, rule_len, 1, debug_fp);
5022
5023 if (debug_mode == 4)
5024 {
5025 fputc (':', debug_fp);
5026
5027 format_plain (debug_fp, mod_plain_ptr, mod_plain_len, outfile_autohex);
5028 }
5029
5030 fputc ('\n', debug_fp);
5031
5032 if (debug_file != NULL) fclose (debug_fp);
5033 }
5034 }
5035
5036 void format_plain (FILE *fp, unsigned char *plain_ptr, uint plain_len, uint outfile_autohex)
5037 {
5038 int needs_hexify = 0;
5039
5040 if (outfile_autohex == 1)
5041 {
5042 for (uint i = 0; i < plain_len; i++)
5043 {
5044 if (plain_ptr[i] < 0x20)
5045 {
5046 needs_hexify = 1;
5047
5048 break;
5049 }
5050
5051 if (plain_ptr[i] > 0x7f)
5052 {
5053 needs_hexify = 1;
5054
5055 break;
5056 }
5057 }
5058 }
5059
5060 if (needs_hexify == 1)
5061 {
5062 fprintf (fp, "$HEX[");
5063
5064 for (uint i = 0; i < plain_len; i++)
5065 {
5066 fprintf (fp, "%02x", plain_ptr[i]);
5067 }
5068
5069 fprintf (fp, "]");
5070 }
5071 else
5072 {
5073 fwrite (plain_ptr, plain_len, 1, fp);
5074 }
5075 }
5076
5077 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)
5078 {
5079 uint outfile_format = data.outfile_format;
5080
5081 char separator = data.separator;
5082
5083 if (outfile_format & OUTFILE_FMT_HASH)
5084 {
5085 fprintf (out_fp, "%s", out_buf);
5086
5087 if (outfile_format & (OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
5088 {
5089 fputc (separator, out_fp);
5090 }
5091 }
5092 else if (data.username)
5093 {
5094 if (username != NULL)
5095 {
5096 for (uint i = 0; i < user_len; i++)
5097 {
5098 fprintf (out_fp, "%c", username[i]);
5099 }
5100
5101 if (outfile_format & (OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
5102 {
5103 fputc (separator, out_fp);
5104 }
5105 }
5106 }
5107
5108 if (outfile_format & OUTFILE_FMT_PLAIN)
5109 {
5110 format_plain (out_fp, plain_ptr, plain_len, data.outfile_autohex);
5111
5112 if (outfile_format & (OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
5113 {
5114 fputc (separator, out_fp);
5115 }
5116 }
5117
5118 if (outfile_format & OUTFILE_FMT_HEXPLAIN)
5119 {
5120 for (uint i = 0; i < plain_len; i++)
5121 {
5122 fprintf (out_fp, "%02x", plain_ptr[i]);
5123 }
5124
5125 if (outfile_format & (OUTFILE_FMT_CRACKPOS))
5126 {
5127 fputc (separator, out_fp);
5128 }
5129 }
5130
5131 if (outfile_format & OUTFILE_FMT_CRACKPOS)
5132 {
5133 #ifdef _WIN
5134 __mingw_fprintf (out_fp, "%llu", crackpos);
5135 #endif
5136
5137 #ifdef _POSIX
5138 #ifdef __x86_64__
5139 fprintf (out_fp, "%lu", (unsigned long) crackpos);
5140 #else
5141 fprintf (out_fp, "%llu", crackpos);
5142 #endif
5143 #endif
5144 }
5145
5146 fputc ('\n', out_fp);
5147 }
5148
5149 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)
5150 {
5151 pot_t pot_key;
5152
5153 pot_key.hash.salt = hashes_buf->salt;
5154 pot_key.hash.digest = hashes_buf->digest;
5155
5156 pot_t *pot_ptr = (pot_t *) bsearch (&pot_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5157
5158 if (pot_ptr)
5159 {
5160 log_info_nn ("");
5161
5162 input_buf[input_len] = 0;
5163
5164 // user
5165 unsigned char *username = NULL;
5166 uint user_len = 0;
5167
5168 if (data.username)
5169 {
5170 user_t *user = hashes_buf->hash_info->user;
5171
5172 if (user)
5173 {
5174 username = (unsigned char *) (user->user_name);
5175
5176 user_len = user->user_len;
5177 }
5178 }
5179
5180 // do output the line
5181 format_output (out_fp, input_buf, (unsigned char *) pot_ptr->plain_buf, pot_ptr->plain_len, 0, username, user_len);
5182 }
5183 }
5184
5185 #define LM_WEAK_HASH "\x4e\xcf\x0d\x0c\x0a\xe2\xfb\xc1"
5186 #define LM_MASKED_PLAIN "[notfound]"
5187
5188 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)
5189 {
5190 // left
5191
5192 pot_t pot_left_key;
5193
5194 pot_left_key.hash.salt = hash_left->salt;
5195 pot_left_key.hash.digest = hash_left->digest;
5196
5197 pot_t *pot_left_ptr = (pot_t *) bsearch (&pot_left_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5198
5199 // right
5200
5201 uint weak_hash_found = 0;
5202
5203 pot_t pot_right_key;
5204
5205 pot_right_key.hash.salt = hash_right->salt;
5206 pot_right_key.hash.digest = hash_right->digest;
5207
5208 pot_t *pot_right_ptr = (pot_t *) bsearch (&pot_right_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5209
5210 if (pot_right_ptr == NULL)
5211 {
5212 // special case, if "weak hash"
5213
5214 if (memcmp (hash_right->digest, LM_WEAK_HASH, 8) == 0)
5215 {
5216 weak_hash_found = 1;
5217
5218 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5219
5220 // in theory this is not needed, but we are paranoia:
5221
5222 memset (pot_right_ptr->plain_buf, 0, sizeof (pot_right_ptr->plain_buf));
5223 pot_right_ptr->plain_len = 0;
5224 }
5225 }
5226
5227 if ((pot_left_ptr == NULL) && (pot_right_ptr == NULL))
5228 {
5229 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
5230
5231 return;
5232 }
5233
5234 // at least one half was found:
5235
5236 log_info_nn ("");
5237
5238 input_buf[input_len] = 0;
5239
5240 // user
5241
5242 unsigned char *username = NULL;
5243 uint user_len = 0;
5244
5245 if (data.username)
5246 {
5247 user_t *user = hash_left->hash_info->user;
5248
5249 if (user)
5250 {
5251 username = (unsigned char *) (user->user_name);
5252
5253 user_len = user->user_len;
5254 }
5255 }
5256
5257 // mask the part which was not found
5258
5259 uint left_part_masked = 0;
5260 uint right_part_masked = 0;
5261
5262 uint mask_plain_len = strlen (LM_MASKED_PLAIN);
5263
5264 if (pot_left_ptr == NULL)
5265 {
5266 left_part_masked = 1;
5267
5268 pot_left_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5269
5270 memset (pot_left_ptr->plain_buf, 0, sizeof (pot_left_ptr->plain_buf));
5271
5272 memcpy (pot_left_ptr->plain_buf, LM_MASKED_PLAIN, mask_plain_len);
5273 pot_left_ptr->plain_len = mask_plain_len;
5274 }
5275
5276 if (pot_right_ptr == NULL)
5277 {
5278 right_part_masked = 1;
5279
5280 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5281
5282 memset (pot_right_ptr->plain_buf, 0, sizeof (pot_right_ptr->plain_buf));
5283
5284 memcpy (pot_right_ptr->plain_buf, LM_MASKED_PLAIN, mask_plain_len);
5285 pot_right_ptr->plain_len = mask_plain_len;
5286 }
5287
5288 // create the pot_ptr out of pot_left_ptr and pot_right_ptr
5289
5290 pot_t pot_ptr;
5291
5292 pot_ptr.plain_len = pot_left_ptr->plain_len + pot_right_ptr->plain_len;
5293
5294 memcpy (pot_ptr.plain_buf, pot_left_ptr->plain_buf, pot_left_ptr->plain_len);
5295
5296 memcpy (pot_ptr.plain_buf + pot_left_ptr->plain_len, pot_right_ptr->plain_buf, pot_right_ptr->plain_len);
5297
5298 // do output the line
5299
5300 format_output (out_fp, input_buf, (unsigned char *) pot_ptr.plain_buf, pot_ptr.plain_len, 0, username, user_len);
5301
5302 if (weak_hash_found == 1) myfree (pot_right_ptr);
5303
5304 if (left_part_masked == 1) myfree (pot_left_ptr);
5305 if (right_part_masked == 1) myfree (pot_right_ptr);
5306 }
5307
5308 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)
5309 {
5310 pot_t pot_key;
5311
5312 memcpy (&pot_key.hash, hashes_buf, sizeof (hash_t));
5313
5314 pot_t *pot_ptr = (pot_t *) bsearch (&pot_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5315
5316 if (pot_ptr == NULL)
5317 {
5318 log_info_nn ("");
5319
5320 input_buf[input_len] = 0;
5321
5322 format_output (out_fp, input_buf, NULL, 0, 0, NULL, 0);
5323 }
5324 }
5325
5326 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)
5327 {
5328 // left
5329
5330 pot_t pot_left_key;
5331
5332 memcpy (&pot_left_key.hash, hash_left, sizeof (hash_t));
5333
5334 pot_t *pot_left_ptr = (pot_t *) bsearch (&pot_left_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5335
5336 // right
5337
5338 pot_t pot_right_key;
5339
5340 memcpy (&pot_right_key.hash, hash_right, sizeof (hash_t));
5341
5342 pot_t *pot_right_ptr = (pot_t *) bsearch (&pot_right_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5343
5344 uint weak_hash_found = 0;
5345
5346 if (pot_right_ptr == NULL)
5347 {
5348 // special case, if "weak hash"
5349
5350 if (memcmp (hash_right->digest, LM_WEAK_HASH, 8) == 0)
5351 {
5352 weak_hash_found = 1;
5353
5354 // we just need that pot_right_ptr is not a NULL pointer
5355
5356 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5357 }
5358 }
5359
5360 if ((pot_left_ptr != NULL) && (pot_right_ptr != NULL))
5361 {
5362 if (weak_hash_found == 1) myfree (pot_right_ptr);
5363
5364 return;
5365 }
5366
5367 // ... at least one part was not cracked
5368
5369 log_info_nn ("");
5370
5371 input_buf[input_len] = 0;
5372
5373 // only show the hash part which is still not cracked
5374
5375 uint user_len = input_len - 32;
5376
5377 char *hash_output = (char *) mymalloc (33);
5378
5379 memcpy (hash_output, input_buf, input_len);
5380
5381 if (pot_left_ptr != NULL)
5382 {
5383 // only show right part (because left part was already found)
5384
5385 memcpy (hash_output + user_len, input_buf + user_len + 16, 16);
5386
5387 hash_output[user_len + 16] = 0;
5388 }
5389
5390 if (pot_right_ptr != NULL)
5391 {
5392 // only show left part (because right part was already found)
5393
5394 memcpy (hash_output + user_len, input_buf + user_len, 16);
5395
5396 hash_output[user_len + 16] = 0;
5397 }
5398
5399 format_output (out_fp, hash_output, NULL, 0, 0, NULL, 0);
5400
5401 myfree (hash_output);
5402
5403 if (weak_hash_found == 1) myfree (pot_right_ptr);
5404 }
5405
5406 uint setup_opencl_platforms_filter (char *opencl_platforms)
5407 {
5408 uint opencl_platforms_filter = 0;
5409
5410 if (opencl_platforms)
5411 {
5412 char *platforms = strdup (opencl_platforms);
5413
5414 char *next = strtok (platforms, ",");
5415
5416 do
5417 {
5418 int platform = atoi (next);
5419
5420 if (platform < 1 || platform > 32)
5421 {
5422 log_error ("ERROR: invalid OpenCL platform %u specified", platform);
5423
5424 exit (-1);
5425 }
5426
5427 opencl_platforms_filter |= 1 << (platform - 1);
5428
5429 } while ((next = strtok (NULL, ",")) != NULL);
5430
5431 free (platforms);
5432 }
5433 else
5434 {
5435 opencl_platforms_filter = -1;
5436 }
5437
5438 return opencl_platforms_filter;
5439 }
5440
5441 u32 setup_devices_filter (char *opencl_devices)
5442 {
5443 u32 devices_filter = 0;
5444
5445 if (opencl_devices)
5446 {
5447 char *devices = strdup (opencl_devices);
5448
5449 char *next = strtok (devices, ",");
5450
5451 do
5452 {
5453 int device_id = atoi (next);
5454
5455 if (device_id < 1 || device_id > 32)
5456 {
5457 log_error ("ERROR: invalid device_id %u specified", device_id);
5458
5459 exit (-1);
5460 }
5461
5462 devices_filter |= 1 << (device_id - 1);
5463
5464 } while ((next = strtok (NULL, ",")) != NULL);
5465
5466 free (devices);
5467 }
5468 else
5469 {
5470 devices_filter = -1;
5471 }
5472
5473 return devices_filter;
5474 }
5475
5476 cl_device_type setup_device_types_filter (char *opencl_device_types)
5477 {
5478 cl_device_type device_types_filter = 0;
5479
5480 if (opencl_device_types)
5481 {
5482 char *device_types = strdup (opencl_device_types);
5483
5484 char *next = strtok (device_types, ",");
5485
5486 do
5487 {
5488 int device_type = atoi (next);
5489
5490 if (device_type < 1 || device_type > 3)
5491 {
5492 log_error ("ERROR: invalid device_type %u specified", device_type);
5493
5494 exit (-1);
5495 }
5496
5497 device_types_filter |= 1 << device_type;
5498
5499 } while ((next = strtok (NULL, ",")) != NULL);
5500
5501 free (device_types);
5502 }
5503 else
5504 {
5505 // Do not use CPU by default, this often reduces GPU performance because
5506 // the CPU is too busy to handle GPU synchronization
5507
5508 device_types_filter = CL_DEVICE_TYPE_ALL & ~CL_DEVICE_TYPE_CPU;
5509 }
5510
5511 return device_types_filter;
5512 }
5513
5514 u32 get_random_num (const u32 min, const u32 max)
5515 {
5516 if (min == max) return (min);
5517
5518 return ((rand () % (max - min)) + min);
5519 }
5520
5521 u32 mydivc32 (const u32 dividend, const u32 divisor)
5522 {
5523 u32 quotient = dividend / divisor;
5524
5525 if (dividend % divisor) quotient++;
5526
5527 return quotient;
5528 }
5529
5530 u64 mydivc64 (const u64 dividend, const u64 divisor)
5531 {
5532 u64 quotient = dividend / divisor;
5533
5534 if (dividend % divisor) quotient++;
5535
5536 return quotient;
5537 }
5538
5539 void format_timer_display (struct tm *tm, char *buf, size_t len)
5540 {
5541 const char *time_entities_s[] = { "year", "day", "hour", "min", "sec" };
5542 const char *time_entities_m[] = { "years", "days", "hours", "mins", "secs" };
5543
5544 if (tm->tm_year - 70)
5545 {
5546 char *time_entity1 = ((tm->tm_year - 70) == 1) ? (char *) time_entities_s[0] : (char *) time_entities_m[0];
5547 char *time_entity2 = ( tm->tm_yday == 1) ? (char *) time_entities_s[1] : (char *) time_entities_m[1];
5548
5549 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_year - 70, time_entity1, tm->tm_yday, time_entity2);
5550 }
5551 else if (tm->tm_yday)
5552 {
5553 char *time_entity1 = (tm->tm_yday == 1) ? (char *) time_entities_s[1] : (char *) time_entities_m[1];
5554 char *time_entity2 = (tm->tm_hour == 1) ? (char *) time_entities_s[2] : (char *) time_entities_m[2];
5555
5556 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_yday, time_entity1, tm->tm_hour, time_entity2);
5557 }
5558 else if (tm->tm_hour)
5559 {
5560 char *time_entity1 = (tm->tm_hour == 1) ? (char *) time_entities_s[2] : (char *) time_entities_m[2];
5561 char *time_entity2 = (tm->tm_min == 1) ? (char *) time_entities_s[3] : (char *) time_entities_m[3];
5562
5563 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_hour, time_entity1, tm->tm_min, time_entity2);
5564 }
5565 else if (tm->tm_min)
5566 {
5567 char *time_entity1 = (tm->tm_min == 1) ? (char *) time_entities_s[3] : (char *) time_entities_m[3];
5568 char *time_entity2 = (tm->tm_sec == 1) ? (char *) time_entities_s[4] : (char *) time_entities_m[4];
5569
5570 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_min, time_entity1, tm->tm_sec, time_entity2);
5571 }
5572 else
5573 {
5574 char *time_entity1 = (tm->tm_sec == 1) ? (char *) time_entities_s[4] : (char *) time_entities_m[4];
5575
5576 snprintf (buf, len - 1, "%d %s", tm->tm_sec, time_entity1);
5577 }
5578 }
5579
5580 void format_speed_display (float val, char *buf, size_t len)
5581 {
5582 if (val <= 0)
5583 {
5584 buf[0] = '0';
5585 buf[1] = ' ';
5586 buf[2] = 0;
5587
5588 return;
5589 }
5590
5591 char units[7] = { ' ', 'k', 'M', 'G', 'T', 'P', 'E' };
5592
5593 uint level = 0;
5594
5595 while (val > 99999)
5596 {
5597 val /= 1000;
5598
5599 level++;
5600 }
5601
5602 /* generate output */
5603
5604 if (level == 0)
5605 {
5606 snprintf (buf, len - 1, "%.0f ", val);
5607 }
5608 else
5609 {
5610 snprintf (buf, len - 1, "%.1f %c", val, units[level]);
5611 }
5612 }
5613
5614 void lowercase (u8 *buf, int len)
5615 {
5616 for (int i = 0; i < len; i++) buf[i] = tolower (buf[i]);
5617 }
5618
5619 void uppercase (u8 *buf, int len)
5620 {
5621 for (int i = 0; i < len; i++) buf[i] = toupper (buf[i]);
5622 }
5623
5624 int fgetl (FILE *fp, char *line_buf)
5625 {
5626 int line_len = 0;
5627
5628 while (!feof (fp))
5629 {
5630 const int c = fgetc (fp);
5631
5632 if (c == EOF) break;
5633
5634 line_buf[line_len] = (char) c;
5635
5636 line_len++;
5637
5638 if (line_len == HCBUFSIZ) line_len--;
5639
5640 if (c == '\n') break;
5641 }
5642
5643 if (line_len == 0) return 0;
5644
5645 if (line_buf[line_len - 1] == '\n')
5646 {
5647 line_len--;
5648
5649 line_buf[line_len] = 0;
5650 }
5651
5652 if (line_len == 0) return 0;
5653
5654 if (line_buf[line_len - 1] == '\r')
5655 {
5656 line_len--;
5657
5658 line_buf[line_len] = 0;
5659 }
5660
5661 return (line_len);
5662 }
5663
5664 int in_superchop (char *buf)
5665 {
5666 int len = strlen (buf);
5667
5668 while (len)
5669 {
5670 if (buf[len - 1] == '\n')
5671 {
5672 len--;
5673
5674 continue;
5675 }
5676
5677 if (buf[len - 1] == '\r')
5678 {
5679 len--;
5680
5681 continue;
5682 }
5683
5684 break;
5685 }
5686
5687 buf[len] = 0;
5688
5689 return len;
5690 }
5691
5692 char **scan_directory (const char *path)
5693 {
5694 char *tmp_path = mystrdup (path);
5695
5696 size_t tmp_path_len = strlen (tmp_path);
5697
5698 while (tmp_path[tmp_path_len - 1] == '/' || tmp_path[tmp_path_len - 1] == '\\')
5699 {
5700 tmp_path[tmp_path_len - 1] = 0;
5701
5702 tmp_path_len = strlen (tmp_path);
5703 }
5704
5705 char **files = NULL;
5706
5707 int num_files = 0;
5708
5709 DIR *d = NULL;
5710
5711 if ((d = opendir (tmp_path)) != NULL)
5712 {
5713 #ifdef OSX
5714 struct dirent e;
5715
5716 for (;;) {
5717 memset (&e, 0, sizeof (e));
5718 struct dirent *de = NULL;
5719
5720 if (readdir_r (d, &e, &de) != 0)
5721 {
5722 log_error ("ERROR: readdir_r() failed");
5723
5724 break;
5725 }
5726
5727 if (de == NULL) break;
5728 #else
5729 struct dirent *de;
5730
5731 while ((de = readdir (d)) != NULL)
5732 {
5733 #endif
5734 if ((strcmp (de->d_name, ".") == 0) || (strcmp (de->d_name, "..") == 0)) continue;
5735
5736 int path_size = strlen (tmp_path) + 1 + strlen (de->d_name);
5737
5738 char *path_file = (char *) mymalloc (path_size + 1);
5739
5740 snprintf (path_file, path_size + 1, "%s/%s", tmp_path, de->d_name);
5741
5742 path_file[path_size] = 0;
5743
5744 DIR *d_test;
5745
5746 if ((d_test = opendir (path_file)) != NULL)
5747 {
5748 closedir (d_test);
5749
5750 myfree (path_file);
5751 }
5752 else
5753 {
5754 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5755
5756 num_files++;
5757
5758 files[num_files - 1] = path_file;
5759 }
5760 }
5761
5762 closedir (d);
5763 }
5764 else if (errno == ENOTDIR)
5765 {
5766 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5767
5768 num_files++;
5769
5770 files[num_files - 1] = mystrdup (path);
5771 }
5772
5773 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5774
5775 num_files++;
5776
5777 files[num_files - 1] = NULL;
5778
5779 myfree (tmp_path);
5780
5781 return (files);
5782 }
5783
5784 int count_dictionaries (char **dictionary_files)
5785 {
5786 if (dictionary_files == NULL) return 0;
5787
5788 int cnt = 0;
5789
5790 for (int d = 0; dictionary_files[d] != NULL; d++)
5791 {
5792 cnt++;
5793 }
5794
5795 return (cnt);
5796 }
5797
5798 char *stroptitype (const uint opti_type)
5799 {
5800 switch (opti_type)
5801 {
5802 case OPTI_TYPE_ZERO_BYTE: return ((char *) OPTI_STR_ZERO_BYTE); break;
5803 case OPTI_TYPE_PRECOMPUTE_INIT: return ((char *) OPTI_STR_PRECOMPUTE_INIT); break;
5804 case OPTI_TYPE_PRECOMPUTE_MERKLE: return ((char *) OPTI_STR_PRECOMPUTE_MERKLE); break;
5805 case OPTI_TYPE_PRECOMPUTE_PERMUT: return ((char *) OPTI_STR_PRECOMPUTE_PERMUT); break;
5806 case OPTI_TYPE_MEET_IN_MIDDLE: return ((char *) OPTI_STR_MEET_IN_MIDDLE); break;
5807 case OPTI_TYPE_EARLY_SKIP: return ((char *) OPTI_STR_EARLY_SKIP); break;
5808 case OPTI_TYPE_NOT_SALTED: return ((char *) OPTI_STR_NOT_SALTED); break;
5809 case OPTI_TYPE_NOT_ITERATED: return ((char *) OPTI_STR_NOT_ITERATED); break;
5810 case OPTI_TYPE_PREPENDED_SALT: return ((char *) OPTI_STR_PREPENDED_SALT); break;
5811 case OPTI_TYPE_APPENDED_SALT: return ((char *) OPTI_STR_APPENDED_SALT); break;
5812 case OPTI_TYPE_SINGLE_HASH: return ((char *) OPTI_STR_SINGLE_HASH); break;
5813 case OPTI_TYPE_SINGLE_SALT: return ((char *) OPTI_STR_SINGLE_SALT); break;
5814 case OPTI_TYPE_BRUTE_FORCE: return ((char *) OPTI_STR_BRUTE_FORCE); break;
5815 case OPTI_TYPE_RAW_HASH: return ((char *) OPTI_STR_RAW_HASH); break;
5816 case OPTI_TYPE_SLOW_HASH_SIMD: return ((char *) OPTI_STR_SLOW_HASH_SIMD); break;
5817 case OPTI_TYPE_USES_BITS_8: return ((char *) OPTI_STR_USES_BITS_8); break;
5818 case OPTI_TYPE_USES_BITS_16: return ((char *) OPTI_STR_USES_BITS_16); break;
5819 case OPTI_TYPE_USES_BITS_32: return ((char *) OPTI_STR_USES_BITS_32); break;
5820 case OPTI_TYPE_USES_BITS_64: return ((char *) OPTI_STR_USES_BITS_64); break;
5821 }
5822
5823 return (NULL);
5824 }
5825
5826 char *strparser (const uint parser_status)
5827 {
5828 switch (parser_status)
5829 {
5830 case PARSER_OK: return ((char *) PA_000); break;
5831 case PARSER_COMMENT: return ((char *) PA_001); break;
5832 case PARSER_GLOBAL_ZERO: return ((char *) PA_002); break;
5833 case PARSER_GLOBAL_LENGTH: return ((char *) PA_003); break;
5834 case PARSER_HASH_LENGTH: return ((char *) PA_004); break;
5835 case PARSER_HASH_VALUE: return ((char *) PA_005); break;
5836 case PARSER_SALT_LENGTH: return ((char *) PA_006); break;
5837 case PARSER_SALT_VALUE: return ((char *) PA_007); break;
5838 case PARSER_SALT_ITERATION: return ((char *) PA_008); break;
5839 case PARSER_SEPARATOR_UNMATCHED: return ((char *) PA_009); break;
5840 case PARSER_SIGNATURE_UNMATCHED: return ((char *) PA_010); break;
5841 case PARSER_HCCAP_FILE_SIZE: return ((char *) PA_011); break;
5842 case PARSER_HCCAP_EAPOL_SIZE: return ((char *) PA_012); break;
5843 case PARSER_PSAFE2_FILE_SIZE: return ((char *) PA_013); break;
5844 case PARSER_PSAFE3_FILE_SIZE: return ((char *) PA_014); break;
5845 case PARSER_TC_FILE_SIZE: return ((char *) PA_015); break;
5846 case PARSER_SIP_AUTH_DIRECTIVE: return ((char *) PA_016); break;
5847 }
5848
5849 return ((char *) PA_255);
5850 }
5851
5852 char *strhashtype (const uint hash_mode)
5853 {
5854 switch (hash_mode)
5855 {
5856 case 0: return ((char *) HT_00000); break;
5857 case 10: return ((char *) HT_00010); break;
5858 case 11: return ((char *) HT_00011); break;
5859 case 12: return ((char *) HT_00012); break;
5860 case 20: return ((char *) HT_00020); break;
5861 case 21: return ((char *) HT_00021); break;
5862 case 22: return ((char *) HT_00022); break;
5863 case 23: return ((char *) HT_00023); break;
5864 case 30: return ((char *) HT_00030); break;
5865 case 40: return ((char *) HT_00040); break;
5866 case 50: return ((char *) HT_00050); break;
5867 case 60: return ((char *) HT_00060); break;
5868 case 100: return ((char *) HT_00100); break;
5869 case 101: return ((char *) HT_00101); break;
5870 case 110: return ((char *) HT_00110); break;
5871 case 111: return ((char *) HT_00111); break;
5872 case 112: return ((char *) HT_00112); break;
5873 case 120: return ((char *) HT_00120); break;
5874 case 121: return ((char *) HT_00121); break;
5875 case 122: return ((char *) HT_00122); break;
5876 case 124: return ((char *) HT_00124); break;
5877 case 125: return ((char *) HT_00125); break;
5878 case 130: return ((char *) HT_00130); break;
5879 case 131: return ((char *) HT_00131); break;
5880 case 132: return ((char *) HT_00132); break;
5881 case 133: return ((char *) HT_00133); break;
5882 case 140: return ((char *) HT_00140); break;
5883 case 141: return ((char *) HT_00141); break;
5884 case 150: return ((char *) HT_00150); break;
5885 case 160: return ((char *) HT_00160); break;
5886 case 190: return ((char *) HT_00190); break;
5887 case 200: return ((char *) HT_00200); break;
5888 case 300: return ((char *) HT_00300); break;
5889 case 400: return ((char *) HT_00400); break;
5890 case 500: return ((char *) HT_00500); break;
5891 case 501: return ((char *) HT_00501); break;
5892 case 900: return ((char *) HT_00900); break;
5893 case 910: return ((char *) HT_00910); break;
5894 case 1000: return ((char *) HT_01000); break;
5895 case 1100: return ((char *) HT_01100); break;
5896 case 1400: return ((char *) HT_01400); break;
5897 case 1410: return ((char *) HT_01410); break;
5898 case 1420: return ((char *) HT_01420); break;
5899 case 1421: return ((char *) HT_01421); break;
5900 case 1430: return ((char *) HT_01430); break;
5901 case 1440: return ((char *) HT_01440); break;
5902 case 1441: return ((char *) HT_01441); break;
5903 case 1450: return ((char *) HT_01450); break;
5904 case 1460: return ((char *) HT_01460); break;
5905 case 1500: return ((char *) HT_01500); break;
5906 case 1600: return ((char *) HT_01600); break;
5907 case 1700: return ((char *) HT_01700); break;
5908 case 1710: return ((char *) HT_01710); break;
5909 case 1711: return ((char *) HT_01711); break;
5910 case 1720: return ((char *) HT_01720); break;
5911 case 1722: return ((char *) HT_01722); break;
5912 case 1730: return ((char *) HT_01730); break;
5913 case 1731: return ((char *) HT_01731); break;
5914 case 1740: return ((char *) HT_01740); break;
5915 case 1750: return ((char *) HT_01750); break;
5916 case 1760: return ((char *) HT_01760); break;
5917 case 1800: return ((char *) HT_01800); break;
5918 case 2100: return ((char *) HT_02100); break;
5919 case 2400: return ((char *) HT_02400); break;
5920 case 2410: return ((char *) HT_02410); break;
5921 case 2500: return ((char *) HT_02500); break;
5922 case 2600: return ((char *) HT_02600); break;
5923 case 2611: return ((char *) HT_02611); break;
5924 case 2612: return ((char *) HT_02612); break;
5925 case 2711: return ((char *) HT_02711); break;
5926 case 2811: return ((char *) HT_02811); break;
5927 case 3000: return ((char *) HT_03000); break;
5928 case 3100: return ((char *) HT_03100); break;
5929 case 3200: return ((char *) HT_03200); break;
5930 case 3710: return ((char *) HT_03710); break;
5931 case 3711: return ((char *) HT_03711); break;
5932 case 3800: return ((char *) HT_03800); break;
5933 case 4300: return ((char *) HT_04300); break;
5934 case 4400: return ((char *) HT_04400); break;
5935 case 4500: return ((char *) HT_04500); break;
5936 case 4700: return ((char *) HT_04700); break;
5937 case 4800: return ((char *) HT_04800); break;
5938 case 4900: return ((char *) HT_04900); break;
5939 case 5000: return ((char *) HT_05000); break;
5940 case 5100: return ((char *) HT_05100); break;
5941 case 5200: return ((char *) HT_05200); break;
5942 case 5300: return ((char *) HT_05300); break;
5943 case 5400: return ((char *) HT_05400); break;
5944 case 5500: return ((char *) HT_05500); break;
5945 case 5600: return ((char *) HT_05600); break;
5946 case 5700: return ((char *) HT_05700); break;
5947 case 5800: return ((char *) HT_05800); break;
5948 case 6000: return ((char *) HT_06000); break;
5949 case 6100: return ((char *) HT_06100); break;
5950 case 6211: return ((char *) HT_06211); break;
5951 case 6212: return ((char *) HT_06212); break;
5952 case 6213: return ((char *) HT_06213); break;
5953 case 6221: return ((char *) HT_06221); break;
5954 case 6222: return ((char *) HT_06222); break;
5955 case 6223: return ((char *) HT_06223); break;
5956 case 6231: return ((char *) HT_06231); break;
5957 case 6232: return ((char *) HT_06232); break;
5958 case 6233: return ((char *) HT_06233); break;
5959 case 6241: return ((char *) HT_06241); break;
5960 case 6242: return ((char *) HT_06242); break;
5961 case 6243: return ((char *) HT_06243); break;
5962 case 6300: return ((char *) HT_06300); break;
5963 case 6400: return ((char *) HT_06400); break;
5964 case 6500: return ((char *) HT_06500); break;
5965 case 6600: return ((char *) HT_06600); break;
5966 case 6700: return ((char *) HT_06700); break;
5967 case 6800: return ((char *) HT_06800); break;
5968 case 6900: return ((char *) HT_06900); break;
5969 case 7100: return ((char *) HT_07100); break;
5970 case 7200: return ((char *) HT_07200); break;
5971 case 7300: return ((char *) HT_07300); break;
5972 case 7400: return ((char *) HT_07400); break;
5973 case 7500: return ((char *) HT_07500); break;
5974 case 7600: return ((char *) HT_07600); break;
5975 case 7700: return ((char *) HT_07700); break;
5976 case 7800: return ((char *) HT_07800); break;
5977 case 7900: return ((char *) HT_07900); break;
5978 case 8000: return ((char *) HT_08000); break;
5979 case 8100: return ((char *) HT_08100); break;
5980 case 8200: return ((char *) HT_08200); break;
5981 case 8300: return ((char *) HT_08300); break;
5982 case 8400: return ((char *) HT_08400); break;
5983 case 8500: return ((char *) HT_08500); break;
5984 case 8600: return ((char *) HT_08600); break;
5985 case 8700: return ((char *) HT_08700); break;
5986 case 8800: return ((char *) HT_08800); break;
5987 case 8900: return ((char *) HT_08900); break;
5988 case 9000: return ((char *) HT_09000); break;
5989 case 9100: return ((char *) HT_09100); break;
5990 case 9200: return ((char *) HT_09200); break;
5991 case 9300: return ((char *) HT_09300); break;
5992 case 9400: return ((char *) HT_09400); break;
5993 case 9500: return ((char *) HT_09500); break;
5994 case 9600: return ((char *) HT_09600); break;
5995 case 9700: return ((char *) HT_09700); break;
5996 case 9710: return ((char *) HT_09710); break;
5997 case 9720: return ((char *) HT_09720); break;
5998 case 9800: return ((char *) HT_09800); break;
5999 case 9810: return ((char *) HT_09810); break;
6000 case 9820: return ((char *) HT_09820); break;
6001 case 9900: return ((char *) HT_09900); break;
6002 case 10000: return ((char *) HT_10000); break;
6003 case 10100: return ((char *) HT_10100); break;
6004 case 10200: return ((char *) HT_10200); break;
6005 case 10300: return ((char *) HT_10300); break;
6006 case 10400: return ((char *) HT_10400); break;
6007 case 10410: return ((char *) HT_10410); break;
6008 case 10420: return ((char *) HT_10420); break;
6009 case 10500: return ((char *) HT_10500); break;
6010 case 10600: return ((char *) HT_10600); break;
6011 case 10700: return ((char *) HT_10700); break;
6012 case 10800: return ((char *) HT_10800); break;
6013 case 10900: return ((char *) HT_10900); break;
6014 case 11000: return ((char *) HT_11000); break;
6015 case 11100: return ((char *) HT_11100); break;
6016 case 11200: return ((char *) HT_11200); break;
6017 case 11300: return ((char *) HT_11300); break;
6018 case 11400: return ((char *) HT_11400); break;
6019 case 11500: return ((char *) HT_11500); break;
6020 case 11600: return ((char *) HT_11600); break;
6021 case 11700: return ((char *) HT_11700); break;
6022 case 11800: return ((char *) HT_11800); break;
6023 case 11900: return ((char *) HT_11900); break;
6024 case 12000: return ((char *) HT_12000); break;
6025 case 12100: return ((char *) HT_12100); break;
6026 case 12200: return ((char *) HT_12200); break;
6027 case 12300: return ((char *) HT_12300); break;
6028 case 12400: return ((char *) HT_12400); break;
6029 case 12500: return ((char *) HT_12500); break;
6030 case 12600: return ((char *) HT_12600); break;
6031 case 12700: return ((char *) HT_12700); break;
6032 case 12800: return ((char *) HT_12800); break;
6033 case 12900: return ((char *) HT_12900); break;
6034 case 13000: return ((char *) HT_13000); break;
6035 case 13100: return ((char *) HT_13100); break;
6036 case 13200: return ((char *) HT_13200); break;
6037 case 13300: return ((char *) HT_13300); break;
6038 case 13400: return ((char *) HT_13400); break;
6039 case 13500: return ((char *) HT_13500); break;
6040 case 13600: return ((char *) HT_13600); break;
6041 case 13711: return ((char *) HT_13711); break;
6042 case 13712: return ((char *) HT_13712); break;
6043 case 13713: return ((char *) HT_13713); break;
6044 case 13721: return ((char *) HT_13721); break;
6045 case 13722: return ((char *) HT_13722); break;
6046 case 13723: return ((char *) HT_13723); break;
6047 case 13731: return ((char *) HT_13731); break;
6048 case 13732: return ((char *) HT_13732); break;
6049 case 13733: return ((char *) HT_13733); break;
6050 case 13741: return ((char *) HT_13741); break;
6051 case 13742: return ((char *) HT_13742); break;
6052 case 13743: return ((char *) HT_13743); break;
6053 case 13751: return ((char *) HT_13751); break;
6054 case 13752: return ((char *) HT_13752); break;
6055 case 13753: return ((char *) HT_13753); break;
6056 case 13761: return ((char *) HT_13761); break;
6057 case 13762: return ((char *) HT_13762); break;
6058 case 13763: return ((char *) HT_13763); break;
6059 }
6060
6061 return ((char *) "Unknown");
6062 }
6063
6064 char *strstatus (const uint devices_status)
6065 {
6066 switch (devices_status)
6067 {
6068 case STATUS_INIT: return ((char *) ST_0000); break;
6069 case STATUS_STARTING: return ((char *) ST_0001); break;
6070 case STATUS_RUNNING: return ((char *) ST_0002); break;
6071 case STATUS_PAUSED: return ((char *) ST_0003); break;
6072 case STATUS_EXHAUSTED: return ((char *) ST_0004); break;
6073 case STATUS_CRACKED: return ((char *) ST_0005); break;
6074 case STATUS_ABORTED: return ((char *) ST_0006); break;
6075 case STATUS_QUIT: return ((char *) ST_0007); break;
6076 case STATUS_BYPASS: return ((char *) ST_0008); break;
6077 case STATUS_STOP_AT_CHECKPOINT: return ((char *) ST_0009); break;
6078 case STATUS_AUTOTUNE: return ((char *) ST_0010); break;
6079 }
6080
6081 return ((char *) "Unknown");
6082 }
6083
6084 void ascii_digest (char *out_buf, uint salt_pos, uint digest_pos)
6085 {
6086 uint hash_type = data.hash_type;
6087 uint hash_mode = data.hash_mode;
6088 uint salt_type = data.salt_type;
6089 uint opts_type = data.opts_type;
6090 uint opti_type = data.opti_type;
6091 uint dgst_size = data.dgst_size;
6092
6093 char *hashfile = data.hashfile;
6094
6095 uint len = 4096;
6096
6097 uint digest_buf[64] = { 0 };
6098
6099 u64 *digest_buf64 = (u64 *) digest_buf;
6100
6101 char *digests_buf_ptr = (char *) data.digests_buf;
6102
6103 memcpy (digest_buf, digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size), dgst_size);
6104
6105 if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT)
6106 {
6107 uint tt;
6108
6109 switch (hash_type)
6110 {
6111 case HASH_TYPE_DESCRYPT:
6112 FP (digest_buf[1], digest_buf[0], tt);
6113 break;
6114
6115 case HASH_TYPE_DESRACF:
6116 digest_buf[0] = rotl32 (digest_buf[0], 29);
6117 digest_buf[1] = rotl32 (digest_buf[1], 29);
6118
6119 FP (digest_buf[1], digest_buf[0], tt);
6120 break;
6121
6122 case HASH_TYPE_LM:
6123 FP (digest_buf[1], digest_buf[0], tt);
6124 break;
6125
6126 case HASH_TYPE_NETNTLM:
6127 digest_buf[0] = rotl32 (digest_buf[0], 29);
6128 digest_buf[1] = rotl32 (digest_buf[1], 29);
6129 digest_buf[2] = rotl32 (digest_buf[2], 29);
6130 digest_buf[3] = rotl32 (digest_buf[3], 29);
6131
6132 FP (digest_buf[1], digest_buf[0], tt);
6133 FP (digest_buf[3], digest_buf[2], tt);
6134 break;
6135
6136 case HASH_TYPE_BSDICRYPT:
6137 digest_buf[0] = rotl32 (digest_buf[0], 31);
6138 digest_buf[1] = rotl32 (digest_buf[1], 31);
6139
6140 FP (digest_buf[1], digest_buf[0], tt);
6141 break;
6142 }
6143 }
6144
6145 if (opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE)
6146 {
6147 switch (hash_type)
6148 {
6149 case HASH_TYPE_MD4:
6150 digest_buf[0] += MD4M_A;
6151 digest_buf[1] += MD4M_B;
6152 digest_buf[2] += MD4M_C;
6153 digest_buf[3] += MD4M_D;
6154 break;
6155
6156 case HASH_TYPE_MD5:
6157 digest_buf[0] += MD5M_A;
6158 digest_buf[1] += MD5M_B;
6159 digest_buf[2] += MD5M_C;
6160 digest_buf[3] += MD5M_D;
6161 break;
6162
6163 case HASH_TYPE_SHA1:
6164 digest_buf[0] += SHA1M_A;
6165 digest_buf[1] += SHA1M_B;
6166 digest_buf[2] += SHA1M_C;
6167 digest_buf[3] += SHA1M_D;
6168 digest_buf[4] += SHA1M_E;
6169 break;
6170
6171 case HASH_TYPE_SHA256:
6172 digest_buf[0] += SHA256M_A;
6173 digest_buf[1] += SHA256M_B;
6174 digest_buf[2] += SHA256M_C;
6175 digest_buf[3] += SHA256M_D;
6176 digest_buf[4] += SHA256M_E;
6177 digest_buf[5] += SHA256M_F;
6178 digest_buf[6] += SHA256M_G;
6179 digest_buf[7] += SHA256M_H;
6180 break;
6181
6182 case HASH_TYPE_SHA384:
6183 digest_buf64[0] += SHA384M_A;
6184 digest_buf64[1] += SHA384M_B;
6185 digest_buf64[2] += SHA384M_C;
6186 digest_buf64[3] += SHA384M_D;
6187 digest_buf64[4] += SHA384M_E;
6188 digest_buf64[5] += SHA384M_F;
6189 digest_buf64[6] += 0;
6190 digest_buf64[7] += 0;
6191 break;
6192
6193 case HASH_TYPE_SHA512:
6194 digest_buf64[0] += SHA512M_A;
6195 digest_buf64[1] += SHA512M_B;
6196 digest_buf64[2] += SHA512M_C;
6197 digest_buf64[3] += SHA512M_D;
6198 digest_buf64[4] += SHA512M_E;
6199 digest_buf64[5] += SHA512M_F;
6200 digest_buf64[6] += SHA512M_G;
6201 digest_buf64[7] += SHA512M_H;
6202 break;
6203 }
6204 }
6205
6206 if (opts_type & OPTS_TYPE_PT_GENERATE_LE)
6207 {
6208 if (dgst_size == DGST_SIZE_4_2)
6209 {
6210 for (int i = 0; i < 2; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6211 }
6212 else if (dgst_size == DGST_SIZE_4_4)
6213 {
6214 for (int i = 0; i < 4; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6215 }
6216 else if (dgst_size == DGST_SIZE_4_5)
6217 {
6218 for (int i = 0; i < 5; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6219 }
6220 else if (dgst_size == DGST_SIZE_4_6)
6221 {
6222 for (int i = 0; i < 6; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6223 }
6224 else if (dgst_size == DGST_SIZE_4_8)
6225 {
6226 for (int i = 0; i < 8; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6227 }
6228 else if ((dgst_size == DGST_SIZE_4_16) || (dgst_size == DGST_SIZE_8_8)) // same size, same result :)
6229 {
6230 if (hash_type == HASH_TYPE_WHIRLPOOL)
6231 {
6232 for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6233 }
6234 else if (hash_type == HASH_TYPE_SHA384)
6235 {
6236 for (int i = 0; i < 8; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
6237 }
6238 else if (hash_type == HASH_TYPE_SHA512)
6239 {
6240 for (int i = 0; i < 8; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
6241 }
6242 else if (hash_type == HASH_TYPE_GOST)
6243 {
6244 for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6245 }
6246 }
6247 else if (dgst_size == DGST_SIZE_4_64)
6248 {
6249 for (int i = 0; i < 64; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6250 }
6251 else if (dgst_size == DGST_SIZE_8_25)
6252 {
6253 for (int i = 0; i < 25; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
6254 }
6255 }
6256
6257 uint isSalted = ((data.salt_type == SALT_TYPE_INTERN)
6258 | (data.salt_type == SALT_TYPE_EXTERN)
6259 | (data.salt_type == SALT_TYPE_EMBEDDED));
6260
6261 salt_t salt;
6262
6263 if (isSalted)
6264 {
6265 memset (&salt, 0, sizeof (salt_t));
6266
6267 memcpy (&salt, &data.salts_buf[salt_pos], sizeof (salt_t));
6268
6269 char *ptr = (char *) salt.salt_buf;
6270
6271 uint len = salt.salt_len;
6272
6273 if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT)
6274 {
6275 uint tt;
6276
6277 switch (hash_type)
6278 {
6279 case HASH_TYPE_NETNTLM:
6280
6281 salt.salt_buf[0] = rotr32 (salt.salt_buf[0], 3);
6282 salt.salt_buf[1] = rotr32 (salt.salt_buf[1], 3);
6283
6284 FP (salt.salt_buf[1], salt.salt_buf[0], tt);
6285
6286 break;
6287 }
6288 }
6289
6290 if (opts_type & OPTS_TYPE_ST_UNICODE)
6291 {
6292 for (uint i = 0, j = 0; i < len; i += 1, j += 2)
6293 {
6294 ptr[i] = ptr[j];
6295 }
6296
6297 len = len / 2;
6298 }
6299
6300 if (opts_type & OPTS_TYPE_ST_GENERATE_LE)
6301 {
6302 uint max = salt.salt_len / 4;
6303
6304 if (len % 4) max++;
6305
6306 for (uint i = 0; i < max; i++)
6307 {
6308 salt.salt_buf[i] = byte_swap_32 (salt.salt_buf[i]);
6309 }
6310 }
6311
6312 if (opts_type & OPTS_TYPE_ST_HEX)
6313 {
6314 char tmp[64] = { 0 };
6315
6316 for (uint i = 0, j = 0; i < len; i += 1, j += 2)
6317 {
6318 sprintf (tmp + j, "%02x", (unsigned char) ptr[i]);
6319 }
6320
6321 len = len * 2;
6322
6323 memcpy (ptr, tmp, len);
6324 }
6325
6326 uint memset_size = ((48 - (int) len) > 0) ? (48 - len) : 0;
6327
6328 memset (ptr + len, 0, memset_size);
6329
6330 salt.salt_len = len;
6331 }
6332
6333 //
6334 // some modes require special encoding
6335 //
6336
6337 uint out_buf_plain[256] = { 0 };
6338 uint out_buf_salt[256] = { 0 };
6339
6340 char tmp_buf[1024] = { 0 };
6341
6342 char *ptr_plain = (char *) out_buf_plain;
6343 char *ptr_salt = (char *) out_buf_salt;
6344
6345 if (hash_mode == 22)
6346 {
6347 char username[30] = { 0 };
6348
6349 memcpy (username, salt.salt_buf, salt.salt_len - 22);
6350
6351 char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' };
6352
6353 u16 *ptr = (u16 *) digest_buf;
6354
6355 tmp_buf[ 0] = sig[0];
6356 tmp_buf[ 1] = int_to_base64 (((ptr[1]) >> 12) & 0x3f);
6357 tmp_buf[ 2] = int_to_base64 (((ptr[1]) >> 6) & 0x3f);
6358 tmp_buf[ 3] = int_to_base64 (((ptr[1]) >> 0) & 0x3f);
6359 tmp_buf[ 4] = int_to_base64 (((ptr[0]) >> 12) & 0x3f);
6360 tmp_buf[ 5] = int_to_base64 (((ptr[0]) >> 6) & 0x3f);
6361 tmp_buf[ 6] = sig[1];
6362 tmp_buf[ 7] = int_to_base64 (((ptr[0]) >> 0) & 0x3f);
6363 tmp_buf[ 8] = int_to_base64 (((ptr[3]) >> 12) & 0x3f);
6364 tmp_buf[ 9] = int_to_base64 (((ptr[3]) >> 6) & 0x3f);
6365 tmp_buf[10] = int_to_base64 (((ptr[3]) >> 0) & 0x3f);
6366 tmp_buf[11] = int_to_base64 (((ptr[2]) >> 12) & 0x3f);
6367 tmp_buf[12] = sig[2];
6368 tmp_buf[13] = int_to_base64 (((ptr[2]) >> 6) & 0x3f);
6369 tmp_buf[14] = int_to_base64 (((ptr[2]) >> 0) & 0x3f);
6370 tmp_buf[15] = int_to_base64 (((ptr[5]) >> 12) & 0x3f);
6371 tmp_buf[16] = int_to_base64 (((ptr[5]) >> 6) & 0x3f);
6372 tmp_buf[17] = sig[3];
6373 tmp_buf[18] = int_to_base64 (((ptr[5]) >> 0) & 0x3f);
6374 tmp_buf[19] = int_to_base64 (((ptr[4]) >> 12) & 0x3f);
6375 tmp_buf[20] = int_to_base64 (((ptr[4]) >> 6) & 0x3f);
6376 tmp_buf[21] = int_to_base64 (((ptr[4]) >> 0) & 0x3f);
6377 tmp_buf[22] = int_to_base64 (((ptr[7]) >> 12) & 0x3f);
6378 tmp_buf[23] = sig[4];
6379 tmp_buf[24] = int_to_base64 (((ptr[7]) >> 6) & 0x3f);
6380 tmp_buf[25] = int_to_base64 (((ptr[7]) >> 0) & 0x3f);
6381 tmp_buf[26] = int_to_base64 (((ptr[6]) >> 12) & 0x3f);
6382 tmp_buf[27] = int_to_base64 (((ptr[6]) >> 6) & 0x3f);
6383 tmp_buf[28] = int_to_base64 (((ptr[6]) >> 0) & 0x3f);
6384 tmp_buf[29] = sig[5];
6385
6386 snprintf (out_buf, len-1, "%s:%s",
6387 tmp_buf,
6388 username);
6389 }
6390 else if (hash_mode == 23)
6391 {
6392 // do not show the skyper part in output
6393
6394 char *salt_buf_ptr = (char *) salt.salt_buf;
6395
6396 salt_buf_ptr[salt.salt_len - 8] = 0;
6397
6398 snprintf (out_buf, len-1, "%08x%08x%08x%08x:%s",
6399 digest_buf[0],
6400 digest_buf[1],
6401 digest_buf[2],
6402 digest_buf[3],
6403 salt_buf_ptr);
6404 }
6405 else if (hash_mode == 101)
6406 {
6407 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6408
6409 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6410 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6411 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6412 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6413 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6414
6415 memcpy (tmp_buf, digest_buf, 20);
6416
6417 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6418
6419 snprintf (out_buf, len-1, "{SHA}%s", ptr_plain);
6420 }
6421 else if (hash_mode == 111)
6422 {
6423 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6424
6425 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6426 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6427 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6428 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6429 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6430
6431 memcpy (tmp_buf, digest_buf, 20);
6432 memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len);
6433
6434 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20 + salt.salt_len, (u8 *) ptr_plain);
6435
6436 snprintf (out_buf, len-1, "{SSHA}%s", ptr_plain);
6437 }
6438 else if ((hash_mode == 122) || (hash_mode == 125))
6439 {
6440 snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x",
6441 (char *) salt.salt_buf,
6442 digest_buf[0],
6443 digest_buf[1],
6444 digest_buf[2],
6445 digest_buf[3],
6446 digest_buf[4]);
6447 }
6448 else if (hash_mode == 124)
6449 {
6450 snprintf (out_buf, len-1, "sha1$%s$%08x%08x%08x%08x%08x",
6451 (char *) salt.salt_buf,
6452 digest_buf[0],
6453 digest_buf[1],
6454 digest_buf[2],
6455 digest_buf[3],
6456 digest_buf[4]);
6457 }
6458 else if (hash_mode == 131)
6459 {
6460 snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6461 (char *) salt.salt_buf,
6462 0, 0, 0, 0, 0,
6463 digest_buf[0],
6464 digest_buf[1],
6465 digest_buf[2],
6466 digest_buf[3],
6467 digest_buf[4]);
6468 }
6469 else if (hash_mode == 132)
6470 {
6471 snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x",
6472 (char *) salt.salt_buf,
6473 digest_buf[0],
6474 digest_buf[1],
6475 digest_buf[2],
6476 digest_buf[3],
6477 digest_buf[4]);
6478 }
6479 else if (hash_mode == 133)
6480 {
6481 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6482
6483 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6484 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6485 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6486 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6487 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6488
6489 memcpy (tmp_buf, digest_buf, 20);
6490
6491 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6492
6493 snprintf (out_buf, len-1, "%s", ptr_plain);
6494 }
6495 else if (hash_mode == 141)
6496 {
6497 memcpy (tmp_buf, salt.salt_buf, salt.salt_len);
6498
6499 base64_encode (int_to_base64, (const u8 *) tmp_buf, salt.salt_len, (u8 *) ptr_salt);
6500
6501 memset (tmp_buf, 0, sizeof (tmp_buf));
6502
6503 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6504
6505 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6506 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6507 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6508 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6509 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6510
6511 memcpy (tmp_buf, digest_buf, 20);
6512
6513 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6514
6515 ptr_plain[27] = 0;
6516
6517 snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER, ptr_salt, ptr_plain);
6518 }
6519 else if (hash_mode == 400)
6520 {
6521 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6522
6523 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6524 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6525 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6526 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6527
6528 phpass_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6529
6530 snprintf (out_buf, len-1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, (char *) ptr_plain);
6531 }
6532 else if (hash_mode == 500)
6533 {
6534 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6535
6536 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6537 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6538 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6539 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6540
6541 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6542
6543 if (salt.salt_iter == ROUNDS_MD5CRYPT)
6544 {
6545 snprintf (out_buf, len-1, "$1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6546 }
6547 else
6548 {
6549 snprintf (out_buf, len-1, "$1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6550 }
6551 }
6552 else if (hash_mode == 501)
6553 {
6554 uint digest_idx = salt.digests_offset + digest_pos;
6555
6556 hashinfo_t **hashinfo_ptr = data.hash_info;
6557 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
6558
6559 snprintf (out_buf, len-1, "%s", hash_buf);
6560 }
6561 else if (hash_mode == 1421)
6562 {
6563 u8 *salt_ptr = (u8 *) salt.salt_buf;
6564
6565 snprintf (out_buf, len-1, "%c%c%c%c%c%c%08x%08x%08x%08x%08x%08x%08x%08x",
6566 salt_ptr[0],
6567 salt_ptr[1],
6568 salt_ptr[2],
6569 salt_ptr[3],
6570 salt_ptr[4],
6571 salt_ptr[5],
6572 digest_buf[0],
6573 digest_buf[1],
6574 digest_buf[2],
6575 digest_buf[3],
6576 digest_buf[4],
6577 digest_buf[5],
6578 digest_buf[6],
6579 digest_buf[7]);
6580 }
6581 else if (hash_mode == 1441)
6582 {
6583 memcpy (tmp_buf, salt.salt_buf, salt.salt_len);
6584
6585 base64_encode (int_to_base64, (const u8 *) tmp_buf, salt.salt_len, (u8 *) ptr_salt);
6586
6587 memset (tmp_buf, 0, sizeof (tmp_buf));
6588
6589 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6590
6591 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6592 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6593 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6594 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6595 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6596 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6597 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6598 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6599
6600 memcpy (tmp_buf, digest_buf, 32);
6601
6602 base64_encode (int_to_base64, (const u8 *) tmp_buf, 32, (u8 *) ptr_plain);
6603
6604 ptr_plain[43] = 0;
6605
6606 snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER4, ptr_salt, ptr_plain);
6607 }
6608 else if (hash_mode == 1500)
6609 {
6610 out_buf[0] = salt.salt_sign[0] & 0xff;
6611 out_buf[1] = salt.salt_sign[1] & 0xff;
6612 //original method, but changed because of this ticket: https://hashcat.net/trac/ticket/269
6613 //out_buf[0] = int_to_itoa64 ((salt.salt_buf[0] >> 0) & 0x3f);
6614 //out_buf[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f);
6615
6616 memset (tmp_buf, 0, sizeof (tmp_buf));
6617
6618 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6619
6620 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6621 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6622
6623 memcpy (tmp_buf, digest_buf, 8);
6624
6625 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 8, (u8 *) ptr_plain);
6626
6627 snprintf (out_buf + 2, len-1-2, "%s", ptr_plain);
6628
6629 out_buf[13] = 0;
6630 }
6631 else if (hash_mode == 1600)
6632 {
6633 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6634
6635 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6636 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6637 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6638 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6639
6640 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6641
6642 if (salt.salt_iter == ROUNDS_MD5CRYPT)
6643 {
6644 snprintf (out_buf, len-1, "$apr1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6645 }
6646 else
6647 {
6648 snprintf (out_buf, len-1, "$apr1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6649 }
6650 }
6651 else if (hash_mode == 1711)
6652 {
6653 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6654
6655 digest_buf64[0] = byte_swap_64 (digest_buf64[0]);
6656 digest_buf64[1] = byte_swap_64 (digest_buf64[1]);
6657 digest_buf64[2] = byte_swap_64 (digest_buf64[2]);
6658 digest_buf64[3] = byte_swap_64 (digest_buf64[3]);
6659 digest_buf64[4] = byte_swap_64 (digest_buf64[4]);
6660 digest_buf64[5] = byte_swap_64 (digest_buf64[5]);
6661 digest_buf64[6] = byte_swap_64 (digest_buf64[6]);
6662 digest_buf64[7] = byte_swap_64 (digest_buf64[7]);
6663
6664 memcpy (tmp_buf, digest_buf, 64);
6665 memcpy (tmp_buf + 64, salt.salt_buf, salt.salt_len);
6666
6667 base64_encode (int_to_base64, (const u8 *) tmp_buf, 64 + salt.salt_len, (u8 *) ptr_plain);
6668
6669 snprintf (out_buf, len-1, "%s%s", SIGNATURE_SHA512B64S, ptr_plain);
6670 }
6671 else if (hash_mode == 1722)
6672 {
6673 uint *ptr = digest_buf;
6674
6675 snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6676 (unsigned char *) salt.salt_buf,
6677 ptr[ 1], ptr[ 0],
6678 ptr[ 3], ptr[ 2],
6679 ptr[ 5], ptr[ 4],
6680 ptr[ 7], ptr[ 6],
6681 ptr[ 9], ptr[ 8],
6682 ptr[11], ptr[10],
6683 ptr[13], ptr[12],
6684 ptr[15], ptr[14]);
6685 }
6686 else if (hash_mode == 1731)
6687 {
6688 uint *ptr = digest_buf;
6689
6690 snprintf (out_buf, len-1, "0x0200%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6691 (unsigned char *) salt.salt_buf,
6692 ptr[ 1], ptr[ 0],
6693 ptr[ 3], ptr[ 2],
6694 ptr[ 5], ptr[ 4],
6695 ptr[ 7], ptr[ 6],
6696 ptr[ 9], ptr[ 8],
6697 ptr[11], ptr[10],
6698 ptr[13], ptr[12],
6699 ptr[15], ptr[14]);
6700 }
6701 else if (hash_mode == 1800)
6702 {
6703 // temp workaround
6704
6705 digest_buf64[0] = byte_swap_64 (digest_buf64[0]);
6706 digest_buf64[1] = byte_swap_64 (digest_buf64[1]);
6707 digest_buf64[2] = byte_swap_64 (digest_buf64[2]);
6708 digest_buf64[3] = byte_swap_64 (digest_buf64[3]);
6709 digest_buf64[4] = byte_swap_64 (digest_buf64[4]);
6710 digest_buf64[5] = byte_swap_64 (digest_buf64[5]);
6711 digest_buf64[6] = byte_swap_64 (digest_buf64[6]);
6712 digest_buf64[7] = byte_swap_64 (digest_buf64[7]);
6713
6714 sha512crypt_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
6715
6716 if (salt.salt_iter == ROUNDS_SHA512CRYPT)
6717 {
6718 snprintf (out_buf, len-1, "$6$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6719 }
6720 else
6721 {
6722 snprintf (out_buf, len-1, "$6$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6723 }
6724 }
6725 else if (hash_mode == 2100)
6726 {
6727 uint pos = 0;
6728
6729 snprintf (out_buf + pos, len-1, "%s%i#",
6730 SIGNATURE_DCC2,
6731 salt.salt_iter + 1);
6732
6733 uint signature_len = strlen (out_buf);
6734
6735 pos += signature_len;
6736 len -= signature_len;
6737
6738 char *salt_ptr = (char *) salt.salt_buf;
6739
6740 for (uint i = 0; i < salt.salt_len; i++, pos++, len--) snprintf (out_buf + pos, len-1, "%c", salt_ptr[i]);
6741
6742 snprintf (out_buf + pos, len-1, "#%08x%08x%08x%08x",
6743 byte_swap_32 (digest_buf[0]),
6744 byte_swap_32 (digest_buf[1]),
6745 byte_swap_32 (digest_buf[2]),
6746 byte_swap_32 (digest_buf[3]));
6747 }
6748 else if ((hash_mode == 2400) || (hash_mode == 2410))
6749 {
6750 memcpy (tmp_buf, digest_buf, 16);
6751
6752 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6753
6754 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6755 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6756 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6757 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6758
6759 out_buf[ 0] = int_to_itoa64 ((digest_buf[0] >> 0) & 0x3f);
6760 out_buf[ 1] = int_to_itoa64 ((digest_buf[0] >> 6) & 0x3f);
6761 out_buf[ 2] = int_to_itoa64 ((digest_buf[0] >> 12) & 0x3f);
6762 out_buf[ 3] = int_to_itoa64 ((digest_buf[0] >> 18) & 0x3f);
6763
6764 out_buf[ 4] = int_to_itoa64 ((digest_buf[1] >> 0) & 0x3f);
6765 out_buf[ 5] = int_to_itoa64 ((digest_buf[1] >> 6) & 0x3f);
6766 out_buf[ 6] = int_to_itoa64 ((digest_buf[1] >> 12) & 0x3f);
6767 out_buf[ 7] = int_to_itoa64 ((digest_buf[1] >> 18) & 0x3f);
6768
6769 out_buf[ 8] = int_to_itoa64 ((digest_buf[2] >> 0) & 0x3f);
6770 out_buf[ 9] = int_to_itoa64 ((digest_buf[2] >> 6) & 0x3f);
6771 out_buf[10] = int_to_itoa64 ((digest_buf[2] >> 12) & 0x3f);
6772 out_buf[11] = int_to_itoa64 ((digest_buf[2] >> 18) & 0x3f);
6773
6774 out_buf[12] = int_to_itoa64 ((digest_buf[3] >> 0) & 0x3f);
6775 out_buf[13] = int_to_itoa64 ((digest_buf[3] >> 6) & 0x3f);
6776 out_buf[14] = int_to_itoa64 ((digest_buf[3] >> 12) & 0x3f);
6777 out_buf[15] = int_to_itoa64 ((digest_buf[3] >> 18) & 0x3f);
6778
6779 out_buf[16] = 0;
6780 }
6781 else if (hash_mode == 2500)
6782 {
6783 wpa_t *wpas = (wpa_t *) data.esalts_buf;
6784
6785 wpa_t *wpa = &wpas[salt_pos];
6786
6787 snprintf (out_buf, len-1, "%s:%02x%02x%02x%02x%02x%02x:%02x%02x%02x%02x%02x%02x",
6788 (char *) salt.salt_buf,
6789 wpa->orig_mac1[0],
6790 wpa->orig_mac1[1],
6791 wpa->orig_mac1[2],
6792 wpa->orig_mac1[3],
6793 wpa->orig_mac1[4],
6794 wpa->orig_mac1[5],
6795 wpa->orig_mac2[0],
6796 wpa->orig_mac2[1],
6797 wpa->orig_mac2[2],
6798 wpa->orig_mac2[3],
6799 wpa->orig_mac2[4],
6800 wpa->orig_mac2[5]);
6801 }
6802 else if (hash_mode == 4400)
6803 {
6804 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
6805 byte_swap_32 (digest_buf[0]),
6806 byte_swap_32 (digest_buf[1]),
6807 byte_swap_32 (digest_buf[2]),
6808 byte_swap_32 (digest_buf[3]));
6809 }
6810 else if (hash_mode == 4700)
6811 {
6812 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6813 byte_swap_32 (digest_buf[0]),
6814 byte_swap_32 (digest_buf[1]),
6815 byte_swap_32 (digest_buf[2]),
6816 byte_swap_32 (digest_buf[3]),
6817 byte_swap_32 (digest_buf[4]));
6818 }
6819 else if (hash_mode == 4800)
6820 {
6821 u8 chap_id_byte = (u8) salt.salt_buf[4];
6822
6823 snprintf (out_buf, len-1, "%08x%08x%08x%08x:%08x%08x%08x%08x:%02x",
6824 digest_buf[0],
6825 digest_buf[1],
6826 digest_buf[2],
6827 digest_buf[3],
6828 byte_swap_32 (salt.salt_buf[0]),
6829 byte_swap_32 (salt.salt_buf[1]),
6830 byte_swap_32 (salt.salt_buf[2]),
6831 byte_swap_32 (salt.salt_buf[3]),
6832 chap_id_byte);
6833 }
6834 else if (hash_mode == 4900)
6835 {
6836 snprintf (out_buf, len-1, "%08x%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 byte_swap_32 (digest_buf[4]));
6842 }
6843 else if (hash_mode == 5100)
6844 {
6845 snprintf (out_buf, len-1, "%08x%08x",
6846 digest_buf[0],
6847 digest_buf[1]);
6848 }
6849 else if (hash_mode == 5200)
6850 {
6851 snprintf (out_buf, len-1, "%s", hashfile);
6852 }
6853 else if (hash_mode == 5300)
6854 {
6855 ikepsk_t *ikepsks = (ikepsk_t *) data.esalts_buf;
6856
6857 ikepsk_t *ikepsk = &ikepsks[salt_pos];
6858
6859 int buf_len = len -1;
6860
6861 // msg_buf
6862
6863 uint ikepsk_msg_len = ikepsk->msg_len / 4;
6864
6865 for (uint i = 0; i < ikepsk_msg_len; i++)
6866 {
6867 if ((i == 32) || (i == 64) || (i == 66) || (i == 68) || (i == 108))
6868 {
6869 snprintf (out_buf, buf_len, ":");
6870
6871 buf_len--;
6872 out_buf++;
6873 }
6874
6875 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->msg_buf[i]));
6876
6877 buf_len -= 8;
6878 out_buf += 8;
6879 }
6880
6881 // nr_buf
6882
6883 uint ikepsk_nr_len = ikepsk->nr_len / 4;
6884
6885 for (uint i = 0; i < ikepsk_nr_len; i++)
6886 {
6887 if ((i == 0) || (i == 5))
6888 {
6889 snprintf (out_buf, buf_len, ":");
6890
6891 buf_len--;
6892 out_buf++;
6893 }
6894
6895 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->nr_buf[i]));
6896
6897 buf_len -= 8;
6898 out_buf += 8;
6899 }
6900
6901 // digest_buf
6902
6903 for (uint i = 0; i < 4; i++)
6904 {
6905 if (i == 0)
6906 {
6907 snprintf (out_buf, buf_len, ":");
6908
6909 buf_len--;
6910 out_buf++;
6911 }
6912
6913 snprintf (out_buf, buf_len, "%08x", digest_buf[i]);
6914
6915 buf_len -= 8;
6916 out_buf += 8;
6917 }
6918 }
6919 else if (hash_mode == 5400)
6920 {
6921 ikepsk_t *ikepsks = (ikepsk_t *) data.esalts_buf;
6922
6923 ikepsk_t *ikepsk = &ikepsks[salt_pos];
6924
6925 int buf_len = len -1;
6926
6927 // msg_buf
6928
6929 uint ikepsk_msg_len = ikepsk->msg_len / 4;
6930
6931 for (uint i = 0; i < ikepsk_msg_len; i++)
6932 {
6933 if ((i == 32) || (i == 64) || (i == 66) || (i == 68) || (i == 108))
6934 {
6935 snprintf (out_buf, buf_len, ":");
6936
6937 buf_len--;
6938 out_buf++;
6939 }
6940
6941 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->msg_buf[i]));
6942
6943 buf_len -= 8;
6944 out_buf += 8;
6945 }
6946
6947 // nr_buf
6948
6949 uint ikepsk_nr_len = ikepsk->nr_len / 4;
6950
6951 for (uint i = 0; i < ikepsk_nr_len; i++)
6952 {
6953 if ((i == 0) || (i == 5))
6954 {
6955 snprintf (out_buf, buf_len, ":");
6956
6957 buf_len--;
6958 out_buf++;
6959 }
6960
6961 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->nr_buf[i]));
6962
6963 buf_len -= 8;
6964 out_buf += 8;
6965 }
6966
6967 // digest_buf
6968
6969 for (uint i = 0; i < 5; i++)
6970 {
6971 if (i == 0)
6972 {
6973 snprintf (out_buf, buf_len, ":");
6974
6975 buf_len--;
6976 out_buf++;
6977 }
6978
6979 snprintf (out_buf, buf_len, "%08x", digest_buf[i]);
6980
6981 buf_len -= 8;
6982 out_buf += 8;
6983 }
6984 }
6985 else if (hash_mode == 5500)
6986 {
6987 netntlm_t *netntlms = (netntlm_t *) data.esalts_buf;
6988
6989 netntlm_t *netntlm = &netntlms[salt_pos];
6990
6991 char user_buf[64] = { 0 };
6992 char domain_buf[64] = { 0 };
6993 char srvchall_buf[1024] = { 0 };
6994 char clichall_buf[1024] = { 0 };
6995
6996 for (uint i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2)
6997 {
6998 char *ptr = (char *) netntlm->userdomain_buf;
6999
7000 user_buf[i] = ptr[j];
7001 }
7002
7003 for (uint i = 0, j = 0; j < netntlm->domain_len; i += 1, j += 2)
7004 {
7005 char *ptr = (char *) netntlm->userdomain_buf;
7006
7007 domain_buf[i] = ptr[netntlm->user_len + j];
7008 }
7009
7010 for (uint i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2)
7011 {
7012 u8 *ptr = (u8 *) netntlm->chall_buf;
7013
7014 sprintf (srvchall_buf + j, "%02x", ptr[i]);
7015 }
7016
7017 for (uint i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2)
7018 {
7019 u8 *ptr = (u8 *) netntlm->chall_buf;
7020
7021 sprintf (clichall_buf + j, "%02x", ptr[netntlm->srvchall_len + i]);
7022 }
7023
7024 snprintf (out_buf, len-1, "%s::%s:%s:%08x%08x%08x%08x%08x%08x:%s",
7025 user_buf,
7026 domain_buf,
7027 srvchall_buf,
7028 digest_buf[0],
7029 digest_buf[1],
7030 digest_buf[2],
7031 digest_buf[3],
7032 byte_swap_32 (salt.salt_buf_pc[0]),
7033 byte_swap_32 (salt.salt_buf_pc[1]),
7034 clichall_buf);
7035 }
7036 else if (hash_mode == 5600)
7037 {
7038 netntlm_t *netntlms = (netntlm_t *) data.esalts_buf;
7039
7040 netntlm_t *netntlm = &netntlms[salt_pos];
7041
7042 char user_buf[64] = { 0 };
7043 char domain_buf[64] = { 0 };
7044 char srvchall_buf[1024] = { 0 };
7045 char clichall_buf[1024] = { 0 };
7046
7047 for (uint i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2)
7048 {
7049 char *ptr = (char *) netntlm->userdomain_buf;
7050
7051 user_buf[i] = ptr[j];
7052 }
7053
7054 for (uint i = 0, j = 0; j < netntlm->domain_len; i += 1, j += 2)
7055 {
7056 char *ptr = (char *) netntlm->userdomain_buf;
7057
7058 domain_buf[i] = ptr[netntlm->user_len + j];
7059 }
7060
7061 for (uint i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2)
7062 {
7063 u8 *ptr = (u8 *) netntlm->chall_buf;
7064
7065 sprintf (srvchall_buf + j, "%02x", ptr[i]);
7066 }
7067
7068 for (uint i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2)
7069 {
7070 u8 *ptr = (u8 *) netntlm->chall_buf;
7071
7072 sprintf (clichall_buf + j, "%02x", ptr[netntlm->srvchall_len + i]);
7073 }
7074
7075 snprintf (out_buf, len-1, "%s::%s:%s:%08x%08x%08x%08x:%s",
7076 user_buf,
7077 domain_buf,
7078 srvchall_buf,
7079 digest_buf[0],
7080 digest_buf[1],
7081 digest_buf[2],
7082 digest_buf[3],
7083 clichall_buf);
7084 }
7085 else if (hash_mode == 5700)
7086 {
7087 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
7088
7089 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7090 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7091 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7092 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7093 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7094 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7095 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7096 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7097
7098 memcpy (tmp_buf, digest_buf, 32);
7099
7100 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 32, (u8 *) ptr_plain);
7101
7102 ptr_plain[43] = 0;
7103
7104 snprintf (out_buf, len-1, "%s", ptr_plain);
7105 }
7106 else if (hash_mode == 5800)
7107 {
7108 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7109 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7110 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7111 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7112 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7113
7114 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
7115 digest_buf[0],
7116 digest_buf[1],
7117 digest_buf[2],
7118 digest_buf[3],
7119 digest_buf[4]);
7120 }
7121 else if ((hash_mode >= 6200) && (hash_mode <= 6299))
7122 {
7123 snprintf (out_buf, len-1, "%s", hashfile);
7124 }
7125 else if (hash_mode == 6300)
7126 {
7127 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
7128
7129 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7130 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7131 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7132 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7133
7134 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
7135
7136 snprintf (out_buf, len-1, "{smd5}%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
7137 }
7138 else if (hash_mode == 6400)
7139 {
7140 sha256aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
7141
7142 snprintf (out_buf, len-1, "{ssha256}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
7143 }
7144 else if (hash_mode == 6500)
7145 {
7146 sha512aix_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
7147
7148 snprintf (out_buf, len-1, "{ssha512}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
7149 }
7150 else if (hash_mode == 6600)
7151 {
7152 agilekey_t *agilekeys = (agilekey_t *) data.esalts_buf;
7153
7154 agilekey_t *agilekey = &agilekeys[salt_pos];
7155
7156 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
7157 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
7158
7159 uint buf_len = len - 1;
7160
7161 uint off = snprintf (out_buf, buf_len, "%d:%08x%08x:", salt.salt_iter + 1, salt.salt_buf[0], salt.salt_buf[1]);
7162 buf_len -= 22;
7163
7164 for (uint i = 0, j = off; i < 1040; i++, j += 2)
7165 {
7166 snprintf (out_buf + j, buf_len, "%02x", agilekey->cipher[i]);
7167
7168 buf_len -= 2;
7169 }
7170 }
7171 else if (hash_mode == 6700)
7172 {
7173 sha1aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
7174
7175 snprintf (out_buf, len-1, "{ssha1}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
7176 }
7177 else if (hash_mode == 6800)
7178 {
7179 snprintf (out_buf, len-1, "%s", (char *) salt.salt_buf);
7180 }
7181 else if (hash_mode == 7100)
7182 {
7183 uint *ptr = digest_buf;
7184
7185 pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) data.esalts_buf;
7186
7187 pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[salt_pos];
7188
7189 uint esalt[8] = { 0 };
7190
7191 esalt[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]);
7192 esalt[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]);
7193 esalt[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]);
7194 esalt[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]);
7195 esalt[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]);
7196 esalt[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]);
7197 esalt[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]);
7198 esalt[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]);
7199
7200 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",
7201 SIGNATURE_SHA512OSX,
7202 salt.salt_iter + 1,
7203 esalt[ 0], esalt[ 1],
7204 esalt[ 2], esalt[ 3],
7205 esalt[ 4], esalt[ 5],
7206 esalt[ 6], esalt[ 7],
7207 ptr [ 1], ptr [ 0],
7208 ptr [ 3], ptr [ 2],
7209 ptr [ 5], ptr [ 4],
7210 ptr [ 7], ptr [ 6],
7211 ptr [ 9], ptr [ 8],
7212 ptr [11], ptr [10],
7213 ptr [13], ptr [12],
7214 ptr [15], ptr [14]);
7215 }
7216 else if (hash_mode == 7200)
7217 {
7218 uint *ptr = digest_buf;
7219
7220 pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) data.esalts_buf;
7221
7222 pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[salt_pos];
7223
7224 uint len_used = 0;
7225
7226 snprintf (out_buf + len_used, len - len_used - 1, "%s%i.", SIGNATURE_SHA512GRUB, salt.salt_iter + 1);
7227
7228 len_used = strlen (out_buf);
7229
7230 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha512->salt_buf;
7231
7232 for (uint i = 0; i < salt.salt_len; i++, len_used += 2)
7233 {
7234 snprintf (out_buf + len_used, len - len_used - 1, "%02x", salt_buf_ptr[i]);
7235 }
7236
7237 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",
7238 ptr [ 1], ptr [ 0],
7239 ptr [ 3], ptr [ 2],
7240 ptr [ 5], ptr [ 4],
7241 ptr [ 7], ptr [ 6],
7242 ptr [ 9], ptr [ 8],
7243 ptr [11], ptr [10],
7244 ptr [13], ptr [12],
7245 ptr [15], ptr [14]);
7246 }
7247 else if (hash_mode == 7300)
7248 {
7249 rakp_t *rakps = (rakp_t *) data.esalts_buf;
7250
7251 rakp_t *rakp = &rakps[salt_pos];
7252
7253 for (uint i = 0, j = 0; (i * 4) < rakp->salt_len; i += 1, j += 8)
7254 {
7255 sprintf (out_buf + j, "%08x", rakp->salt_buf[i]);
7256 }
7257
7258 snprintf (out_buf + rakp->salt_len * 2, len - 1, ":%08x%08x%08x%08x%08x",
7259 digest_buf[0],
7260 digest_buf[1],
7261 digest_buf[2],
7262 digest_buf[3],
7263 digest_buf[4]);
7264 }
7265 else if (hash_mode == 7400)
7266 {
7267 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
7268
7269 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7270 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7271 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7272 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7273 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7274 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7275 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7276 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7277
7278 sha256crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
7279
7280 if (salt.salt_iter == ROUNDS_SHA256CRYPT)
7281 {
7282 snprintf (out_buf, len-1, "$5$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
7283 }
7284 else
7285 {
7286 snprintf (out_buf, len-1, "$5$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
7287 }
7288 }
7289 else if (hash_mode == 7500)
7290 {
7291 krb5pa_t *krb5pas = (krb5pa_t *) data.esalts_buf;
7292
7293 krb5pa_t *krb5pa = &krb5pas[salt_pos];
7294
7295 u8 *ptr_timestamp = (u8 *) krb5pa->timestamp;
7296 u8 *ptr_checksum = (u8 *) krb5pa->checksum;
7297
7298 char data[128] = { 0 };
7299
7300 char *ptr_data = data;
7301
7302 for (uint i = 0; i < 36; i++, ptr_data += 2)
7303 {
7304 sprintf (ptr_data, "%02x", ptr_timestamp[i]);
7305 }
7306
7307 for (uint i = 0; i < 16; i++, ptr_data += 2)
7308 {
7309 sprintf (ptr_data, "%02x", ptr_checksum[i]);
7310 }
7311
7312 *ptr_data = 0;
7313
7314 snprintf (out_buf, len-1, "%s$%s$%s$%s$%s",
7315 SIGNATURE_KRB5PA,
7316 (char *) krb5pa->user,
7317 (char *) krb5pa->realm,
7318 (char *) krb5pa->salt,
7319 data);
7320 }
7321 else if (hash_mode == 7700)
7322 {
7323 snprintf (out_buf, len-1, "%s$%08X%08X",
7324 (char *) salt.salt_buf,
7325 digest_buf[0],
7326 digest_buf[1]);
7327 }
7328 else if (hash_mode == 7800)
7329 {
7330 snprintf (out_buf, len-1, "%s$%08X%08X%08X%08X%08X",
7331 (char *) salt.salt_buf,
7332 digest_buf[0],
7333 digest_buf[1],
7334 digest_buf[2],
7335 digest_buf[3],
7336 digest_buf[4]);
7337 }
7338 else if (hash_mode == 7900)
7339 {
7340 drupal7_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
7341
7342 // ugly hack start
7343
7344 char *tmp = (char *) salt.salt_buf_pc;
7345
7346 ptr_plain[42] = tmp[0];
7347
7348 // ugly hack end
7349
7350 ptr_plain[43] = 0;
7351
7352 snprintf (out_buf, len-1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, (char *) ptr_plain);
7353 }
7354 else if (hash_mode == 8000)
7355 {
7356 snprintf (out_buf, len-1, "0xc007%s%08x%08x%08x%08x%08x%08x%08x%08x",
7357 (unsigned char *) salt.salt_buf,
7358 digest_buf[0],
7359 digest_buf[1],
7360 digest_buf[2],
7361 digest_buf[3],
7362 digest_buf[4],
7363 digest_buf[5],
7364 digest_buf[6],
7365 digest_buf[7]);
7366 }
7367 else if (hash_mode == 8100)
7368 {
7369 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
7370 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
7371
7372 snprintf (out_buf, len-1, "1%s%08x%08x%08x%08x%08x",
7373 (unsigned char *) salt.salt_buf,
7374 digest_buf[0],
7375 digest_buf[1],
7376 digest_buf[2],
7377 digest_buf[3],
7378 digest_buf[4]);
7379 }
7380 else if (hash_mode == 8200)
7381 {
7382 cloudkey_t *cloudkeys = (cloudkey_t *) data.esalts_buf;
7383
7384 cloudkey_t *cloudkey = &cloudkeys[salt_pos];
7385
7386 char data_buf[4096] = { 0 };
7387
7388 for (int i = 0, j = 0; i < 512; i += 1, j += 8)
7389 {
7390 sprintf (data_buf + j, "%08x", cloudkey->data_buf[i]);
7391 }
7392
7393 data_buf[cloudkey->data_len * 2] = 0;
7394
7395 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7396 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7397 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7398 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7399 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7400 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7401 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7402 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7403
7404 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
7405 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
7406 salt.salt_buf[2] = byte_swap_32 (salt.salt_buf[2]);
7407 salt.salt_buf[3] = byte_swap_32 (salt.salt_buf[3]);
7408
7409 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x:%08x%08x%08x%08x:%u:%s",
7410 digest_buf[0],
7411 digest_buf[1],
7412 digest_buf[2],
7413 digest_buf[3],
7414 digest_buf[4],
7415 digest_buf[5],
7416 digest_buf[6],
7417 digest_buf[7],
7418 salt.salt_buf[0],
7419 salt.salt_buf[1],
7420 salt.salt_buf[2],
7421 salt.salt_buf[3],
7422 salt.salt_iter + 1,
7423 data_buf);
7424 }
7425 else if (hash_mode == 8300)
7426 {
7427 char digest_buf_c[34] = { 0 };
7428
7429 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7430 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7431 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7432 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7433 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7434
7435 base32_encode (int_to_itoa32, (const u8 *) digest_buf, 20, (u8 *) digest_buf_c);
7436
7437 digest_buf_c[32] = 0;
7438
7439 // domain
7440
7441 const uint salt_pc_len = salt.salt_buf_pc[7]; // what a hack
7442
7443 char domain_buf_c[33] = { 0 };
7444
7445 memcpy (domain_buf_c, (char *) salt.salt_buf_pc, salt_pc_len);
7446
7447 for (uint i = 0; i < salt_pc_len; i++)
7448 {
7449 const char next = domain_buf_c[i];
7450
7451 domain_buf_c[i] = '.';
7452
7453 i += next;
7454 }
7455
7456 domain_buf_c[salt_pc_len] = 0;
7457
7458 // final
7459
7460 snprintf (out_buf, len-1, "%s:%s:%s:%u", digest_buf_c, domain_buf_c, (char *) salt.salt_buf, salt.salt_iter);
7461 }
7462 else if (hash_mode == 8500)
7463 {
7464 snprintf (out_buf, len-1, "%s*%s*%08X%08X", SIGNATURE_RACF, (char *) salt.salt_buf, digest_buf[0], digest_buf[1]);
7465 }
7466 else if (hash_mode == 2612)
7467 {
7468 snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x",
7469 SIGNATURE_PHPS,
7470 (char *) salt.salt_buf,
7471 digest_buf[0],
7472 digest_buf[1],
7473 digest_buf[2],
7474 digest_buf[3]);
7475 }
7476 else if (hash_mode == 3711)
7477 {
7478 char *salt_ptr = (char *) salt.salt_buf;
7479
7480 salt_ptr[salt.salt_len - 1] = 0;
7481
7482 snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x",
7483 SIGNATURE_MEDIAWIKI_B,
7484 salt_ptr,
7485 digest_buf[0],
7486 digest_buf[1],
7487 digest_buf[2],
7488 digest_buf[3]);
7489 }
7490 else if (hash_mode == 8800)
7491 {
7492 androidfde_t *androidfdes = (androidfde_t *) data.esalts_buf;
7493
7494 androidfde_t *androidfde = &androidfdes[salt_pos];
7495
7496 char tmp[3073] = { 0 };
7497
7498 for (uint i = 0, j = 0; i < 384; i += 1, j += 8)
7499 {
7500 sprintf (tmp + j, "%08x", androidfde->data[i]);
7501 }
7502
7503 tmp[3072] = 0;
7504
7505 snprintf (out_buf, len-1, "%s16$%08x%08x%08x%08x$16$%08x%08x%08x%08x$%s",
7506 SIGNATURE_ANDROIDFDE,
7507 byte_swap_32 (salt.salt_buf[0]),
7508 byte_swap_32 (salt.salt_buf[1]),
7509 byte_swap_32 (salt.salt_buf[2]),
7510 byte_swap_32 (salt.salt_buf[3]),
7511 byte_swap_32 (digest_buf[0]),
7512 byte_swap_32 (digest_buf[1]),
7513 byte_swap_32 (digest_buf[2]),
7514 byte_swap_32 (digest_buf[3]),
7515 tmp);
7516 }
7517 else if (hash_mode == 8900)
7518 {
7519 uint N = salt.scrypt_N;
7520 uint r = salt.scrypt_r;
7521 uint p = salt.scrypt_p;
7522
7523 char base64_salt[32] = { 0 };
7524
7525 base64_encode (int_to_base64, (const u8 *) salt.salt_buf, salt.salt_len, (u8 *) base64_salt);
7526
7527 memset (tmp_buf, 0, 46);
7528
7529 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7530 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7531 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7532 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7533 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7534 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7535 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7536 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7537 digest_buf[8] = 0; // needed for base64_encode ()
7538
7539 base64_encode (int_to_base64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7540
7541 snprintf (out_buf, len-1, "%s:%i:%i:%i:%s:%s",
7542 SIGNATURE_SCRYPT,
7543 N,
7544 r,
7545 p,
7546 base64_salt,
7547 tmp_buf);
7548 }
7549 else if (hash_mode == 9000)
7550 {
7551 snprintf (out_buf, len-1, "%s", hashfile);
7552 }
7553 else if (hash_mode == 9200)
7554 {
7555 // salt
7556
7557 pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) data.esalts_buf;
7558
7559 pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[salt_pos];
7560
7561 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf;
7562
7563 // hash
7564
7565 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7566 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7567 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7568 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7569 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7570 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7571 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7572 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7573 digest_buf[8] = 0; // needed for base64_encode ()
7574
7575 char tmp_buf[64] = { 0 };
7576
7577 base64_encode (int_to_itoa64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7578 tmp_buf[43] = 0; // cut it here
7579
7580 // output
7581
7582 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO8, salt_buf_ptr, tmp_buf);
7583 }
7584 else if (hash_mode == 9300)
7585 {
7586 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7587 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7588 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7589 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7590 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7591 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7592 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7593 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7594 digest_buf[8] = 0; // needed for base64_encode ()
7595
7596 char tmp_buf[64] = { 0 };
7597
7598 base64_encode (int_to_itoa64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7599 tmp_buf[43] = 0; // cut it here
7600
7601 unsigned char *salt_buf_ptr = (unsigned char *) salt.salt_buf;
7602
7603 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO9, salt_buf_ptr, tmp_buf);
7604 }
7605 else if (hash_mode == 9400)
7606 {
7607 office2007_t *office2007s = (office2007_t *) data.esalts_buf;
7608
7609 office2007_t *office2007 = &office2007s[salt_pos];
7610
7611 snprintf (out_buf, len-1, "%s*%u*%u*%u*%u*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7612 SIGNATURE_OFFICE2007,
7613 2007,
7614 20,
7615 office2007->keySize,
7616 16,
7617 salt.salt_buf[0],
7618 salt.salt_buf[1],
7619 salt.salt_buf[2],
7620 salt.salt_buf[3],
7621 office2007->encryptedVerifier[0],
7622 office2007->encryptedVerifier[1],
7623 office2007->encryptedVerifier[2],
7624 office2007->encryptedVerifier[3],
7625 office2007->encryptedVerifierHash[0],
7626 office2007->encryptedVerifierHash[1],
7627 office2007->encryptedVerifierHash[2],
7628 office2007->encryptedVerifierHash[3],
7629 office2007->encryptedVerifierHash[4]);
7630 }
7631 else if (hash_mode == 9500)
7632 {
7633 office2010_t *office2010s = (office2010_t *) data.esalts_buf;
7634
7635 office2010_t *office2010 = &office2010s[salt_pos];
7636
7637 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,
7638
7639 salt.salt_buf[0],
7640 salt.salt_buf[1],
7641 salt.salt_buf[2],
7642 salt.salt_buf[3],
7643 office2010->encryptedVerifier[0],
7644 office2010->encryptedVerifier[1],
7645 office2010->encryptedVerifier[2],
7646 office2010->encryptedVerifier[3],
7647 office2010->encryptedVerifierHash[0],
7648 office2010->encryptedVerifierHash[1],
7649 office2010->encryptedVerifierHash[2],
7650 office2010->encryptedVerifierHash[3],
7651 office2010->encryptedVerifierHash[4],
7652 office2010->encryptedVerifierHash[5],
7653 office2010->encryptedVerifierHash[6],
7654 office2010->encryptedVerifierHash[7]);
7655 }
7656 else if (hash_mode == 9600)
7657 {
7658 office2013_t *office2013s = (office2013_t *) data.esalts_buf;
7659
7660 office2013_t *office2013 = &office2013s[salt_pos];
7661
7662 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,
7663
7664 salt.salt_buf[0],
7665 salt.salt_buf[1],
7666 salt.salt_buf[2],
7667 salt.salt_buf[3],
7668 office2013->encryptedVerifier[0],
7669 office2013->encryptedVerifier[1],
7670 office2013->encryptedVerifier[2],
7671 office2013->encryptedVerifier[3],
7672 office2013->encryptedVerifierHash[0],
7673 office2013->encryptedVerifierHash[1],
7674 office2013->encryptedVerifierHash[2],
7675 office2013->encryptedVerifierHash[3],
7676 office2013->encryptedVerifierHash[4],
7677 office2013->encryptedVerifierHash[5],
7678 office2013->encryptedVerifierHash[6],
7679 office2013->encryptedVerifierHash[7]);
7680 }
7681 else if (hash_mode == 9700)
7682 {
7683 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7684
7685 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7686
7687 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7688 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7689 byte_swap_32 (salt.salt_buf[0]),
7690 byte_swap_32 (salt.salt_buf[1]),
7691 byte_swap_32 (salt.salt_buf[2]),
7692 byte_swap_32 (salt.salt_buf[3]),
7693 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7694 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7695 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7696 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7697 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7698 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7699 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7700 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]));
7701 }
7702 else if (hash_mode == 9710)
7703 {
7704 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7705
7706 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7707
7708 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7709 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7710 byte_swap_32 (salt.salt_buf[0]),
7711 byte_swap_32 (salt.salt_buf[1]),
7712 byte_swap_32 (salt.salt_buf[2]),
7713 byte_swap_32 (salt.salt_buf[3]),
7714 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7715 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7716 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7717 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7718 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7719 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7720 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7721 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]));
7722 }
7723 else if (hash_mode == 9720)
7724 {
7725 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7726
7727 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7728
7729 u8 *rc4key = (u8 *) oldoffice01->rc4key;
7730
7731 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7732 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7733 byte_swap_32 (salt.salt_buf[0]),
7734 byte_swap_32 (salt.salt_buf[1]),
7735 byte_swap_32 (salt.salt_buf[2]),
7736 byte_swap_32 (salt.salt_buf[3]),
7737 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7738 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7739 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7740 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7741 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7742 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7743 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7744 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]),
7745 rc4key[0],
7746 rc4key[1],
7747 rc4key[2],
7748 rc4key[3],
7749 rc4key[4]);
7750 }
7751 else if (hash_mode == 9800)
7752 {
7753 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7754
7755 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7756
7757 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7758 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7759 salt.salt_buf[0],
7760 salt.salt_buf[1],
7761 salt.salt_buf[2],
7762 salt.salt_buf[3],
7763 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7764 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7765 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7766 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7767 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7768 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7769 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7770 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7771 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]));
7772 }
7773 else if (hash_mode == 9810)
7774 {
7775 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7776
7777 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7778
7779 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7780 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7781 salt.salt_buf[0],
7782 salt.salt_buf[1],
7783 salt.salt_buf[2],
7784 salt.salt_buf[3],
7785 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7786 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7787 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7788 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7789 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7790 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7791 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7792 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7793 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]));
7794 }
7795 else if (hash_mode == 9820)
7796 {
7797 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7798
7799 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7800
7801 u8 *rc4key = (u8 *) oldoffice34->rc4key;
7802
7803 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7804 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7805 salt.salt_buf[0],
7806 salt.salt_buf[1],
7807 salt.salt_buf[2],
7808 salt.salt_buf[3],
7809 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7810 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7811 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7812 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7813 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7814 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7815 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7816 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7817 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]),
7818 rc4key[0],
7819 rc4key[1],
7820 rc4key[2],
7821 rc4key[3],
7822 rc4key[4]);
7823 }
7824 else if (hash_mode == 10000)
7825 {
7826 // salt
7827
7828 pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) data.esalts_buf;
7829
7830 pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[salt_pos];
7831
7832 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf;
7833
7834 // hash
7835
7836 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7837 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7838 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7839 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7840 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7841 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7842 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7843 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7844 digest_buf[8] = 0; // needed for base64_encode ()
7845
7846 char tmp_buf[64] = { 0 };
7847
7848 base64_encode (int_to_base64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7849
7850 // output
7851
7852 snprintf (out_buf, len-1, "%s%i$%s$%s", SIGNATURE_DJANGOPBKDF2, salt.salt_iter + 1, salt_buf_ptr, tmp_buf);
7853 }
7854 else if (hash_mode == 10100)
7855 {
7856 snprintf (out_buf, len-1, "%08x%08x:%u:%u:%08x%08x%08x%08x",
7857 digest_buf[0],
7858 digest_buf[1],
7859 2,
7860 4,
7861 byte_swap_32 (salt.salt_buf[0]),
7862 byte_swap_32 (salt.salt_buf[1]),
7863 byte_swap_32 (salt.salt_buf[2]),
7864 byte_swap_32 (salt.salt_buf[3]));
7865 }
7866 else if (hash_mode == 10200)
7867 {
7868 cram_md5_t *cram_md5s = (cram_md5_t *) data.esalts_buf;
7869
7870 cram_md5_t *cram_md5 = &cram_md5s[salt_pos];
7871
7872 // challenge
7873
7874 char challenge[100] = { 0 };
7875
7876 base64_encode (int_to_base64, (const u8 *) salt.salt_buf, salt.salt_len, (u8 *) challenge);
7877
7878 // response
7879
7880 char tmp_buf[100] = { 0 };
7881
7882 uint tmp_len = snprintf (tmp_buf, 100, "%s %08x%08x%08x%08x",
7883 (char *) cram_md5->user,
7884 digest_buf[0],
7885 digest_buf[1],
7886 digest_buf[2],
7887 digest_buf[3]);
7888
7889 char response[100] = { 0 };
7890
7891 base64_encode (int_to_base64, (const u8 *) tmp_buf, tmp_len, (u8 *) response);
7892
7893 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CRAM_MD5, challenge, response);
7894 }
7895 else if (hash_mode == 10300)
7896 {
7897 char tmp_buf[100] = { 0 };
7898
7899 memcpy (tmp_buf + 0, digest_buf, 20);
7900 memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len);
7901
7902 uint tmp_len = 20 + salt.salt_len;
7903
7904 // base64 encode it
7905
7906 char base64_encoded[100] = { 0 };
7907
7908 base64_encode (int_to_base64, (const u8 *) tmp_buf, tmp_len, (u8 *) base64_encoded);
7909
7910 snprintf (out_buf, len-1, "%s%i}%s", SIGNATURE_SAPH_SHA1, salt.salt_iter + 1, base64_encoded);
7911 }
7912 else if (hash_mode == 10400)
7913 {
7914 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7915
7916 pdf_t *pdf = &pdfs[salt_pos];
7917
7918 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",
7919
7920 pdf->V,
7921 pdf->R,
7922 40,
7923 pdf->P,
7924 pdf->enc_md,
7925 pdf->id_len,
7926 byte_swap_32 (pdf->id_buf[0]),
7927 byte_swap_32 (pdf->id_buf[1]),
7928 byte_swap_32 (pdf->id_buf[2]),
7929 byte_swap_32 (pdf->id_buf[3]),
7930 pdf->u_len,
7931 byte_swap_32 (pdf->u_buf[0]),
7932 byte_swap_32 (pdf->u_buf[1]),
7933 byte_swap_32 (pdf->u_buf[2]),
7934 byte_swap_32 (pdf->u_buf[3]),
7935 byte_swap_32 (pdf->u_buf[4]),
7936 byte_swap_32 (pdf->u_buf[5]),
7937 byte_swap_32 (pdf->u_buf[6]),
7938 byte_swap_32 (pdf->u_buf[7]),
7939 pdf->o_len,
7940 byte_swap_32 (pdf->o_buf[0]),
7941 byte_swap_32 (pdf->o_buf[1]),
7942 byte_swap_32 (pdf->o_buf[2]),
7943 byte_swap_32 (pdf->o_buf[3]),
7944 byte_swap_32 (pdf->o_buf[4]),
7945 byte_swap_32 (pdf->o_buf[5]),
7946 byte_swap_32 (pdf->o_buf[6]),
7947 byte_swap_32 (pdf->o_buf[7])
7948 );
7949 }
7950 else if (hash_mode == 10410)
7951 {
7952 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7953
7954 pdf_t *pdf = &pdfs[salt_pos];
7955
7956 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",
7957
7958 pdf->V,
7959 pdf->R,
7960 40,
7961 pdf->P,
7962 pdf->enc_md,
7963 pdf->id_len,
7964 byte_swap_32 (pdf->id_buf[0]),
7965 byte_swap_32 (pdf->id_buf[1]),
7966 byte_swap_32 (pdf->id_buf[2]),
7967 byte_swap_32 (pdf->id_buf[3]),
7968 pdf->u_len,
7969 byte_swap_32 (pdf->u_buf[0]),
7970 byte_swap_32 (pdf->u_buf[1]),
7971 byte_swap_32 (pdf->u_buf[2]),
7972 byte_swap_32 (pdf->u_buf[3]),
7973 byte_swap_32 (pdf->u_buf[4]),
7974 byte_swap_32 (pdf->u_buf[5]),
7975 byte_swap_32 (pdf->u_buf[6]),
7976 byte_swap_32 (pdf->u_buf[7]),
7977 pdf->o_len,
7978 byte_swap_32 (pdf->o_buf[0]),
7979 byte_swap_32 (pdf->o_buf[1]),
7980 byte_swap_32 (pdf->o_buf[2]),
7981 byte_swap_32 (pdf->o_buf[3]),
7982 byte_swap_32 (pdf->o_buf[4]),
7983 byte_swap_32 (pdf->o_buf[5]),
7984 byte_swap_32 (pdf->o_buf[6]),
7985 byte_swap_32 (pdf->o_buf[7])
7986 );
7987 }
7988 else if (hash_mode == 10420)
7989 {
7990 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7991
7992 pdf_t *pdf = &pdfs[salt_pos];
7993
7994 u8 *rc4key = (u8 *) pdf->rc4key;
7995
7996 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",
7997
7998 pdf->V,
7999 pdf->R,
8000 40,
8001 pdf->P,
8002 pdf->enc_md,
8003 pdf->id_len,
8004 byte_swap_32 (pdf->id_buf[0]),
8005 byte_swap_32 (pdf->id_buf[1]),
8006 byte_swap_32 (pdf->id_buf[2]),
8007 byte_swap_32 (pdf->id_buf[3]),
8008 pdf->u_len,
8009 byte_swap_32 (pdf->u_buf[0]),
8010 byte_swap_32 (pdf->u_buf[1]),
8011 byte_swap_32 (pdf->u_buf[2]),
8012 byte_swap_32 (pdf->u_buf[3]),
8013 byte_swap_32 (pdf->u_buf[4]),
8014 byte_swap_32 (pdf->u_buf[5]),
8015 byte_swap_32 (pdf->u_buf[6]),
8016 byte_swap_32 (pdf->u_buf[7]),
8017 pdf->o_len,
8018 byte_swap_32 (pdf->o_buf[0]),
8019 byte_swap_32 (pdf->o_buf[1]),
8020 byte_swap_32 (pdf->o_buf[2]),
8021 byte_swap_32 (pdf->o_buf[3]),
8022 byte_swap_32 (pdf->o_buf[4]),
8023 byte_swap_32 (pdf->o_buf[5]),
8024 byte_swap_32 (pdf->o_buf[6]),
8025 byte_swap_32 (pdf->o_buf[7]),
8026 rc4key[0],
8027 rc4key[1],
8028 rc4key[2],
8029 rc4key[3],
8030 rc4key[4]
8031 );
8032 }
8033 else if (hash_mode == 10500)
8034 {
8035 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
8036
8037 pdf_t *pdf = &pdfs[salt_pos];
8038
8039 if (pdf->id_len == 32)
8040 {
8041 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",
8042
8043 pdf->V,
8044 pdf->R,
8045 128,
8046 pdf->P,
8047 pdf->enc_md,
8048 pdf->id_len,
8049 byte_swap_32 (pdf->id_buf[0]),
8050 byte_swap_32 (pdf->id_buf[1]),
8051 byte_swap_32 (pdf->id_buf[2]),
8052 byte_swap_32 (pdf->id_buf[3]),
8053 byte_swap_32 (pdf->id_buf[4]),
8054 byte_swap_32 (pdf->id_buf[5]),
8055 byte_swap_32 (pdf->id_buf[6]),
8056 byte_swap_32 (pdf->id_buf[7]),
8057 pdf->u_len,
8058 byte_swap_32 (pdf->u_buf[0]),
8059 byte_swap_32 (pdf->u_buf[1]),
8060 byte_swap_32 (pdf->u_buf[2]),
8061 byte_swap_32 (pdf->u_buf[3]),
8062 byte_swap_32 (pdf->u_buf[4]),
8063 byte_swap_32 (pdf->u_buf[5]),
8064 byte_swap_32 (pdf->u_buf[6]),
8065 byte_swap_32 (pdf->u_buf[7]),
8066 pdf->o_len,
8067 byte_swap_32 (pdf->o_buf[0]),
8068 byte_swap_32 (pdf->o_buf[1]),
8069 byte_swap_32 (pdf->o_buf[2]),
8070 byte_swap_32 (pdf->o_buf[3]),
8071 byte_swap_32 (pdf->o_buf[4]),
8072 byte_swap_32 (pdf->o_buf[5]),
8073 byte_swap_32 (pdf->o_buf[6]),
8074 byte_swap_32 (pdf->o_buf[7])
8075 );
8076 }
8077 else
8078 {
8079 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",
8080
8081 pdf->V,
8082 pdf->R,
8083 128,
8084 pdf->P,
8085 pdf->enc_md,
8086 pdf->id_len,
8087 byte_swap_32 (pdf->id_buf[0]),
8088 byte_swap_32 (pdf->id_buf[1]),
8089 byte_swap_32 (pdf->id_buf[2]),
8090 byte_swap_32 (pdf->id_buf[3]),
8091 pdf->u_len,
8092 byte_swap_32 (pdf->u_buf[0]),
8093 byte_swap_32 (pdf->u_buf[1]),
8094 byte_swap_32 (pdf->u_buf[2]),
8095 byte_swap_32 (pdf->u_buf[3]),
8096 byte_swap_32 (pdf->u_buf[4]),
8097 byte_swap_32 (pdf->u_buf[5]),
8098 byte_swap_32 (pdf->u_buf[6]),
8099 byte_swap_32 (pdf->u_buf[7]),
8100 pdf->o_len,
8101 byte_swap_32 (pdf->o_buf[0]),
8102 byte_swap_32 (pdf->o_buf[1]),
8103 byte_swap_32 (pdf->o_buf[2]),
8104 byte_swap_32 (pdf->o_buf[3]),
8105 byte_swap_32 (pdf->o_buf[4]),
8106 byte_swap_32 (pdf->o_buf[5]),
8107 byte_swap_32 (pdf->o_buf[6]),
8108 byte_swap_32 (pdf->o_buf[7])
8109 );
8110 }
8111 }
8112 else if (hash_mode == 10600)
8113 {
8114 uint digest_idx = salt.digests_offset + digest_pos;
8115
8116 hashinfo_t **hashinfo_ptr = data.hash_info;
8117 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8118
8119 snprintf (out_buf, len-1, "%s", hash_buf);
8120 }
8121 else if (hash_mode == 10700)
8122 {
8123 uint digest_idx = salt.digests_offset + digest_pos;
8124
8125 hashinfo_t **hashinfo_ptr = data.hash_info;
8126 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8127
8128 snprintf (out_buf, len-1, "%s", hash_buf);
8129 }
8130 else if (hash_mode == 10900)
8131 {
8132 uint digest_idx = salt.digests_offset + digest_pos;
8133
8134 hashinfo_t **hashinfo_ptr = data.hash_info;
8135 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8136
8137 snprintf (out_buf, len-1, "%s", hash_buf);
8138 }
8139 else if (hash_mode == 11100)
8140 {
8141 u32 salt_challenge = salt.salt_buf[0];
8142
8143 salt_challenge = byte_swap_32 (salt_challenge);
8144
8145 unsigned char *user_name = (unsigned char *) (salt.salt_buf + 1);
8146
8147 snprintf (out_buf, len-1, "%s%s*%08x*%08x%08x%08x%08x",
8148 SIGNATURE_POSTGRESQL_AUTH,
8149 user_name,
8150 salt_challenge,
8151 digest_buf[0],
8152 digest_buf[1],
8153 digest_buf[2],
8154 digest_buf[3]);
8155 }
8156 else if (hash_mode == 11200)
8157 {
8158 snprintf (out_buf, len-1, "%s%s*%08x%08x%08x%08x%08x",
8159 SIGNATURE_MYSQL_AUTH,
8160 (unsigned char *) salt.salt_buf,
8161 digest_buf[0],
8162 digest_buf[1],
8163 digest_buf[2],
8164 digest_buf[3],
8165 digest_buf[4]);
8166 }
8167 else if (hash_mode == 11300)
8168 {
8169 bitcoin_wallet_t *bitcoin_wallets = (bitcoin_wallet_t *) data.esalts_buf;
8170
8171 bitcoin_wallet_t *bitcoin_wallet = &bitcoin_wallets[salt_pos];
8172
8173 const uint cry_master_len = bitcoin_wallet->cry_master_len;
8174 const uint ckey_len = bitcoin_wallet->ckey_len;
8175 const uint public_key_len = bitcoin_wallet->public_key_len;
8176
8177 char *cry_master_buf = (char *) mymalloc ((cry_master_len * 2) + 1);
8178 char *ckey_buf = (char *) mymalloc ((ckey_len * 2) + 1);
8179 char *public_key_buf = (char *) mymalloc ((public_key_len * 2) + 1);
8180
8181 for (uint i = 0, j = 0; i < cry_master_len; i += 1, j += 2)
8182 {
8183 const u8 *ptr = (const u8 *) bitcoin_wallet->cry_master_buf;
8184
8185 sprintf (cry_master_buf + j, "%02x", ptr[i]);
8186 }
8187
8188 for (uint i = 0, j = 0; i < ckey_len; i += 1, j += 2)
8189 {
8190 const u8 *ptr = (const u8 *) bitcoin_wallet->ckey_buf;
8191
8192 sprintf (ckey_buf + j, "%02x", ptr[i]);
8193 }
8194
8195 for (uint i = 0, j = 0; i < public_key_len; i += 1, j += 2)
8196 {
8197 const u8 *ptr = (const u8 *) bitcoin_wallet->public_key_buf;
8198
8199 sprintf (public_key_buf + j, "%02x", ptr[i]);
8200 }
8201
8202 snprintf (out_buf, len-1, "%s%d$%s$%d$%s$%d$%d$%s$%d$%s",
8203 SIGNATURE_BITCOIN_WALLET,
8204 cry_master_len * 2,
8205 cry_master_buf,
8206 salt.salt_len,
8207 (unsigned char *) salt.salt_buf,
8208 salt.salt_iter + 1,
8209 ckey_len * 2,
8210 ckey_buf,
8211 public_key_len * 2,
8212 public_key_buf
8213 );
8214
8215 free (cry_master_buf);
8216 free (ckey_buf);
8217 free (public_key_buf);
8218 }
8219 else if (hash_mode == 11400)
8220 {
8221 uint digest_idx = salt.digests_offset + digest_pos;
8222
8223 hashinfo_t **hashinfo_ptr = data.hash_info;
8224 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8225
8226 snprintf (out_buf, len-1, "%s", hash_buf);
8227 }
8228 else if (hash_mode == 11600)
8229 {
8230 seven_zip_t *seven_zips = (seven_zip_t *) data.esalts_buf;
8231
8232 seven_zip_t *seven_zip = &seven_zips[salt_pos];
8233
8234 const uint data_len = seven_zip->data_len;
8235
8236 char *data_buf = (char *) mymalloc ((data_len * 2) + 1);
8237
8238 for (uint i = 0, j = 0; i < data_len; i += 1, j += 2)
8239 {
8240 const u8 *ptr = (const u8 *) seven_zip->data_buf;
8241
8242 sprintf (data_buf + j, "%02x", ptr[i]);
8243 }
8244
8245 snprintf (out_buf, len-1, "%s%u$%u$%u$%s$%u$%08x%08x%08x%08x$%u$%u$%u$%s",
8246 SIGNATURE_SEVEN_ZIP,
8247 0,
8248 salt.salt_sign[0],
8249 0,
8250 (char *) seven_zip->salt_buf,
8251 seven_zip->iv_len,
8252 seven_zip->iv_buf[0],
8253 seven_zip->iv_buf[1],
8254 seven_zip->iv_buf[2],
8255 seven_zip->iv_buf[3],
8256 seven_zip->crc,
8257 seven_zip->data_len,
8258 seven_zip->unpack_size,
8259 data_buf);
8260
8261 free (data_buf);
8262 }
8263 else if (hash_mode == 11700)
8264 {
8265 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8266 digest_buf[0],
8267 digest_buf[1],
8268 digest_buf[2],
8269 digest_buf[3],
8270 digest_buf[4],
8271 digest_buf[5],
8272 digest_buf[6],
8273 digest_buf[7]);
8274 }
8275 else if (hash_mode == 11800)
8276 {
8277 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8278 digest_buf[ 0],
8279 digest_buf[ 1],
8280 digest_buf[ 2],
8281 digest_buf[ 3],
8282 digest_buf[ 4],
8283 digest_buf[ 5],
8284 digest_buf[ 6],
8285 digest_buf[ 7],
8286 digest_buf[ 8],
8287 digest_buf[ 9],
8288 digest_buf[10],
8289 digest_buf[11],
8290 digest_buf[12],
8291 digest_buf[13],
8292 digest_buf[14],
8293 digest_buf[15]);
8294 }
8295 else if (hash_mode == 11900)
8296 {
8297 uint digest_idx = salt.digests_offset + digest_pos;
8298
8299 hashinfo_t **hashinfo_ptr = data.hash_info;
8300 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8301
8302 snprintf (out_buf, len-1, "%s", hash_buf);
8303 }
8304 else if (hash_mode == 12000)
8305 {
8306 uint digest_idx = salt.digests_offset + digest_pos;
8307
8308 hashinfo_t **hashinfo_ptr = data.hash_info;
8309 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8310
8311 snprintf (out_buf, len-1, "%s", hash_buf);
8312 }
8313 else if (hash_mode == 12100)
8314 {
8315 uint digest_idx = salt.digests_offset + digest_pos;
8316
8317 hashinfo_t **hashinfo_ptr = data.hash_info;
8318 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8319
8320 snprintf (out_buf, len-1, "%s", hash_buf);
8321 }
8322 else if (hash_mode == 12200)
8323 {
8324 uint *ptr_digest = digest_buf;
8325 uint *ptr_salt = salt.salt_buf;
8326
8327 snprintf (out_buf, len-1, "%s0$1$%08x%08x$%08x%08x",
8328 SIGNATURE_ECRYPTFS,
8329 ptr_salt[0],
8330 ptr_salt[1],
8331 ptr_digest[0],
8332 ptr_digest[1]);
8333 }
8334 else if (hash_mode == 12300)
8335 {
8336 uint *ptr_digest = digest_buf;
8337 uint *ptr_salt = salt.salt_buf;
8338
8339 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",
8340 ptr_digest[ 0], ptr_digest[ 1],
8341 ptr_digest[ 2], ptr_digest[ 3],
8342 ptr_digest[ 4], ptr_digest[ 5],
8343 ptr_digest[ 6], ptr_digest[ 7],
8344 ptr_digest[ 8], ptr_digest[ 9],
8345 ptr_digest[10], ptr_digest[11],
8346 ptr_digest[12], ptr_digest[13],
8347 ptr_digest[14], ptr_digest[15],
8348 ptr_salt[0],
8349 ptr_salt[1],
8350 ptr_salt[2],
8351 ptr_salt[3]);
8352 }
8353 else if (hash_mode == 12400)
8354 {
8355 // encode iteration count
8356
8357 char salt_iter[5] = { 0 };
8358
8359 salt_iter[0] = int_to_itoa64 ((salt.salt_iter ) & 0x3f);
8360 salt_iter[1] = int_to_itoa64 ((salt.salt_iter >> 6) & 0x3f);
8361 salt_iter[2] = int_to_itoa64 ((salt.salt_iter >> 12) & 0x3f);
8362 salt_iter[3] = int_to_itoa64 ((salt.salt_iter >> 18) & 0x3f);
8363 salt_iter[4] = 0;
8364
8365 // encode salt
8366
8367 ptr_salt[0] = int_to_itoa64 ((salt.salt_buf[0] ) & 0x3f);
8368 ptr_salt[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f);
8369 ptr_salt[2] = int_to_itoa64 ((salt.salt_buf[0] >> 12) & 0x3f);
8370 ptr_salt[3] = int_to_itoa64 ((salt.salt_buf[0] >> 18) & 0x3f);
8371 ptr_salt[4] = 0;
8372
8373 // encode digest
8374
8375 memset (tmp_buf, 0, sizeof (tmp_buf));
8376
8377 digest_buf[0] = byte_swap_32 (digest_buf[0]);
8378 digest_buf[1] = byte_swap_32 (digest_buf[1]);
8379
8380 memcpy (tmp_buf, digest_buf, 8);
8381
8382 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 8, (u8 *) ptr_plain);
8383
8384 ptr_plain[11] = 0;
8385
8386 // fill the resulting buffer
8387
8388 snprintf (out_buf, len - 1, "_%s%s%s", salt_iter, ptr_salt, ptr_plain);
8389 }
8390 else if (hash_mode == 12500)
8391 {
8392 snprintf (out_buf, len - 1, "%s*0*%08x%08x*%08x%08x%08x%08x",
8393 SIGNATURE_RAR3,
8394 byte_swap_32 (salt.salt_buf[0]),
8395 byte_swap_32 (salt.salt_buf[1]),
8396 salt.salt_buf[2],
8397 salt.salt_buf[3],
8398 salt.salt_buf[4],
8399 salt.salt_buf[5]);
8400 }
8401 else if (hash_mode == 12600)
8402 {
8403 snprintf (out_buf, len - 1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8404 digest_buf[0] + salt.salt_buf_pc[0],
8405 digest_buf[1] + salt.salt_buf_pc[1],
8406 digest_buf[2] + salt.salt_buf_pc[2],
8407 digest_buf[3] + salt.salt_buf_pc[3],
8408 digest_buf[4] + salt.salt_buf_pc[4],
8409 digest_buf[5] + salt.salt_buf_pc[5],
8410 digest_buf[6] + salt.salt_buf_pc[6],
8411 digest_buf[7] + salt.salt_buf_pc[7]);
8412 }
8413 else if (hash_mode == 12700)
8414 {
8415 uint digest_idx = salt.digests_offset + digest_pos;
8416
8417 hashinfo_t **hashinfo_ptr = data.hash_info;
8418 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8419
8420 snprintf (out_buf, len-1, "%s", hash_buf);
8421 }
8422 else if (hash_mode == 12800)
8423 {
8424 const u8 *ptr = (const u8 *) salt.salt_buf;
8425
8426 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",
8427 SIGNATURE_MS_DRSR,
8428 ptr[0],
8429 ptr[1],
8430 ptr[2],
8431 ptr[3],
8432 ptr[4],
8433 ptr[5],
8434 ptr[6],
8435 ptr[7],
8436 ptr[8],
8437 ptr[9],
8438 salt.salt_iter + 1,
8439 byte_swap_32 (digest_buf[0]),
8440 byte_swap_32 (digest_buf[1]),
8441 byte_swap_32 (digest_buf[2]),
8442 byte_swap_32 (digest_buf[3]),
8443 byte_swap_32 (digest_buf[4]),
8444 byte_swap_32 (digest_buf[5]),
8445 byte_swap_32 (digest_buf[6]),
8446 byte_swap_32 (digest_buf[7])
8447 );
8448 }
8449 else if (hash_mode == 12900)
8450 {
8451 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",
8452 salt.salt_buf[ 4],
8453 salt.salt_buf[ 5],
8454 salt.salt_buf[ 6],
8455 salt.salt_buf[ 7],
8456 salt.salt_buf[ 8],
8457 salt.salt_buf[ 9],
8458 salt.salt_buf[10],
8459 salt.salt_buf[11],
8460 byte_swap_32 (digest_buf[0]),
8461 byte_swap_32 (digest_buf[1]),
8462 byte_swap_32 (digest_buf[2]),
8463 byte_swap_32 (digest_buf[3]),
8464 byte_swap_32 (digest_buf[4]),
8465 byte_swap_32 (digest_buf[5]),
8466 byte_swap_32 (digest_buf[6]),
8467 byte_swap_32 (digest_buf[7]),
8468 salt.salt_buf[ 0],
8469 salt.salt_buf[ 1],
8470 salt.salt_buf[ 2],
8471 salt.salt_buf[ 3]
8472 );
8473 }
8474 else if (hash_mode == 13000)
8475 {
8476 rar5_t *rar5s = (rar5_t *) data.esalts_buf;
8477
8478 rar5_t *rar5 = &rar5s[salt_pos];
8479
8480 snprintf (out_buf, len-1, "$rar5$16$%08x%08x%08x%08x$%u$%08x%08x%08x%08x$8$%08x%08x",
8481 salt.salt_buf[0],
8482 salt.salt_buf[1],
8483 salt.salt_buf[2],
8484 salt.salt_buf[3],
8485 salt.salt_sign[0],
8486 rar5->iv[0],
8487 rar5->iv[1],
8488 rar5->iv[2],
8489 rar5->iv[3],
8490 byte_swap_32 (digest_buf[0]),
8491 byte_swap_32 (digest_buf[1])
8492 );
8493 }
8494 else if (hash_mode == 13100)
8495 {
8496 krb5tgs_t *krb5tgss = (krb5tgs_t *) data.esalts_buf;
8497
8498 krb5tgs_t *krb5tgs = &krb5tgss[salt_pos];
8499
8500 u8 *ptr_checksum = (u8 *) krb5tgs->checksum;
8501 u8 *ptr_edata2 = (u8 *) krb5tgs->edata2;
8502
8503 char data[2560 * 4 * 2] = { 0 };
8504
8505 char *ptr_data = data;
8506
8507 for (uint i = 0; i < 16; i++, ptr_data += 2)
8508 sprintf (ptr_data, "%02x", ptr_checksum[i]);
8509
8510 /* skip '$' */
8511 ptr_data++;
8512
8513 for (uint i = 0; i < krb5tgs->edata2_len; i++, ptr_data += 2)
8514 sprintf (ptr_data, "%02x", ptr_edata2[i]);
8515
8516 snprintf (out_buf, len-1, "%s$%s$%s$%s",
8517 SIGNATURE_KRB5TGS,
8518 (char *) krb5tgs->account_info,
8519 data,
8520 data + 33);
8521 }
8522 else if (hash_mode == 13200)
8523 {
8524 snprintf (out_buf, len-1, "%s*%d*%08x%08x%08x%08x*%08x%08x%08x%08x%08x%08x",
8525 SIGNATURE_AXCRYPT,
8526 salt.salt_iter,
8527 salt.salt_buf[0],
8528 salt.salt_buf[1],
8529 salt.salt_buf[2],
8530 salt.salt_buf[3],
8531 salt.salt_buf[4],
8532 salt.salt_buf[5],
8533 salt.salt_buf[6],
8534 salt.salt_buf[7],
8535 salt.salt_buf[8],
8536 salt.salt_buf[9]);
8537 }
8538 else if (hash_mode == 13300)
8539 {
8540 snprintf (out_buf, len-1, "%s$%08x%08x%08x%08x",
8541 SIGNATURE_AXCRYPT_SHA1,
8542 digest_buf[0],
8543 digest_buf[1],
8544 digest_buf[2],
8545 digest_buf[3]);
8546 }
8547 else if (hash_mode == 13400)
8548 {
8549 keepass_t *keepasss = (keepass_t *) data.esalts_buf;
8550
8551 keepass_t *keepass = &keepasss[salt_pos];
8552
8553 u32 version = (u32) keepass->version;
8554 u32 rounds = salt.salt_iter;
8555 u32 algorithm = (u32) keepass->algorithm;
8556 u32 keyfile_len = (u32) keepass->keyfile_len;
8557
8558 u32 *ptr_final_random_seed = (u32 *) keepass->final_random_seed ;
8559 u32 *ptr_transf_random_seed = (u32 *) keepass->transf_random_seed ;
8560 u32 *ptr_enc_iv = (u32 *) keepass->enc_iv ;
8561 u32 *ptr_contents_hash = (u32 *) keepass->contents_hash ;
8562 u32 *ptr_keyfile = (u32 *) keepass->keyfile ;
8563
8564 /* specific to version 1 */
8565 u32 contents_len;
8566 u32 *ptr_contents;
8567
8568 /* specific to version 2 */
8569 u32 expected_bytes_len;
8570 u32 *ptr_expected_bytes;
8571
8572 u32 final_random_seed_len;
8573 u32 transf_random_seed_len;
8574 u32 enc_iv_len;
8575 u32 contents_hash_len;
8576
8577 transf_random_seed_len = 8;
8578 enc_iv_len = 4;
8579 contents_hash_len = 8;
8580 final_random_seed_len = 8;
8581
8582 if (version == 1)
8583 final_random_seed_len = 4;
8584
8585 snprintf (out_buf, len-1, "%s*%d*%d*%d",
8586 SIGNATURE_KEEPASS,
8587 version,
8588 rounds,
8589 algorithm);
8590
8591 char *ptr_data = out_buf;
8592
8593 ptr_data += strlen(out_buf);
8594
8595 *ptr_data = '*';
8596 ptr_data++;
8597
8598 for (uint i = 0; i < final_random_seed_len; i++, ptr_data += 8)
8599 sprintf (ptr_data, "%08x", ptr_final_random_seed[i]);
8600
8601 *ptr_data = '*';
8602 ptr_data++;
8603
8604 for (uint i = 0; i < transf_random_seed_len; i++, ptr_data += 8)
8605 sprintf (ptr_data, "%08x", ptr_transf_random_seed[i]);
8606
8607 *ptr_data = '*';
8608 ptr_data++;
8609
8610 for (uint i = 0; i < enc_iv_len; i++, ptr_data += 8)
8611 sprintf (ptr_data, "%08x", ptr_enc_iv[i]);
8612
8613 *ptr_data = '*';
8614 ptr_data++;
8615
8616 if (version == 1)
8617 {
8618 contents_len = (u32) keepass->contents_len;
8619 ptr_contents = (u32 *) keepass->contents;
8620
8621 for (uint i = 0; i < contents_hash_len; i++, ptr_data += 8)
8622 sprintf (ptr_data, "%08x", ptr_contents_hash[i]);
8623
8624 *ptr_data = '*';
8625 ptr_data++;
8626
8627 /* inline flag */
8628 *ptr_data = '1';
8629 ptr_data++;
8630
8631 *ptr_data = '*';
8632 ptr_data++;
8633
8634 char ptr_contents_len[10] = { 0 };
8635
8636 sprintf ((char*) ptr_contents_len, "%d", contents_len);
8637
8638 sprintf (ptr_data, "%d", contents_len);
8639
8640 ptr_data += strlen(ptr_contents_len);
8641
8642 *ptr_data = '*';
8643 ptr_data++;
8644
8645 for (uint i = 0; i < contents_len / 4; i++, ptr_data += 8)
8646 sprintf (ptr_data, "%08x", ptr_contents[i]);
8647 }
8648 else if (version == 2)
8649 {
8650 expected_bytes_len = 8;
8651 ptr_expected_bytes = (u32 *) keepass->expected_bytes ;
8652
8653 for (uint i = 0; i < expected_bytes_len; i++, ptr_data += 8)
8654 sprintf (ptr_data, "%08x", ptr_expected_bytes[i]);
8655
8656 *ptr_data = '*';
8657 ptr_data++;
8658
8659 for (uint i = 0; i < contents_hash_len; i++, ptr_data += 8)
8660 sprintf (ptr_data, "%08x", ptr_contents_hash[i]);
8661 }
8662 if (keyfile_len)
8663 {
8664 *ptr_data = '*';
8665 ptr_data++;
8666
8667 /* inline flag */
8668 *ptr_data = '1';
8669 ptr_data++;
8670
8671 *ptr_data = '*';
8672 ptr_data++;
8673
8674 sprintf (ptr_data, "%d", keyfile_len);
8675
8676 ptr_data += 2;
8677
8678 *ptr_data = '*';
8679 ptr_data++;
8680
8681 for (uint i = 0; i < 8; i++, ptr_data += 8)
8682 sprintf (ptr_data, "%08x", ptr_keyfile[i]);
8683 }
8684 }
8685 else if (hash_mode == 13500)
8686 {
8687 pstoken_t *pstokens = (pstoken_t *) data.esalts_buf;
8688
8689 pstoken_t *pstoken = &pstokens[salt_pos];
8690
8691 const u32 salt_len = (pstoken->salt_len > 512) ? 512 : pstoken->salt_len;
8692
8693 char pstoken_tmp[1024 + 1] = { 0 };
8694
8695 for (uint i = 0, j = 0; i < salt_len; i += 1, j += 2)
8696 {
8697 const u8 *ptr = (const u8 *) pstoken->salt_buf;
8698
8699 sprintf (pstoken_tmp + j, "%02x", ptr[i]);
8700 }
8701
8702 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x:%s",
8703 digest_buf[0],
8704 digest_buf[1],
8705 digest_buf[2],
8706 digest_buf[3],
8707 digest_buf[4],
8708 pstoken_tmp);
8709 }
8710 else if (hash_mode == 13600)
8711 {
8712 zip2_t *zip2s = (zip2_t *) data.esalts_buf;
8713
8714 zip2_t *zip2 = &zip2s[salt_pos];
8715
8716 const u32 salt_len = zip2->salt_len;
8717
8718 char salt_tmp[32 + 1] = { 0 };
8719
8720 for (uint i = 0, j = 0; i < salt_len; i += 1, j += 2)
8721 {
8722 const u8 *ptr = (const u8 *) zip2->salt_buf;
8723
8724 sprintf (salt_tmp + j, "%02x", ptr[i]);
8725 }
8726
8727 const u32 data_len = zip2->data_len;
8728
8729 char data_tmp[8192 + 1] = { 0 };
8730
8731 for (uint i = 0, j = 0; i < data_len; i += 1, j += 2)
8732 {
8733 const u8 *ptr = (const u8 *) zip2->data_buf;
8734
8735 sprintf (data_tmp + j, "%02x", ptr[i]);
8736 }
8737
8738 const u32 auth_len = zip2->auth_len;
8739
8740 char auth_tmp[20 + 1] = { 0 };
8741
8742 for (uint i = 0, j = 0; i < auth_len; i += 1, j += 2)
8743 {
8744 const u8 *ptr = (const u8 *) zip2->auth_buf;
8745
8746 sprintf (auth_tmp + j, "%02x", ptr[i]);
8747 }
8748
8749 snprintf (out_buf, 255, "%s*%u*%u*%u*%s*%x*%u*%s*%s*%s",
8750 SIGNATURE_ZIP2_START,
8751 zip2->type,
8752 zip2->mode,
8753 zip2->magic,
8754 salt_tmp,
8755 zip2->verify_bytes,
8756 zip2->compress_length,
8757 data_tmp,
8758 auth_tmp,
8759 SIGNATURE_ZIP2_STOP);
8760 }
8761 else if ((hash_mode >= 13700) && (hash_mode <= 13799))
8762 {
8763 snprintf (out_buf, len-1, "%s", hashfile);
8764 }
8765 else
8766 {
8767 if (hash_type == HASH_TYPE_MD4)
8768 {
8769 snprintf (out_buf, 255, "%08x%08x%08x%08x",
8770 digest_buf[0],
8771 digest_buf[1],
8772 digest_buf[2],
8773 digest_buf[3]);
8774 }
8775 else if (hash_type == HASH_TYPE_MD5)
8776 {
8777 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
8778 digest_buf[0],
8779 digest_buf[1],
8780 digest_buf[2],
8781 digest_buf[3]);
8782 }
8783 else if (hash_type == HASH_TYPE_SHA1)
8784 {
8785 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
8786 digest_buf[0],
8787 digest_buf[1],
8788 digest_buf[2],
8789 digest_buf[3],
8790 digest_buf[4]);
8791 }
8792 else if (hash_type == HASH_TYPE_SHA256)
8793 {
8794 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8795 digest_buf[0],
8796 digest_buf[1],
8797 digest_buf[2],
8798 digest_buf[3],
8799 digest_buf[4],
8800 digest_buf[5],
8801 digest_buf[6],
8802 digest_buf[7]);
8803 }
8804 else if (hash_type == HASH_TYPE_SHA384)
8805 {
8806 uint *ptr = digest_buf;
8807
8808 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8809 ptr[ 1], ptr[ 0],
8810 ptr[ 3], ptr[ 2],
8811 ptr[ 5], ptr[ 4],
8812 ptr[ 7], ptr[ 6],
8813 ptr[ 9], ptr[ 8],
8814 ptr[11], ptr[10]);
8815 }
8816 else if (hash_type == HASH_TYPE_SHA512)
8817 {
8818 uint *ptr = digest_buf;
8819
8820 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8821 ptr[ 1], ptr[ 0],
8822 ptr[ 3], ptr[ 2],
8823 ptr[ 5], ptr[ 4],
8824 ptr[ 7], ptr[ 6],
8825 ptr[ 9], ptr[ 8],
8826 ptr[11], ptr[10],
8827 ptr[13], ptr[12],
8828 ptr[15], ptr[14]);
8829 }
8830 else if (hash_type == HASH_TYPE_LM)
8831 {
8832 snprintf (out_buf, len-1, "%08x%08x",
8833 digest_buf[0],
8834 digest_buf[1]);
8835 }
8836 else if (hash_type == HASH_TYPE_ORACLEH)
8837 {
8838 snprintf (out_buf, len-1, "%08X%08X",
8839 digest_buf[0],
8840 digest_buf[1]);
8841 }
8842 else if (hash_type == HASH_TYPE_BCRYPT)
8843 {
8844 base64_encode (int_to_bf64, (const u8 *) salt.salt_buf, 16, (u8 *) tmp_buf + 0);
8845 base64_encode (int_to_bf64, (const u8 *) digest_buf, 23, (u8 *) tmp_buf + 22);
8846
8847 tmp_buf[22 + 31] = 0; // base64_encode wants to pad
8848
8849 snprintf (out_buf, len-1, "%s$%s", (char *) salt.salt_sign, tmp_buf);
8850 }
8851 else if (hash_type == HASH_TYPE_KECCAK)
8852 {
8853 uint *ptr = digest_buf;
8854
8855 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",
8856 ptr[ 1], ptr[ 0],
8857 ptr[ 3], ptr[ 2],
8858 ptr[ 5], ptr[ 4],
8859 ptr[ 7], ptr[ 6],
8860 ptr[ 9], ptr[ 8],
8861 ptr[11], ptr[10],
8862 ptr[13], ptr[12],
8863 ptr[15], ptr[14],
8864 ptr[17], ptr[16],
8865 ptr[19], ptr[18],
8866 ptr[21], ptr[20],
8867 ptr[23], ptr[22],
8868 ptr[25], ptr[24],
8869 ptr[27], ptr[26],
8870 ptr[29], ptr[28],
8871 ptr[31], ptr[30],
8872 ptr[33], ptr[32],
8873 ptr[35], ptr[34],
8874 ptr[37], ptr[36],
8875 ptr[39], ptr[38],
8876 ptr[41], ptr[30],
8877 ptr[43], ptr[42],
8878 ptr[45], ptr[44],
8879 ptr[47], ptr[46],
8880 ptr[49], ptr[48]
8881 );
8882
8883 out_buf[salt.keccak_mdlen * 2] = 0;
8884 }
8885 else if (hash_type == HASH_TYPE_RIPEMD160)
8886 {
8887 snprintf (out_buf, 255, "%08x%08x%08x%08x%08x",
8888 digest_buf[0],
8889 digest_buf[1],
8890 digest_buf[2],
8891 digest_buf[3],
8892 digest_buf[4]);
8893 }
8894 else if (hash_type == HASH_TYPE_WHIRLPOOL)
8895 {
8896 digest_buf[ 0] = digest_buf[ 0];
8897 digest_buf[ 1] = digest_buf[ 1];
8898 digest_buf[ 2] = digest_buf[ 2];
8899 digest_buf[ 3] = digest_buf[ 3];
8900 digest_buf[ 4] = digest_buf[ 4];
8901 digest_buf[ 5] = digest_buf[ 5];
8902 digest_buf[ 6] = digest_buf[ 6];
8903 digest_buf[ 7] = digest_buf[ 7];
8904 digest_buf[ 8] = digest_buf[ 8];
8905 digest_buf[ 9] = digest_buf[ 9];
8906 digest_buf[10] = digest_buf[10];
8907 digest_buf[11] = digest_buf[11];
8908 digest_buf[12] = digest_buf[12];
8909 digest_buf[13] = digest_buf[13];
8910 digest_buf[14] = digest_buf[14];
8911 digest_buf[15] = digest_buf[15];
8912
8913 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8914 digest_buf[ 0],
8915 digest_buf[ 1],
8916 digest_buf[ 2],
8917 digest_buf[ 3],
8918 digest_buf[ 4],
8919 digest_buf[ 5],
8920 digest_buf[ 6],
8921 digest_buf[ 7],
8922 digest_buf[ 8],
8923 digest_buf[ 9],
8924 digest_buf[10],
8925 digest_buf[11],
8926 digest_buf[12],
8927 digest_buf[13],
8928 digest_buf[14],
8929 digest_buf[15]);
8930 }
8931 else if (hash_type == HASH_TYPE_GOST)
8932 {
8933 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8934 digest_buf[0],
8935 digest_buf[1],
8936 digest_buf[2],
8937 digest_buf[3],
8938 digest_buf[4],
8939 digest_buf[5],
8940 digest_buf[6],
8941 digest_buf[7]);
8942 }
8943 else if (hash_type == HASH_TYPE_MYSQL)
8944 {
8945 snprintf (out_buf, len-1, "%08x%08x",
8946 digest_buf[0],
8947 digest_buf[1]);
8948 }
8949 else if (hash_type == HASH_TYPE_LOTUS5)
8950 {
8951 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
8952 digest_buf[0],
8953 digest_buf[1],
8954 digest_buf[2],
8955 digest_buf[3]);
8956 }
8957 else if (hash_type == HASH_TYPE_LOTUS6)
8958 {
8959 digest_buf[ 0] = byte_swap_32 (digest_buf[ 0]);
8960 digest_buf[ 1] = byte_swap_32 (digest_buf[ 1]);
8961 digest_buf[ 2] = byte_swap_32 (digest_buf[ 2]);
8962 digest_buf[ 3] = byte_swap_32 (digest_buf[ 3]);
8963
8964 char buf[16] = { 0 };
8965
8966 memcpy (buf + 0, salt.salt_buf, 5);
8967 memcpy (buf + 5, digest_buf, 9);
8968
8969 buf[3] -= -4;
8970
8971 base64_encode (int_to_lotus64, (const u8 *) buf, 14, (u8 *) tmp_buf);
8972
8973 tmp_buf[18] = salt.salt_buf_pc[7];
8974 tmp_buf[19] = 0;
8975
8976 snprintf (out_buf, len-1, "(G%s)", tmp_buf);
8977 }
8978 else if (hash_type == HASH_TYPE_LOTUS8)
8979 {
8980 char buf[52] = { 0 };
8981
8982 // salt
8983
8984 memcpy (buf + 0, salt.salt_buf, 16);
8985
8986 buf[3] -= -4;
8987
8988 // iteration
8989
8990 snprintf (buf + 16, 11, "%010i", salt.salt_iter + 1);
8991
8992 // chars
8993
8994 buf[26] = salt.salt_buf_pc[0];
8995 buf[27] = salt.salt_buf_pc[1];
8996
8997 // digest
8998
8999 memcpy (buf + 28, digest_buf, 8);
9000
9001 base64_encode (int_to_lotus64, (const u8 *) buf, 36, (u8 *) tmp_buf);
9002
9003 tmp_buf[49] = 0;
9004
9005 snprintf (out_buf, len-1, "(H%s)", tmp_buf);
9006 }
9007 else if (hash_type == HASH_TYPE_CRC32)
9008 {
9009 snprintf (out_buf, len-1, "%08x", byte_swap_32 (digest_buf[0]));
9010 }
9011 }
9012
9013 if (salt_type == SALT_TYPE_INTERN)
9014 {
9015 size_t pos = strlen (out_buf);
9016
9017 out_buf[pos] = data.separator;
9018
9019 char *ptr = (char *) salt.salt_buf;
9020
9021 memcpy (out_buf + pos + 1, ptr, salt.salt_len);
9022
9023 out_buf[pos + 1 + salt.salt_len] = 0;
9024 }
9025 }
9026
9027 void to_hccap_t (hccap_t *hccap, uint salt_pos, uint digest_pos)
9028 {
9029 memset (hccap, 0, sizeof (hccap_t));
9030
9031 salt_t *salt = &data.salts_buf[salt_pos];
9032
9033 memcpy (hccap->essid, salt->salt_buf, salt->salt_len);
9034
9035 wpa_t *wpas = (wpa_t *) data.esalts_buf;
9036 wpa_t *wpa = &wpas[salt_pos];
9037
9038 hccap->keyver = wpa->keyver;
9039
9040 hccap->eapol_size = wpa->eapol_size;
9041
9042 if (wpa->keyver != 1)
9043 {
9044 uint eapol_tmp[64] = { 0 };
9045
9046 for (uint i = 0; i < 64; i++)
9047 {
9048 eapol_tmp[i] = byte_swap_32 (wpa->eapol[i]);
9049 }
9050
9051 memcpy (hccap->eapol, eapol_tmp, wpa->eapol_size);
9052 }
9053 else
9054 {
9055 memcpy (hccap->eapol, wpa->eapol, wpa->eapol_size);
9056 }
9057
9058 memcpy (hccap->mac1, wpa->orig_mac1, 6);
9059 memcpy (hccap->mac2, wpa->orig_mac2, 6);
9060 memcpy (hccap->nonce1, wpa->orig_nonce1, 32);
9061 memcpy (hccap->nonce2, wpa->orig_nonce2, 32);
9062
9063 char *digests_buf_ptr = (char *) data.digests_buf;
9064
9065 uint dgst_size = data.dgst_size;
9066
9067 uint *digest_ptr = (uint *) (digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size));
9068
9069 if (wpa->keyver != 1)
9070 {
9071 uint digest_tmp[4] = { 0 };
9072
9073 digest_tmp[0] = byte_swap_32 (digest_ptr[0]);
9074 digest_tmp[1] = byte_swap_32 (digest_ptr[1]);
9075 digest_tmp[2] = byte_swap_32 (digest_ptr[2]);
9076 digest_tmp[3] = byte_swap_32 (digest_ptr[3]);
9077
9078 memcpy (hccap->keymic, digest_tmp, 16);
9079 }
9080 else
9081 {
9082 memcpy (hccap->keymic, digest_ptr, 16);
9083 }
9084 }
9085
9086 void SuspendThreads ()
9087 {
9088 if (data.devices_status == STATUS_RUNNING)
9089 {
9090 hc_timer_set (&data.timer_paused);
9091
9092 data.devices_status = STATUS_PAUSED;
9093
9094 log_info ("Paused");
9095 }
9096 }
9097
9098 void ResumeThreads ()
9099 {
9100 if (data.devices_status == STATUS_PAUSED)
9101 {
9102 double ms_paused;
9103
9104 hc_timer_get (data.timer_paused, ms_paused);
9105
9106 data.ms_paused += ms_paused;
9107
9108 data.devices_status = STATUS_RUNNING;
9109
9110 log_info ("Resumed");
9111 }
9112 }
9113
9114 void bypass ()
9115 {
9116 if (data.devices_status != STATUS_RUNNING) return;
9117
9118 data.devices_status = STATUS_BYPASS;
9119
9120 log_info ("Next dictionary / mask in queue selected, bypassing current one");
9121 }
9122
9123 void stop_at_checkpoint ()
9124 {
9125 if (data.devices_status != STATUS_STOP_AT_CHECKPOINT)
9126 {
9127 if (data.devices_status != STATUS_RUNNING) return;
9128 }
9129
9130 // this feature only makes sense if --restore-disable was not specified
9131
9132 if (data.restore_disable == 1)
9133 {
9134 log_info ("WARNING: this feature is disabled when --restore-disable was specified");
9135
9136 return;
9137 }
9138
9139 // check if monitoring of Restore Point updates should be enabled or disabled
9140
9141 if (data.devices_status != STATUS_STOP_AT_CHECKPOINT)
9142 {
9143 data.devices_status = STATUS_STOP_AT_CHECKPOINT;
9144
9145 // save the current restore point value
9146
9147 data.checkpoint_cur_words = get_lowest_words_done ();
9148
9149 log_info ("Checkpoint enabled: will quit at next Restore Point update");
9150 }
9151 else
9152 {
9153 data.devices_status = STATUS_RUNNING;
9154
9155 // reset the global value for checkpoint checks
9156
9157 data.checkpoint_cur_words = 0;
9158
9159 log_info ("Checkpoint disabled: Restore Point updates will no longer be monitored");
9160 }
9161 }
9162
9163 void myabort ()
9164 {
9165 if (data.devices_status == STATUS_INIT) return;
9166 if (data.devices_status == STATUS_STARTING) return;
9167
9168 data.devices_status = STATUS_ABORTED;
9169 }
9170
9171 void myquit ()
9172 {
9173 if (data.devices_status == STATUS_INIT) return;
9174 if (data.devices_status == STATUS_STARTING) return;
9175
9176 data.devices_status = STATUS_QUIT;
9177 }
9178
9179 void load_kernel (const char *kernel_file, int num_devices, size_t *kernel_lengths, const u8 **kernel_sources)
9180 {
9181 FILE *fp = fopen (kernel_file, "rb");
9182
9183 if (fp != NULL)
9184 {
9185 struct stat st;
9186
9187 memset (&st, 0, sizeof (st));
9188
9189 stat (kernel_file, &st);
9190
9191 u8 *buf = (u8 *) mymalloc (st.st_size + 1);
9192
9193 size_t num_read = fread (buf, sizeof (u8), st.st_size, fp);
9194
9195 if (num_read != (size_t) st.st_size)
9196 {
9197 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
9198
9199 exit (-1);
9200 }
9201
9202 fclose (fp);
9203
9204 buf[st.st_size] = 0;
9205
9206 for (int i = 0; i < num_devices; i++)
9207 {
9208 kernel_lengths[i] = (size_t) st.st_size;
9209
9210 kernel_sources[i] = buf;
9211 }
9212 }
9213 else
9214 {
9215 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
9216
9217 exit (-1);
9218 }
9219
9220 return;
9221 }
9222
9223 void writeProgramBin (char *dst, u8 *binary, size_t binary_size)
9224 {
9225 if (binary_size > 0)
9226 {
9227 FILE *fp = fopen (dst, "wb");
9228
9229 lock_file (fp);
9230 fwrite (binary, sizeof (u8), binary_size, fp);
9231
9232 fflush (fp);
9233 fclose (fp);
9234 }
9235 }
9236
9237 /**
9238 * restore
9239 */
9240
9241 restore_data_t *init_restore (int argc, char **argv)
9242 {
9243 restore_data_t *rd = (restore_data_t *) mymalloc (sizeof (restore_data_t));
9244
9245 if (data.restore_disable == 0)
9246 {
9247 FILE *fp = fopen (data.eff_restore_file, "rb");
9248
9249 if (fp)
9250 {
9251 size_t nread = fread (rd, sizeof (restore_data_t), 1, fp);
9252
9253 if (nread != 1)
9254 {
9255 log_error ("ERROR: cannot read %s", data.eff_restore_file);
9256
9257 exit (-1);
9258 }
9259
9260 fclose (fp);
9261
9262 if (rd->pid)
9263 {
9264 char *pidbin = (char *) mymalloc (HCBUFSIZ);
9265
9266 int pidbin_len = -1;
9267
9268 #ifdef _POSIX
9269 snprintf (pidbin, HCBUFSIZ - 1, "/proc/%d/cmdline", rd->pid);
9270
9271 FILE *fd = fopen (pidbin, "rb");
9272
9273 if (fd)
9274 {
9275 pidbin_len = fread (pidbin, 1, HCBUFSIZ, fd);
9276
9277 pidbin[pidbin_len] = 0;
9278
9279 fclose (fd);
9280
9281 char *argv0_r = strrchr (argv[0], '/');
9282
9283 char *pidbin_r = strrchr (pidbin, '/');
9284
9285 if (argv0_r == NULL) argv0_r = argv[0];
9286
9287 if (pidbin_r == NULL) pidbin_r = pidbin;
9288
9289 if (strcmp (argv0_r, pidbin_r) == 0)
9290 {
9291 log_error ("ERROR: already an instance %s running on pid %d", pidbin, rd->pid);
9292
9293 exit (-1);
9294 }
9295 }
9296
9297 #elif _WIN
9298 HANDLE hProcess = OpenProcess (PROCESS_ALL_ACCESS, FALSE, rd->pid);
9299
9300 char *pidbin2 = (char *) mymalloc (HCBUFSIZ);
9301
9302 int pidbin2_len = -1;
9303
9304 pidbin_len = GetModuleFileName (NULL, pidbin, HCBUFSIZ);
9305 pidbin2_len = GetModuleFileNameEx (hProcess, NULL, pidbin2, HCBUFSIZ);
9306
9307 pidbin[pidbin_len] = 0;
9308 pidbin2[pidbin2_len] = 0;
9309
9310 if (pidbin2_len)
9311 {
9312 if (strcmp (pidbin, pidbin2) == 0)
9313 {
9314 log_error ("ERROR: already an instance %s running on pid %d", pidbin2, rd->pid);
9315
9316 exit (-1);
9317 }
9318 }
9319
9320 myfree (pidbin2);
9321
9322 #endif
9323
9324 myfree (pidbin);
9325 }
9326
9327 if (rd->version_bin < RESTORE_MIN)
9328 {
9329 log_error ("ERROR: cannot use outdated %s. Please remove it.", data.eff_restore_file);
9330
9331 exit (-1);
9332 }
9333 }
9334 }
9335
9336 memset (rd, 0, sizeof (restore_data_t));
9337
9338 rd->version_bin = VERSION_BIN;
9339
9340 #ifdef _POSIX
9341 rd->pid = getpid ();
9342 #elif _WIN
9343 rd->pid = GetCurrentProcessId ();
9344 #endif
9345
9346 if (getcwd (rd->cwd, 255) == NULL)
9347 {
9348 myfree (rd);
9349
9350 return (NULL);
9351 }
9352
9353 rd->argc = argc;
9354 rd->argv = argv;
9355
9356 return (rd);
9357 }
9358
9359 void read_restore (const char *eff_restore_file, restore_data_t *rd)
9360 {
9361 FILE *fp = fopen (eff_restore_file, "rb");
9362
9363 if (fp == NULL)
9364 {
9365 log_error ("ERROR: restore file '%s': %s", eff_restore_file, strerror (errno));
9366
9367 exit (-1);
9368 }
9369
9370 if (fread (rd, sizeof (restore_data_t), 1, fp) != 1)
9371 {
9372 log_error ("ERROR: cannot read %s", eff_restore_file);
9373
9374 exit (-1);
9375 }
9376
9377 rd->argv = (char **) mycalloc (rd->argc, sizeof (char *));
9378
9379 char *buf = (char *) mymalloc (HCBUFSIZ);
9380
9381 for (uint i = 0; i < rd->argc; i++)
9382 {
9383 if (fgets (buf, HCBUFSIZ - 1, fp) == NULL)
9384 {
9385 log_error ("ERROR: cannot read %s", eff_restore_file);
9386
9387 exit (-1);
9388 }
9389
9390 size_t len = strlen (buf);
9391
9392 if (len) buf[len - 1] = 0;
9393
9394 rd->argv[i] = mystrdup (buf);
9395 }
9396
9397 myfree (buf);
9398
9399 fclose (fp);
9400
9401 log_info ("INFO: Changing current working directory to the path found within the .restore file: '%s'", rd->cwd);
9402
9403 if (chdir (rd->cwd))
9404 {
9405 log_error ("ERROR: The directory '%s' does not exist. It is needed to restore (--restore) the session.\n"
9406 " You could either create this directory (or link it) or update the .restore file using e.g. the analyze_hc_restore.pl tool:\n"
9407 " https://github.com/philsmd/analyze_hc_restore\n"
9408 " The directory must be relative to (or contain) all files/folders mentioned within the command line.", rd->cwd);
9409
9410 exit (-1);
9411 }
9412 }
9413
9414 u64 get_lowest_words_done ()
9415 {
9416 u64 words_cur = -1;
9417
9418 for (uint device_id = 0; device_id < data.devices_cnt; device_id++)
9419 {
9420 hc_device_param_t *device_param = &data.devices_param[device_id];
9421
9422 if (device_param->skipped) continue;
9423
9424 const u64 words_done = device_param->words_done;
9425
9426 if (words_done < words_cur) words_cur = words_done;
9427 }
9428
9429 // It's possible that a device's workload isn't finished right after a restore-case.
9430 // In that case, this function would return 0 and overwrite the real restore point
9431 // There's also data.words_cur which is set to rd->words_cur but it changes while
9432 // the attack is running therefore we should stick to rd->words_cur.
9433 // Note that -s influences rd->words_cur we should keep a close look on that.
9434
9435 if (words_cur < data.rd->words_cur) words_cur = data.rd->words_cur;
9436
9437 return words_cur;
9438 }
9439
9440 void write_restore (const char *new_restore_file, restore_data_t *rd)
9441 {
9442 u64 words_cur = get_lowest_words_done ();
9443
9444 rd->words_cur = words_cur;
9445
9446 FILE *fp = fopen (new_restore_file, "wb");
9447
9448 if (fp == NULL)
9449 {
9450 log_error ("ERROR: %s: %s", new_restore_file, strerror (errno));
9451
9452 exit (-1);
9453 }
9454
9455 if (setvbuf (fp, NULL, _IONBF, 0))
9456 {
9457 log_error ("ERROR: setvbuf file '%s': %s", new_restore_file, strerror (errno));
9458
9459 exit (-1);
9460 }
9461
9462 fwrite (rd, sizeof (restore_data_t), 1, fp);
9463
9464 for (uint i = 0; i < rd->argc; i++)
9465 {
9466 fprintf (fp, "%s", rd->argv[i]);
9467 fputc ('\n', fp);
9468 }
9469
9470 fflush (fp);
9471
9472 fsync (fileno (fp));
9473
9474 fclose (fp);
9475 }
9476
9477 void cycle_restore ()
9478 {
9479 const char *eff_restore_file = data.eff_restore_file;
9480 const char *new_restore_file = data.new_restore_file;
9481
9482 restore_data_t *rd = data.rd;
9483
9484 write_restore (new_restore_file, rd);
9485
9486 struct stat st;
9487
9488 memset (&st, 0, sizeof(st));
9489
9490 if (stat (eff_restore_file, &st) == 0)
9491 {
9492 if (unlink (eff_restore_file))
9493 {
9494 log_info ("WARN: unlink file '%s': %s", eff_restore_file, strerror (errno));
9495 }
9496 }
9497
9498 if (rename (new_restore_file, eff_restore_file))
9499 {
9500 log_info ("WARN: rename file '%s' to '%s': %s", new_restore_file, eff_restore_file, strerror (errno));
9501 }
9502 }
9503
9504 void check_checkpoint ()
9505 {
9506 // if (data.restore_disable == 1) break; (this is already implied by previous checks)
9507
9508 u64 words_cur = get_lowest_words_done ();
9509
9510 if (words_cur != data.checkpoint_cur_words)
9511 {
9512 myabort ();
9513 }
9514 }
9515
9516 /**
9517 * tuning db
9518 */
9519
9520 void tuning_db_destroy (tuning_db_t *tuning_db)
9521 {
9522 int i;
9523
9524 for (i = 0; i < tuning_db->alias_cnt; i++)
9525 {
9526 tuning_db_alias_t *alias = &tuning_db->alias_buf[i];
9527
9528 myfree (alias->device_name);
9529 myfree (alias->alias_name);
9530 }
9531
9532 for (i = 0; i < tuning_db->entry_cnt; i++)
9533 {
9534 tuning_db_entry_t *entry = &tuning_db->entry_buf[i];
9535
9536 myfree (entry->device_name);
9537 }
9538
9539 myfree (tuning_db->alias_buf);
9540 myfree (tuning_db->entry_buf);
9541
9542 myfree (tuning_db);
9543 }
9544
9545 tuning_db_t *tuning_db_alloc (FILE *fp)
9546 {
9547 tuning_db_t *tuning_db = (tuning_db_t *) mymalloc (sizeof (tuning_db_t));
9548
9549 int num_lines = count_lines (fp);
9550
9551 // a bit over-allocated
9552
9553 tuning_db->alias_buf = (tuning_db_alias_t *) mycalloc (num_lines + 1, sizeof (tuning_db_alias_t));
9554 tuning_db->alias_cnt = 0;
9555
9556 tuning_db->entry_buf = (tuning_db_entry_t *) mycalloc (num_lines + 1, sizeof (tuning_db_entry_t));
9557 tuning_db->entry_cnt = 0;
9558
9559 return tuning_db;
9560 }
9561
9562 tuning_db_t *tuning_db_init (const char *tuning_db_file)
9563 {
9564 FILE *fp = fopen (tuning_db_file, "rb");
9565
9566 if (fp == NULL)
9567 {
9568 log_error ("%s: %s", tuning_db_file, strerror (errno));
9569
9570 exit (-1);
9571 }
9572
9573 tuning_db_t *tuning_db = tuning_db_alloc (fp);
9574
9575 rewind (fp);
9576
9577 int line_num = 0;
9578
9579 char *buf = (char *) mymalloc (HCBUFSIZ);
9580
9581 while (!feof (fp))
9582 {
9583 char *line_buf = fgets (buf, HCBUFSIZ - 1, fp);
9584
9585 if (line_buf == NULL) break;
9586
9587 line_num++;
9588
9589 const int line_len = in_superchop (line_buf);
9590
9591 if (line_len == 0) continue;
9592
9593 if (line_buf[0] == '#') continue;
9594
9595 // start processing
9596
9597 char *token_ptr[7] = { NULL };
9598
9599 int token_cnt = 0;
9600
9601 char *next = strtok (line_buf, "\t ");
9602
9603 token_ptr[token_cnt] = next;
9604
9605 token_cnt++;
9606
9607 while ((next = strtok (NULL, "\t ")) != NULL)
9608 {
9609 token_ptr[token_cnt] = next;
9610
9611 token_cnt++;
9612 }
9613
9614 if (token_cnt == 2)
9615 {
9616 char *device_name = token_ptr[0];
9617 char *alias_name = token_ptr[1];
9618
9619 tuning_db_alias_t *alias = &tuning_db->alias_buf[tuning_db->alias_cnt];
9620
9621 alias->device_name = mystrdup (device_name);
9622 alias->alias_name = mystrdup (alias_name);
9623
9624 tuning_db->alias_cnt++;
9625 }
9626 else if (token_cnt == 6)
9627 {
9628 if ((token_ptr[1][0] != '0') &&
9629 (token_ptr[1][0] != '1') &&
9630 (token_ptr[1][0] != '3') &&
9631 (token_ptr[1][0] != '*'))
9632 {
9633 log_info ("WARNING: Tuning-db: Invalid attack_mode '%c' in Line '%u'", token_ptr[1][0], line_num);
9634
9635 continue;
9636 }
9637
9638 if ((token_ptr[3][0] != '1') &&
9639 (token_ptr[3][0] != '2') &&
9640 (token_ptr[3][0] != '4') &&
9641 (token_ptr[3][0] != '8') &&
9642 (token_ptr[3][0] != 'N'))
9643 {
9644 log_info ("WARNING: Tuning-db: Invalid vector_width '%c' in Line '%u'", token_ptr[3][0], line_num);
9645
9646 continue;
9647 }
9648
9649 char *device_name = token_ptr[0];
9650
9651 int attack_mode = -1;
9652 int hash_type = -1;
9653 int vector_width = -1;
9654 int kernel_accel = -1;
9655 int kernel_loops = -1;
9656
9657 if (token_ptr[1][0] != '*') attack_mode = atoi (token_ptr[1]);
9658 if (token_ptr[2][0] != '*') hash_type = atoi (token_ptr[2]);
9659 if (token_ptr[3][0] != 'N') vector_width = atoi (token_ptr[3]);
9660
9661 if (token_ptr[4][0] != 'A')
9662 {
9663 kernel_accel = atoi (token_ptr[4]);
9664
9665 if ((kernel_accel < 1) || (kernel_accel > 1024))
9666 {
9667 log_info ("WARNING: Tuning-db: Invalid kernel_accel '%d' in Line '%u'", kernel_accel, line_num);
9668
9669 continue;
9670 }
9671 }
9672 else
9673 {
9674 kernel_accel = 0;
9675 }
9676
9677 if (token_ptr[5][0] != 'A')
9678 {
9679 kernel_loops = atoi (token_ptr[5]);
9680
9681 if ((kernel_loops < 1) || (kernel_loops > 1024))
9682 {
9683 log_info ("WARNING: Tuning-db: Invalid kernel_loops '%d' in Line '%u'", kernel_loops, line_num);
9684
9685 continue;
9686 }
9687 }
9688 else
9689 {
9690 kernel_loops = 0;
9691 }
9692
9693 tuning_db_entry_t *entry = &tuning_db->entry_buf[tuning_db->entry_cnt];
9694
9695 entry->device_name = mystrdup (device_name);
9696 entry->attack_mode = attack_mode;
9697 entry->hash_type = hash_type;
9698 entry->vector_width = vector_width;
9699 entry->kernel_accel = kernel_accel;
9700 entry->kernel_loops = kernel_loops;
9701
9702 tuning_db->entry_cnt++;
9703 }
9704 else
9705 {
9706 log_info ("WARNING: Tuning-db: Invalid number of token in Line '%u'", line_num);
9707
9708 continue;
9709 }
9710 }
9711
9712 myfree (buf);
9713
9714 fclose (fp);
9715
9716 // todo: print loaded 'cnt' message
9717
9718 // sort the database
9719
9720 qsort (tuning_db->alias_buf, tuning_db->alias_cnt, sizeof (tuning_db_alias_t), sort_by_tuning_db_alias);
9721 qsort (tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry);
9722
9723 return tuning_db;
9724 }
9725
9726 tuning_db_entry_t *tuning_db_search (tuning_db_t *tuning_db, hc_device_param_t *device_param, int attack_mode, int hash_type)
9727 {
9728 static tuning_db_entry_t s;
9729
9730 // first we need to convert all spaces in the device_name to underscore
9731
9732 char *device_name_nospace = strdup (device_param->device_name);
9733
9734 int device_name_length = strlen (device_name_nospace);
9735
9736 int i;
9737
9738 for (i = 0; i < device_name_length; i++)
9739 {
9740 if (device_name_nospace[i] == ' ') device_name_nospace[i] = '_';
9741 }
9742
9743 // find out if there's an alias configured
9744
9745 tuning_db_alias_t a;
9746
9747 a.device_name = device_name_nospace;
9748
9749 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);
9750
9751 char *alias_name = (alias == NULL) ? NULL : alias->alias_name;
9752
9753 // attack-mode 6 and 7 are attack-mode 1 basically
9754
9755 if (attack_mode == 6) attack_mode = 1;
9756 if (attack_mode == 7) attack_mode = 1;
9757
9758 // bsearch is not ideal but fast enough
9759
9760 s.device_name = device_name_nospace;
9761 s.attack_mode = attack_mode;
9762 s.hash_type = hash_type;
9763
9764 tuning_db_entry_t *entry = NULL;
9765
9766 // this will produce all 2^3 combinations required
9767
9768 for (i = 0; i < 8; i++)
9769 {
9770 s.device_name = (i & 1) ? "*" : device_name_nospace;
9771 s.attack_mode = (i & 2) ? -1 : attack_mode;
9772 s.hash_type = (i & 4) ? -1 : hash_type;
9773
9774 entry = bsearch (&s, tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry);
9775
9776 if (entry != NULL) break;
9777
9778 // in non-wildcard mode do some additional checks:
9779
9780 if ((i & 1) == 0)
9781 {
9782 // in case we have an alias-name
9783
9784 if (alias_name != NULL)
9785 {
9786 s.device_name = alias_name;
9787
9788 entry = bsearch (&s, tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry);
9789
9790 if (entry != NULL) break;
9791 }
9792
9793 // or by device type
9794
9795 if (device_param->device_type & CL_DEVICE_TYPE_CPU)
9796 {
9797 s.device_name = "DEVICE_TYPE_CPU";
9798 }
9799 else if (device_param->device_type & CL_DEVICE_TYPE_GPU)
9800 {
9801 s.device_name = "DEVICE_TYPE_GPU";
9802 }
9803 else if (device_param->device_type & CL_DEVICE_TYPE_ACCELERATOR)
9804 {
9805 s.device_name = "DEVICE_TYPE_ACCELERATOR";
9806 }
9807
9808 entry = bsearch (&s, tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry);
9809
9810 if (entry != NULL) break;
9811 }
9812 }
9813
9814 // free converted device_name
9815
9816 myfree (device_name_nospace);
9817
9818 return entry;
9819 }
9820
9821 /**
9822 * parser
9823 */
9824
9825 uint parse_and_store_salt (char *out, char *in, uint salt_len)
9826 {
9827 u8 tmp[256] = { 0 };
9828
9829 if (salt_len > sizeof (tmp))
9830 {
9831 return UINT_MAX;
9832 }
9833
9834 memcpy (tmp, in, salt_len);
9835
9836 if (data.opts_type & OPTS_TYPE_ST_HEX)
9837 {
9838 if ((salt_len % 2) == 0)
9839 {
9840 u32 new_salt_len = salt_len / 2;
9841
9842 for (uint i = 0, j = 0; i < new_salt_len; i += 1, j += 2)
9843 {
9844 u8 p0 = tmp[j + 0];
9845 u8 p1 = tmp[j + 1];
9846
9847 tmp[i] = hex_convert (p1) << 0;
9848 tmp[i] |= hex_convert (p0) << 4;
9849 }
9850
9851 salt_len = new_salt_len;
9852 }
9853 else
9854 {
9855 return UINT_MAX;
9856 }
9857 }
9858 else if (data.opts_type & OPTS_TYPE_ST_BASE64)
9859 {
9860 salt_len = base64_decode (base64_to_int, (const u8 *) in, salt_len, (u8 *) tmp);
9861 }
9862
9863 memset (tmp + salt_len, 0, sizeof (tmp) - salt_len);
9864
9865 if (data.opts_type & OPTS_TYPE_ST_UNICODE)
9866 {
9867 if (salt_len < 20)
9868 {
9869 u32 *tmp_uint = (u32 *) tmp;
9870
9871 tmp_uint[9] = ((tmp_uint[4] >> 8) & 0x00FF0000) | ((tmp_uint[4] >> 16) & 0x000000FF);
9872 tmp_uint[8] = ((tmp_uint[4] << 8) & 0x00FF0000) | ((tmp_uint[4] >> 0) & 0x000000FF);
9873 tmp_uint[7] = ((tmp_uint[3] >> 8) & 0x00FF0000) | ((tmp_uint[3] >> 16) & 0x000000FF);
9874 tmp_uint[6] = ((tmp_uint[3] << 8) & 0x00FF0000) | ((tmp_uint[3] >> 0) & 0x000000FF);
9875 tmp_uint[5] = ((tmp_uint[2] >> 8) & 0x00FF0000) | ((tmp_uint[2] >> 16) & 0x000000FF);
9876 tmp_uint[4] = ((tmp_uint[2] << 8) & 0x00FF0000) | ((tmp_uint[2] >> 0) & 0x000000FF);
9877 tmp_uint[3] = ((tmp_uint[1] >> 8) & 0x00FF0000) | ((tmp_uint[1] >> 16) & 0x000000FF);
9878 tmp_uint[2] = ((tmp_uint[1] << 8) & 0x00FF0000) | ((tmp_uint[1] >> 0) & 0x000000FF);
9879 tmp_uint[1] = ((tmp_uint[0] >> 8) & 0x00FF0000) | ((tmp_uint[0] >> 16) & 0x000000FF);
9880 tmp_uint[0] = ((tmp_uint[0] << 8) & 0x00FF0000) | ((tmp_uint[0] >> 0) & 0x000000FF);
9881
9882 salt_len = salt_len * 2;
9883 }
9884 else
9885 {
9886 return UINT_MAX;
9887 }
9888 }
9889
9890 if (data.opts_type & OPTS_TYPE_ST_LOWER)
9891 {
9892 lowercase (tmp, salt_len);
9893 }
9894
9895 if (data.opts_type & OPTS_TYPE_ST_UPPER)
9896 {
9897 uppercase (tmp, salt_len);
9898 }
9899
9900 u32 len = salt_len;
9901
9902 if (data.opts_type & OPTS_TYPE_ST_ADD80)
9903 {
9904 tmp[len++] = 0x80;
9905 }
9906
9907 if (data.opts_type & OPTS_TYPE_ST_ADD01)
9908 {
9909 tmp[len++] = 0x01;
9910 }
9911
9912 if (data.opts_type & OPTS_TYPE_ST_GENERATE_LE)
9913 {
9914 u32 *tmp_uint = (uint *) tmp;
9915
9916 u32 max = len / 4;
9917
9918 if (len % 4) max++;
9919
9920 for (u32 i = 0; i < max; i++)
9921 {
9922 tmp_uint[i] = byte_swap_32 (tmp_uint[i]);
9923 }
9924
9925 // Important: we may need to increase the length of memcpy since
9926 // we don't want to "loose" some swapped bytes (could happen if
9927 // they do not perfectly fit in the 4-byte blocks)
9928 // Memcpy does always copy the bytes in the BE order, but since
9929 // we swapped them, some important bytes could be in positions
9930 // we normally skip with the original len
9931
9932 if (len % 4) len += 4 - (len % 4);
9933 }
9934
9935 memcpy (out, tmp, len);
9936
9937 return (salt_len);
9938 }
9939
9940 int bcrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9941 {
9942 if ((input_len < DISPLAY_LEN_MIN_3200) || (input_len > DISPLAY_LEN_MAX_3200)) return (PARSER_GLOBAL_LENGTH);
9943
9944 if ((memcmp (SIGNATURE_BCRYPT1, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT2, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT3, input_buf, 4))) return (PARSER_SIGNATURE_UNMATCHED);
9945
9946 u32 *digest = (u32 *) hash_buf->digest;
9947
9948 salt_t *salt = hash_buf->salt;
9949
9950 memcpy ((char *) salt->salt_sign, input_buf, 6);
9951
9952 char *iter_pos = input_buf + 4;
9953
9954 salt->salt_iter = 1 << atoi (iter_pos);
9955
9956 char *salt_pos = strchr (iter_pos, '$');
9957
9958 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9959
9960 salt_pos++;
9961
9962 uint salt_len = 16;
9963
9964 salt->salt_len = salt_len;
9965
9966 u8 tmp_buf[100] = { 0 };
9967
9968 base64_decode (bf64_to_int, (const u8 *) salt_pos, 22, tmp_buf);
9969
9970 char *salt_buf_ptr = (char *) salt->salt_buf;
9971
9972 memcpy (salt_buf_ptr, tmp_buf, 16);
9973
9974 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
9975 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
9976 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
9977 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
9978
9979 char *hash_pos = salt_pos + 22;
9980
9981 memset (tmp_buf, 0, sizeof (tmp_buf));
9982
9983 base64_decode (bf64_to_int, (const u8 *) hash_pos, 31, tmp_buf);
9984
9985 memcpy (digest, tmp_buf, 24);
9986
9987 digest[0] = byte_swap_32 (digest[0]);
9988 digest[1] = byte_swap_32 (digest[1]);
9989 digest[2] = byte_swap_32 (digest[2]);
9990 digest[3] = byte_swap_32 (digest[3]);
9991 digest[4] = byte_swap_32 (digest[4]);
9992 digest[5] = byte_swap_32 (digest[5]);
9993
9994 digest[5] &= ~0xff; // its just 23 not 24 !
9995
9996 return (PARSER_OK);
9997 }
9998
9999 int cisco4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10000 {
10001 if ((input_len < DISPLAY_LEN_MIN_5700) || (input_len > DISPLAY_LEN_MAX_5700)) return (PARSER_GLOBAL_LENGTH);
10002
10003 u32 *digest = (u32 *) hash_buf->digest;
10004
10005 u8 tmp_buf[100] = { 0 };
10006
10007 base64_decode (itoa64_to_int, (const u8 *) input_buf, 43, tmp_buf);
10008
10009 memcpy (digest, tmp_buf, 32);
10010
10011 digest[0] = byte_swap_32 (digest[0]);
10012 digest[1] = byte_swap_32 (digest[1]);
10013 digest[2] = byte_swap_32 (digest[2]);
10014 digest[3] = byte_swap_32 (digest[3]);
10015 digest[4] = byte_swap_32 (digest[4]);
10016 digest[5] = byte_swap_32 (digest[5]);
10017 digest[6] = byte_swap_32 (digest[6]);
10018 digest[7] = byte_swap_32 (digest[7]);
10019
10020 digest[0] -= SHA256M_A;
10021 digest[1] -= SHA256M_B;
10022 digest[2] -= SHA256M_C;
10023 digest[3] -= SHA256M_D;
10024 digest[4] -= SHA256M_E;
10025 digest[5] -= SHA256M_F;
10026 digest[6] -= SHA256M_G;
10027 digest[7] -= SHA256M_H;
10028
10029 return (PARSER_OK);
10030 }
10031
10032 int lm_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10033 {
10034 if ((input_len < DISPLAY_LEN_MIN_3000) || (input_len > DISPLAY_LEN_MAX_3000)) return (PARSER_GLOBAL_LENGTH);
10035
10036 u32 *digest = (u32 *) hash_buf->digest;
10037
10038 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10039 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10040
10041 digest[0] = byte_swap_32 (digest[0]);
10042 digest[1] = byte_swap_32 (digest[1]);
10043
10044 uint tt;
10045
10046 IP (digest[0], digest[1], tt);
10047
10048 digest[0] = digest[0];
10049 digest[1] = digest[1];
10050 digest[2] = 0;
10051 digest[3] = 0;
10052
10053 return (PARSER_OK);
10054 }
10055
10056 int arubaos_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10057 {
10058 if ((input_len < DISPLAY_LEN_MIN_125) || (input_len > DISPLAY_LEN_MAX_125)) return (PARSER_GLOBAL_LENGTH);
10059
10060 if ((input_buf[8] != '0') || (input_buf[9] != '1')) return (PARSER_SIGNATURE_UNMATCHED);
10061
10062 u32 *digest = (u32 *) hash_buf->digest;
10063
10064 salt_t *salt = hash_buf->salt;
10065
10066 char *hash_pos = input_buf + 10;
10067
10068 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
10069 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
10070 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
10071 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
10072 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
10073
10074 digest[0] -= SHA1M_A;
10075 digest[1] -= SHA1M_B;
10076 digest[2] -= SHA1M_C;
10077 digest[3] -= SHA1M_D;
10078 digest[4] -= SHA1M_E;
10079
10080 uint salt_len = 10;
10081
10082 char *salt_buf_ptr = (char *) salt->salt_buf;
10083
10084 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
10085
10086 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10087
10088 salt->salt_len = salt_len;
10089
10090 return (PARSER_OK);
10091 }
10092
10093 int osx1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10094 {
10095 if ((input_len < DISPLAY_LEN_MIN_122) || (input_len > DISPLAY_LEN_MAX_122)) return (PARSER_GLOBAL_LENGTH);
10096
10097 u32 *digest = (u32 *) hash_buf->digest;
10098
10099 salt_t *salt = hash_buf->salt;
10100
10101 char *hash_pos = input_buf + 8;
10102
10103 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
10104 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
10105 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
10106 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
10107 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
10108
10109 digest[0] -= SHA1M_A;
10110 digest[1] -= SHA1M_B;
10111 digest[2] -= SHA1M_C;
10112 digest[3] -= SHA1M_D;
10113 digest[4] -= SHA1M_E;
10114
10115 uint salt_len = 8;
10116
10117 char *salt_buf_ptr = (char *) salt->salt_buf;
10118
10119 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
10120
10121 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10122
10123 salt->salt_len = salt_len;
10124
10125 return (PARSER_OK);
10126 }
10127
10128 int osx512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10129 {
10130 if ((input_len < DISPLAY_LEN_MIN_1722) || (input_len > DISPLAY_LEN_MAX_1722)) return (PARSER_GLOBAL_LENGTH);
10131
10132 u64 *digest = (u64 *) hash_buf->digest;
10133
10134 salt_t *salt = hash_buf->salt;
10135
10136 char *hash_pos = input_buf + 8;
10137
10138 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
10139 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
10140 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
10141 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
10142 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
10143 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
10144 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
10145 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
10146
10147 digest[0] -= SHA512M_A;
10148 digest[1] -= SHA512M_B;
10149 digest[2] -= SHA512M_C;
10150 digest[3] -= SHA512M_D;
10151 digest[4] -= SHA512M_E;
10152 digest[5] -= SHA512M_F;
10153 digest[6] -= SHA512M_G;
10154 digest[7] -= SHA512M_H;
10155
10156 uint salt_len = 8;
10157
10158 char *salt_buf_ptr = (char *) salt->salt_buf;
10159
10160 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
10161
10162 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10163
10164 salt->salt_len = salt_len;
10165
10166 return (PARSER_OK);
10167 }
10168
10169 int osc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10170 {
10171 if (data.opts_type & OPTS_TYPE_ST_HEX)
10172 {
10173 if ((input_len < DISPLAY_LEN_MIN_21H) || (input_len > DISPLAY_LEN_MAX_21H)) return (PARSER_GLOBAL_LENGTH);
10174 }
10175 else
10176 {
10177 if ((input_len < DISPLAY_LEN_MIN_21) || (input_len > DISPLAY_LEN_MAX_21)) return (PARSER_GLOBAL_LENGTH);
10178 }
10179
10180 u32 *digest = (u32 *) hash_buf->digest;
10181
10182 salt_t *salt = hash_buf->salt;
10183
10184 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10185 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10186 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10187 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10188
10189 digest[0] = byte_swap_32 (digest[0]);
10190 digest[1] = byte_swap_32 (digest[1]);
10191 digest[2] = byte_swap_32 (digest[2]);
10192 digest[3] = byte_swap_32 (digest[3]);
10193
10194 digest[0] -= MD5M_A;
10195 digest[1] -= MD5M_B;
10196 digest[2] -= MD5M_C;
10197 digest[3] -= MD5M_D;
10198
10199 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10200
10201 uint salt_len = input_len - 32 - 1;
10202
10203 char *salt_buf = input_buf + 32 + 1;
10204
10205 char *salt_buf_ptr = (char *) salt->salt_buf;
10206
10207 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10208
10209 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10210
10211 salt->salt_len = salt_len;
10212
10213 return (PARSER_OK);
10214 }
10215
10216 int netscreen_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10217 {
10218 if (data.opts_type & OPTS_TYPE_ST_HEX)
10219 {
10220 if ((input_len < DISPLAY_LEN_MIN_22H) || (input_len > DISPLAY_LEN_MAX_22H)) return (PARSER_GLOBAL_LENGTH);
10221 }
10222 else
10223 {
10224 if ((input_len < DISPLAY_LEN_MIN_22) || (input_len > DISPLAY_LEN_MAX_22)) return (PARSER_GLOBAL_LENGTH);
10225 }
10226
10227 // unscramble
10228
10229 char clean_input_buf[32] = { 0 };
10230
10231 char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' };
10232 int pos[6] = { 0, 6, 12, 17, 23, 29 };
10233
10234 for (int i = 0, j = 0, k = 0; i < 30; i++)
10235 {
10236 if (i == pos[j])
10237 {
10238 if (sig[j] != input_buf[i]) return (PARSER_SIGNATURE_UNMATCHED);
10239
10240 j++;
10241 }
10242 else
10243 {
10244 clean_input_buf[k] = input_buf[i];
10245
10246 k++;
10247 }
10248 }
10249
10250 // base64 decode
10251
10252 u32 *digest = (u32 *) hash_buf->digest;
10253
10254 salt_t *salt = hash_buf->salt;
10255
10256 u32 a, b, c, d, e, f;
10257
10258 a = base64_to_int (clean_input_buf[ 0] & 0x7f);
10259 b = base64_to_int (clean_input_buf[ 1] & 0x7f);
10260 c = base64_to_int (clean_input_buf[ 2] & 0x7f);
10261 d = base64_to_int (clean_input_buf[ 3] & 0x7f);
10262 e = base64_to_int (clean_input_buf[ 4] & 0x7f);
10263 f = base64_to_int (clean_input_buf[ 5] & 0x7f);
10264
10265 digest[0] = (((a << 12) | (b << 6) | (c)) << 16)
10266 | (((d << 12) | (e << 6) | (f)) << 0);
10267
10268 a = base64_to_int (clean_input_buf[ 6] & 0x7f);
10269 b = base64_to_int (clean_input_buf[ 7] & 0x7f);
10270 c = base64_to_int (clean_input_buf[ 8] & 0x7f);
10271 d = base64_to_int (clean_input_buf[ 9] & 0x7f);
10272 e = base64_to_int (clean_input_buf[10] & 0x7f);
10273 f = base64_to_int (clean_input_buf[11] & 0x7f);
10274
10275 digest[1] = (((a << 12) | (b << 6) | (c)) << 16)
10276 | (((d << 12) | (e << 6) | (f)) << 0);
10277
10278 a = base64_to_int (clean_input_buf[12] & 0x7f);
10279 b = base64_to_int (clean_input_buf[13] & 0x7f);
10280 c = base64_to_int (clean_input_buf[14] & 0x7f);
10281 d = base64_to_int (clean_input_buf[15] & 0x7f);
10282 e = base64_to_int (clean_input_buf[16] & 0x7f);
10283 f = base64_to_int (clean_input_buf[17] & 0x7f);
10284
10285 digest[2] = (((a << 12) | (b << 6) | (c)) << 16)
10286 | (((d << 12) | (e << 6) | (f)) << 0);
10287
10288 a = base64_to_int (clean_input_buf[18] & 0x7f);
10289 b = base64_to_int (clean_input_buf[19] & 0x7f);
10290 c = base64_to_int (clean_input_buf[20] & 0x7f);
10291 d = base64_to_int (clean_input_buf[21] & 0x7f);
10292 e = base64_to_int (clean_input_buf[22] & 0x7f);
10293 f = base64_to_int (clean_input_buf[23] & 0x7f);
10294
10295 digest[3] = (((a << 12) | (b << 6) | (c)) << 16)
10296 | (((d << 12) | (e << 6) | (f)) << 0);
10297
10298 digest[0] = byte_swap_32 (digest[0]);
10299 digest[1] = byte_swap_32 (digest[1]);
10300 digest[2] = byte_swap_32 (digest[2]);
10301 digest[3] = byte_swap_32 (digest[3]);
10302
10303 digest[0] -= MD5M_A;
10304 digest[1] -= MD5M_B;
10305 digest[2] -= MD5M_C;
10306 digest[3] -= MD5M_D;
10307
10308 if (input_buf[30] != ':') return (PARSER_SEPARATOR_UNMATCHED);
10309
10310 uint salt_len = input_len - 30 - 1;
10311
10312 char *salt_buf = input_buf + 30 + 1;
10313
10314 char *salt_buf_ptr = (char *) salt->salt_buf;
10315
10316 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10317
10318 // max. salt length: 55 (max for MD5) - 22 (":Administration Tools:") - 1 (0x80) = 32
10319 // 32 - 4 bytes (to fit w0lr for all attack modes) = 28
10320
10321 if (salt_len > 28) return (PARSER_SALT_LENGTH);
10322
10323 salt->salt_len = salt_len;
10324
10325 memcpy (salt_buf_ptr + salt_len, ":Administration Tools:", 22);
10326
10327 salt->salt_len += 22;
10328
10329 return (PARSER_OK);
10330 }
10331
10332 int smf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10333 {
10334 if (data.opts_type & OPTS_TYPE_ST_HEX)
10335 {
10336 if ((input_len < DISPLAY_LEN_MIN_121H) || (input_len > DISPLAY_LEN_MAX_121H)) return (PARSER_GLOBAL_LENGTH);
10337 }
10338 else
10339 {
10340 if ((input_len < DISPLAY_LEN_MIN_121) || (input_len > DISPLAY_LEN_MAX_121)) return (PARSER_GLOBAL_LENGTH);
10341 }
10342
10343 u32 *digest = (u32 *) hash_buf->digest;
10344
10345 salt_t *salt = hash_buf->salt;
10346
10347 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10348 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10349 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10350 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10351 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
10352
10353 digest[0] -= SHA1M_A;
10354 digest[1] -= SHA1M_B;
10355 digest[2] -= SHA1M_C;
10356 digest[3] -= SHA1M_D;
10357 digest[4] -= SHA1M_E;
10358
10359 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10360
10361 uint salt_len = input_len - 40 - 1;
10362
10363 char *salt_buf = input_buf + 40 + 1;
10364
10365 char *salt_buf_ptr = (char *) salt->salt_buf;
10366
10367 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10368
10369 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10370
10371 salt->salt_len = salt_len;
10372
10373 return (PARSER_OK);
10374 }
10375
10376 int dcc2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10377 {
10378 if (data.opts_type & OPTS_TYPE_ST_HEX)
10379 {
10380 if ((input_len < DISPLAY_LEN_MIN_2100H) || (input_len > DISPLAY_LEN_MAX_2100H)) return (PARSER_GLOBAL_LENGTH);
10381 }
10382 else
10383 {
10384 if ((input_len < DISPLAY_LEN_MIN_2100) || (input_len > DISPLAY_LEN_MAX_2100)) return (PARSER_GLOBAL_LENGTH);
10385 }
10386
10387 if (memcmp (SIGNATURE_DCC2, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
10388
10389 char *iter_pos = input_buf + 6;
10390
10391 salt_t *salt = hash_buf->salt;
10392
10393 uint iter = atoi (iter_pos);
10394
10395 if (iter < 1)
10396 {
10397 iter = ROUNDS_DCC2;
10398 }
10399
10400 salt->salt_iter = iter - 1;
10401
10402 char *salt_pos = strchr (iter_pos, '#');
10403
10404 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10405
10406 salt_pos++;
10407
10408 char *digest_pos = strchr (salt_pos, '#');
10409
10410 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10411
10412 digest_pos++;
10413
10414 uint salt_len = digest_pos - salt_pos - 1;
10415
10416 u32 *digest = (u32 *) hash_buf->digest;
10417
10418 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
10419 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
10420 digest[2] = hex_to_u32 ((const u8 *) &digest_pos[16]);
10421 digest[3] = hex_to_u32 ((const u8 *) &digest_pos[24]);
10422
10423 char *salt_buf_ptr = (char *) salt->salt_buf;
10424
10425 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
10426
10427 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10428
10429 salt->salt_len = salt_len;
10430
10431 return (PARSER_OK);
10432 }
10433
10434 int wpa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10435 {
10436 u32 *digest = (u32 *) hash_buf->digest;
10437
10438 salt_t *salt = hash_buf->salt;
10439
10440 wpa_t *wpa = (wpa_t *) hash_buf->esalt;
10441
10442 hccap_t in;
10443
10444 memcpy (&in, input_buf, input_len);
10445
10446 if (in.eapol_size < 1 || in.eapol_size > 255) return (PARSER_HCCAP_EAPOL_SIZE);
10447
10448 memcpy (digest, in.keymic, 16);
10449
10450 /*
10451 http://www.one-net.eu/jsw/j_sec/m_ptype.html
10452 The phrase "Pairwise key expansion"
10453 Access Point Address (referred to as Authenticator Address AA)
10454 Supplicant Address (referred to as Supplicant Address SA)
10455 Access Point Nonce (referred to as Authenticator Anonce)
10456 Wireless Device Nonce (referred to as Supplicant Nonce Snonce)
10457 */
10458
10459 uint salt_len = strlen (in.essid);
10460
10461 if (salt_len > 36)
10462 {
10463 log_info ("WARNING: the length of the ESSID is too long. The hccap file may be invalid or corrupted");
10464
10465 return (PARSER_SALT_LENGTH);
10466 }
10467
10468 memcpy (salt->salt_buf, in.essid, salt_len);
10469
10470 salt->salt_len = salt_len;
10471
10472 salt->salt_iter = ROUNDS_WPA2 - 1;
10473
10474 unsigned char *pke_ptr = (unsigned char *) wpa->pke;
10475
10476 memcpy (pke_ptr, "Pairwise key expansion", 23);
10477
10478 if (memcmp (in.mac1, in.mac2, 6) < 0)
10479 {
10480 memcpy (pke_ptr + 23, in.mac1, 6);
10481 memcpy (pke_ptr + 29, in.mac2, 6);
10482 }
10483 else
10484 {
10485 memcpy (pke_ptr + 23, in.mac2, 6);
10486 memcpy (pke_ptr + 29, in.mac1, 6);
10487 }
10488
10489 if (memcmp (in.nonce1, in.nonce2, 32) < 0)
10490 {
10491 memcpy (pke_ptr + 35, in.nonce1, 32);
10492 memcpy (pke_ptr + 67, in.nonce2, 32);
10493 }
10494 else
10495 {
10496 memcpy (pke_ptr + 35, in.nonce2, 32);
10497 memcpy (pke_ptr + 67, in.nonce1, 32);
10498 }
10499
10500 for (int i = 0; i < 25; i++)
10501 {
10502 wpa->pke[i] = byte_swap_32 (wpa->pke[i]);
10503 }
10504
10505 memcpy (wpa->orig_mac1, in.mac1, 6);
10506 memcpy (wpa->orig_mac2, in.mac2, 6);
10507 memcpy (wpa->orig_nonce1, in.nonce1, 32);
10508 memcpy (wpa->orig_nonce2, in.nonce2, 32);
10509
10510 wpa->keyver = in.keyver;
10511
10512 if (wpa->keyver > 255)
10513 {
10514 log_info ("ATTENTION!");
10515 log_info (" The WPA/WPA2 key version in your .hccap file is invalid!");
10516 log_info (" This could be due to a recent aircrack-ng bug.");
10517 log_info (" The key version was automatically reset to a reasonable value.");
10518 log_info ("");
10519
10520 wpa->keyver &= 0xff;
10521 }
10522
10523 wpa->eapol_size = in.eapol_size;
10524
10525 unsigned char *eapol_ptr = (unsigned char *) wpa->eapol;
10526
10527 memcpy (eapol_ptr, in.eapol, wpa->eapol_size);
10528
10529 memset (eapol_ptr + wpa->eapol_size, 0, 256 - wpa->eapol_size);
10530
10531 eapol_ptr[wpa->eapol_size] = (unsigned char) 0x80;
10532
10533 if (wpa->keyver == 1)
10534 {
10535 // nothing to do
10536 }
10537 else
10538 {
10539 digest[0] = byte_swap_32 (digest[0]);
10540 digest[1] = byte_swap_32 (digest[1]);
10541 digest[2] = byte_swap_32 (digest[2]);
10542 digest[3] = byte_swap_32 (digest[3]);
10543
10544 for (int i = 0; i < 64; i++)
10545 {
10546 wpa->eapol[i] = byte_swap_32 (wpa->eapol[i]);
10547 }
10548 }
10549
10550 uint32_t *p0 = (uint32_t *) in.essid;
10551 uint32_t c0 = 0;
10552 uint32_t c1 = 0;
10553
10554 for (uint i = 0; i < sizeof (in.essid) / sizeof (uint32_t); i++) c0 ^= *p0++;
10555 for (uint i = 0; i < sizeof (wpa->pke) / sizeof (wpa->pke[0]); i++) c1 ^= wpa->pke[i];
10556
10557 salt->salt_buf[10] = c0;
10558 salt->salt_buf[11] = c1;
10559
10560 return (PARSER_OK);
10561 }
10562
10563 int psafe2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10564 {
10565 u32 *digest = (u32 *) hash_buf->digest;
10566
10567 salt_t *salt = hash_buf->salt;
10568
10569 if (input_len == 0)
10570 {
10571 log_error ("Password Safe v2 container not specified");
10572
10573 exit (-1);
10574 }
10575
10576 FILE *fp = fopen (input_buf, "rb");
10577
10578 if (fp == NULL)
10579 {
10580 log_error ("%s: %s", input_buf, strerror (errno));
10581
10582 exit (-1);
10583 }
10584
10585 psafe2_hdr buf;
10586
10587 memset (&buf, 0, sizeof (psafe2_hdr));
10588
10589 int n = fread (&buf, sizeof (psafe2_hdr), 1, fp);
10590
10591 fclose (fp);
10592
10593 if (n != 1) return (PARSER_PSAFE2_FILE_SIZE);
10594
10595 salt->salt_buf[0] = buf.random[0];
10596 salt->salt_buf[1] = buf.random[1];
10597
10598 salt->salt_len = 8;
10599 salt->salt_iter = 1000;
10600
10601 digest[0] = byte_swap_32 (buf.hash[0]);
10602 digest[1] = byte_swap_32 (buf.hash[1]);
10603 digest[2] = byte_swap_32 (buf.hash[2]);
10604 digest[3] = byte_swap_32 (buf.hash[3]);
10605 digest[4] = byte_swap_32 (buf.hash[4]);
10606
10607 return (PARSER_OK);
10608 }
10609
10610 int psafe3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10611 {
10612 u32 *digest = (u32 *) hash_buf->digest;
10613
10614 salt_t *salt = hash_buf->salt;
10615
10616 if (input_len == 0)
10617 {
10618 log_error (".psafe3 not specified");
10619
10620 exit (-1);
10621 }
10622
10623 FILE *fp = fopen (input_buf, "rb");
10624
10625 if (fp == NULL)
10626 {
10627 log_error ("%s: %s", input_buf, strerror (errno));
10628
10629 exit (-1);
10630 }
10631
10632 psafe3_t in;
10633
10634 int n = fread (&in, sizeof (psafe3_t), 1, fp);
10635
10636 fclose (fp);
10637
10638 data.hashfile = input_buf; // we will need this in case it gets cracked
10639
10640 if (memcmp (SIGNATURE_PSAFE3, in.signature, 4)) return (PARSER_SIGNATURE_UNMATCHED);
10641
10642 if (n != 1) return (PARSER_PSAFE3_FILE_SIZE);
10643
10644 salt->salt_iter = in.iterations + 1;
10645
10646 salt->salt_buf[0] = in.salt_buf[0];
10647 salt->salt_buf[1] = in.salt_buf[1];
10648 salt->salt_buf[2] = in.salt_buf[2];
10649 salt->salt_buf[3] = in.salt_buf[3];
10650 salt->salt_buf[4] = in.salt_buf[4];
10651 salt->salt_buf[5] = in.salt_buf[5];
10652 salt->salt_buf[6] = in.salt_buf[6];
10653 salt->salt_buf[7] = in.salt_buf[7];
10654
10655 salt->salt_len = 32;
10656
10657 digest[0] = in.hash_buf[0];
10658 digest[1] = in.hash_buf[1];
10659 digest[2] = in.hash_buf[2];
10660 digest[3] = in.hash_buf[3];
10661 digest[4] = in.hash_buf[4];
10662 digest[5] = in.hash_buf[5];
10663 digest[6] = in.hash_buf[6];
10664 digest[7] = in.hash_buf[7];
10665
10666 digest[0] = byte_swap_32 (digest[0]);
10667 digest[1] = byte_swap_32 (digest[1]);
10668 digest[2] = byte_swap_32 (digest[2]);
10669 digest[3] = byte_swap_32 (digest[3]);
10670 digest[4] = byte_swap_32 (digest[4]);
10671 digest[5] = byte_swap_32 (digest[5]);
10672 digest[6] = byte_swap_32 (digest[6]);
10673 digest[7] = byte_swap_32 (digest[7]);
10674
10675 return (PARSER_OK);
10676 }
10677
10678 int phpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10679 {
10680 if ((input_len < DISPLAY_LEN_MIN_400) || (input_len > DISPLAY_LEN_MAX_400)) return (PARSER_GLOBAL_LENGTH);
10681
10682 if ((memcmp (SIGNATURE_PHPASS1, input_buf, 3)) && (memcmp (SIGNATURE_PHPASS2, input_buf, 3))) return (PARSER_SIGNATURE_UNMATCHED);
10683
10684 u32 *digest = (u32 *) hash_buf->digest;
10685
10686 salt_t *salt = hash_buf->salt;
10687
10688 char *iter_pos = input_buf + 3;
10689
10690 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
10691
10692 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
10693
10694 memcpy ((char *) salt->salt_sign, input_buf, 4);
10695
10696 salt->salt_iter = salt_iter;
10697
10698 char *salt_pos = iter_pos + 1;
10699
10700 uint salt_len = 8;
10701
10702 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10703
10704 salt->salt_len = salt_len;
10705
10706 char *hash_pos = salt_pos + salt_len;
10707
10708 phpass_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10709
10710 return (PARSER_OK);
10711 }
10712
10713 int md5crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10714 {
10715 if (input_len < DISPLAY_LEN_MIN_500) return (PARSER_GLOBAL_LENGTH);
10716
10717 if (memcmp (SIGNATURE_MD5CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
10718
10719 u32 *digest = (u32 *) hash_buf->digest;
10720
10721 salt_t *salt = hash_buf->salt;
10722
10723 char *salt_pos = input_buf + 3;
10724
10725 uint iterations_len = 0;
10726
10727 if (memcmp (salt_pos, "rounds=", 7) == 0)
10728 {
10729 salt_pos += 7;
10730
10731 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10732
10733 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10734 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10735
10736 salt_pos[0] = 0x0;
10737
10738 salt->salt_iter = atoi (salt_pos - iterations_len);
10739
10740 salt_pos += 1;
10741
10742 iterations_len += 8;
10743 }
10744 else
10745 {
10746 salt->salt_iter = ROUNDS_MD5CRYPT;
10747 }
10748
10749 if (input_len > (DISPLAY_LEN_MAX_500 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
10750
10751 char *hash_pos = strchr (salt_pos, '$');
10752
10753 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10754
10755 uint salt_len = hash_pos - salt_pos;
10756
10757 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10758
10759 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10760
10761 salt->salt_len = salt_len;
10762
10763 hash_pos++;
10764
10765 uint hash_len = input_len - 3 - iterations_len - salt_len - 1;
10766
10767 if (hash_len != 22) return (PARSER_HASH_LENGTH);
10768
10769 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10770
10771 return (PARSER_OK);
10772 }
10773
10774 int md5apr1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10775 {
10776 if (memcmp (SIGNATURE_MD5APR1, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
10777
10778 u32 *digest = (u32 *) hash_buf->digest;
10779
10780 salt_t *salt = hash_buf->salt;
10781
10782 char *salt_pos = input_buf + 6;
10783
10784 uint iterations_len = 0;
10785
10786 if (memcmp (salt_pos, "rounds=", 7) == 0)
10787 {
10788 salt_pos += 7;
10789
10790 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10791
10792 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10793 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10794
10795 salt_pos[0] = 0x0;
10796
10797 salt->salt_iter = atoi (salt_pos - iterations_len);
10798
10799 salt_pos += 1;
10800
10801 iterations_len += 8;
10802 }
10803 else
10804 {
10805 salt->salt_iter = ROUNDS_MD5CRYPT;
10806 }
10807
10808 if ((input_len < DISPLAY_LEN_MIN_1600) || (input_len > DISPLAY_LEN_MAX_1600 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
10809
10810 char *hash_pos = strchr (salt_pos, '$');
10811
10812 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10813
10814 uint salt_len = hash_pos - salt_pos;
10815
10816 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10817
10818 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10819
10820 salt->salt_len = salt_len;
10821
10822 hash_pos++;
10823
10824 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10825
10826 return (PARSER_OK);
10827 }
10828
10829 int episerver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10830 {
10831 if ((input_len < DISPLAY_LEN_MIN_141) || (input_len > DISPLAY_LEN_MAX_141)) return (PARSER_GLOBAL_LENGTH);
10832
10833 if (memcmp (SIGNATURE_EPISERVER, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
10834
10835 u32 *digest = (u32 *) hash_buf->digest;
10836
10837 salt_t *salt = hash_buf->salt;
10838
10839 char *salt_pos = input_buf + 14;
10840
10841 char *hash_pos = strchr (salt_pos, '*');
10842
10843 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10844
10845 hash_pos++;
10846
10847 uint salt_len = hash_pos - salt_pos - 1;
10848
10849 char *salt_buf_ptr = (char *) salt->salt_buf;
10850
10851 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
10852
10853 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10854
10855 salt->salt_len = salt_len;
10856
10857 u8 tmp_buf[100] = { 0 };
10858
10859 base64_decode (base64_to_int, (const u8 *) hash_pos, 27, tmp_buf);
10860
10861 memcpy (digest, tmp_buf, 20);
10862
10863 digest[0] = byte_swap_32 (digest[0]);
10864 digest[1] = byte_swap_32 (digest[1]);
10865 digest[2] = byte_swap_32 (digest[2]);
10866 digest[3] = byte_swap_32 (digest[3]);
10867 digest[4] = byte_swap_32 (digest[4]);
10868
10869 digest[0] -= SHA1M_A;
10870 digest[1] -= SHA1M_B;
10871 digest[2] -= SHA1M_C;
10872 digest[3] -= SHA1M_D;
10873 digest[4] -= SHA1M_E;
10874
10875 return (PARSER_OK);
10876 }
10877
10878 int descrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10879 {
10880 if ((input_len < DISPLAY_LEN_MIN_1500) || (input_len > DISPLAY_LEN_MAX_1500)) return (PARSER_GLOBAL_LENGTH);
10881
10882 unsigned char c12 = itoa64_to_int (input_buf[12]);
10883
10884 if (c12 & 3) return (PARSER_HASH_VALUE);
10885
10886 u32 *digest = (u32 *) hash_buf->digest;
10887
10888 salt_t *salt = hash_buf->salt;
10889
10890 // for ascii_digest
10891 salt->salt_sign[0] = input_buf[0];
10892 salt->salt_sign[1] = input_buf[1];
10893
10894 salt->salt_buf[0] = itoa64_to_int (input_buf[0])
10895 | itoa64_to_int (input_buf[1]) << 6;
10896
10897 salt->salt_len = 2;
10898
10899 u8 tmp_buf[100] = { 0 };
10900
10901 base64_decode (itoa64_to_int, (const u8 *) input_buf + 2, 11, tmp_buf);
10902
10903 memcpy (digest, tmp_buf, 8);
10904
10905 uint tt;
10906
10907 IP (digest[0], digest[1], tt);
10908
10909 digest[2] = 0;
10910 digest[3] = 0;
10911
10912 return (PARSER_OK);
10913 }
10914
10915 int md4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10916 {
10917 if ((input_len < DISPLAY_LEN_MIN_900) || (input_len > DISPLAY_LEN_MAX_900)) return (PARSER_GLOBAL_LENGTH);
10918
10919 u32 *digest = (u32 *) hash_buf->digest;
10920
10921 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10922 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10923 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10924 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10925
10926 digest[0] = byte_swap_32 (digest[0]);
10927 digest[1] = byte_swap_32 (digest[1]);
10928 digest[2] = byte_swap_32 (digest[2]);
10929 digest[3] = byte_swap_32 (digest[3]);
10930
10931 digest[0] -= MD4M_A;
10932 digest[1] -= MD4M_B;
10933 digest[2] -= MD4M_C;
10934 digest[3] -= MD4M_D;
10935
10936 return (PARSER_OK);
10937 }
10938
10939 int md4s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10940 {
10941 if (data.opts_type & OPTS_TYPE_ST_HEX)
10942 {
10943 if ((input_len < DISPLAY_LEN_MIN_910H) || (input_len > DISPLAY_LEN_MAX_910H)) return (PARSER_GLOBAL_LENGTH);
10944 }
10945 else
10946 {
10947 if ((input_len < DISPLAY_LEN_MIN_910) || (input_len > DISPLAY_LEN_MAX_910)) return (PARSER_GLOBAL_LENGTH);
10948 }
10949
10950 u32 *digest = (u32 *) hash_buf->digest;
10951
10952 salt_t *salt = hash_buf->salt;
10953
10954 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10955 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10956 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10957 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10958
10959 digest[0] = byte_swap_32 (digest[0]);
10960 digest[1] = byte_swap_32 (digest[1]);
10961 digest[2] = byte_swap_32 (digest[2]);
10962 digest[3] = byte_swap_32 (digest[3]);
10963
10964 digest[0] -= MD4M_A;
10965 digest[1] -= MD4M_B;
10966 digest[2] -= MD4M_C;
10967 digest[3] -= MD4M_D;
10968
10969 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10970
10971 uint salt_len = input_len - 32 - 1;
10972
10973 char *salt_buf = input_buf + 32 + 1;
10974
10975 char *salt_buf_ptr = (char *) salt->salt_buf;
10976
10977 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10978
10979 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10980
10981 salt->salt_len = salt_len;
10982
10983 return (PARSER_OK);
10984 }
10985
10986 int md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10987 {
10988 if ((input_len < DISPLAY_LEN_MIN_0) || (input_len > DISPLAY_LEN_MAX_0)) return (PARSER_GLOBAL_LENGTH);
10989
10990 u32 *digest = (u32 *) hash_buf->digest;
10991
10992 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10993 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10994 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10995 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10996
10997 digest[0] = byte_swap_32 (digest[0]);
10998 digest[1] = byte_swap_32 (digest[1]);
10999 digest[2] = byte_swap_32 (digest[2]);
11000 digest[3] = byte_swap_32 (digest[3]);
11001
11002 digest[0] -= MD5M_A;
11003 digest[1] -= MD5M_B;
11004 digest[2] -= MD5M_C;
11005 digest[3] -= MD5M_D;
11006
11007 return (PARSER_OK);
11008 }
11009
11010 int md5half_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11011 {
11012 if ((input_len < DISPLAY_LEN_MIN_5100) || (input_len > DISPLAY_LEN_MAX_5100)) return (PARSER_GLOBAL_LENGTH);
11013
11014 u32 *digest = (u32 *) hash_buf->digest;
11015
11016 digest[0] = hex_to_u32 ((const u8 *) &input_buf[0]);
11017 digest[1] = hex_to_u32 ((const u8 *) &input_buf[8]);
11018 digest[2] = 0;
11019 digest[3] = 0;
11020
11021 digest[0] = byte_swap_32 (digest[0]);
11022 digest[1] = byte_swap_32 (digest[1]);
11023
11024 return (PARSER_OK);
11025 }
11026
11027 int md5s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11028 {
11029 if (data.opts_type & OPTS_TYPE_ST_HEX)
11030 {
11031 if ((input_len < DISPLAY_LEN_MIN_10H) || (input_len > DISPLAY_LEN_MAX_10H)) return (PARSER_GLOBAL_LENGTH);
11032 }
11033 else
11034 {
11035 if ((input_len < DISPLAY_LEN_MIN_10) || (input_len > DISPLAY_LEN_MAX_10)) return (PARSER_GLOBAL_LENGTH);
11036 }
11037
11038 u32 *digest = (u32 *) hash_buf->digest;
11039
11040 salt_t *salt = hash_buf->salt;
11041
11042 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11043 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11044 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11045 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11046
11047 digest[0] = byte_swap_32 (digest[0]);
11048 digest[1] = byte_swap_32 (digest[1]);
11049 digest[2] = byte_swap_32 (digest[2]);
11050 digest[3] = byte_swap_32 (digest[3]);
11051
11052 digest[0] -= MD5M_A;
11053 digest[1] -= MD5M_B;
11054 digest[2] -= MD5M_C;
11055 digest[3] -= MD5M_D;
11056
11057 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11058
11059 uint salt_len = input_len - 32 - 1;
11060
11061 char *salt_buf = input_buf + 32 + 1;
11062
11063 char *salt_buf_ptr = (char *) salt->salt_buf;
11064
11065 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11066
11067 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11068
11069 salt->salt_len = salt_len;
11070
11071 return (PARSER_OK);
11072 }
11073
11074 int md5pix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11075 {
11076 if ((input_len < DISPLAY_LEN_MIN_2400) || (input_len > DISPLAY_LEN_MAX_2400)) return (PARSER_GLOBAL_LENGTH);
11077
11078 u32 *digest = (u32 *) hash_buf->digest;
11079
11080 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
11081 | itoa64_to_int (input_buf[ 1]) << 6
11082 | itoa64_to_int (input_buf[ 2]) << 12
11083 | itoa64_to_int (input_buf[ 3]) << 18;
11084 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
11085 | itoa64_to_int (input_buf[ 5]) << 6
11086 | itoa64_to_int (input_buf[ 6]) << 12
11087 | itoa64_to_int (input_buf[ 7]) << 18;
11088 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
11089 | itoa64_to_int (input_buf[ 9]) << 6
11090 | itoa64_to_int (input_buf[10]) << 12
11091 | itoa64_to_int (input_buf[11]) << 18;
11092 digest[3] = itoa64_to_int (input_buf[12]) << 0
11093 | itoa64_to_int (input_buf[13]) << 6
11094 | itoa64_to_int (input_buf[14]) << 12
11095 | itoa64_to_int (input_buf[15]) << 18;
11096
11097 digest[0] -= MD5M_A;
11098 digest[1] -= MD5M_B;
11099 digest[2] -= MD5M_C;
11100 digest[3] -= MD5M_D;
11101
11102 digest[0] &= 0x00ffffff;
11103 digest[1] &= 0x00ffffff;
11104 digest[2] &= 0x00ffffff;
11105 digest[3] &= 0x00ffffff;
11106
11107 return (PARSER_OK);
11108 }
11109
11110 int md5asa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11111 {
11112 if (data.opts_type & OPTS_TYPE_ST_HEX)
11113 {
11114 if ((input_len < DISPLAY_LEN_MIN_2410H) || (input_len > DISPLAY_LEN_MAX_2410H)) return (PARSER_GLOBAL_LENGTH);
11115 }
11116 else
11117 {
11118 if ((input_len < DISPLAY_LEN_MIN_2410) || (input_len > DISPLAY_LEN_MAX_2410)) return (PARSER_GLOBAL_LENGTH);
11119 }
11120
11121 u32 *digest = (u32 *) hash_buf->digest;
11122
11123 salt_t *salt = hash_buf->salt;
11124
11125 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
11126 | itoa64_to_int (input_buf[ 1]) << 6
11127 | itoa64_to_int (input_buf[ 2]) << 12
11128 | itoa64_to_int (input_buf[ 3]) << 18;
11129 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
11130 | itoa64_to_int (input_buf[ 5]) << 6
11131 | itoa64_to_int (input_buf[ 6]) << 12
11132 | itoa64_to_int (input_buf[ 7]) << 18;
11133 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
11134 | itoa64_to_int (input_buf[ 9]) << 6
11135 | itoa64_to_int (input_buf[10]) << 12
11136 | itoa64_to_int (input_buf[11]) << 18;
11137 digest[3] = itoa64_to_int (input_buf[12]) << 0
11138 | itoa64_to_int (input_buf[13]) << 6
11139 | itoa64_to_int (input_buf[14]) << 12
11140 | itoa64_to_int (input_buf[15]) << 18;
11141
11142 digest[0] -= MD5M_A;
11143 digest[1] -= MD5M_B;
11144 digest[2] -= MD5M_C;
11145 digest[3] -= MD5M_D;
11146
11147 digest[0] &= 0x00ffffff;
11148 digest[1] &= 0x00ffffff;
11149 digest[2] &= 0x00ffffff;
11150 digest[3] &= 0x00ffffff;
11151
11152 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11153
11154 uint salt_len = input_len - 16 - 1;
11155
11156 char *salt_buf = input_buf + 16 + 1;
11157
11158 char *salt_buf_ptr = (char *) salt->salt_buf;
11159
11160 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11161
11162 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11163
11164 salt->salt_len = salt_len;
11165
11166 return (PARSER_OK);
11167 }
11168
11169 void transform_netntlmv1_key (const u8 *nthash, u8 *key)
11170 {
11171 key[0] = (nthash[0] >> 0);
11172 key[1] = (nthash[0] << 7) | (nthash[1] >> 1);
11173 key[2] = (nthash[1] << 6) | (nthash[2] >> 2);
11174 key[3] = (nthash[2] << 5) | (nthash[3] >> 3);
11175 key[4] = (nthash[3] << 4) | (nthash[4] >> 4);
11176 key[5] = (nthash[4] << 3) | (nthash[5] >> 5);
11177 key[6] = (nthash[5] << 2) | (nthash[6] >> 6);
11178 key[7] = (nthash[6] << 1);
11179
11180 key[0] |= 0x01;
11181 key[1] |= 0x01;
11182 key[2] |= 0x01;
11183 key[3] |= 0x01;
11184 key[4] |= 0x01;
11185 key[5] |= 0x01;
11186 key[6] |= 0x01;
11187 key[7] |= 0x01;
11188 }
11189
11190 int netntlmv1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11191 {
11192 if ((input_len < DISPLAY_LEN_MIN_5500) || (input_len > DISPLAY_LEN_MAX_5500)) return (PARSER_GLOBAL_LENGTH);
11193
11194 u32 *digest = (u32 *) hash_buf->digest;
11195
11196 salt_t *salt = hash_buf->salt;
11197
11198 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
11199
11200 /**
11201 * parse line
11202 */
11203
11204 char *user_pos = input_buf;
11205
11206 char *unused_pos = strchr (user_pos, ':');
11207
11208 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11209
11210 uint user_len = unused_pos - user_pos;
11211
11212 if (user_len > 60) return (PARSER_SALT_LENGTH);
11213
11214 unused_pos++;
11215
11216 char *domain_pos = strchr (unused_pos, ':');
11217
11218 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11219
11220 uint unused_len = domain_pos - unused_pos;
11221
11222 if (unused_len != 0) return (PARSER_SALT_LENGTH);
11223
11224 domain_pos++;
11225
11226 char *srvchall_pos = strchr (domain_pos, ':');
11227
11228 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11229
11230 uint domain_len = srvchall_pos - domain_pos;
11231
11232 if (domain_len > 45) return (PARSER_SALT_LENGTH);
11233
11234 srvchall_pos++;
11235
11236 char *hash_pos = strchr (srvchall_pos, ':');
11237
11238 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11239
11240 uint srvchall_len = hash_pos - srvchall_pos;
11241
11242 // if (srvchall_len != 0) return (PARSER_SALT_LENGTH);
11243
11244 hash_pos++;
11245
11246 char *clichall_pos = strchr (hash_pos, ':');
11247
11248 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11249
11250 uint hash_len = clichall_pos - hash_pos;
11251
11252 if (hash_len != 48) return (PARSER_HASH_LENGTH);
11253
11254 clichall_pos++;
11255
11256 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
11257
11258 if (clichall_len != 16) return (PARSER_SALT_LENGTH);
11259
11260 /**
11261 * store some data for later use
11262 */
11263
11264 netntlm->user_len = user_len * 2;
11265 netntlm->domain_len = domain_len * 2;
11266 netntlm->srvchall_len = srvchall_len / 2;
11267 netntlm->clichall_len = clichall_len / 2;
11268
11269 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
11270 char *chall_ptr = (char *) netntlm->chall_buf;
11271
11272 /**
11273 * handle username and domainname
11274 */
11275
11276 for (uint i = 0; i < user_len; i++)
11277 {
11278 *userdomain_ptr++ = user_pos[i];
11279 *userdomain_ptr++ = 0;
11280 }
11281
11282 for (uint i = 0; i < domain_len; i++)
11283 {
11284 *userdomain_ptr++ = domain_pos[i];
11285 *userdomain_ptr++ = 0;
11286 }
11287
11288 /**
11289 * handle server challenge encoding
11290 */
11291
11292 for (uint i = 0; i < srvchall_len; i += 2)
11293 {
11294 const char p0 = srvchall_pos[i + 0];
11295 const char p1 = srvchall_pos[i + 1];
11296
11297 *chall_ptr++ = hex_convert (p1) << 0
11298 | hex_convert (p0) << 4;
11299 }
11300
11301 /**
11302 * handle client challenge encoding
11303 */
11304
11305 for (uint i = 0; i < clichall_len; i += 2)
11306 {
11307 const char p0 = clichall_pos[i + 0];
11308 const char p1 = clichall_pos[i + 1];
11309
11310 *chall_ptr++ = hex_convert (p1) << 0
11311 | hex_convert (p0) << 4;
11312 }
11313
11314 /**
11315 * store data
11316 */
11317
11318 char *salt_buf_ptr = (char *) salt->salt_buf;
11319
11320 uint salt_len = parse_and_store_salt (salt_buf_ptr, clichall_pos, clichall_len);
11321
11322 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11323
11324 salt->salt_len = salt_len;
11325
11326 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11327 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11328 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11329 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11330
11331 digest[0] = byte_swap_32 (digest[0]);
11332 digest[1] = byte_swap_32 (digest[1]);
11333 digest[2] = byte_swap_32 (digest[2]);
11334 digest[3] = byte_swap_32 (digest[3]);
11335
11336 /* special case, last 8 byte do not need to be checked since they are brute-forced next */
11337
11338 uint digest_tmp[2] = { 0 };
11339
11340 digest_tmp[0] = hex_to_u32 ((const u8 *) &hash_pos[32]);
11341 digest_tmp[1] = hex_to_u32 ((const u8 *) &hash_pos[40]);
11342
11343 digest_tmp[0] = byte_swap_32 (digest_tmp[0]);
11344 digest_tmp[1] = byte_swap_32 (digest_tmp[1]);
11345
11346 /* special case 2: ESS */
11347
11348 if (srvchall_len == 48)
11349 {
11350 if ((netntlm->chall_buf[2] == 0) && (netntlm->chall_buf[3] == 0) && (netntlm->chall_buf[4] == 0) && (netntlm->chall_buf[5] == 0))
11351 {
11352 uint w[16] = { 0 };
11353
11354 w[ 0] = netntlm->chall_buf[6];
11355 w[ 1] = netntlm->chall_buf[7];
11356 w[ 2] = netntlm->chall_buf[0];
11357 w[ 3] = netntlm->chall_buf[1];
11358 w[ 4] = 0x80;
11359 w[14] = 16 * 8;
11360
11361 uint dgst[4] = { 0 };
11362
11363 dgst[0] = MAGIC_A;
11364 dgst[1] = MAGIC_B;
11365 dgst[2] = MAGIC_C;
11366 dgst[3] = MAGIC_D;
11367
11368 md5_64 (w, dgst);
11369
11370 salt->salt_buf[0] = dgst[0];
11371 salt->salt_buf[1] = dgst[1];
11372 }
11373 }
11374
11375 /* precompute netntlmv1 exploit start */
11376
11377 for (uint i = 0; i < 0x10000; i++)
11378 {
11379 uint key_md4[2] = { i, 0 };
11380 uint key_des[2] = { 0, 0 };
11381
11382 transform_netntlmv1_key ((u8 *) key_md4, (u8 *) key_des);
11383
11384 uint Kc[16] = { 0 };
11385 uint Kd[16] = { 0 };
11386
11387 _des_keysetup (key_des, Kc, Kd, c_skb);
11388
11389 uint data3[2] = { salt->salt_buf[0], salt->salt_buf[1] };
11390
11391 _des_encrypt (data3, Kc, Kd, c_SPtrans);
11392
11393 if (data3[0] != digest_tmp[0]) continue;
11394 if (data3[1] != digest_tmp[1]) continue;
11395
11396 salt->salt_buf[2] = i;
11397
11398 salt->salt_len = 24;
11399
11400 break;
11401 }
11402
11403 salt->salt_buf_pc[0] = digest_tmp[0];
11404 salt->salt_buf_pc[1] = digest_tmp[1];
11405
11406 /* precompute netntlmv1 exploit stop */
11407
11408 u32 tt;
11409
11410 IP (digest[0], digest[1], tt);
11411 IP (digest[2], digest[3], tt);
11412
11413 digest[0] = rotr32 (digest[0], 29);
11414 digest[1] = rotr32 (digest[1], 29);
11415 digest[2] = rotr32 (digest[2], 29);
11416 digest[3] = rotr32 (digest[3], 29);
11417
11418 IP (salt->salt_buf[0], salt->salt_buf[1], tt);
11419
11420 salt->salt_buf[0] = rotl32 (salt->salt_buf[0], 3);
11421 salt->salt_buf[1] = rotl32 (salt->salt_buf[1], 3);
11422
11423 return (PARSER_OK);
11424 }
11425
11426 int netntlmv2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11427 {
11428 if ((input_len < DISPLAY_LEN_MIN_5600) || (input_len > DISPLAY_LEN_MAX_5600)) return (PARSER_GLOBAL_LENGTH);
11429
11430 u32 *digest = (u32 *) hash_buf->digest;
11431
11432 salt_t *salt = hash_buf->salt;
11433
11434 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
11435
11436 /**
11437 * parse line
11438 */
11439
11440 char *user_pos = input_buf;
11441
11442 char *unused_pos = strchr (user_pos, ':');
11443
11444 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11445
11446 uint user_len = unused_pos - user_pos;
11447
11448 if (user_len > 60) return (PARSER_SALT_LENGTH);
11449
11450 unused_pos++;
11451
11452 char *domain_pos = strchr (unused_pos, ':');
11453
11454 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11455
11456 uint unused_len = domain_pos - unused_pos;
11457
11458 if (unused_len != 0) return (PARSER_SALT_LENGTH);
11459
11460 domain_pos++;
11461
11462 char *srvchall_pos = strchr (domain_pos, ':');
11463
11464 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11465
11466 uint domain_len = srvchall_pos - domain_pos;
11467
11468 if (domain_len > 45) return (PARSER_SALT_LENGTH);
11469
11470 srvchall_pos++;
11471
11472 char *hash_pos = strchr (srvchall_pos, ':');
11473
11474 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11475
11476 uint srvchall_len = hash_pos - srvchall_pos;
11477
11478 if (srvchall_len != 16) return (PARSER_SALT_LENGTH);
11479
11480 hash_pos++;
11481
11482 char *clichall_pos = strchr (hash_pos, ':');
11483
11484 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11485
11486 uint hash_len = clichall_pos - hash_pos;
11487
11488 if (hash_len != 32) return (PARSER_HASH_LENGTH);
11489
11490 clichall_pos++;
11491
11492 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
11493
11494 if (clichall_len > 1024) return (PARSER_SALT_LENGTH);
11495
11496 if (clichall_len % 2) return (PARSER_SALT_VALUE);
11497
11498 /**
11499 * store some data for later use
11500 */
11501
11502 netntlm->user_len = user_len * 2;
11503 netntlm->domain_len = domain_len * 2;
11504 netntlm->srvchall_len = srvchall_len / 2;
11505 netntlm->clichall_len = clichall_len / 2;
11506
11507 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
11508 char *chall_ptr = (char *) netntlm->chall_buf;
11509
11510 /**
11511 * handle username and domainname
11512 */
11513
11514 for (uint i = 0; i < user_len; i++)
11515 {
11516 *userdomain_ptr++ = toupper (user_pos[i]);
11517 *userdomain_ptr++ = 0;
11518 }
11519
11520 for (uint i = 0; i < domain_len; i++)
11521 {
11522 *userdomain_ptr++ = domain_pos[i];
11523 *userdomain_ptr++ = 0;
11524 }
11525
11526 *userdomain_ptr++ = 0x80;
11527
11528 /**
11529 * handle server challenge encoding
11530 */
11531
11532 for (uint i = 0; i < srvchall_len; i += 2)
11533 {
11534 const char p0 = srvchall_pos[i + 0];
11535 const char p1 = srvchall_pos[i + 1];
11536
11537 *chall_ptr++ = hex_convert (p1) << 0
11538 | hex_convert (p0) << 4;
11539 }
11540
11541 /**
11542 * handle client challenge encoding
11543 */
11544
11545 for (uint i = 0; i < clichall_len; i += 2)
11546 {
11547 const char p0 = clichall_pos[i + 0];
11548 const char p1 = clichall_pos[i + 1];
11549
11550 *chall_ptr++ = hex_convert (p1) << 0
11551 | hex_convert (p0) << 4;
11552 }
11553
11554 *chall_ptr++ = 0x80;
11555
11556 /**
11557 * handle hash itself
11558 */
11559
11560 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11561 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11562 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11563 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11564
11565 digest[0] = byte_swap_32 (digest[0]);
11566 digest[1] = byte_swap_32 (digest[1]);
11567 digest[2] = byte_swap_32 (digest[2]);
11568 digest[3] = byte_swap_32 (digest[3]);
11569
11570 /**
11571 * reuse challange data as salt_buf, its the buffer that is most likely unique
11572 */
11573
11574 salt->salt_buf[0] = 0;
11575 salt->salt_buf[1] = 0;
11576 salt->salt_buf[2] = 0;
11577 salt->salt_buf[3] = 0;
11578 salt->salt_buf[4] = 0;
11579 salt->salt_buf[5] = 0;
11580 salt->salt_buf[6] = 0;
11581 salt->salt_buf[7] = 0;
11582
11583 uint *uptr;
11584
11585 uptr = (uint *) netntlm->userdomain_buf;
11586
11587 for (uint i = 0; i < 16; i += 16)
11588 {
11589 md5_64 (uptr, salt->salt_buf);
11590 }
11591
11592 uptr = (uint *) netntlm->chall_buf;
11593
11594 for (uint i = 0; i < 256; i += 16)
11595 {
11596 md5_64 (uptr, salt->salt_buf);
11597 }
11598
11599 salt->salt_len = 16;
11600
11601 return (PARSER_OK);
11602 }
11603
11604 int joomla_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11605 {
11606 if (data.opts_type & OPTS_TYPE_ST_HEX)
11607 {
11608 if ((input_len < DISPLAY_LEN_MIN_11H) || (input_len > DISPLAY_LEN_MAX_11H)) return (PARSER_GLOBAL_LENGTH);
11609 }
11610 else
11611 {
11612 if ((input_len < DISPLAY_LEN_MIN_11) || (input_len > DISPLAY_LEN_MAX_11)) return (PARSER_GLOBAL_LENGTH);
11613 }
11614
11615 u32 *digest = (u32 *) hash_buf->digest;
11616
11617 salt_t *salt = hash_buf->salt;
11618
11619 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11620 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11621 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11622 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11623
11624 digest[0] = byte_swap_32 (digest[0]);
11625 digest[1] = byte_swap_32 (digest[1]);
11626 digest[2] = byte_swap_32 (digest[2]);
11627 digest[3] = byte_swap_32 (digest[3]);
11628
11629 digest[0] -= MD5M_A;
11630 digest[1] -= MD5M_B;
11631 digest[2] -= MD5M_C;
11632 digest[3] -= MD5M_D;
11633
11634 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11635
11636 uint salt_len = input_len - 32 - 1;
11637
11638 char *salt_buf = input_buf + 32 + 1;
11639
11640 char *salt_buf_ptr = (char *) salt->salt_buf;
11641
11642 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11643
11644 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11645
11646 salt->salt_len = salt_len;
11647
11648 return (PARSER_OK);
11649 }
11650
11651 int postgresql_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11652 {
11653 if (data.opts_type & OPTS_TYPE_ST_HEX)
11654 {
11655 if ((input_len < DISPLAY_LEN_MIN_12H) || (input_len > DISPLAY_LEN_MAX_12H)) return (PARSER_GLOBAL_LENGTH);
11656 }
11657 else
11658 {
11659 if ((input_len < DISPLAY_LEN_MIN_12) || (input_len > DISPLAY_LEN_MAX_12)) return (PARSER_GLOBAL_LENGTH);
11660 }
11661
11662 u32 *digest = (u32 *) hash_buf->digest;
11663
11664 salt_t *salt = hash_buf->salt;
11665
11666 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11667 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11668 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11669 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11670
11671 digest[0] = byte_swap_32 (digest[0]);
11672 digest[1] = byte_swap_32 (digest[1]);
11673 digest[2] = byte_swap_32 (digest[2]);
11674 digest[3] = byte_swap_32 (digest[3]);
11675
11676 digest[0] -= MD5M_A;
11677 digest[1] -= MD5M_B;
11678 digest[2] -= MD5M_C;
11679 digest[3] -= MD5M_D;
11680
11681 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11682
11683 uint salt_len = input_len - 32 - 1;
11684
11685 char *salt_buf = input_buf + 32 + 1;
11686
11687 char *salt_buf_ptr = (char *) salt->salt_buf;
11688
11689 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11690
11691 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11692
11693 salt->salt_len = salt_len;
11694
11695 return (PARSER_OK);
11696 }
11697
11698 int md5md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11699 {
11700 if ((input_len < DISPLAY_LEN_MIN_2600) || (input_len > DISPLAY_LEN_MAX_2600)) return (PARSER_GLOBAL_LENGTH);
11701
11702 u32 *digest = (u32 *) hash_buf->digest;
11703
11704 salt_t *salt = hash_buf->salt;
11705
11706 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11707 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11708 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11709 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11710
11711 digest[0] = byte_swap_32 (digest[0]);
11712 digest[1] = byte_swap_32 (digest[1]);
11713 digest[2] = byte_swap_32 (digest[2]);
11714 digest[3] = byte_swap_32 (digest[3]);
11715
11716 digest[0] -= MD5M_A;
11717 digest[1] -= MD5M_B;
11718 digest[2] -= MD5M_C;
11719 digest[3] -= MD5M_D;
11720
11721 /**
11722 * This is a virtual salt. While the algorithm is basically not salted
11723 * we can exploit the salt buffer to set the 0x80 and the w[14] value.
11724 * This way we can save a special md5md5 kernel and reuse the one from vbull.
11725 */
11726
11727 char *salt_buf_ptr = (char *) salt->salt_buf;
11728
11729 uint salt_len = parse_and_store_salt (salt_buf_ptr, (char *) "", 0);
11730
11731 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11732
11733 salt->salt_len = salt_len;
11734
11735 return (PARSER_OK);
11736 }
11737
11738 int vb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11739 {
11740 if (data.opts_type & OPTS_TYPE_ST_HEX)
11741 {
11742 if ((input_len < DISPLAY_LEN_MIN_2611H) || (input_len > DISPLAY_LEN_MAX_2611H)) return (PARSER_GLOBAL_LENGTH);
11743 }
11744 else
11745 {
11746 if ((input_len < DISPLAY_LEN_MIN_2611) || (input_len > DISPLAY_LEN_MAX_2611)) return (PARSER_GLOBAL_LENGTH);
11747 }
11748
11749 u32 *digest = (u32 *) hash_buf->digest;
11750
11751 salt_t *salt = hash_buf->salt;
11752
11753 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11754 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11755 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11756 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11757
11758 digest[0] = byte_swap_32 (digest[0]);
11759 digest[1] = byte_swap_32 (digest[1]);
11760 digest[2] = byte_swap_32 (digest[2]);
11761 digest[3] = byte_swap_32 (digest[3]);
11762
11763 digest[0] -= MD5M_A;
11764 digest[1] -= MD5M_B;
11765 digest[2] -= MD5M_C;
11766 digest[3] -= MD5M_D;
11767
11768 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11769
11770 uint salt_len = input_len - 32 - 1;
11771
11772 char *salt_buf = input_buf + 32 + 1;
11773
11774 char *salt_buf_ptr = (char *) salt->salt_buf;
11775
11776 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11777
11778 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11779
11780 salt->salt_len = salt_len;
11781
11782 return (PARSER_OK);
11783 }
11784
11785 int vb30_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11786 {
11787 if (data.opts_type & OPTS_TYPE_ST_HEX)
11788 {
11789 if ((input_len < DISPLAY_LEN_MIN_2711H) || (input_len > DISPLAY_LEN_MAX_2711H)) return (PARSER_GLOBAL_LENGTH);
11790 }
11791 else
11792 {
11793 if ((input_len < DISPLAY_LEN_MIN_2711) || (input_len > DISPLAY_LEN_MAX_2711)) return (PARSER_GLOBAL_LENGTH);
11794 }
11795
11796 u32 *digest = (u32 *) hash_buf->digest;
11797
11798 salt_t *salt = hash_buf->salt;
11799
11800 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11801 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11802 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11803 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11804
11805 digest[0] = byte_swap_32 (digest[0]);
11806 digest[1] = byte_swap_32 (digest[1]);
11807 digest[2] = byte_swap_32 (digest[2]);
11808 digest[3] = byte_swap_32 (digest[3]);
11809
11810 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11811
11812 uint salt_len = input_len - 32 - 1;
11813
11814 char *salt_buf = input_buf + 32 + 1;
11815
11816 char *salt_buf_ptr = (char *) salt->salt_buf;
11817
11818 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11819
11820 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11821
11822 salt->salt_len = salt_len;
11823
11824 return (PARSER_OK);
11825 }
11826
11827 int dcc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11828 {
11829 if (data.opts_type & OPTS_TYPE_ST_HEX)
11830 {
11831 if ((input_len < DISPLAY_LEN_MIN_1100H) || (input_len > DISPLAY_LEN_MAX_1100H)) return (PARSER_GLOBAL_LENGTH);
11832 }
11833 else
11834 {
11835 if ((input_len < DISPLAY_LEN_MIN_1100) || (input_len > DISPLAY_LEN_MAX_1100)) return (PARSER_GLOBAL_LENGTH);
11836 }
11837
11838 u32 *digest = (u32 *) hash_buf->digest;
11839
11840 salt_t *salt = hash_buf->salt;
11841
11842 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11843 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11844 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11845 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11846
11847 digest[0] = byte_swap_32 (digest[0]);
11848 digest[1] = byte_swap_32 (digest[1]);
11849 digest[2] = byte_swap_32 (digest[2]);
11850 digest[3] = byte_swap_32 (digest[3]);
11851
11852 digest[0] -= MD4M_A;
11853 digest[1] -= MD4M_B;
11854 digest[2] -= MD4M_C;
11855 digest[3] -= MD4M_D;
11856
11857 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11858
11859 uint salt_len = input_len - 32 - 1;
11860
11861 char *salt_buf = input_buf + 32 + 1;
11862
11863 char *salt_buf_ptr = (char *) salt->salt_buf;
11864
11865 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11866
11867 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11868
11869 salt->salt_len = salt_len;
11870
11871 return (PARSER_OK);
11872 }
11873
11874 int ipb2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11875 {
11876 if (data.opts_type & OPTS_TYPE_ST_HEX)
11877 {
11878 if ((input_len < DISPLAY_LEN_MIN_2811H) || (input_len > DISPLAY_LEN_MAX_2811H)) return (PARSER_GLOBAL_LENGTH);
11879 }
11880 else
11881 {
11882 if ((input_len < DISPLAY_LEN_MIN_2811) || (input_len > DISPLAY_LEN_MAX_2811)) return (PARSER_GLOBAL_LENGTH);
11883 }
11884
11885 u32 *digest = (u32 *) hash_buf->digest;
11886
11887 salt_t *salt = hash_buf->salt;
11888
11889 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11890 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11891 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11892 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11893
11894 digest[0] = byte_swap_32 (digest[0]);
11895 digest[1] = byte_swap_32 (digest[1]);
11896 digest[2] = byte_swap_32 (digest[2]);
11897 digest[3] = byte_swap_32 (digest[3]);
11898
11899 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11900
11901 uint salt_len = input_len - 32 - 1;
11902
11903 char *salt_buf = input_buf + 32 + 1;
11904
11905 uint salt_pc_block[16] = { 0 };
11906
11907 char *salt_pc_block_ptr = (char *) salt_pc_block;
11908
11909 salt_len = parse_and_store_salt (salt_pc_block_ptr, salt_buf, salt_len);
11910
11911 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11912
11913 salt_pc_block_ptr[salt_len] = (unsigned char) 0x80;
11914
11915 salt_pc_block[14] = salt_len * 8;
11916
11917 uint salt_pc_digest[4] = { MAGIC_A, MAGIC_B, MAGIC_C, MAGIC_D };
11918
11919 md5_64 (salt_pc_block, salt_pc_digest);
11920
11921 salt_pc_digest[0] = byte_swap_32 (salt_pc_digest[0]);
11922 salt_pc_digest[1] = byte_swap_32 (salt_pc_digest[1]);
11923 salt_pc_digest[2] = byte_swap_32 (salt_pc_digest[2]);
11924 salt_pc_digest[3] = byte_swap_32 (salt_pc_digest[3]);
11925
11926 u8 *salt_buf_ptr = (u8 *) salt->salt_buf;
11927
11928 memcpy (salt_buf_ptr, salt_buf, salt_len);
11929
11930 u8 *salt_buf_pc_ptr = (u8 *) salt->salt_buf_pc;
11931
11932 bin_to_hex_lower (salt_pc_digest[0], salt_buf_pc_ptr + 0);
11933 bin_to_hex_lower (salt_pc_digest[1], salt_buf_pc_ptr + 8);
11934 bin_to_hex_lower (salt_pc_digest[2], salt_buf_pc_ptr + 16);
11935 bin_to_hex_lower (salt_pc_digest[3], salt_buf_pc_ptr + 24);
11936
11937 salt->salt_len = 32; // changed, was salt_len before -- was a bug? 32 should be correct
11938
11939 return (PARSER_OK);
11940 }
11941
11942 int sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11943 {
11944 if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH);
11945
11946 u32 *digest = (u32 *) hash_buf->digest;
11947
11948 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11949 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11950 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11951 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11952 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11953
11954 digest[0] -= SHA1M_A;
11955 digest[1] -= SHA1M_B;
11956 digest[2] -= SHA1M_C;
11957 digest[3] -= SHA1M_D;
11958 digest[4] -= SHA1M_E;
11959
11960 return (PARSER_OK);
11961 }
11962
11963 int sha1linkedin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11964 {
11965 if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH);
11966
11967 u32 *digest = (u32 *) hash_buf->digest;
11968
11969 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11970 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11971 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11972 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11973 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11974
11975 return (PARSER_OK);
11976 }
11977
11978 int sha1axcrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11979 {
11980 if ((input_len < DISPLAY_LEN_MIN_13300) || (input_len > DISPLAY_LEN_MAX_13300)) return (PARSER_GLOBAL_LENGTH);
11981
11982 if (memcmp (SIGNATURE_AXCRYPT_SHA1, input_buf, 13)) return (PARSER_SIGNATURE_UNMATCHED);
11983
11984 u32 *digest = (u32 *) hash_buf->digest;
11985
11986 input_buf +=14;
11987
11988 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11989 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11990 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11991 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11992 digest[4] = 0x00000000;
11993
11994 return (PARSER_OK);
11995 }
11996
11997 int sha1s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11998 {
11999 if (data.opts_type & OPTS_TYPE_ST_HEX)
12000 {
12001 if ((input_len < DISPLAY_LEN_MIN_110H) || (input_len > DISPLAY_LEN_MAX_110H)) return (PARSER_GLOBAL_LENGTH);
12002 }
12003 else
12004 {
12005 if ((input_len < DISPLAY_LEN_MIN_110) || (input_len > DISPLAY_LEN_MAX_110)) return (PARSER_GLOBAL_LENGTH);
12006 }
12007
12008 u32 *digest = (u32 *) hash_buf->digest;
12009
12010 salt_t *salt = hash_buf->salt;
12011
12012 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12013 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12014 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12015 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12016 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12017
12018 digest[0] -= SHA1M_A;
12019 digest[1] -= SHA1M_B;
12020 digest[2] -= SHA1M_C;
12021 digest[3] -= SHA1M_D;
12022 digest[4] -= SHA1M_E;
12023
12024 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12025
12026 uint salt_len = input_len - 40 - 1;
12027
12028 char *salt_buf = input_buf + 40 + 1;
12029
12030 char *salt_buf_ptr = (char *) salt->salt_buf;
12031
12032 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12033
12034 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12035
12036 salt->salt_len = salt_len;
12037
12038 return (PARSER_OK);
12039 }
12040
12041 int pstoken_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12042 {
12043 if ((input_len < DISPLAY_LEN_MIN_13500) || (input_len > DISPLAY_LEN_MAX_13500)) return (PARSER_GLOBAL_LENGTH);
12044
12045 u32 *digest = (u32 *) hash_buf->digest;
12046
12047 salt_t *salt = hash_buf->salt;
12048
12049 pstoken_t *pstoken = (pstoken_t *) hash_buf->esalt;
12050
12051 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12052 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12053 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12054 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12055 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12056
12057 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12058
12059 uint salt_len = input_len - 40 - 1;
12060
12061 char *salt_buf = input_buf + 40 + 1;
12062
12063 if (salt_len == UINT_MAX || salt_len % 2 != 0) return (PARSER_SALT_LENGTH);
12064
12065 u8 *pstoken_ptr = (u8 *) pstoken->salt_buf;
12066
12067 for (uint i = 0, j = 0; i < salt_len; i += 2, j += 1)
12068 {
12069 pstoken_ptr[j] = hex_to_u8 ((const u8 *) &salt_buf[i]);
12070 }
12071
12072 pstoken->salt_len = salt_len / 2;
12073
12074 /* some fake salt for the sorting mechanisms */
12075
12076 salt->salt_buf[0] = pstoken->salt_buf[0];
12077 salt->salt_buf[1] = pstoken->salt_buf[1];
12078 salt->salt_buf[2] = pstoken->salt_buf[2];
12079 salt->salt_buf[3] = pstoken->salt_buf[3];
12080 salt->salt_buf[4] = pstoken->salt_buf[4];
12081 salt->salt_buf[5] = pstoken->salt_buf[5];
12082 salt->salt_buf[6] = pstoken->salt_buf[6];
12083 salt->salt_buf[7] = pstoken->salt_buf[7];
12084
12085 salt->salt_len = 32;
12086
12087 /* we need to check if we can precompute some of the data --
12088 this is possible since the scheme is badly designed */
12089
12090 pstoken->pc_digest[0] = SHA1M_A;
12091 pstoken->pc_digest[1] = SHA1M_B;
12092 pstoken->pc_digest[2] = SHA1M_C;
12093 pstoken->pc_digest[3] = SHA1M_D;
12094 pstoken->pc_digest[4] = SHA1M_E;
12095
12096 pstoken->pc_offset = 0;
12097
12098 for (int i = 0; i < (int) pstoken->salt_len - 64; i += 64)
12099 {
12100 uint w[16];
12101
12102 w[ 0] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 0]);
12103 w[ 1] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 1]);
12104 w[ 2] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 2]);
12105 w[ 3] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 3]);
12106 w[ 4] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 4]);
12107 w[ 5] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 5]);
12108 w[ 6] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 6]);
12109 w[ 7] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 7]);
12110 w[ 8] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 8]);
12111 w[ 9] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 9]);
12112 w[10] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 10]);
12113 w[11] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 11]);
12114 w[12] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 12]);
12115 w[13] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 13]);
12116 w[14] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 14]);
12117 w[15] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 15]);
12118
12119 sha1_64 (w, pstoken->pc_digest);
12120
12121 pstoken->pc_offset += 16;
12122 }
12123
12124 return (PARSER_OK);
12125 }
12126
12127 int sha1b64_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12128 {
12129 if ((input_len < DISPLAY_LEN_MIN_101) || (input_len > DISPLAY_LEN_MAX_101)) return (PARSER_GLOBAL_LENGTH);
12130
12131 if (memcmp (SIGNATURE_SHA1B64, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
12132
12133 u32 *digest = (u32 *) hash_buf->digest;
12134
12135 u8 tmp_buf[100] = { 0 };
12136
12137 base64_decode (base64_to_int, (const u8 *) input_buf + 5, input_len - 5, tmp_buf);
12138
12139 memcpy (digest, tmp_buf, 20);
12140
12141 digest[0] = byte_swap_32 (digest[0]);
12142 digest[1] = byte_swap_32 (digest[1]);
12143 digest[2] = byte_swap_32 (digest[2]);
12144 digest[3] = byte_swap_32 (digest[3]);
12145 digest[4] = byte_swap_32 (digest[4]);
12146
12147 digest[0] -= SHA1M_A;
12148 digest[1] -= SHA1M_B;
12149 digest[2] -= SHA1M_C;
12150 digest[3] -= SHA1M_D;
12151 digest[4] -= SHA1M_E;
12152
12153 return (PARSER_OK);
12154 }
12155
12156 int sha1b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12157 {
12158 if ((input_len < DISPLAY_LEN_MIN_111) || (input_len > DISPLAY_LEN_MAX_111)) return (PARSER_GLOBAL_LENGTH);
12159
12160 if (memcmp (SIGNATURE_SSHA1B64_lower, input_buf, 6) && memcmp (SIGNATURE_SSHA1B64_upper, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
12161
12162 u32 *digest = (u32 *) hash_buf->digest;
12163
12164 salt_t *salt = hash_buf->salt;
12165
12166 u8 tmp_buf[100] = { 0 };
12167
12168 int tmp_len = base64_decode (base64_to_int, (const u8 *) input_buf + 6, input_len - 6, tmp_buf);
12169
12170 if (tmp_len < 20) return (PARSER_HASH_LENGTH);
12171
12172 memcpy (digest, tmp_buf, 20);
12173
12174 int salt_len = tmp_len - 20;
12175
12176 if (salt_len < 0) return (PARSER_SALT_LENGTH);
12177
12178 salt->salt_len = salt_len;
12179
12180 memcpy (salt->salt_buf, tmp_buf + 20, salt->salt_len);
12181
12182 if (data.opts_type & OPTS_TYPE_ST_ADD80)
12183 {
12184 char *ptr = (char *) salt->salt_buf;
12185
12186 ptr[salt->salt_len] = 0x80;
12187 }
12188
12189 digest[0] = byte_swap_32 (digest[0]);
12190 digest[1] = byte_swap_32 (digest[1]);
12191 digest[2] = byte_swap_32 (digest[2]);
12192 digest[3] = byte_swap_32 (digest[3]);
12193 digest[4] = byte_swap_32 (digest[4]);
12194
12195 digest[0] -= SHA1M_A;
12196 digest[1] -= SHA1M_B;
12197 digest[2] -= SHA1M_C;
12198 digest[3] -= SHA1M_D;
12199 digest[4] -= SHA1M_E;
12200
12201 return (PARSER_OK);
12202 }
12203
12204 int mssql2000_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12205 {
12206 if ((input_len < DISPLAY_LEN_MIN_131) || (input_len > DISPLAY_LEN_MAX_131)) return (PARSER_GLOBAL_LENGTH);
12207
12208 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
12209
12210 u32 *digest = (u32 *) hash_buf->digest;
12211
12212 salt_t *salt = hash_buf->salt;
12213
12214 char *salt_buf = input_buf + 6;
12215
12216 uint salt_len = 8;
12217
12218 char *salt_buf_ptr = (char *) salt->salt_buf;
12219
12220 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12221
12222 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12223
12224 salt->salt_len = salt_len;
12225
12226 char *hash_pos = input_buf + 6 + 8 + 40;
12227
12228 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
12229 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
12230 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
12231 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
12232 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
12233
12234 digest[0] -= SHA1M_A;
12235 digest[1] -= SHA1M_B;
12236 digest[2] -= SHA1M_C;
12237 digest[3] -= SHA1M_D;
12238 digest[4] -= SHA1M_E;
12239
12240 return (PARSER_OK);
12241 }
12242
12243 int mssql2005_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12244 {
12245 if ((input_len < DISPLAY_LEN_MIN_132) || (input_len > DISPLAY_LEN_MAX_132)) return (PARSER_GLOBAL_LENGTH);
12246
12247 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
12248
12249 u32 *digest = (u32 *) hash_buf->digest;
12250
12251 salt_t *salt = hash_buf->salt;
12252
12253 char *salt_buf = input_buf + 6;
12254
12255 uint salt_len = 8;
12256
12257 char *salt_buf_ptr = (char *) salt->salt_buf;
12258
12259 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12260
12261 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12262
12263 salt->salt_len = salt_len;
12264
12265 char *hash_pos = input_buf + 6 + 8;
12266
12267 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
12268 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
12269 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
12270 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
12271 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
12272
12273 digest[0] -= SHA1M_A;
12274 digest[1] -= SHA1M_B;
12275 digest[2] -= SHA1M_C;
12276 digest[3] -= SHA1M_D;
12277 digest[4] -= SHA1M_E;
12278
12279 return (PARSER_OK);
12280 }
12281
12282 int mssql2012_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12283 {
12284 if ((input_len < DISPLAY_LEN_MIN_1731) || (input_len > DISPLAY_LEN_MAX_1731)) return (PARSER_GLOBAL_LENGTH);
12285
12286 if (memcmp (SIGNATURE_MSSQL2012, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
12287
12288 u64 *digest = (u64 *) hash_buf->digest;
12289
12290 salt_t *salt = hash_buf->salt;
12291
12292 char *salt_buf = input_buf + 6;
12293
12294 uint salt_len = 8;
12295
12296 char *salt_buf_ptr = (char *) salt->salt_buf;
12297
12298 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12299
12300 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12301
12302 salt->salt_len = salt_len;
12303
12304 char *hash_pos = input_buf + 6 + 8;
12305
12306 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
12307 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
12308 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
12309 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
12310 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
12311 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
12312 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
12313 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
12314
12315 digest[0] -= SHA512M_A;
12316 digest[1] -= SHA512M_B;
12317 digest[2] -= SHA512M_C;
12318 digest[3] -= SHA512M_D;
12319 digest[4] -= SHA512M_E;
12320 digest[5] -= SHA512M_F;
12321 digest[6] -= SHA512M_G;
12322 digest[7] -= SHA512M_H;
12323
12324 return (PARSER_OK);
12325 }
12326
12327 int oracleh_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12328 {
12329 if (data.opts_type & OPTS_TYPE_ST_HEX)
12330 {
12331 if ((input_len < DISPLAY_LEN_MIN_3100H) || (input_len > DISPLAY_LEN_MAX_3100H)) return (PARSER_GLOBAL_LENGTH);
12332 }
12333 else
12334 {
12335 if ((input_len < DISPLAY_LEN_MIN_3100) || (input_len > DISPLAY_LEN_MAX_3100)) return (PARSER_GLOBAL_LENGTH);
12336 }
12337
12338 u32 *digest = (u32 *) hash_buf->digest;
12339
12340 salt_t *salt = hash_buf->salt;
12341
12342 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12343 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12344 digest[2] = 0;
12345 digest[3] = 0;
12346
12347 digest[0] = byte_swap_32 (digest[0]);
12348 digest[1] = byte_swap_32 (digest[1]);
12349
12350 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12351
12352 uint salt_len = input_len - 16 - 1;
12353
12354 char *salt_buf = input_buf + 16 + 1;
12355
12356 char *salt_buf_ptr = (char *) salt->salt_buf;
12357
12358 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12359
12360 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12361
12362 salt->salt_len = salt_len;
12363
12364 return (PARSER_OK);
12365 }
12366
12367 int oracles_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12368 {
12369 if ((input_len < DISPLAY_LEN_MIN_112) || (input_len > DISPLAY_LEN_MAX_112)) return (PARSER_GLOBAL_LENGTH);
12370
12371 u32 *digest = (u32 *) hash_buf->digest;
12372
12373 salt_t *salt = hash_buf->salt;
12374
12375 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12376 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12377 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12378 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12379 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12380
12381 digest[0] -= SHA1M_A;
12382 digest[1] -= SHA1M_B;
12383 digest[2] -= SHA1M_C;
12384 digest[3] -= SHA1M_D;
12385 digest[4] -= SHA1M_E;
12386
12387 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12388
12389 uint salt_len = input_len - 40 - 1;
12390
12391 char *salt_buf = input_buf + 40 + 1;
12392
12393 char *salt_buf_ptr = (char *) salt->salt_buf;
12394
12395 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12396
12397 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12398
12399 salt->salt_len = salt_len;
12400
12401 return (PARSER_OK);
12402 }
12403
12404 int oraclet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12405 {
12406 if ((input_len < DISPLAY_LEN_MIN_12300) || (input_len > DISPLAY_LEN_MAX_12300)) return (PARSER_GLOBAL_LENGTH);
12407
12408 u32 *digest = (u32 *) hash_buf->digest;
12409
12410 salt_t *salt = hash_buf->salt;
12411
12412 char *hash_pos = input_buf;
12413
12414 digest[ 0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
12415 digest[ 1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
12416 digest[ 2] = hex_to_u32 ((const u8 *) &hash_pos[ 16]);
12417 digest[ 3] = hex_to_u32 ((const u8 *) &hash_pos[ 24]);
12418 digest[ 4] = hex_to_u32 ((const u8 *) &hash_pos[ 32]);
12419 digest[ 5] = hex_to_u32 ((const u8 *) &hash_pos[ 40]);
12420 digest[ 6] = hex_to_u32 ((const u8 *) &hash_pos[ 48]);
12421 digest[ 7] = hex_to_u32 ((const u8 *) &hash_pos[ 56]);
12422 digest[ 8] = hex_to_u32 ((const u8 *) &hash_pos[ 64]);
12423 digest[ 9] = hex_to_u32 ((const u8 *) &hash_pos[ 72]);
12424 digest[10] = hex_to_u32 ((const u8 *) &hash_pos[ 80]);
12425 digest[11] = hex_to_u32 ((const u8 *) &hash_pos[ 88]);
12426 digest[12] = hex_to_u32 ((const u8 *) &hash_pos[ 96]);
12427 digest[13] = hex_to_u32 ((const u8 *) &hash_pos[104]);
12428 digest[14] = hex_to_u32 ((const u8 *) &hash_pos[112]);
12429 digest[15] = hex_to_u32 ((const u8 *) &hash_pos[120]);
12430
12431 char *salt_pos = input_buf + 128;
12432
12433 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
12434 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
12435 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
12436 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
12437
12438 salt->salt_iter = ROUNDS_ORACLET - 1;
12439 salt->salt_len = 16;
12440
12441 return (PARSER_OK);
12442 }
12443
12444 int sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12445 {
12446 if ((input_len < DISPLAY_LEN_MIN_1400) || (input_len > DISPLAY_LEN_MAX_1400)) return (PARSER_GLOBAL_LENGTH);
12447
12448 u32 *digest = (u32 *) hash_buf->digest;
12449
12450 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12451 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12452 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12453 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12454 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12455 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
12456 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
12457 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
12458
12459 digest[0] -= SHA256M_A;
12460 digest[1] -= SHA256M_B;
12461 digest[2] -= SHA256M_C;
12462 digest[3] -= SHA256M_D;
12463 digest[4] -= SHA256M_E;
12464 digest[5] -= SHA256M_F;
12465 digest[6] -= SHA256M_G;
12466 digest[7] -= SHA256M_H;
12467
12468 return (PARSER_OK);
12469 }
12470
12471 int sha256s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12472 {
12473 if (data.opts_type & OPTS_TYPE_ST_HEX)
12474 {
12475 if ((input_len < DISPLAY_LEN_MIN_1410H) || (input_len > DISPLAY_LEN_MAX_1410H)) return (PARSER_GLOBAL_LENGTH);
12476 }
12477 else
12478 {
12479 if ((input_len < DISPLAY_LEN_MIN_1410) || (input_len > DISPLAY_LEN_MAX_1410)) return (PARSER_GLOBAL_LENGTH);
12480 }
12481
12482 u32 *digest = (u32 *) hash_buf->digest;
12483
12484 salt_t *salt = hash_buf->salt;
12485
12486 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12487 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12488 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12489 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12490 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12491 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
12492 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
12493 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
12494
12495 digest[0] -= SHA256M_A;
12496 digest[1] -= SHA256M_B;
12497 digest[2] -= SHA256M_C;
12498 digest[3] -= SHA256M_D;
12499 digest[4] -= SHA256M_E;
12500 digest[5] -= SHA256M_F;
12501 digest[6] -= SHA256M_G;
12502 digest[7] -= SHA256M_H;
12503
12504 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12505
12506 uint salt_len = input_len - 64 - 1;
12507
12508 char *salt_buf = input_buf + 64 + 1;
12509
12510 char *salt_buf_ptr = (char *) salt->salt_buf;
12511
12512 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12513
12514 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12515
12516 salt->salt_len = salt_len;
12517
12518 return (PARSER_OK);
12519 }
12520
12521 int sha384_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12522 {
12523 if ((input_len < DISPLAY_LEN_MIN_10800) || (input_len > DISPLAY_LEN_MAX_10800)) return (PARSER_GLOBAL_LENGTH);
12524
12525 u64 *digest = (u64 *) hash_buf->digest;
12526
12527 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
12528 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
12529 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
12530 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
12531 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
12532 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
12533 digest[6] = 0;
12534 digest[7] = 0;
12535
12536 digest[0] -= SHA384M_A;
12537 digest[1] -= SHA384M_B;
12538 digest[2] -= SHA384M_C;
12539 digest[3] -= SHA384M_D;
12540 digest[4] -= SHA384M_E;
12541 digest[5] -= SHA384M_F;
12542 digest[6] -= 0;
12543 digest[7] -= 0;
12544
12545 return (PARSER_OK);
12546 }
12547
12548 int sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12549 {
12550 if ((input_len < DISPLAY_LEN_MIN_1700) || (input_len > DISPLAY_LEN_MAX_1700)) return (PARSER_GLOBAL_LENGTH);
12551
12552 u64 *digest = (u64 *) hash_buf->digest;
12553
12554 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
12555 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
12556 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
12557 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
12558 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
12559 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
12560 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
12561 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
12562
12563 digest[0] -= SHA512M_A;
12564 digest[1] -= SHA512M_B;
12565 digest[2] -= SHA512M_C;
12566 digest[3] -= SHA512M_D;
12567 digest[4] -= SHA512M_E;
12568 digest[5] -= SHA512M_F;
12569 digest[6] -= SHA512M_G;
12570 digest[7] -= SHA512M_H;
12571
12572 return (PARSER_OK);
12573 }
12574
12575 int sha512s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12576 {
12577 if (data.opts_type & OPTS_TYPE_ST_HEX)
12578 {
12579 if ((input_len < DISPLAY_LEN_MIN_1710H) || (input_len > DISPLAY_LEN_MAX_1710H)) return (PARSER_GLOBAL_LENGTH);
12580 }
12581 else
12582 {
12583 if ((input_len < DISPLAY_LEN_MIN_1710) || (input_len > DISPLAY_LEN_MAX_1710)) return (PARSER_GLOBAL_LENGTH);
12584 }
12585
12586 u64 *digest = (u64 *) hash_buf->digest;
12587
12588 salt_t *salt = hash_buf->salt;
12589
12590 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
12591 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
12592 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
12593 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
12594 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
12595 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
12596 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
12597 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
12598
12599 digest[0] -= SHA512M_A;
12600 digest[1] -= SHA512M_B;
12601 digest[2] -= SHA512M_C;
12602 digest[3] -= SHA512M_D;
12603 digest[4] -= SHA512M_E;
12604 digest[5] -= SHA512M_F;
12605 digest[6] -= SHA512M_G;
12606 digest[7] -= SHA512M_H;
12607
12608 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12609
12610 uint salt_len = input_len - 128 - 1;
12611
12612 char *salt_buf = input_buf + 128 + 1;
12613
12614 char *salt_buf_ptr = (char *) salt->salt_buf;
12615
12616 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12617
12618 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12619
12620 salt->salt_len = salt_len;
12621
12622 return (PARSER_OK);
12623 }
12624
12625 int sha512crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12626 {
12627 if (memcmp (SIGNATURE_SHA512CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
12628
12629 u64 *digest = (u64 *) hash_buf->digest;
12630
12631 salt_t *salt = hash_buf->salt;
12632
12633 char *salt_pos = input_buf + 3;
12634
12635 uint iterations_len = 0;
12636
12637 if (memcmp (salt_pos, "rounds=", 7) == 0)
12638 {
12639 salt_pos += 7;
12640
12641 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
12642
12643 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
12644 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
12645
12646 salt_pos[0] = 0x0;
12647
12648 salt->salt_iter = atoi (salt_pos - iterations_len);
12649
12650 salt_pos += 1;
12651
12652 iterations_len += 8;
12653 }
12654 else
12655 {
12656 salt->salt_iter = ROUNDS_SHA512CRYPT;
12657 }
12658
12659 if ((input_len < DISPLAY_LEN_MIN_1800) || (input_len > DISPLAY_LEN_MAX_1800 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
12660
12661 char *hash_pos = strchr (salt_pos, '$');
12662
12663 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12664
12665 uint salt_len = hash_pos - salt_pos;
12666
12667 if (salt_len > 16) return (PARSER_SALT_LENGTH);
12668
12669 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12670
12671 salt->salt_len = salt_len;
12672
12673 hash_pos++;
12674
12675 sha512crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12676
12677 return (PARSER_OK);
12678 }
12679
12680 int keccak_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12681 {
12682 if ((input_len < DISPLAY_LEN_MIN_5000) || (input_len > DISPLAY_LEN_MAX_5000)) return (PARSER_GLOBAL_LENGTH);
12683
12684 if (input_len % 16) return (PARSER_GLOBAL_LENGTH);
12685
12686 u64 *digest = (u64 *) hash_buf->digest;
12687
12688 salt_t *salt = hash_buf->salt;
12689
12690 uint keccak_mdlen = input_len / 2;
12691
12692 for (uint i = 0; i < keccak_mdlen / 8; i++)
12693 {
12694 digest[i] = hex_to_u64 ((const u8 *) &input_buf[i * 16]);
12695
12696 digest[i] = byte_swap_64 (digest[i]);
12697 }
12698
12699 salt->keccak_mdlen = keccak_mdlen;
12700
12701 return (PARSER_OK);
12702 }
12703
12704 int ikepsk_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12705 {
12706 if ((input_len < DISPLAY_LEN_MIN_5300) || (input_len > DISPLAY_LEN_MAX_5300)) return (PARSER_GLOBAL_LENGTH);
12707
12708 u32 *digest = (u32 *) hash_buf->digest;
12709
12710 salt_t *salt = hash_buf->salt;
12711
12712 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
12713
12714 /**
12715 * Parse that strange long line
12716 */
12717
12718 char *in_off[9];
12719
12720 size_t in_len[9] = { 0 };
12721
12722 in_off[0] = strtok (input_buf, ":");
12723
12724 if (in_off[0] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12725
12726 in_len[0] = strlen (in_off[0]);
12727
12728 size_t i;
12729
12730 for (i = 1; i < 9; i++)
12731 {
12732 in_off[i] = strtok (NULL, ":");
12733
12734 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12735
12736 in_len[i] = strlen (in_off[i]);
12737 }
12738
12739 char *ptr = (char *) ikepsk->msg_buf;
12740
12741 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[0] + i);
12742 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[1] + i);
12743 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[2] + i);
12744 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[3] + i);
12745 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[4] + i);
12746 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[5] + i);
12747
12748 *ptr = 0x80;
12749
12750 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
12751
12752 ptr = (char *) ikepsk->nr_buf;
12753
12754 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[6] + i);
12755 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[7] + i);
12756
12757 *ptr = 0x80;
12758
12759 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
12760
12761 /**
12762 * Store to database
12763 */
12764
12765 ptr = in_off[8];
12766
12767 digest[0] = hex_to_u32 ((const u8 *) &ptr[ 0]);
12768 digest[1] = hex_to_u32 ((const u8 *) &ptr[ 8]);
12769 digest[2] = hex_to_u32 ((const u8 *) &ptr[16]);
12770 digest[3] = hex_to_u32 ((const u8 *) &ptr[24]);
12771
12772 digest[0] = byte_swap_32 (digest[0]);
12773 digest[1] = byte_swap_32 (digest[1]);
12774 digest[2] = byte_swap_32 (digest[2]);
12775 digest[3] = byte_swap_32 (digest[3]);
12776
12777 salt->salt_len = 32;
12778
12779 salt->salt_buf[0] = ikepsk->nr_buf[0];
12780 salt->salt_buf[1] = ikepsk->nr_buf[1];
12781 salt->salt_buf[2] = ikepsk->nr_buf[2];
12782 salt->salt_buf[3] = ikepsk->nr_buf[3];
12783 salt->salt_buf[4] = ikepsk->nr_buf[4];
12784 salt->salt_buf[5] = ikepsk->nr_buf[5];
12785 salt->salt_buf[6] = ikepsk->nr_buf[6];
12786 salt->salt_buf[7] = ikepsk->nr_buf[7];
12787
12788 return (PARSER_OK);
12789 }
12790
12791 int ikepsk_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12792 {
12793 if ((input_len < DISPLAY_LEN_MIN_5400) || (input_len > DISPLAY_LEN_MAX_5400)) return (PARSER_GLOBAL_LENGTH);
12794
12795 u32 *digest = (u32 *) hash_buf->digest;
12796
12797 salt_t *salt = hash_buf->salt;
12798
12799 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
12800
12801 /**
12802 * Parse that strange long line
12803 */
12804
12805 char *in_off[9];
12806
12807 size_t in_len[9] = { 0 };
12808
12809 in_off[0] = strtok (input_buf, ":");
12810
12811 if (in_off[0] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12812
12813 in_len[0] = strlen (in_off[0]);
12814
12815 size_t i;
12816
12817 for (i = 1; i < 9; i++)
12818 {
12819 in_off[i] = strtok (NULL, ":");
12820
12821 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12822
12823 in_len[i] = strlen (in_off[i]);
12824 }
12825
12826 char *ptr = (char *) ikepsk->msg_buf;
12827
12828 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[0] + i);
12829 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[1] + i);
12830 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[2] + i);
12831 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[3] + i);
12832 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[4] + i);
12833 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[5] + i);
12834
12835 *ptr = 0x80;
12836
12837 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
12838
12839 ptr = (char *) ikepsk->nr_buf;
12840
12841 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[6] + i);
12842 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[7] + i);
12843
12844 *ptr = 0x80;
12845
12846 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
12847
12848 /**
12849 * Store to database
12850 */
12851
12852 ptr = in_off[8];
12853
12854 digest[0] = hex_to_u32 ((const u8 *) &ptr[ 0]);
12855 digest[1] = hex_to_u32 ((const u8 *) &ptr[ 8]);
12856 digest[2] = hex_to_u32 ((const u8 *) &ptr[16]);
12857 digest[3] = hex_to_u32 ((const u8 *) &ptr[24]);
12858 digest[4] = hex_to_u32 ((const u8 *) &ptr[32]);
12859
12860 salt->salt_len = 32;
12861
12862 salt->salt_buf[0] = ikepsk->nr_buf[0];
12863 salt->salt_buf[1] = ikepsk->nr_buf[1];
12864 salt->salt_buf[2] = ikepsk->nr_buf[2];
12865 salt->salt_buf[3] = ikepsk->nr_buf[3];
12866 salt->salt_buf[4] = ikepsk->nr_buf[4];
12867 salt->salt_buf[5] = ikepsk->nr_buf[5];
12868 salt->salt_buf[6] = ikepsk->nr_buf[6];
12869 salt->salt_buf[7] = ikepsk->nr_buf[7];
12870
12871 return (PARSER_OK);
12872 }
12873
12874 int ripemd160_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12875 {
12876 if ((input_len < DISPLAY_LEN_MIN_6000) || (input_len > DISPLAY_LEN_MAX_6000)) return (PARSER_GLOBAL_LENGTH);
12877
12878 u32 *digest = (u32 *) hash_buf->digest;
12879
12880 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12881 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12882 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12883 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12884 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12885
12886 digest[0] = byte_swap_32 (digest[0]);
12887 digest[1] = byte_swap_32 (digest[1]);
12888 digest[2] = byte_swap_32 (digest[2]);
12889 digest[3] = byte_swap_32 (digest[3]);
12890 digest[4] = byte_swap_32 (digest[4]);
12891
12892 return (PARSER_OK);
12893 }
12894
12895 int whirlpool_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12896 {
12897 if ((input_len < DISPLAY_LEN_MIN_6100) || (input_len > DISPLAY_LEN_MAX_6100)) return (PARSER_GLOBAL_LENGTH);
12898
12899 u32 *digest = (u32 *) hash_buf->digest;
12900
12901 digest[ 0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12902 digest[ 1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12903 digest[ 2] = hex_to_u32 ((const u8 *) &input_buf[ 16]);
12904 digest[ 3] = hex_to_u32 ((const u8 *) &input_buf[ 24]);
12905 digest[ 4] = hex_to_u32 ((const u8 *) &input_buf[ 32]);
12906 digest[ 5] = hex_to_u32 ((const u8 *) &input_buf[ 40]);
12907 digest[ 6] = hex_to_u32 ((const u8 *) &input_buf[ 48]);
12908 digest[ 7] = hex_to_u32 ((const u8 *) &input_buf[ 56]);
12909 digest[ 8] = hex_to_u32 ((const u8 *) &input_buf[ 64]);
12910 digest[ 9] = hex_to_u32 ((const u8 *) &input_buf[ 72]);
12911 digest[10] = hex_to_u32 ((const u8 *) &input_buf[ 80]);
12912 digest[11] = hex_to_u32 ((const u8 *) &input_buf[ 88]);
12913 digest[12] = hex_to_u32 ((const u8 *) &input_buf[ 96]);
12914 digest[13] = hex_to_u32 ((const u8 *) &input_buf[104]);
12915 digest[14] = hex_to_u32 ((const u8 *) &input_buf[112]);
12916 digest[15] = hex_to_u32 ((const u8 *) &input_buf[120]);
12917
12918 return (PARSER_OK);
12919 }
12920
12921 int androidpin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12922 {
12923 if ((input_len < DISPLAY_LEN_MIN_5800) || (input_len > DISPLAY_LEN_MAX_5800)) return (PARSER_GLOBAL_LENGTH);
12924
12925 u32 *digest = (u32 *) hash_buf->digest;
12926
12927 salt_t *salt = hash_buf->salt;
12928
12929 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12930 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12931 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12932 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12933 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12934
12935 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12936
12937 uint salt_len = input_len - 40 - 1;
12938
12939 char *salt_buf = input_buf + 40 + 1;
12940
12941 char *salt_buf_ptr = (char *) salt->salt_buf;
12942
12943 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12944
12945 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12946
12947 salt->salt_len = salt_len;
12948
12949 salt->salt_iter = ROUNDS_ANDROIDPIN - 1;
12950
12951 return (PARSER_OK);
12952 }
12953
12954 int truecrypt_parse_hash_1k (char *input_buf, uint input_len, hash_t *hash_buf)
12955 {
12956 u32 *digest = (u32 *) hash_buf->digest;
12957
12958 salt_t *salt = hash_buf->salt;
12959
12960 tc_t *tc = (tc_t *) hash_buf->esalt;
12961
12962 if (input_len == 0)
12963 {
12964 log_error ("TrueCrypt container not specified");
12965
12966 exit (-1);
12967 }
12968
12969 FILE *fp = fopen (input_buf, "rb");
12970
12971 if (fp == NULL)
12972 {
12973 log_error ("%s: %s", input_buf, strerror (errno));
12974
12975 exit (-1);
12976 }
12977
12978 char buf[512] = { 0 };
12979
12980 int n = fread (buf, 1, sizeof (buf), fp);
12981
12982 fclose (fp);
12983
12984 if (n != 512) return (PARSER_TC_FILE_SIZE);
12985
12986 memcpy (tc->salt_buf, buf, 64);
12987
12988 memcpy (tc->data_buf, buf + 64, 512 - 64);
12989
12990 salt->salt_buf[0] = tc->salt_buf[0];
12991
12992 salt->salt_len = 4;
12993
12994 salt->salt_iter = ROUNDS_TRUECRYPT_1K - 1;
12995
12996 tc->signature = 0x45555254; // "TRUE"
12997
12998 digest[0] = tc->data_buf[0];
12999
13000 return (PARSER_OK);
13001 }
13002
13003 int truecrypt_parse_hash_2k (char *input_buf, uint input_len, hash_t *hash_buf)
13004 {
13005 u32 *digest = (u32 *) hash_buf->digest;
13006
13007 salt_t *salt = hash_buf->salt;
13008
13009 tc_t *tc = (tc_t *) hash_buf->esalt;
13010
13011 if (input_len == 0)
13012 {
13013 log_error ("TrueCrypt container not specified");
13014
13015 exit (-1);
13016 }
13017
13018 FILE *fp = fopen (input_buf, "rb");
13019
13020 if (fp == NULL)
13021 {
13022 log_error ("%s: %s", input_buf, strerror (errno));
13023
13024 exit (-1);
13025 }
13026
13027 char buf[512] = { 0 };
13028
13029 int n = fread (buf, 1, sizeof (buf), fp);
13030
13031 fclose (fp);
13032
13033 if (n != 512) return (PARSER_TC_FILE_SIZE);
13034
13035 memcpy (tc->salt_buf, buf, 64);
13036
13037 memcpy (tc->data_buf, buf + 64, 512 - 64);
13038
13039 salt->salt_buf[0] = tc->salt_buf[0];
13040
13041 salt->salt_len = 4;
13042
13043 salt->salt_iter = ROUNDS_TRUECRYPT_2K - 1;
13044
13045 tc->signature = 0x45555254; // "TRUE"
13046
13047 digest[0] = tc->data_buf[0];
13048
13049 return (PARSER_OK);
13050 }
13051
13052 int veracrypt_parse_hash_200000 (char *input_buf, uint input_len, hash_t *hash_buf)
13053 {
13054 u32 *digest = (u32 *) hash_buf->digest;
13055
13056 salt_t *salt = hash_buf->salt;
13057
13058 tc_t *tc = (tc_t *) hash_buf->esalt;
13059
13060 if (input_len == 0)
13061 {
13062 log_error ("VeraCrypt container not specified");
13063
13064 exit (-1);
13065 }
13066
13067 FILE *fp = fopen (input_buf, "rb");
13068
13069 if (fp == NULL)
13070 {
13071 log_error ("%s: %s", input_buf, strerror (errno));
13072
13073 exit (-1);
13074 }
13075
13076 char buf[512] = { 0 };
13077
13078 int n = fread (buf, 1, sizeof (buf), fp);
13079
13080 fclose (fp);
13081
13082 if (n != 512) return (PARSER_VC_FILE_SIZE);
13083
13084 memcpy (tc->salt_buf, buf, 64);
13085
13086 memcpy (tc->data_buf, buf + 64, 512 - 64);
13087
13088 salt->salt_buf[0] = tc->salt_buf[0];
13089
13090 salt->salt_len = 4;
13091
13092 salt->salt_iter = ROUNDS_VERACRYPT_200000 - 1;
13093
13094 tc->signature = 0x41524556; // "VERA"
13095
13096 digest[0] = tc->data_buf[0];
13097
13098 return (PARSER_OK);
13099 }
13100
13101 int veracrypt_parse_hash_500000 (char *input_buf, uint input_len, hash_t *hash_buf)
13102 {
13103 u32 *digest = (u32 *) hash_buf->digest;
13104
13105 salt_t *salt = hash_buf->salt;
13106
13107 tc_t *tc = (tc_t *) hash_buf->esalt;
13108
13109 if (input_len == 0)
13110 {
13111 log_error ("VeraCrypt container not specified");
13112
13113 exit (-1);
13114 }
13115
13116 FILE *fp = fopen (input_buf, "rb");
13117
13118 if (fp == NULL)
13119 {
13120 log_error ("%s: %s", input_buf, strerror (errno));
13121
13122 exit (-1);
13123 }
13124
13125 char buf[512] = { 0 };
13126
13127 int n = fread (buf, 1, sizeof (buf), fp);
13128
13129 fclose (fp);
13130
13131 if (n != 512) return (PARSER_VC_FILE_SIZE);
13132
13133 memcpy (tc->salt_buf, buf, 64);
13134
13135 memcpy (tc->data_buf, buf + 64, 512 - 64);
13136
13137 salt->salt_buf[0] = tc->salt_buf[0];
13138
13139 salt->salt_len = 4;
13140
13141 salt->salt_iter = ROUNDS_VERACRYPT_500000 - 1;
13142
13143 tc->signature = 0x41524556; // "VERA"
13144
13145 digest[0] = tc->data_buf[0];
13146
13147 return (PARSER_OK);
13148 }
13149
13150 int veracrypt_parse_hash_327661 (char *input_buf, uint input_len, hash_t *hash_buf)
13151 {
13152 u32 *digest = (u32 *) hash_buf->digest;
13153
13154 salt_t *salt = hash_buf->salt;
13155
13156 tc_t *tc = (tc_t *) hash_buf->esalt;
13157
13158 if (input_len == 0)
13159 {
13160 log_error ("VeraCrypt container not specified");
13161
13162 exit (-1);
13163 }
13164
13165 FILE *fp = fopen (input_buf, "rb");
13166
13167 if (fp == NULL)
13168 {
13169 log_error ("%s: %s", input_buf, strerror (errno));
13170
13171 exit (-1);
13172 }
13173
13174 char buf[512] = { 0 };
13175
13176 int n = fread (buf, 1, sizeof (buf), fp);
13177
13178 fclose (fp);
13179
13180 if (n != 512) return (PARSER_VC_FILE_SIZE);
13181
13182 memcpy (tc->salt_buf, buf, 64);
13183
13184 memcpy (tc->data_buf, buf + 64, 512 - 64);
13185
13186 salt->salt_buf[0] = tc->salt_buf[0];
13187
13188 salt->salt_len = 4;
13189
13190 salt->salt_iter = ROUNDS_VERACRYPT_327661 - 1;
13191
13192 tc->signature = 0x41524556; // "VERA"
13193
13194 digest[0] = tc->data_buf[0];
13195
13196 return (PARSER_OK);
13197 }
13198
13199 int veracrypt_parse_hash_655331 (char *input_buf, uint input_len, hash_t *hash_buf)
13200 {
13201 u32 *digest = (u32 *) hash_buf->digest;
13202
13203 salt_t *salt = hash_buf->salt;
13204
13205 tc_t *tc = (tc_t *) hash_buf->esalt;
13206
13207 if (input_len == 0)
13208 {
13209 log_error ("VeraCrypt container not specified");
13210
13211 exit (-1);
13212 }
13213
13214 FILE *fp = fopen (input_buf, "rb");
13215
13216 if (fp == NULL)
13217 {
13218 log_error ("%s: %s", input_buf, strerror (errno));
13219
13220 exit (-1);
13221 }
13222
13223 char buf[512] = { 0 };
13224
13225 int n = fread (buf, 1, sizeof (buf), fp);
13226
13227 fclose (fp);
13228
13229 if (n != 512) return (PARSER_VC_FILE_SIZE);
13230
13231 memcpy (tc->salt_buf, buf, 64);
13232
13233 memcpy (tc->data_buf, buf + 64, 512 - 64);
13234
13235 salt->salt_buf[0] = tc->salt_buf[0];
13236
13237 salt->salt_len = 4;
13238
13239 salt->salt_iter = ROUNDS_VERACRYPT_655331 - 1;
13240
13241 tc->signature = 0x41524556; // "VERA"
13242
13243 digest[0] = tc->data_buf[0];
13244
13245 return (PARSER_OK);
13246 }
13247
13248 int md5aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13249 {
13250 if ((input_len < DISPLAY_LEN_MIN_6300) || (input_len > DISPLAY_LEN_MAX_6300)) return (PARSER_GLOBAL_LENGTH);
13251
13252 if (memcmp (SIGNATURE_MD5AIX, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
13253
13254 u32 *digest = (u32 *) hash_buf->digest;
13255
13256 salt_t *salt = hash_buf->salt;
13257
13258 char *salt_pos = input_buf + 6;
13259
13260 char *hash_pos = strchr (salt_pos, '$');
13261
13262 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13263
13264 uint salt_len = hash_pos - salt_pos;
13265
13266 if (salt_len < 8) return (PARSER_SALT_LENGTH);
13267
13268 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13269
13270 salt->salt_len = salt_len;
13271
13272 salt->salt_iter = 1000;
13273
13274 hash_pos++;
13275
13276 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13277
13278 return (PARSER_OK);
13279 }
13280
13281 int sha1aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13282 {
13283 if ((input_len < DISPLAY_LEN_MIN_6700) || (input_len > DISPLAY_LEN_MAX_6700)) return (PARSER_GLOBAL_LENGTH);
13284
13285 if (memcmp (SIGNATURE_SHA1AIX, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
13286
13287 u32 *digest = (u32 *) hash_buf->digest;
13288
13289 salt_t *salt = hash_buf->salt;
13290
13291 char *iter_pos = input_buf + 7;
13292
13293 char *salt_pos = strchr (iter_pos, '$');
13294
13295 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13296
13297 salt_pos++;
13298
13299 char *hash_pos = strchr (salt_pos, '$');
13300
13301 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13302
13303 uint salt_len = hash_pos - salt_pos;
13304
13305 if (salt_len < 16) return (PARSER_SALT_LENGTH);
13306
13307 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13308
13309 salt->salt_len = salt_len;
13310
13311 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
13312
13313 salt->salt_sign[0] = atoi (salt_iter);
13314
13315 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
13316
13317 hash_pos++;
13318
13319 sha1aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13320
13321 digest[0] = byte_swap_32 (digest[0]);
13322 digest[1] = byte_swap_32 (digest[1]);
13323 digest[2] = byte_swap_32 (digest[2]);
13324 digest[3] = byte_swap_32 (digest[3]);
13325 digest[4] = byte_swap_32 (digest[4]);
13326
13327 return (PARSER_OK);
13328 }
13329
13330 int sha256aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13331 {
13332 if ((input_len < DISPLAY_LEN_MIN_6400) || (input_len > DISPLAY_LEN_MAX_6400)) return (PARSER_GLOBAL_LENGTH);
13333
13334 if (memcmp (SIGNATURE_SHA256AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
13335
13336 u32 *digest = (u32 *) hash_buf->digest;
13337
13338 salt_t *salt = hash_buf->salt;
13339
13340 char *iter_pos = input_buf + 9;
13341
13342 char *salt_pos = strchr (iter_pos, '$');
13343
13344 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13345
13346 salt_pos++;
13347
13348 char *hash_pos = strchr (salt_pos, '$');
13349
13350 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13351
13352 uint salt_len = hash_pos - salt_pos;
13353
13354 if (salt_len < 16) return (PARSER_SALT_LENGTH);
13355
13356 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13357
13358 salt->salt_len = salt_len;
13359
13360 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
13361
13362 salt->salt_sign[0] = atoi (salt_iter);
13363
13364 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
13365
13366 hash_pos++;
13367
13368 sha256aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13369
13370 digest[0] = byte_swap_32 (digest[0]);
13371 digest[1] = byte_swap_32 (digest[1]);
13372 digest[2] = byte_swap_32 (digest[2]);
13373 digest[3] = byte_swap_32 (digest[3]);
13374 digest[4] = byte_swap_32 (digest[4]);
13375 digest[5] = byte_swap_32 (digest[5]);
13376 digest[6] = byte_swap_32 (digest[6]);
13377 digest[7] = byte_swap_32 (digest[7]);
13378
13379 return (PARSER_OK);
13380 }
13381
13382 int sha512aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13383 {
13384 if ((input_len < DISPLAY_LEN_MIN_6500) || (input_len > DISPLAY_LEN_MAX_6500)) return (PARSER_GLOBAL_LENGTH);
13385
13386 if (memcmp (SIGNATURE_SHA512AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
13387
13388 u64 *digest = (u64 *) hash_buf->digest;
13389
13390 salt_t *salt = hash_buf->salt;
13391
13392 char *iter_pos = input_buf + 9;
13393
13394 char *salt_pos = strchr (iter_pos, '$');
13395
13396 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13397
13398 salt_pos++;
13399
13400 char *hash_pos = strchr (salt_pos, '$');
13401
13402 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13403
13404 uint salt_len = hash_pos - salt_pos;
13405
13406 if (salt_len < 16) return (PARSER_SALT_LENGTH);
13407
13408 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13409
13410 salt->salt_len = salt_len;
13411
13412 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
13413
13414 salt->salt_sign[0] = atoi (salt_iter);
13415
13416 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
13417
13418 hash_pos++;
13419
13420 sha512aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13421
13422 digest[0] = byte_swap_64 (digest[0]);
13423 digest[1] = byte_swap_64 (digest[1]);
13424 digest[2] = byte_swap_64 (digest[2]);
13425 digest[3] = byte_swap_64 (digest[3]);
13426 digest[4] = byte_swap_64 (digest[4]);
13427 digest[5] = byte_swap_64 (digest[5]);
13428 digest[6] = byte_swap_64 (digest[6]);
13429 digest[7] = byte_swap_64 (digest[7]);
13430
13431 return (PARSER_OK);
13432 }
13433
13434 int agilekey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13435 {
13436 if ((input_len < DISPLAY_LEN_MIN_6600) || (input_len > DISPLAY_LEN_MAX_6600)) return (PARSER_GLOBAL_LENGTH);
13437
13438 u32 *digest = (u32 *) hash_buf->digest;
13439
13440 salt_t *salt = hash_buf->salt;
13441
13442 agilekey_t *agilekey = (agilekey_t *) hash_buf->esalt;
13443
13444 /**
13445 * parse line
13446 */
13447
13448 char *iterations_pos = input_buf;
13449
13450 char *saltbuf_pos = strchr (iterations_pos, ':');
13451
13452 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13453
13454 uint iterations_len = saltbuf_pos - iterations_pos;
13455
13456 if (iterations_len > 6) return (PARSER_SALT_LENGTH);
13457
13458 saltbuf_pos++;
13459
13460 char *cipherbuf_pos = strchr (saltbuf_pos, ':');
13461
13462 if (cipherbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13463
13464 uint saltbuf_len = cipherbuf_pos - saltbuf_pos;
13465
13466 if (saltbuf_len != 16) return (PARSER_SALT_LENGTH);
13467
13468 uint cipherbuf_len = input_len - iterations_len - 1 - saltbuf_len - 1;
13469
13470 if (cipherbuf_len != 2080) return (PARSER_HASH_LENGTH);
13471
13472 cipherbuf_pos++;
13473
13474 /**
13475 * pbkdf2 iterations
13476 */
13477
13478 salt->salt_iter = atoi (iterations_pos) - 1;
13479
13480 /**
13481 * handle salt encoding
13482 */
13483
13484 char *saltbuf_ptr = (char *) salt->salt_buf;
13485
13486 for (uint i = 0; i < saltbuf_len; i += 2)
13487 {
13488 const char p0 = saltbuf_pos[i + 0];
13489 const char p1 = saltbuf_pos[i + 1];
13490
13491 *saltbuf_ptr++ = hex_convert (p1) << 0
13492 | hex_convert (p0) << 4;
13493 }
13494
13495 salt->salt_len = saltbuf_len / 2;
13496
13497 /**
13498 * handle cipher encoding
13499 */
13500
13501 uint *tmp = (uint *) mymalloc (32);
13502
13503 char *cipherbuf_ptr = (char *) tmp;
13504
13505 for (uint i = 2016; i < cipherbuf_len; i += 2)
13506 {
13507 const char p0 = cipherbuf_pos[i + 0];
13508 const char p1 = cipherbuf_pos[i + 1];
13509
13510 *cipherbuf_ptr++ = hex_convert (p1) << 0
13511 | hex_convert (p0) << 4;
13512 }
13513
13514 // iv is stored at salt_buf 4 (length 16)
13515 // data is stored at salt_buf 8 (length 16)
13516
13517 salt->salt_buf[ 4] = byte_swap_32 (tmp[0]);
13518 salt->salt_buf[ 5] = byte_swap_32 (tmp[1]);
13519 salt->salt_buf[ 6] = byte_swap_32 (tmp[2]);
13520 salt->salt_buf[ 7] = byte_swap_32 (tmp[3]);
13521
13522 salt->salt_buf[ 8] = byte_swap_32 (tmp[4]);
13523 salt->salt_buf[ 9] = byte_swap_32 (tmp[5]);
13524 salt->salt_buf[10] = byte_swap_32 (tmp[6]);
13525 salt->salt_buf[11] = byte_swap_32 (tmp[7]);
13526
13527 free (tmp);
13528
13529 for (uint i = 0, j = 0; i < 1040; i += 1, j += 2)
13530 {
13531 const char p0 = cipherbuf_pos[j + 0];
13532 const char p1 = cipherbuf_pos[j + 1];
13533
13534 agilekey->cipher[i] = hex_convert (p1) << 0
13535 | hex_convert (p0) << 4;
13536 }
13537
13538 /**
13539 * digest buf
13540 */
13541
13542 digest[0] = 0x10101010;
13543 digest[1] = 0x10101010;
13544 digest[2] = 0x10101010;
13545 digest[3] = 0x10101010;
13546
13547 return (PARSER_OK);
13548 }
13549
13550 int lastpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13551 {
13552 if ((input_len < DISPLAY_LEN_MIN_6800) || (input_len > DISPLAY_LEN_MAX_6800)) return (PARSER_GLOBAL_LENGTH);
13553
13554 u32 *digest = (u32 *) hash_buf->digest;
13555
13556 salt_t *salt = hash_buf->salt;
13557
13558 char *hashbuf_pos = input_buf;
13559
13560 char *iterations_pos = strchr (hashbuf_pos, ':');
13561
13562 if (iterations_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13563
13564 uint hash_len = iterations_pos - hashbuf_pos;
13565
13566 if ((hash_len != 32) && (hash_len != 64)) return (PARSER_HASH_LENGTH);
13567
13568 iterations_pos++;
13569
13570 char *saltbuf_pos = strchr (iterations_pos, ':');
13571
13572 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13573
13574 uint iterations_len = saltbuf_pos - iterations_pos;
13575
13576 saltbuf_pos++;
13577
13578 uint salt_len = input_len - hash_len - 1 - iterations_len - 1;
13579
13580 if (salt_len > 32) return (PARSER_SALT_LENGTH);
13581
13582 char *salt_buf_ptr = (char *) salt->salt_buf;
13583
13584 salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, salt_len);
13585
13586 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13587
13588 salt->salt_len = salt_len;
13589
13590 salt->salt_iter = atoi (iterations_pos) - 1;
13591
13592 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
13593 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
13594 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
13595 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
13596
13597 return (PARSER_OK);
13598 }
13599
13600 int gost_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13601 {
13602 if ((input_len < DISPLAY_LEN_MIN_6900) || (input_len > DISPLAY_LEN_MAX_6900)) return (PARSER_GLOBAL_LENGTH);
13603
13604 u32 *digest = (u32 *) hash_buf->digest;
13605
13606 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13607 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13608 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13609 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13610 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
13611 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
13612 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
13613 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
13614
13615 digest[0] = byte_swap_32 (digest[0]);
13616 digest[1] = byte_swap_32 (digest[1]);
13617 digest[2] = byte_swap_32 (digest[2]);
13618 digest[3] = byte_swap_32 (digest[3]);
13619 digest[4] = byte_swap_32 (digest[4]);
13620 digest[5] = byte_swap_32 (digest[5]);
13621 digest[6] = byte_swap_32 (digest[6]);
13622 digest[7] = byte_swap_32 (digest[7]);
13623
13624 return (PARSER_OK);
13625 }
13626
13627 int sha256crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13628 {
13629 if (memcmp (SIGNATURE_SHA256CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
13630
13631 u32 *digest = (u32 *) hash_buf->digest;
13632
13633 salt_t *salt = hash_buf->salt;
13634
13635 char *salt_pos = input_buf + 3;
13636
13637 uint iterations_len = 0;
13638
13639 if (memcmp (salt_pos, "rounds=", 7) == 0)
13640 {
13641 salt_pos += 7;
13642
13643 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
13644
13645 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
13646 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
13647
13648 salt_pos[0] = 0x0;
13649
13650 salt->salt_iter = atoi (salt_pos - iterations_len);
13651
13652 salt_pos += 1;
13653
13654 iterations_len += 8;
13655 }
13656 else
13657 {
13658 salt->salt_iter = ROUNDS_SHA256CRYPT;
13659 }
13660
13661 if ((input_len < DISPLAY_LEN_MIN_7400) || (input_len > DISPLAY_LEN_MAX_7400 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
13662
13663 char *hash_pos = strchr (salt_pos, '$');
13664
13665 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13666
13667 uint salt_len = hash_pos - salt_pos;
13668
13669 if (salt_len > 16) return (PARSER_SALT_LENGTH);
13670
13671 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13672
13673 salt->salt_len = salt_len;
13674
13675 hash_pos++;
13676
13677 sha256crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13678
13679 return (PARSER_OK);
13680 }
13681
13682 int sha512osx_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13683 {
13684 uint max_len = DISPLAY_LEN_MAX_7100 + (2 * 128);
13685
13686 if ((input_len < DISPLAY_LEN_MIN_7100) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
13687
13688 if (memcmp (SIGNATURE_SHA512OSX, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
13689
13690 u64 *digest = (u64 *) hash_buf->digest;
13691
13692 salt_t *salt = hash_buf->salt;
13693
13694 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
13695
13696 char *iter_pos = input_buf + 4;
13697
13698 char *salt_pos = strchr (iter_pos, '$');
13699
13700 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13701
13702 salt_pos++;
13703
13704 char *hash_pos = strchr (salt_pos, '$');
13705
13706 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13707
13708 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
13709
13710 hash_pos++;
13711
13712 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
13713 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
13714 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
13715 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
13716 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
13717 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
13718 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
13719 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
13720
13721 uint salt_len = hash_pos - salt_pos - 1;
13722
13723 if ((salt_len % 2) != 0) return (PARSER_SALT_LENGTH);
13724
13725 salt->salt_len = salt_len / 2;
13726
13727 pbkdf2_sha512->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
13728 pbkdf2_sha512->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
13729 pbkdf2_sha512->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
13730 pbkdf2_sha512->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
13731 pbkdf2_sha512->salt_buf[4] = hex_to_u32 ((const u8 *) &salt_pos[32]);
13732 pbkdf2_sha512->salt_buf[5] = hex_to_u32 ((const u8 *) &salt_pos[40]);
13733 pbkdf2_sha512->salt_buf[6] = hex_to_u32 ((const u8 *) &salt_pos[48]);
13734 pbkdf2_sha512->salt_buf[7] = hex_to_u32 ((const u8 *) &salt_pos[56]);
13735
13736 pbkdf2_sha512->salt_buf[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]);
13737 pbkdf2_sha512->salt_buf[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]);
13738 pbkdf2_sha512->salt_buf[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]);
13739 pbkdf2_sha512->salt_buf[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]);
13740 pbkdf2_sha512->salt_buf[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]);
13741 pbkdf2_sha512->salt_buf[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]);
13742 pbkdf2_sha512->salt_buf[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]);
13743 pbkdf2_sha512->salt_buf[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]);
13744 pbkdf2_sha512->salt_buf[8] = 0x01000000;
13745 pbkdf2_sha512->salt_buf[9] = 0x80;
13746
13747 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
13748
13749 salt->salt_iter = atoi (iter_pos) - 1;
13750
13751 return (PARSER_OK);
13752 }
13753
13754 int episerver4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13755 {
13756 if ((input_len < DISPLAY_LEN_MIN_1441) || (input_len > DISPLAY_LEN_MAX_1441)) return (PARSER_GLOBAL_LENGTH);
13757
13758 if (memcmp (SIGNATURE_EPISERVER4, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
13759
13760 u32 *digest = (u32 *) hash_buf->digest;
13761
13762 salt_t *salt = hash_buf->salt;
13763
13764 char *salt_pos = input_buf + 14;
13765
13766 char *hash_pos = strchr (salt_pos, '*');
13767
13768 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13769
13770 hash_pos++;
13771
13772 uint salt_len = hash_pos - salt_pos - 1;
13773
13774 char *salt_buf_ptr = (char *) salt->salt_buf;
13775
13776 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13777
13778 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13779
13780 salt->salt_len = salt_len;
13781
13782 u8 tmp_buf[100] = { 0 };
13783
13784 base64_decode (base64_to_int, (const u8 *) hash_pos, 43, tmp_buf);
13785
13786 memcpy (digest, tmp_buf, 32);
13787
13788 digest[0] = byte_swap_32 (digest[0]);
13789 digest[1] = byte_swap_32 (digest[1]);
13790 digest[2] = byte_swap_32 (digest[2]);
13791 digest[3] = byte_swap_32 (digest[3]);
13792 digest[4] = byte_swap_32 (digest[4]);
13793 digest[5] = byte_swap_32 (digest[5]);
13794 digest[6] = byte_swap_32 (digest[6]);
13795 digest[7] = byte_swap_32 (digest[7]);
13796
13797 digest[0] -= SHA256M_A;
13798 digest[1] -= SHA256M_B;
13799 digest[2] -= SHA256M_C;
13800 digest[3] -= SHA256M_D;
13801 digest[4] -= SHA256M_E;
13802 digest[5] -= SHA256M_F;
13803 digest[6] -= SHA256M_G;
13804 digest[7] -= SHA256M_H;
13805
13806 return (PARSER_OK);
13807 }
13808
13809 int sha512grub_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13810 {
13811 uint max_len = DISPLAY_LEN_MAX_7200 + (8 * 128);
13812
13813 if ((input_len < DISPLAY_LEN_MIN_7200) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
13814
13815 if (memcmp (SIGNATURE_SHA512GRUB, input_buf, 19)) return (PARSER_SIGNATURE_UNMATCHED);
13816
13817 u64 *digest = (u64 *) hash_buf->digest;
13818
13819 salt_t *salt = hash_buf->salt;
13820
13821 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
13822
13823 char *iter_pos = input_buf + 19;
13824
13825 char *salt_pos = strchr (iter_pos, '.');
13826
13827 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13828
13829 salt_pos++;
13830
13831 char *hash_pos = strchr (salt_pos, '.');
13832
13833 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13834
13835 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
13836
13837 hash_pos++;
13838
13839 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
13840 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
13841 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
13842 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
13843 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
13844 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
13845 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
13846 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
13847
13848 uint salt_len = hash_pos - salt_pos - 1;
13849
13850 salt_len /= 2;
13851
13852 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
13853
13854 uint i;
13855
13856 for (i = 0; i < salt_len; i++)
13857 {
13858 salt_buf_ptr[i] = hex_to_u8 ((const u8 *) &salt_pos[i * 2]);
13859 }
13860
13861 salt_buf_ptr[salt_len + 3] = 0x01;
13862 salt_buf_ptr[salt_len + 4] = 0x80;
13863
13864 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
13865
13866 salt->salt_len = salt_len;
13867
13868 salt->salt_iter = atoi (iter_pos) - 1;
13869
13870 return (PARSER_OK);
13871 }
13872
13873 int sha512b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13874 {
13875 if ((input_len < DISPLAY_LEN_MIN_1711) || (input_len > DISPLAY_LEN_MAX_1711)) return (PARSER_GLOBAL_LENGTH);
13876
13877 if (memcmp (SIGNATURE_SHA512B64S, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
13878
13879 u64 *digest = (u64 *) hash_buf->digest;
13880
13881 salt_t *salt = hash_buf->salt;
13882
13883 u8 tmp_buf[120] = { 0 };
13884
13885 int tmp_len = base64_decode (base64_to_int, (const u8 *) input_buf + 9, input_len - 9, tmp_buf);
13886
13887 if (tmp_len < 64) return (PARSER_HASH_LENGTH);
13888
13889 memcpy (digest, tmp_buf, 64);
13890
13891 digest[0] = byte_swap_64 (digest[0]);
13892 digest[1] = byte_swap_64 (digest[1]);
13893 digest[2] = byte_swap_64 (digest[2]);
13894 digest[3] = byte_swap_64 (digest[3]);
13895 digest[4] = byte_swap_64 (digest[4]);
13896 digest[5] = byte_swap_64 (digest[5]);
13897 digest[6] = byte_swap_64 (digest[6]);
13898 digest[7] = byte_swap_64 (digest[7]);
13899
13900 digest[0] -= SHA512M_A;
13901 digest[1] -= SHA512M_B;
13902 digest[2] -= SHA512M_C;
13903 digest[3] -= SHA512M_D;
13904 digest[4] -= SHA512M_E;
13905 digest[5] -= SHA512M_F;
13906 digest[6] -= SHA512M_G;
13907 digest[7] -= SHA512M_H;
13908
13909 int salt_len = tmp_len - 64;
13910
13911 if (salt_len < 0) return (PARSER_SALT_LENGTH);
13912
13913 salt->salt_len = salt_len;
13914
13915 memcpy (salt->salt_buf, tmp_buf + 64, salt->salt_len);
13916
13917 if (data.opts_type & OPTS_TYPE_ST_ADD80)
13918 {
13919 char *ptr = (char *) salt->salt_buf;
13920
13921 ptr[salt->salt_len] = 0x80;
13922 }
13923
13924 return (PARSER_OK);
13925 }
13926
13927 int hmacmd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13928 {
13929 if (data.opts_type & OPTS_TYPE_ST_HEX)
13930 {
13931 if ((input_len < DISPLAY_LEN_MIN_50H) || (input_len > DISPLAY_LEN_MAX_50H)) return (PARSER_GLOBAL_LENGTH);
13932 }
13933 else
13934 {
13935 if ((input_len < DISPLAY_LEN_MIN_50) || (input_len > DISPLAY_LEN_MAX_50)) return (PARSER_GLOBAL_LENGTH);
13936 }
13937
13938 u32 *digest = (u32 *) hash_buf->digest;
13939
13940 salt_t *salt = hash_buf->salt;
13941
13942 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13943 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13944 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13945 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13946
13947 digest[0] = byte_swap_32 (digest[0]);
13948 digest[1] = byte_swap_32 (digest[1]);
13949 digest[2] = byte_swap_32 (digest[2]);
13950 digest[3] = byte_swap_32 (digest[3]);
13951
13952 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13953
13954 uint salt_len = input_len - 32 - 1;
13955
13956 char *salt_buf = input_buf + 32 + 1;
13957
13958 char *salt_buf_ptr = (char *) salt->salt_buf;
13959
13960 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13961
13962 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13963
13964 salt->salt_len = salt_len;
13965
13966 return (PARSER_OK);
13967 }
13968
13969 int hmacsha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13970 {
13971 if (data.opts_type & OPTS_TYPE_ST_HEX)
13972 {
13973 if ((input_len < DISPLAY_LEN_MIN_150H) || (input_len > DISPLAY_LEN_MAX_150H)) return (PARSER_GLOBAL_LENGTH);
13974 }
13975 else
13976 {
13977 if ((input_len < DISPLAY_LEN_MIN_150) || (input_len > DISPLAY_LEN_MAX_150)) return (PARSER_GLOBAL_LENGTH);
13978 }
13979
13980 u32 *digest = (u32 *) hash_buf->digest;
13981
13982 salt_t *salt = hash_buf->salt;
13983
13984 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13985 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13986 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13987 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13988 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
13989
13990 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13991
13992 uint salt_len = input_len - 40 - 1;
13993
13994 char *salt_buf = input_buf + 40 + 1;
13995
13996 char *salt_buf_ptr = (char *) salt->salt_buf;
13997
13998 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13999
14000 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14001
14002 salt->salt_len = salt_len;
14003
14004 return (PARSER_OK);
14005 }
14006
14007 int hmacsha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14008 {
14009 if (data.opts_type & OPTS_TYPE_ST_HEX)
14010 {
14011 if ((input_len < DISPLAY_LEN_MIN_1450H) || (input_len > DISPLAY_LEN_MAX_1450H)) return (PARSER_GLOBAL_LENGTH);
14012 }
14013 else
14014 {
14015 if ((input_len < DISPLAY_LEN_MIN_1450) || (input_len > DISPLAY_LEN_MAX_1450)) return (PARSER_GLOBAL_LENGTH);
14016 }
14017
14018 u32 *digest = (u32 *) hash_buf->digest;
14019
14020 salt_t *salt = hash_buf->salt;
14021
14022 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14023 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14024 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14025 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14026 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
14027 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
14028 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
14029 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
14030
14031 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14032
14033 uint salt_len = input_len - 64 - 1;
14034
14035 char *salt_buf = input_buf + 64 + 1;
14036
14037 char *salt_buf_ptr = (char *) salt->salt_buf;
14038
14039 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14040
14041 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14042
14043 salt->salt_len = salt_len;
14044
14045 return (PARSER_OK);
14046 }
14047
14048 int hmacsha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14049 {
14050 if (data.opts_type & OPTS_TYPE_ST_HEX)
14051 {
14052 if ((input_len < DISPLAY_LEN_MIN_1750H) || (input_len > DISPLAY_LEN_MAX_1750H)) return (PARSER_GLOBAL_LENGTH);
14053 }
14054 else
14055 {
14056 if ((input_len < DISPLAY_LEN_MIN_1750) || (input_len > DISPLAY_LEN_MAX_1750)) return (PARSER_GLOBAL_LENGTH);
14057 }
14058
14059 u64 *digest = (u64 *) hash_buf->digest;
14060
14061 salt_t *salt = hash_buf->salt;
14062
14063 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
14064 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
14065 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
14066 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
14067 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
14068 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
14069 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
14070 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
14071
14072 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14073
14074 uint salt_len = input_len - 128 - 1;
14075
14076 char *salt_buf = input_buf + 128 + 1;
14077
14078 char *salt_buf_ptr = (char *) salt->salt_buf;
14079
14080 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14081
14082 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14083
14084 salt->salt_len = salt_len;
14085
14086 return (PARSER_OK);
14087 }
14088
14089 int krb5pa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14090 {
14091 if ((input_len < DISPLAY_LEN_MIN_7500) || (input_len > DISPLAY_LEN_MAX_7500)) return (PARSER_GLOBAL_LENGTH);
14092
14093 if (memcmp (SIGNATURE_KRB5PA, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
14094
14095 u32 *digest = (u32 *) hash_buf->digest;
14096
14097 salt_t *salt = hash_buf->salt;
14098
14099 krb5pa_t *krb5pa = (krb5pa_t *) hash_buf->esalt;
14100
14101 /**
14102 * parse line
14103 */
14104
14105 char *user_pos = input_buf + 10 + 1;
14106
14107 char *realm_pos = strchr (user_pos, '$');
14108
14109 if (realm_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14110
14111 uint user_len = realm_pos - user_pos;
14112
14113 if (user_len >= 64) return (PARSER_SALT_LENGTH);
14114
14115 realm_pos++;
14116
14117 char *salt_pos = strchr (realm_pos, '$');
14118
14119 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14120
14121 uint realm_len = salt_pos - realm_pos;
14122
14123 if (realm_len >= 64) return (PARSER_SALT_LENGTH);
14124
14125 salt_pos++;
14126
14127 char *data_pos = strchr (salt_pos, '$');
14128
14129 if (data_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14130
14131 uint salt_len = data_pos - salt_pos;
14132
14133 if (salt_len >= 128) return (PARSER_SALT_LENGTH);
14134
14135 data_pos++;
14136
14137 uint data_len = input_len - 10 - 1 - user_len - 1 - realm_len - 1 - salt_len - 1;
14138
14139 if (data_len != ((36 + 16) * 2)) return (PARSER_SALT_LENGTH);
14140
14141 /**
14142 * copy data
14143 */
14144
14145 memcpy (krb5pa->user, user_pos, user_len);
14146 memcpy (krb5pa->realm, realm_pos, realm_len);
14147 memcpy (krb5pa->salt, salt_pos, salt_len);
14148
14149 char *timestamp_ptr = (char *) krb5pa->timestamp;
14150
14151 for (uint i = 0; i < (36 * 2); i += 2)
14152 {
14153 const char p0 = data_pos[i + 0];
14154 const char p1 = data_pos[i + 1];
14155
14156 *timestamp_ptr++ = hex_convert (p1) << 0
14157 | hex_convert (p0) << 4;
14158 }
14159
14160 char *checksum_ptr = (char *) krb5pa->checksum;
14161
14162 for (uint i = (36 * 2); i < ((36 + 16) * 2); i += 2)
14163 {
14164 const char p0 = data_pos[i + 0];
14165 const char p1 = data_pos[i + 1];
14166
14167 *checksum_ptr++ = hex_convert (p1) << 0
14168 | hex_convert (p0) << 4;
14169 }
14170
14171 /**
14172 * copy some data to generic buffers to make sorting happy
14173 */
14174
14175 salt->salt_buf[0] = krb5pa->timestamp[0];
14176 salt->salt_buf[1] = krb5pa->timestamp[1];
14177 salt->salt_buf[2] = krb5pa->timestamp[2];
14178 salt->salt_buf[3] = krb5pa->timestamp[3];
14179 salt->salt_buf[4] = krb5pa->timestamp[4];
14180 salt->salt_buf[5] = krb5pa->timestamp[5];
14181 salt->salt_buf[6] = krb5pa->timestamp[6];
14182 salt->salt_buf[7] = krb5pa->timestamp[7];
14183 salt->salt_buf[8] = krb5pa->timestamp[8];
14184
14185 salt->salt_len = 36;
14186
14187 digest[0] = krb5pa->checksum[0];
14188 digest[1] = krb5pa->checksum[1];
14189 digest[2] = krb5pa->checksum[2];
14190 digest[3] = krb5pa->checksum[3];
14191
14192 return (PARSER_OK);
14193 }
14194
14195 int sapb_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14196 {
14197 if ((input_len < DISPLAY_LEN_MIN_7700) || (input_len > DISPLAY_LEN_MAX_7700)) return (PARSER_GLOBAL_LENGTH);
14198
14199 u32 *digest = (u32 *) hash_buf->digest;
14200
14201 salt_t *salt = hash_buf->salt;
14202
14203 /**
14204 * parse line
14205 */
14206
14207 char *salt_pos = input_buf;
14208
14209 char *hash_pos = strchr (salt_pos, '$');
14210
14211 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14212
14213 uint salt_len = hash_pos - salt_pos;
14214
14215 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
14216
14217 hash_pos++;
14218
14219 uint hash_len = input_len - 1 - salt_len;
14220
14221 if (hash_len != 16) return (PARSER_HASH_LENGTH);
14222
14223 /**
14224 * valid some data
14225 */
14226
14227 uint user_len = 0;
14228
14229 for (uint i = 0; i < salt_len; i++)
14230 {
14231 if (salt_pos[i] == ' ') continue;
14232
14233 user_len++;
14234 }
14235
14236 // SAP user names cannot be longer than 12 characters
14237 if (user_len > 12) return (PARSER_SALT_LENGTH);
14238
14239 // SAP user name cannot start with ! or ?
14240 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
14241
14242 /**
14243 * copy data
14244 */
14245
14246 char *salt_buf_ptr = (char *) salt->salt_buf;
14247
14248 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
14249
14250 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14251
14252 salt->salt_len = salt_len;
14253
14254 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[0]);
14255 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[8]);
14256 digest[2] = 0;
14257 digest[3] = 0;
14258
14259 digest[0] = byte_swap_32 (digest[0]);
14260 digest[1] = byte_swap_32 (digest[1]);
14261
14262 return (PARSER_OK);
14263 }
14264
14265 int sapg_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14266 {
14267 if ((input_len < DISPLAY_LEN_MIN_7800) || (input_len > DISPLAY_LEN_MAX_7800)) return (PARSER_GLOBAL_LENGTH);
14268
14269 u32 *digest = (u32 *) hash_buf->digest;
14270
14271 salt_t *salt = hash_buf->salt;
14272
14273 /**
14274 * parse line
14275 */
14276
14277 char *salt_pos = input_buf;
14278
14279 char *hash_pos = strchr (salt_pos, '$');
14280
14281 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14282
14283 uint salt_len = hash_pos - salt_pos;
14284
14285 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
14286
14287 hash_pos++;
14288
14289 uint hash_len = input_len - 1 - salt_len;
14290
14291 if (hash_len != 40) return (PARSER_HASH_LENGTH);
14292
14293 /**
14294 * valid some data
14295 */
14296
14297 uint user_len = 0;
14298
14299 for (uint i = 0; i < salt_len; i++)
14300 {
14301 if (salt_pos[i] == ' ') continue;
14302
14303 user_len++;
14304 }
14305
14306 // SAP user names cannot be longer than 12 characters
14307 // this is kinda buggy. if the username is in utf the length can be up to length 12*3
14308 // so far nobody complained so we stay with this because it helps in optimization
14309 // final string can have a max size of 32 (password) + (10 * 5) = lengthMagicArray + 12 (max salt) + 1 (the 0x80)
14310
14311 if (user_len > 12) return (PARSER_SALT_LENGTH);
14312
14313 // SAP user name cannot start with ! or ?
14314 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
14315
14316 /**
14317 * copy data
14318 */
14319
14320 char *salt_buf_ptr = (char *) salt->salt_buf;
14321
14322 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
14323
14324 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14325
14326 salt->salt_len = salt_len;
14327
14328 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
14329 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
14330 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
14331 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
14332 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
14333
14334 return (PARSER_OK);
14335 }
14336
14337 int drupal7_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14338 {
14339 if ((input_len < DISPLAY_LEN_MIN_7900) || (input_len > DISPLAY_LEN_MAX_7900)) return (PARSER_GLOBAL_LENGTH);
14340
14341 if (memcmp (SIGNATURE_DRUPAL7, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14342
14343 u64 *digest = (u64 *) hash_buf->digest;
14344
14345 salt_t *salt = hash_buf->salt;
14346
14347 char *iter_pos = input_buf + 3;
14348
14349 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
14350
14351 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
14352
14353 memcpy ((char *) salt->salt_sign, input_buf, 4);
14354
14355 salt->salt_iter = salt_iter;
14356
14357 char *salt_pos = iter_pos + 1;
14358
14359 uint salt_len = 8;
14360
14361 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
14362
14363 salt->salt_len = salt_len;
14364
14365 char *hash_pos = salt_pos + salt_len;
14366
14367 drupal7_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
14368
14369 // ugly hack start
14370
14371 char *tmp = (char *) salt->salt_buf_pc;
14372
14373 tmp[0] = hash_pos[42];
14374
14375 // ugly hack end
14376
14377 digest[ 0] = byte_swap_64 (digest[ 0]);
14378 digest[ 1] = byte_swap_64 (digest[ 1]);
14379 digest[ 2] = byte_swap_64 (digest[ 2]);
14380 digest[ 3] = byte_swap_64 (digest[ 3]);
14381 digest[ 4] = 0;
14382 digest[ 5] = 0;
14383 digest[ 6] = 0;
14384 digest[ 7] = 0;
14385
14386 return (PARSER_OK);
14387 }
14388
14389 int sybasease_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14390 {
14391 if ((input_len < DISPLAY_LEN_MIN_8000) || (input_len > DISPLAY_LEN_MAX_8000)) return (PARSER_GLOBAL_LENGTH);
14392
14393 if (memcmp (SIGNATURE_SYBASEASE, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14394
14395 u32 *digest = (u32 *) hash_buf->digest;
14396
14397 salt_t *salt = hash_buf->salt;
14398
14399 char *salt_buf = input_buf + 6;
14400
14401 uint salt_len = 16;
14402
14403 char *salt_buf_ptr = (char *) salt->salt_buf;
14404
14405 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14406
14407 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14408
14409 salt->salt_len = salt_len;
14410
14411 char *hash_pos = input_buf + 6 + 16;
14412
14413 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
14414 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
14415 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
14416 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
14417 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
14418 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
14419 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
14420 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
14421
14422 return (PARSER_OK);
14423 }
14424
14425 int mysql323_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14426 {
14427 if ((input_len < DISPLAY_LEN_MIN_200) || (input_len > DISPLAY_LEN_MAX_200)) return (PARSER_GLOBAL_LENGTH);
14428
14429 u32 *digest = (u32 *) hash_buf->digest;
14430
14431 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14432 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14433 digest[2] = 0;
14434 digest[3] = 0;
14435
14436 return (PARSER_OK);
14437 }
14438
14439 int rakp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14440 {
14441 if ((input_len < DISPLAY_LEN_MIN_7300) || (input_len > DISPLAY_LEN_MAX_7300)) return (PARSER_GLOBAL_LENGTH);
14442
14443 u32 *digest = (u32 *) hash_buf->digest;
14444
14445 salt_t *salt = hash_buf->salt;
14446
14447 rakp_t *rakp = (rakp_t *) hash_buf->esalt;
14448
14449 char *saltbuf_pos = input_buf;
14450
14451 char *hashbuf_pos = strchr (saltbuf_pos, ':');
14452
14453 if (hashbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14454
14455 uint saltbuf_len = hashbuf_pos - saltbuf_pos;
14456
14457 if (saltbuf_len < 64) return (PARSER_SALT_LENGTH);
14458 if (saltbuf_len > 512) return (PARSER_SALT_LENGTH);
14459
14460 if (saltbuf_len & 1) return (PARSER_SALT_LENGTH); // muss gerade sein wegen hex
14461
14462 hashbuf_pos++;
14463
14464 uint hashbuf_len = input_len - saltbuf_len - 1;
14465
14466 if (hashbuf_len != 40) return (PARSER_HASH_LENGTH);
14467
14468 char *salt_ptr = (char *) saltbuf_pos;
14469 char *rakp_ptr = (char *) rakp->salt_buf;
14470
14471 uint i;
14472 uint j;
14473
14474 for (i = 0, j = 0; i < saltbuf_len; i += 2, j += 1)
14475 {
14476 rakp_ptr[j] = hex_to_u8 ((const u8 *) &salt_ptr[i]);
14477 }
14478
14479 rakp_ptr[j] = 0x80;
14480
14481 rakp->salt_len = j;
14482
14483 for (i = 0; i < 64; i++)
14484 {
14485 rakp->salt_buf[i] = byte_swap_32 (rakp->salt_buf[i]);
14486 }
14487
14488 salt->salt_buf[0] = rakp->salt_buf[0];
14489 salt->salt_buf[1] = rakp->salt_buf[1];
14490 salt->salt_buf[2] = rakp->salt_buf[2];
14491 salt->salt_buf[3] = rakp->salt_buf[3];
14492 salt->salt_buf[4] = rakp->salt_buf[4];
14493 salt->salt_buf[5] = rakp->salt_buf[5];
14494 salt->salt_buf[6] = rakp->salt_buf[6];
14495 salt->salt_buf[7] = rakp->salt_buf[7];
14496
14497 salt->salt_len = 32; // muss min. 32 haben
14498
14499 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
14500 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
14501 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
14502 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
14503 digest[4] = hex_to_u32 ((const u8 *) &hashbuf_pos[32]);
14504
14505 return (PARSER_OK);
14506 }
14507
14508 int netscaler_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14509 {
14510 if ((input_len < DISPLAY_LEN_MIN_8100) || (input_len > DISPLAY_LEN_MAX_8100)) return (PARSER_GLOBAL_LENGTH);
14511
14512 u32 *digest = (u32 *) hash_buf->digest;
14513
14514 salt_t *salt = hash_buf->salt;
14515
14516 if (memcmp (SIGNATURE_NETSCALER, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
14517
14518 char *salt_pos = input_buf + 1;
14519
14520 memcpy (salt->salt_buf, salt_pos, 8);
14521
14522 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
14523 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
14524
14525 salt->salt_len = 8;
14526
14527 char *hash_pos = salt_pos + 8;
14528
14529 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
14530 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
14531 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
14532 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
14533 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
14534
14535 digest[0] -= SHA1M_A;
14536 digest[1] -= SHA1M_B;
14537 digest[2] -= SHA1M_C;
14538 digest[3] -= SHA1M_D;
14539 digest[4] -= SHA1M_E;
14540
14541 return (PARSER_OK);
14542 }
14543
14544 int chap_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14545 {
14546 if ((input_len < DISPLAY_LEN_MIN_4800) || (input_len > DISPLAY_LEN_MAX_4800)) return (PARSER_GLOBAL_LENGTH);
14547
14548 u32 *digest = (u32 *) hash_buf->digest;
14549
14550 salt_t *salt = hash_buf->salt;
14551
14552 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14553 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14554 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14555 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14556
14557 digest[0] = byte_swap_32 (digest[0]);
14558 digest[1] = byte_swap_32 (digest[1]);
14559 digest[2] = byte_swap_32 (digest[2]);
14560 digest[3] = byte_swap_32 (digest[3]);
14561
14562 digest[0] -= MD5M_A;
14563 digest[1] -= MD5M_B;
14564 digest[2] -= MD5M_C;
14565 digest[3] -= MD5M_D;
14566
14567 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14568
14569 char *salt_buf_ptr = input_buf + 32 + 1;
14570
14571 u32 *salt_buf = salt->salt_buf;
14572
14573 salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf_ptr[ 0]);
14574 salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf_ptr[ 8]);
14575 salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf_ptr[16]);
14576 salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf_ptr[24]);
14577
14578 salt_buf[0] = byte_swap_32 (salt_buf[0]);
14579 salt_buf[1] = byte_swap_32 (salt_buf[1]);
14580 salt_buf[2] = byte_swap_32 (salt_buf[2]);
14581 salt_buf[3] = byte_swap_32 (salt_buf[3]);
14582
14583 salt->salt_len = 16 + 1;
14584
14585 if (input_buf[65] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14586
14587 char *idbyte_buf_ptr = input_buf + 32 + 1 + 32 + 1;
14588
14589 salt_buf[4] = hex_to_u8 ((const u8 *) &idbyte_buf_ptr[0]) & 0xff;
14590
14591 return (PARSER_OK);
14592 }
14593
14594 int cloudkey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14595 {
14596 if ((input_len < DISPLAY_LEN_MIN_8200) || (input_len > DISPLAY_LEN_MAX_8200)) return (PARSER_GLOBAL_LENGTH);
14597
14598 u32 *digest = (u32 *) hash_buf->digest;
14599
14600 salt_t *salt = hash_buf->salt;
14601
14602 cloudkey_t *cloudkey = (cloudkey_t *) hash_buf->esalt;
14603
14604 /**
14605 * parse line
14606 */
14607
14608 char *hashbuf_pos = input_buf;
14609
14610 char *saltbuf_pos = strchr (hashbuf_pos, ':');
14611
14612 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14613
14614 const uint hashbuf_len = saltbuf_pos - hashbuf_pos;
14615
14616 if (hashbuf_len != 64) return (PARSER_HASH_LENGTH);
14617
14618 saltbuf_pos++;
14619
14620 char *iteration_pos = strchr (saltbuf_pos, ':');
14621
14622 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14623
14624 const uint saltbuf_len = iteration_pos - saltbuf_pos;
14625
14626 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
14627
14628 iteration_pos++;
14629
14630 char *databuf_pos = strchr (iteration_pos, ':');
14631
14632 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14633
14634 const uint iteration_len = databuf_pos - iteration_pos;
14635
14636 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
14637 if (iteration_len > 8) return (PARSER_SALT_ITERATION);
14638
14639 const uint databuf_len = input_len - hashbuf_len - 1 - saltbuf_len - 1 - iteration_len - 1;
14640
14641 if (databuf_len < 1) return (PARSER_SALT_LENGTH);
14642 if (databuf_len > 2048) return (PARSER_SALT_LENGTH);
14643
14644 databuf_pos++;
14645
14646 // digest
14647
14648 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
14649 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
14650 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
14651 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
14652 digest[4] = hex_to_u32 ((const u8 *) &hashbuf_pos[32]);
14653 digest[5] = hex_to_u32 ((const u8 *) &hashbuf_pos[40]);
14654 digest[6] = hex_to_u32 ((const u8 *) &hashbuf_pos[48]);
14655 digest[7] = hex_to_u32 ((const u8 *) &hashbuf_pos[56]);
14656
14657 // salt
14658
14659 char *saltbuf_ptr = (char *) salt->salt_buf;
14660
14661 for (uint i = 0; i < saltbuf_len; i += 2)
14662 {
14663 const char p0 = saltbuf_pos[i + 0];
14664 const char p1 = saltbuf_pos[i + 1];
14665
14666 *saltbuf_ptr++ = hex_convert (p1) << 0
14667 | hex_convert (p0) << 4;
14668 }
14669
14670 salt->salt_buf[4] = 0x01000000;
14671 salt->salt_buf[5] = 0x80;
14672
14673 salt->salt_len = saltbuf_len / 2;
14674
14675 // iteration
14676
14677 salt->salt_iter = atoi (iteration_pos) - 1;
14678
14679 // data
14680
14681 char *databuf_ptr = (char *) cloudkey->data_buf;
14682
14683 for (uint i = 0; i < databuf_len; i += 2)
14684 {
14685 const char p0 = databuf_pos[i + 0];
14686 const char p1 = databuf_pos[i + 1];
14687
14688 *databuf_ptr++ = hex_convert (p1) << 0
14689 | hex_convert (p0) << 4;
14690 }
14691
14692 *databuf_ptr++ = 0x80;
14693
14694 for (uint i = 0; i < 512; i++)
14695 {
14696 cloudkey->data_buf[i] = byte_swap_32 (cloudkey->data_buf[i]);
14697 }
14698
14699 cloudkey->data_len = databuf_len / 2;
14700
14701 return (PARSER_OK);
14702 }
14703
14704 int nsec3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14705 {
14706 if ((input_len < DISPLAY_LEN_MIN_8300) || (input_len > DISPLAY_LEN_MAX_8300)) return (PARSER_GLOBAL_LENGTH);
14707
14708 u32 *digest = (u32 *) hash_buf->digest;
14709
14710 salt_t *salt = hash_buf->salt;
14711
14712 /**
14713 * parse line
14714 */
14715
14716 char *hashbuf_pos = input_buf;
14717
14718 char *domainbuf_pos = strchr (hashbuf_pos, ':');
14719
14720 if (domainbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14721
14722 const uint hashbuf_len = domainbuf_pos - hashbuf_pos;
14723
14724 if (hashbuf_len != 32) return (PARSER_HASH_LENGTH);
14725
14726 domainbuf_pos++;
14727
14728 if (domainbuf_pos[0] != '.') return (PARSER_SALT_VALUE);
14729
14730 char *saltbuf_pos = strchr (domainbuf_pos, ':');
14731
14732 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14733
14734 const uint domainbuf_len = saltbuf_pos - domainbuf_pos;
14735
14736 if (domainbuf_len >= 32) return (PARSER_SALT_LENGTH);
14737
14738 saltbuf_pos++;
14739
14740 char *iteration_pos = strchr (saltbuf_pos, ':');
14741
14742 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14743
14744 const uint saltbuf_len = iteration_pos - saltbuf_pos;
14745
14746 if (saltbuf_len >= 28) return (PARSER_SALT_LENGTH); // 28 = 32 - 4; 4 = length
14747
14748 if ((domainbuf_len + saltbuf_len) >= 48) return (PARSER_SALT_LENGTH);
14749
14750 iteration_pos++;
14751
14752 const uint iteration_len = input_len - hashbuf_len - 1 - domainbuf_len - 1 - saltbuf_len - 1;
14753
14754 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
14755 if (iteration_len > 5) return (PARSER_SALT_ITERATION);
14756
14757 // ok, the plan for this algorithm is the following:
14758 // we have 2 salts here, the domain-name and a random salt
14759 // while both are used in the initial transformation,
14760 // only the random salt is used in the following iterations
14761 // so we create two buffer, one that includes domain-name (stored into salt_buf_pc[])
14762 // and one that includes only the real salt (stored into salt_buf[]).
14763 // the domain-name length is put into array position 7 of salt_buf_pc[] since there is not salt_pc_len
14764
14765 u8 tmp_buf[100] = { 0 };
14766
14767 base32_decode (itoa32_to_int, (const u8 *) hashbuf_pos, 32, tmp_buf);
14768
14769 memcpy (digest, tmp_buf, 20);
14770
14771 digest[0] = byte_swap_32 (digest[0]);
14772 digest[1] = byte_swap_32 (digest[1]);
14773 digest[2] = byte_swap_32 (digest[2]);
14774 digest[3] = byte_swap_32 (digest[3]);
14775 digest[4] = byte_swap_32 (digest[4]);
14776
14777 // domain
14778
14779 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
14780
14781 memcpy (salt_buf_pc_ptr, domainbuf_pos, domainbuf_len);
14782
14783 char *len_ptr = NULL;
14784
14785 for (uint i = 0; i < domainbuf_len; i++)
14786 {
14787 if (salt_buf_pc_ptr[i] == '.')
14788 {
14789 len_ptr = &salt_buf_pc_ptr[i];
14790
14791 *len_ptr = 0;
14792 }
14793 else
14794 {
14795 *len_ptr += 1;
14796 }
14797 }
14798
14799 salt->salt_buf_pc[7] = domainbuf_len;
14800
14801 // "real" salt
14802
14803 char *salt_buf_ptr = (char *) salt->salt_buf;
14804
14805 const uint salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, saltbuf_len);
14806
14807 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14808
14809 salt->salt_len = salt_len;
14810
14811 // iteration
14812
14813 salt->salt_iter = atoi (iteration_pos);
14814
14815 return (PARSER_OK);
14816 }
14817
14818 int wbb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14819 {
14820 if ((input_len < DISPLAY_LEN_MIN_8400) || (input_len > DISPLAY_LEN_MAX_8400)) return (PARSER_GLOBAL_LENGTH);
14821
14822 u32 *digest = (u32 *) hash_buf->digest;
14823
14824 salt_t *salt = hash_buf->salt;
14825
14826 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14827 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14828 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14829 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14830 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
14831
14832 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14833
14834 uint salt_len = input_len - 40 - 1;
14835
14836 char *salt_buf = input_buf + 40 + 1;
14837
14838 char *salt_buf_ptr = (char *) salt->salt_buf;
14839
14840 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14841
14842 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14843
14844 salt->salt_len = salt_len;
14845
14846 return (PARSER_OK);
14847 }
14848
14849 int racf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14850 {
14851 const u8 ascii_to_ebcdic[] =
14852 {
14853 0x00, 0x01, 0x02, 0x03, 0x37, 0x2d, 0x2e, 0x2f, 0x16, 0x05, 0x25, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
14854 0x10, 0x11, 0x12, 0x13, 0x3c, 0x3d, 0x32, 0x26, 0x18, 0x19, 0x3f, 0x27, 0x1c, 0x1d, 0x1e, 0x1f,
14855 0x40, 0x4f, 0x7f, 0x7b, 0x5b, 0x6c, 0x50, 0x7d, 0x4d, 0x5d, 0x5c, 0x4e, 0x6b, 0x60, 0x4b, 0x61,
14856 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0x7a, 0x5e, 0x4c, 0x7e, 0x6e, 0x6f,
14857 0x7c, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6,
14858 0xd7, 0xd8, 0xd9, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0x4a, 0xe0, 0x5a, 0x5f, 0x6d,
14859 0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
14860 0x97, 0x98, 0x99, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xc0, 0x6a, 0xd0, 0xa1, 0x07,
14861 0x20, 0x21, 0x22, 0x23, 0x24, 0x15, 0x06, 0x17, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x09, 0x0a, 0x1b,
14862 0x30, 0x31, 0x1a, 0x33, 0x34, 0x35, 0x36, 0x08, 0x38, 0x39, 0x3a, 0x3b, 0x04, 0x14, 0x3e, 0xe1,
14863 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
14864 0x58, 0x59, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75,
14865 0x76, 0x77, 0x78, 0x80, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e,
14866 0x9f, 0xa0, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
14867 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xda, 0xdb,
14868 0xdc, 0xdd, 0xde, 0xdf, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
14869 };
14870
14871 if ((input_len < DISPLAY_LEN_MIN_8500) || (input_len > DISPLAY_LEN_MAX_8500)) return (PARSER_GLOBAL_LENGTH);
14872
14873 if (memcmp (SIGNATURE_RACF, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14874
14875 u32 *digest = (u32 *) hash_buf->digest;
14876
14877 salt_t *salt = hash_buf->salt;
14878
14879 char *salt_pos = input_buf + 6 + 1;
14880
14881 char *digest_pos = strchr (salt_pos, '*');
14882
14883 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14884
14885 uint salt_len = digest_pos - salt_pos;
14886
14887 if (salt_len > 8) return (PARSER_SALT_LENGTH);
14888
14889 uint hash_len = input_len - 1 - salt_len - 1 - 6;
14890
14891 if (hash_len != 16) return (PARSER_HASH_LENGTH);
14892
14893 digest_pos++;
14894
14895 char *salt_buf_ptr = (char *) salt->salt_buf;
14896 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
14897
14898 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
14899
14900 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14901
14902 salt->salt_len = salt_len;
14903
14904 for (uint i = 0; i < salt_len; i++)
14905 {
14906 salt_buf_pc_ptr[i] = ascii_to_ebcdic[(int) salt_buf_ptr[i]];
14907 }
14908 for (uint i = salt_len; i < 8; i++)
14909 {
14910 salt_buf_pc_ptr[i] = 0x40;
14911 }
14912
14913 uint tt;
14914
14915 IP (salt->salt_buf_pc[0], salt->salt_buf_pc[1], tt);
14916
14917 salt->salt_buf_pc[0] = rotl32 (salt->salt_buf_pc[0], 3u);
14918 salt->salt_buf_pc[1] = rotl32 (salt->salt_buf_pc[1], 3u);
14919
14920 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
14921 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
14922
14923 digest[0] = byte_swap_32 (digest[0]);
14924 digest[1] = byte_swap_32 (digest[1]);
14925
14926 IP (digest[0], digest[1], tt);
14927
14928 digest[0] = rotr32 (digest[0], 29);
14929 digest[1] = rotr32 (digest[1], 29);
14930 digest[2] = 0;
14931 digest[3] = 0;
14932
14933 return (PARSER_OK);
14934 }
14935
14936 int lotus5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14937 {
14938 if ((input_len < DISPLAY_LEN_MIN_8600) || (input_len > DISPLAY_LEN_MAX_8600)) return (PARSER_GLOBAL_LENGTH);
14939
14940 u32 *digest = (u32 *) hash_buf->digest;
14941
14942 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14943 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14944 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14945 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14946
14947 digest[0] = byte_swap_32 (digest[0]);
14948 digest[1] = byte_swap_32 (digest[1]);
14949 digest[2] = byte_swap_32 (digest[2]);
14950 digest[3] = byte_swap_32 (digest[3]);
14951
14952 return (PARSER_OK);
14953 }
14954
14955 int lotus6_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14956 {
14957 if ((input_len < DISPLAY_LEN_MIN_8700) || (input_len > DISPLAY_LEN_MAX_8700)) return (PARSER_GLOBAL_LENGTH);
14958
14959 if ((input_buf[0] != '(') || (input_buf[1] != 'G') || (input_buf[21] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
14960
14961 u32 *digest = (u32 *) hash_buf->digest;
14962
14963 salt_t *salt = hash_buf->salt;
14964
14965 u8 tmp_buf[120] = { 0 };
14966
14967 base64_decode (lotus64_to_int, (const u8 *) input_buf + 2, input_len - 3, tmp_buf);
14968
14969 tmp_buf[3] += -4; // dont ask!
14970
14971 memcpy (salt->salt_buf, tmp_buf, 5);
14972
14973 salt->salt_len = 5;
14974
14975 memcpy (digest, tmp_buf + 5, 9);
14976
14977 // yes, only 9 byte are needed to crack, but 10 to display
14978
14979 salt->salt_buf_pc[7] = input_buf[20];
14980
14981 return (PARSER_OK);
14982 }
14983
14984 int lotus8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14985 {
14986 if ((input_len < DISPLAY_LEN_MIN_9100) || (input_len > DISPLAY_LEN_MAX_9100)) return (PARSER_GLOBAL_LENGTH);
14987
14988 if ((input_buf[0] != '(') || (input_buf[1] != 'H') || (input_buf[DISPLAY_LEN_MAX_9100 - 1] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
14989
14990 u32 *digest = (u32 *) hash_buf->digest;
14991
14992 salt_t *salt = hash_buf->salt;
14993
14994 u8 tmp_buf[120] = { 0 };
14995
14996 base64_decode (lotus64_to_int, (const u8 *) input_buf + 2, input_len - 3, tmp_buf);
14997
14998 tmp_buf[3] += -4; // dont ask!
14999
15000 // salt
15001
15002 memcpy (salt->salt_buf, tmp_buf, 16);
15003
15004 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)
15005
15006 // iteration
15007
15008 char tmp_iter_buf[11] = { 0 };
15009
15010 memcpy (tmp_iter_buf, tmp_buf + 16, 10);
15011
15012 tmp_iter_buf[10] = 0;
15013
15014 salt->salt_iter = atoi (tmp_iter_buf);
15015
15016 if (salt->salt_iter < 1) // well, the limit hopefully is much higher
15017 {
15018 return (PARSER_SALT_ITERATION);
15019 }
15020
15021 salt->salt_iter--; // first round in init
15022
15023 // 2 additional bytes for display only
15024
15025 salt->salt_buf_pc[0] = tmp_buf[26];
15026 salt->salt_buf_pc[1] = tmp_buf[27];
15027
15028 // digest
15029
15030 memcpy (digest, tmp_buf + 28, 8);
15031
15032 digest[0] = byte_swap_32 (digest[0]);
15033 digest[1] = byte_swap_32 (digest[1]);
15034 digest[2] = 0;
15035 digest[3] = 0;
15036
15037 return (PARSER_OK);
15038 }
15039
15040 int hmailserver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15041 {
15042 if ((input_len < DISPLAY_LEN_MIN_1421) || (input_len > DISPLAY_LEN_MAX_1421)) return (PARSER_GLOBAL_LENGTH);
15043
15044 u32 *digest = (u32 *) hash_buf->digest;
15045
15046 salt_t *salt = hash_buf->salt;
15047
15048 char *salt_buf_pos = input_buf;
15049
15050 char *hash_buf_pos = salt_buf_pos + 6;
15051
15052 digest[0] = hex_to_u32 ((const u8 *) &hash_buf_pos[ 0]);
15053 digest[1] = hex_to_u32 ((const u8 *) &hash_buf_pos[ 8]);
15054 digest[2] = hex_to_u32 ((const u8 *) &hash_buf_pos[16]);
15055 digest[3] = hex_to_u32 ((const u8 *) &hash_buf_pos[24]);
15056 digest[4] = hex_to_u32 ((const u8 *) &hash_buf_pos[32]);
15057 digest[5] = hex_to_u32 ((const u8 *) &hash_buf_pos[40]);
15058 digest[6] = hex_to_u32 ((const u8 *) &hash_buf_pos[48]);
15059 digest[7] = hex_to_u32 ((const u8 *) &hash_buf_pos[56]);
15060
15061 digest[0] -= SHA256M_A;
15062 digest[1] -= SHA256M_B;
15063 digest[2] -= SHA256M_C;
15064 digest[3] -= SHA256M_D;
15065 digest[4] -= SHA256M_E;
15066 digest[5] -= SHA256M_F;
15067 digest[6] -= SHA256M_G;
15068 digest[7] -= SHA256M_H;
15069
15070 char *salt_buf_ptr = (char *) salt->salt_buf;
15071
15072 const uint salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf_pos, 6);
15073
15074 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
15075
15076 salt->salt_len = salt_len;
15077
15078 return (PARSER_OK);
15079 }
15080
15081 int phps_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15082 {
15083 if ((input_len < DISPLAY_LEN_MIN_2612) || (input_len > DISPLAY_LEN_MAX_2612)) return (PARSER_GLOBAL_LENGTH);
15084
15085 u32 *digest = (u32 *) hash_buf->digest;
15086
15087 if (memcmp (SIGNATURE_PHPS, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
15088
15089 salt_t *salt = hash_buf->salt;
15090
15091 char *salt_buf = input_buf + 6;
15092
15093 char *digest_buf = strchr (salt_buf, '$');
15094
15095 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15096
15097 uint salt_len = digest_buf - salt_buf;
15098
15099 digest_buf++; // skip the '$' symbol
15100
15101 char *salt_buf_ptr = (char *) salt->salt_buf;
15102
15103 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
15104
15105 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
15106
15107 salt->salt_len = salt_len;
15108
15109 digest[0] = hex_to_u32 ((const u8 *) &digest_buf[ 0]);
15110 digest[1] = hex_to_u32 ((const u8 *) &digest_buf[ 8]);
15111 digest[2] = hex_to_u32 ((const u8 *) &digest_buf[16]);
15112 digest[3] = hex_to_u32 ((const u8 *) &digest_buf[24]);
15113
15114 digest[0] = byte_swap_32 (digest[0]);
15115 digest[1] = byte_swap_32 (digest[1]);
15116 digest[2] = byte_swap_32 (digest[2]);
15117 digest[3] = byte_swap_32 (digest[3]);
15118
15119 digest[0] -= MD5M_A;
15120 digest[1] -= MD5M_B;
15121 digest[2] -= MD5M_C;
15122 digest[3] -= MD5M_D;
15123
15124 return (PARSER_OK);
15125 }
15126
15127 int mediawiki_b_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15128 {
15129 if ((input_len < DISPLAY_LEN_MIN_3711) || (input_len > DISPLAY_LEN_MAX_3711)) return (PARSER_GLOBAL_LENGTH);
15130
15131 if (memcmp (SIGNATURE_MEDIAWIKI_B, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
15132
15133 u32 *digest = (u32 *) hash_buf->digest;
15134
15135 salt_t *salt = hash_buf->salt;
15136
15137 char *salt_buf = input_buf + 3;
15138
15139 char *digest_buf = strchr (salt_buf, '$');
15140
15141 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15142
15143 uint salt_len = digest_buf - salt_buf;
15144
15145 digest_buf++; // skip the '$' symbol
15146
15147 char *salt_buf_ptr = (char *) salt->salt_buf;
15148
15149 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
15150
15151 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
15152
15153 salt_buf_ptr[salt_len] = 0x2d;
15154
15155 salt->salt_len = salt_len + 1;
15156
15157 digest[0] = hex_to_u32 ((const u8 *) &digest_buf[ 0]);
15158 digest[1] = hex_to_u32 ((const u8 *) &digest_buf[ 8]);
15159 digest[2] = hex_to_u32 ((const u8 *) &digest_buf[16]);
15160 digest[3] = hex_to_u32 ((const u8 *) &digest_buf[24]);
15161
15162 digest[0] = byte_swap_32 (digest[0]);
15163 digest[1] = byte_swap_32 (digest[1]);
15164 digest[2] = byte_swap_32 (digest[2]);
15165 digest[3] = byte_swap_32 (digest[3]);
15166
15167 digest[0] -= MD5M_A;
15168 digest[1] -= MD5M_B;
15169 digest[2] -= MD5M_C;
15170 digest[3] -= MD5M_D;
15171
15172 return (PARSER_OK);
15173 }
15174
15175 int peoplesoft_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15176 {
15177 if ((input_len < DISPLAY_LEN_MIN_133) || (input_len > DISPLAY_LEN_MAX_133)) return (PARSER_GLOBAL_LENGTH);
15178
15179 u32 *digest = (u32 *) hash_buf->digest;
15180
15181 salt_t *salt = hash_buf->salt;
15182
15183 u8 tmp_buf[100] = { 0 };
15184
15185 base64_decode (base64_to_int, (const u8 *) input_buf, input_len, tmp_buf);
15186
15187 memcpy (digest, tmp_buf, 20);
15188
15189 digest[0] = byte_swap_32 (digest[0]);
15190 digest[1] = byte_swap_32 (digest[1]);
15191 digest[2] = byte_swap_32 (digest[2]);
15192 digest[3] = byte_swap_32 (digest[3]);
15193 digest[4] = byte_swap_32 (digest[4]);
15194
15195 digest[0] -= SHA1M_A;
15196 digest[1] -= SHA1M_B;
15197 digest[2] -= SHA1M_C;
15198 digest[3] -= SHA1M_D;
15199 digest[4] -= SHA1M_E;
15200
15201 salt->salt_buf[0] = 0x80;
15202
15203 salt->salt_len = 0;
15204
15205 return (PARSER_OK);
15206 }
15207
15208 int skype_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15209 {
15210 if ((input_len < DISPLAY_LEN_MIN_23) || (input_len > DISPLAY_LEN_MAX_23)) return (PARSER_GLOBAL_LENGTH);
15211
15212 u32 *digest = (u32 *) hash_buf->digest;
15213
15214 salt_t *salt = hash_buf->salt;
15215
15216 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
15217 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
15218 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
15219 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
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
15226 digest[0] -= MD5M_A;
15227 digest[1] -= MD5M_B;
15228 digest[2] -= MD5M_C;
15229 digest[3] -= MD5M_D;
15230
15231 if (input_buf[32] != ':') return (PARSER_SEPARATOR_UNMATCHED);
15232
15233 uint salt_len = input_len - 32 - 1;
15234
15235 char *salt_buf = input_buf + 32 + 1;
15236
15237 char *salt_buf_ptr = (char *) salt->salt_buf;
15238
15239 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
15240
15241 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
15242
15243 /*
15244 * add static "salt" part
15245 */
15246
15247 memcpy (salt_buf_ptr + salt_len, "\nskyper\n", 8);
15248
15249 salt_len += 8;
15250
15251 salt->salt_len = salt_len;
15252
15253 return (PARSER_OK);
15254 }
15255
15256 int androidfde_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15257 {
15258 if ((input_len < DISPLAY_LEN_MIN_8800) || (input_len > DISPLAY_LEN_MAX_8800)) return (PARSER_GLOBAL_LENGTH);
15259
15260 if (memcmp (SIGNATURE_ANDROIDFDE, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
15261
15262 u32 *digest = (u32 *) hash_buf->digest;
15263
15264 salt_t *salt = hash_buf->salt;
15265
15266 androidfde_t *androidfde = (androidfde_t *) hash_buf->esalt;
15267
15268 /**
15269 * parse line
15270 */
15271
15272 char *saltlen_pos = input_buf + 1 + 3 + 1;
15273
15274 char *saltbuf_pos = strchr (saltlen_pos, '$');
15275
15276 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15277
15278 uint saltlen_len = saltbuf_pos - saltlen_pos;
15279
15280 if (saltlen_len != 2) return (PARSER_SALT_LENGTH);
15281
15282 saltbuf_pos++;
15283
15284 char *keylen_pos = strchr (saltbuf_pos, '$');
15285
15286 if (keylen_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15287
15288 uint saltbuf_len = keylen_pos - saltbuf_pos;
15289
15290 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
15291
15292 keylen_pos++;
15293
15294 char *keybuf_pos = strchr (keylen_pos, '$');
15295
15296 if (keybuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15297
15298 uint keylen_len = keybuf_pos - keylen_pos;
15299
15300 if (keylen_len != 2) return (PARSER_SALT_LENGTH);
15301
15302 keybuf_pos++;
15303
15304 char *databuf_pos = strchr (keybuf_pos, '$');
15305
15306 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15307
15308 uint keybuf_len = databuf_pos - keybuf_pos;
15309
15310 if (keybuf_len != 32) return (PARSER_SALT_LENGTH);
15311
15312 databuf_pos++;
15313
15314 uint data_len = input_len - 1 - 3 - 1 - saltlen_len - 1 - saltbuf_len - 1 - keylen_len - 1 - keybuf_len - 1;
15315
15316 if (data_len != 3072) return (PARSER_SALT_LENGTH);
15317
15318 /**
15319 * copy data
15320 */
15321
15322 digest[0] = hex_to_u32 ((const u8 *) &keybuf_pos[ 0]);
15323 digest[1] = hex_to_u32 ((const u8 *) &keybuf_pos[ 8]);
15324 digest[2] = hex_to_u32 ((const u8 *) &keybuf_pos[16]);
15325 digest[3] = hex_to_u32 ((const u8 *) &keybuf_pos[24]);
15326
15327 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &saltbuf_pos[ 0]);
15328 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &saltbuf_pos[ 8]);
15329 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &saltbuf_pos[16]);
15330 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &saltbuf_pos[24]);
15331
15332 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15333 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15334 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15335 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15336
15337 salt->salt_len = 16;
15338 salt->salt_iter = ROUNDS_ANDROIDFDE - 1;
15339
15340 for (uint i = 0, j = 0; i < 3072; i += 8, j += 1)
15341 {
15342 androidfde->data[j] = hex_to_u32 ((const u8 *) &databuf_pos[i]);
15343 }
15344
15345 return (PARSER_OK);
15346 }
15347
15348 int scrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15349 {
15350 if ((input_len < DISPLAY_LEN_MIN_8900) || (input_len > DISPLAY_LEN_MAX_8900)) return (PARSER_GLOBAL_LENGTH);
15351
15352 if (memcmp (SIGNATURE_SCRYPT, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
15353
15354 u32 *digest = (u32 *) hash_buf->digest;
15355
15356 salt_t *salt = hash_buf->salt;
15357
15358 /**
15359 * parse line
15360 */
15361
15362 // first is the N salt parameter
15363
15364 char *N_pos = input_buf + 6;
15365
15366 if (N_pos[0] != ':') return (PARSER_SEPARATOR_UNMATCHED);
15367
15368 N_pos++;
15369
15370 salt->scrypt_N = atoi (N_pos);
15371
15372 // r
15373
15374 char *r_pos = strchr (N_pos, ':');
15375
15376 if (r_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15377
15378 r_pos++;
15379
15380 salt->scrypt_r = atoi (r_pos);
15381
15382 // p
15383
15384 char *p_pos = strchr (r_pos, ':');
15385
15386 if (p_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15387
15388 p_pos++;
15389
15390 salt->scrypt_p = atoi (p_pos);
15391
15392 // salt
15393
15394 char *saltbuf_pos = strchr (p_pos, ':');
15395
15396 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15397
15398 saltbuf_pos++;
15399
15400 char *hash_pos = strchr (saltbuf_pos, ':');
15401
15402 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15403
15404 hash_pos++;
15405
15406 // base64 decode
15407
15408 int salt_len_base64 = hash_pos - saltbuf_pos;
15409
15410 if (salt_len_base64 > 45) return (PARSER_SALT_LENGTH);
15411
15412 u8 tmp_buf[33] = { 0 };
15413
15414 int tmp_len = base64_decode (base64_to_int, (const u8 *) saltbuf_pos, salt_len_base64, tmp_buf);
15415
15416 char *salt_buf_ptr = (char *) salt->salt_buf;
15417
15418 memcpy (salt_buf_ptr, tmp_buf, tmp_len);
15419
15420 salt->salt_len = tmp_len;
15421 salt->salt_iter = 1;
15422
15423 // digest - base64 decode
15424
15425 memset (tmp_buf, 0, sizeof (tmp_buf));
15426
15427 tmp_len = input_len - (hash_pos - input_buf);
15428
15429 if (tmp_len != 44) return (PARSER_GLOBAL_LENGTH);
15430
15431 base64_decode (base64_to_int, (const u8 *) hash_pos, tmp_len, tmp_buf);
15432
15433 memcpy (digest, tmp_buf, 32);
15434
15435 return (PARSER_OK);
15436 }
15437
15438 int juniper_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15439 {
15440 if ((input_len < DISPLAY_LEN_MIN_501) || (input_len > DISPLAY_LEN_MAX_501)) return (PARSER_GLOBAL_LENGTH);
15441
15442 u32 *digest = (u32 *) hash_buf->digest;
15443
15444 salt_t *salt = hash_buf->salt;
15445
15446 /**
15447 * parse line
15448 */
15449
15450 char decrypted[76] = { 0 }; // iv + hash
15451
15452 juniper_decrypt_hash (input_buf, decrypted);
15453
15454 char *md5crypt_hash = decrypted + 12;
15455
15456 if (memcmp (md5crypt_hash, "$1$danastre$", 12)) return (PARSER_SALT_VALUE);
15457
15458 salt->salt_iter = ROUNDS_MD5CRYPT;
15459
15460 char *salt_pos = md5crypt_hash + 3;
15461
15462 char *hash_pos = strchr (salt_pos, '$'); // or simply salt_pos + 8
15463
15464 salt->salt_len = hash_pos - salt_pos; // should be 8
15465
15466 memcpy ((char *) salt->salt_buf, salt_pos, salt->salt_len);
15467
15468 hash_pos++;
15469
15470 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
15471
15472 return (PARSER_OK);
15473 }
15474
15475 int cisco8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15476 {
15477 if ((input_len < DISPLAY_LEN_MIN_9200) || (input_len > DISPLAY_LEN_MAX_9200)) return (PARSER_GLOBAL_LENGTH);
15478
15479 if (memcmp (SIGNATURE_CISCO8, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
15480
15481 u32 *digest = (u32 *) hash_buf->digest;
15482
15483 salt_t *salt = hash_buf->salt;
15484
15485 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
15486
15487 /**
15488 * parse line
15489 */
15490
15491 // first is *raw* salt
15492
15493 char *salt_pos = input_buf + 3;
15494
15495 char *hash_pos = strchr (salt_pos, '$');
15496
15497 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15498
15499 uint salt_len = hash_pos - salt_pos;
15500
15501 if (salt_len != 14) return (PARSER_SALT_LENGTH);
15502
15503 hash_pos++;
15504
15505 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
15506
15507 memcpy (salt_buf_ptr, salt_pos, 14);
15508
15509 salt_buf_ptr[17] = 0x01;
15510 salt_buf_ptr[18] = 0x80;
15511
15512 // add some stuff to normal salt to make sorted happy
15513
15514 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
15515 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
15516 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
15517 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
15518
15519 salt->salt_len = salt_len;
15520 salt->salt_iter = ROUNDS_CISCO8 - 1;
15521
15522 // base64 decode hash
15523
15524 u8 tmp_buf[100] = { 0 };
15525
15526 uint hash_len = input_len - 3 - salt_len - 1;
15527
15528 int tmp_len = base64_decode (itoa64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
15529
15530 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
15531
15532 memcpy (digest, tmp_buf, 32);
15533
15534 digest[0] = byte_swap_32 (digest[0]);
15535 digest[1] = byte_swap_32 (digest[1]);
15536 digest[2] = byte_swap_32 (digest[2]);
15537 digest[3] = byte_swap_32 (digest[3]);
15538 digest[4] = byte_swap_32 (digest[4]);
15539 digest[5] = byte_swap_32 (digest[5]);
15540 digest[6] = byte_swap_32 (digest[6]);
15541 digest[7] = byte_swap_32 (digest[7]);
15542
15543 return (PARSER_OK);
15544 }
15545
15546 int cisco9_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15547 {
15548 if ((input_len < DISPLAY_LEN_MIN_9300) || (input_len > DISPLAY_LEN_MAX_9300)) return (PARSER_GLOBAL_LENGTH);
15549
15550 if (memcmp (SIGNATURE_CISCO9, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
15551
15552 u32 *digest = (u32 *) hash_buf->digest;
15553
15554 salt_t *salt = hash_buf->salt;
15555
15556 /**
15557 * parse line
15558 */
15559
15560 // first is *raw* salt
15561
15562 char *salt_pos = input_buf + 3;
15563
15564 char *hash_pos = strchr (salt_pos, '$');
15565
15566 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15567
15568 uint salt_len = hash_pos - salt_pos;
15569
15570 if (salt_len != 14) return (PARSER_SALT_LENGTH);
15571
15572 salt->salt_len = salt_len;
15573 hash_pos++;
15574
15575 char *salt_buf_ptr = (char *) salt->salt_buf;
15576
15577 memcpy (salt_buf_ptr, salt_pos, salt_len);
15578 salt_buf_ptr[salt_len] = 0;
15579
15580 // base64 decode hash
15581
15582 u8 tmp_buf[100] = { 0 };
15583
15584 uint hash_len = input_len - 3 - salt_len - 1;
15585
15586 int tmp_len = base64_decode (itoa64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
15587
15588 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
15589
15590 memcpy (digest, tmp_buf, 32);
15591
15592 // fixed:
15593 salt->scrypt_N = 16384;
15594 salt->scrypt_r = 1;
15595 salt->scrypt_p = 1;
15596 salt->salt_iter = 1;
15597
15598 return (PARSER_OK);
15599 }
15600
15601 int office2007_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15602 {
15603 if ((input_len < DISPLAY_LEN_MIN_9400) || (input_len > DISPLAY_LEN_MAX_9400)) return (PARSER_GLOBAL_LENGTH);
15604
15605 if (memcmp (SIGNATURE_OFFICE2007, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
15606
15607 u32 *digest = (u32 *) hash_buf->digest;
15608
15609 salt_t *salt = hash_buf->salt;
15610
15611 office2007_t *office2007 = (office2007_t *) hash_buf->esalt;
15612
15613 /**
15614 * parse line
15615 */
15616
15617 char *version_pos = input_buf + 8 + 1;
15618
15619 char *verifierHashSize_pos = strchr (version_pos, '*');
15620
15621 if (verifierHashSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15622
15623 u32 version_len = verifierHashSize_pos - version_pos;
15624
15625 if (version_len != 4) return (PARSER_SALT_LENGTH);
15626
15627 verifierHashSize_pos++;
15628
15629 char *keySize_pos = strchr (verifierHashSize_pos, '*');
15630
15631 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15632
15633 u32 verifierHashSize_len = keySize_pos - verifierHashSize_pos;
15634
15635 if (verifierHashSize_len != 2) return (PARSER_SALT_LENGTH);
15636
15637 keySize_pos++;
15638
15639 char *saltSize_pos = strchr (keySize_pos, '*');
15640
15641 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15642
15643 u32 keySize_len = saltSize_pos - keySize_pos;
15644
15645 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
15646
15647 saltSize_pos++;
15648
15649 char *osalt_pos = strchr (saltSize_pos, '*');
15650
15651 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15652
15653 u32 saltSize_len = osalt_pos - saltSize_pos;
15654
15655 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
15656
15657 osalt_pos++;
15658
15659 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15660
15661 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15662
15663 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15664
15665 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15666
15667 encryptedVerifier_pos++;
15668
15669 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15670
15671 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15672
15673 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15674
15675 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15676
15677 encryptedVerifierHash_pos++;
15678
15679 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;
15680
15681 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
15682
15683 const uint version = atoi (version_pos);
15684
15685 if (version != 2007) return (PARSER_SALT_VALUE);
15686
15687 const uint verifierHashSize = atoi (verifierHashSize_pos);
15688
15689 if (verifierHashSize != 20) return (PARSER_SALT_VALUE);
15690
15691 const uint keySize = atoi (keySize_pos);
15692
15693 if ((keySize != 128) && (keySize != 256)) return (PARSER_SALT_VALUE);
15694
15695 office2007->keySize = keySize;
15696
15697 const uint saltSize = atoi (saltSize_pos);
15698
15699 if (saltSize != 16) return (PARSER_SALT_VALUE);
15700
15701 /**
15702 * salt
15703 */
15704
15705 salt->salt_len = 16;
15706 salt->salt_iter = ROUNDS_OFFICE2007;
15707
15708 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15709 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15710 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15711 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15712
15713 /**
15714 * esalt
15715 */
15716
15717 office2007->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15718 office2007->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15719 office2007->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15720 office2007->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15721
15722 office2007->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15723 office2007->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15724 office2007->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15725 office2007->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15726 office2007->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15727
15728 /**
15729 * digest
15730 */
15731
15732 digest[0] = office2007->encryptedVerifierHash[0];
15733 digest[1] = office2007->encryptedVerifierHash[1];
15734 digest[2] = office2007->encryptedVerifierHash[2];
15735 digest[3] = office2007->encryptedVerifierHash[3];
15736
15737 return (PARSER_OK);
15738 }
15739
15740 int office2010_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15741 {
15742 if ((input_len < DISPLAY_LEN_MIN_9500) || (input_len > DISPLAY_LEN_MAX_9500)) return (PARSER_GLOBAL_LENGTH);
15743
15744 if (memcmp (SIGNATURE_OFFICE2010, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
15745
15746 u32 *digest = (u32 *) hash_buf->digest;
15747
15748 salt_t *salt = hash_buf->salt;
15749
15750 office2010_t *office2010 = (office2010_t *) hash_buf->esalt;
15751
15752 /**
15753 * parse line
15754 */
15755
15756 char *version_pos = input_buf + 8 + 1;
15757
15758 char *spinCount_pos = strchr (version_pos, '*');
15759
15760 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15761
15762 u32 version_len = spinCount_pos - version_pos;
15763
15764 if (version_len != 4) return (PARSER_SALT_LENGTH);
15765
15766 spinCount_pos++;
15767
15768 char *keySize_pos = strchr (spinCount_pos, '*');
15769
15770 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15771
15772 u32 spinCount_len = keySize_pos - spinCount_pos;
15773
15774 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
15775
15776 keySize_pos++;
15777
15778 char *saltSize_pos = strchr (keySize_pos, '*');
15779
15780 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15781
15782 u32 keySize_len = saltSize_pos - keySize_pos;
15783
15784 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
15785
15786 saltSize_pos++;
15787
15788 char *osalt_pos = strchr (saltSize_pos, '*');
15789
15790 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15791
15792 u32 saltSize_len = osalt_pos - saltSize_pos;
15793
15794 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
15795
15796 osalt_pos++;
15797
15798 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15799
15800 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15801
15802 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15803
15804 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15805
15806 encryptedVerifier_pos++;
15807
15808 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15809
15810 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15811
15812 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15813
15814 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15815
15816 encryptedVerifierHash_pos++;
15817
15818 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;
15819
15820 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
15821
15822 const uint version = atoi (version_pos);
15823
15824 if (version != 2010) return (PARSER_SALT_VALUE);
15825
15826 const uint spinCount = atoi (spinCount_pos);
15827
15828 if (spinCount != 100000) return (PARSER_SALT_VALUE);
15829
15830 const uint keySize = atoi (keySize_pos);
15831
15832 if (keySize != 128) return (PARSER_SALT_VALUE);
15833
15834 const uint saltSize = atoi (saltSize_pos);
15835
15836 if (saltSize != 16) return (PARSER_SALT_VALUE);
15837
15838 /**
15839 * salt
15840 */
15841
15842 salt->salt_len = 16;
15843 salt->salt_iter = spinCount;
15844
15845 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15846 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15847 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15848 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15849
15850 /**
15851 * esalt
15852 */
15853
15854 office2010->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15855 office2010->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15856 office2010->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15857 office2010->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15858
15859 office2010->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15860 office2010->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15861 office2010->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15862 office2010->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15863 office2010->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15864 office2010->encryptedVerifierHash[5] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[40]);
15865 office2010->encryptedVerifierHash[6] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[48]);
15866 office2010->encryptedVerifierHash[7] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[56]);
15867
15868 /**
15869 * digest
15870 */
15871
15872 digest[0] = office2010->encryptedVerifierHash[0];
15873 digest[1] = office2010->encryptedVerifierHash[1];
15874 digest[2] = office2010->encryptedVerifierHash[2];
15875 digest[3] = office2010->encryptedVerifierHash[3];
15876
15877 return (PARSER_OK);
15878 }
15879
15880 int office2013_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15881 {
15882 if ((input_len < DISPLAY_LEN_MIN_9600) || (input_len > DISPLAY_LEN_MAX_9600)) return (PARSER_GLOBAL_LENGTH);
15883
15884 if (memcmp (SIGNATURE_OFFICE2013, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
15885
15886 u32 *digest = (u32 *) hash_buf->digest;
15887
15888 salt_t *salt = hash_buf->salt;
15889
15890 office2013_t *office2013 = (office2013_t *) hash_buf->esalt;
15891
15892 /**
15893 * parse line
15894 */
15895
15896 char *version_pos = input_buf + 8 + 1;
15897
15898 char *spinCount_pos = strchr (version_pos, '*');
15899
15900 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15901
15902 u32 version_len = spinCount_pos - version_pos;
15903
15904 if (version_len != 4) return (PARSER_SALT_LENGTH);
15905
15906 spinCount_pos++;
15907
15908 char *keySize_pos = strchr (spinCount_pos, '*');
15909
15910 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15911
15912 u32 spinCount_len = keySize_pos - spinCount_pos;
15913
15914 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
15915
15916 keySize_pos++;
15917
15918 char *saltSize_pos = strchr (keySize_pos, '*');
15919
15920 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15921
15922 u32 keySize_len = saltSize_pos - keySize_pos;
15923
15924 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
15925
15926 saltSize_pos++;
15927
15928 char *osalt_pos = strchr (saltSize_pos, '*');
15929
15930 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15931
15932 u32 saltSize_len = osalt_pos - saltSize_pos;
15933
15934 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
15935
15936 osalt_pos++;
15937
15938 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15939
15940 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15941
15942 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15943
15944 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15945
15946 encryptedVerifier_pos++;
15947
15948 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15949
15950 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15951
15952 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15953
15954 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15955
15956 encryptedVerifierHash_pos++;
15957
15958 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;
15959
15960 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
15961
15962 const uint version = atoi (version_pos);
15963
15964 if (version != 2013) return (PARSER_SALT_VALUE);
15965
15966 const uint spinCount = atoi (spinCount_pos);
15967
15968 if (spinCount != 100000) return (PARSER_SALT_VALUE);
15969
15970 const uint keySize = atoi (keySize_pos);
15971
15972 if (keySize != 256) return (PARSER_SALT_VALUE);
15973
15974 const uint saltSize = atoi (saltSize_pos);
15975
15976 if (saltSize != 16) return (PARSER_SALT_VALUE);
15977
15978 /**
15979 * salt
15980 */
15981
15982 salt->salt_len = 16;
15983 salt->salt_iter = spinCount;
15984
15985 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15986 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15987 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15988 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15989
15990 /**
15991 * esalt
15992 */
15993
15994 office2013->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15995 office2013->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15996 office2013->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15997 office2013->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15998
15999 office2013->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
16000 office2013->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
16001 office2013->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
16002 office2013->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
16003 office2013->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
16004 office2013->encryptedVerifierHash[5] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[40]);
16005 office2013->encryptedVerifierHash[6] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[48]);
16006 office2013->encryptedVerifierHash[7] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[56]);
16007
16008 /**
16009 * digest
16010 */
16011
16012 digest[0] = office2013->encryptedVerifierHash[0];
16013 digest[1] = office2013->encryptedVerifierHash[1];
16014 digest[2] = office2013->encryptedVerifierHash[2];
16015 digest[3] = office2013->encryptedVerifierHash[3];
16016
16017 return (PARSER_OK);
16018 }
16019
16020 int oldoffice01_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16021 {
16022 if ((input_len < DISPLAY_LEN_MIN_9700) || (input_len > DISPLAY_LEN_MAX_9700)) return (PARSER_GLOBAL_LENGTH);
16023
16024 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
16025
16026 u32 *digest = (u32 *) hash_buf->digest;
16027
16028 salt_t *salt = hash_buf->salt;
16029
16030 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
16031
16032 /**
16033 * parse line
16034 */
16035
16036 char *version_pos = input_buf + 11;
16037
16038 char *osalt_pos = strchr (version_pos, '*');
16039
16040 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16041
16042 u32 version_len = osalt_pos - version_pos;
16043
16044 if (version_len != 1) return (PARSER_SALT_LENGTH);
16045
16046 osalt_pos++;
16047
16048 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
16049
16050 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16051
16052 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
16053
16054 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
16055
16056 encryptedVerifier_pos++;
16057
16058 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
16059
16060 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16061
16062 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
16063
16064 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
16065
16066 encryptedVerifierHash_pos++;
16067
16068 u32 encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
16069
16070 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
16071
16072 const uint version = *version_pos - 0x30;
16073
16074 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
16075
16076 /**
16077 * esalt
16078 */
16079
16080 oldoffice01->version = version;
16081
16082 oldoffice01->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
16083 oldoffice01->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
16084 oldoffice01->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
16085 oldoffice01->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
16086
16087 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
16088 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
16089 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
16090 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
16091
16092 oldoffice01->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
16093 oldoffice01->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
16094 oldoffice01->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
16095 oldoffice01->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
16096
16097 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
16098 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
16099 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
16100 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
16101
16102 /**
16103 * salt
16104 */
16105
16106 salt->salt_len = 16;
16107
16108 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
16109 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
16110 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
16111 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
16112
16113 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
16114 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
16115 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
16116 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
16117
16118 // this is a workaround as office produces multiple documents with the same salt
16119
16120 salt->salt_len += 32;
16121
16122 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
16123 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
16124 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
16125 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
16126 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
16127 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
16128 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
16129 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
16130
16131 /**
16132 * digest
16133 */
16134
16135 digest[0] = oldoffice01->encryptedVerifierHash[0];
16136 digest[1] = oldoffice01->encryptedVerifierHash[1];
16137 digest[2] = oldoffice01->encryptedVerifierHash[2];
16138 digest[3] = oldoffice01->encryptedVerifierHash[3];
16139
16140 return (PARSER_OK);
16141 }
16142
16143 int oldoffice01cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16144 {
16145 return oldoffice01_parse_hash (input_buf, input_len, hash_buf);
16146 }
16147
16148 int oldoffice01cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16149 {
16150 if ((input_len < DISPLAY_LEN_MIN_9720) || (input_len > DISPLAY_LEN_MAX_9720)) return (PARSER_GLOBAL_LENGTH);
16151
16152 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
16153
16154 u32 *digest = (u32 *) hash_buf->digest;
16155
16156 salt_t *salt = hash_buf->salt;
16157
16158 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
16159
16160 /**
16161 * parse line
16162 */
16163
16164 char *version_pos = input_buf + 11;
16165
16166 char *osalt_pos = strchr (version_pos, '*');
16167
16168 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16169
16170 u32 version_len = osalt_pos - version_pos;
16171
16172 if (version_len != 1) return (PARSER_SALT_LENGTH);
16173
16174 osalt_pos++;
16175
16176 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
16177
16178 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16179
16180 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
16181
16182 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
16183
16184 encryptedVerifier_pos++;
16185
16186 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
16187
16188 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16189
16190 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
16191
16192 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
16193
16194 encryptedVerifierHash_pos++;
16195
16196 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
16197
16198 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16199
16200 u32 encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
16201
16202 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
16203
16204 rc4key_pos++;
16205
16206 u32 rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
16207
16208 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
16209
16210 const uint version = *version_pos - 0x30;
16211
16212 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
16213
16214 /**
16215 * esalt
16216 */
16217
16218 oldoffice01->version = version;
16219
16220 oldoffice01->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
16221 oldoffice01->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
16222 oldoffice01->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
16223 oldoffice01->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
16224
16225 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
16226 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
16227 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
16228 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
16229
16230 oldoffice01->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
16231 oldoffice01->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
16232 oldoffice01->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
16233 oldoffice01->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
16234
16235 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
16236 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
16237 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
16238 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
16239
16240 oldoffice01->rc4key[1] = 0;
16241 oldoffice01->rc4key[0] = 0;
16242
16243 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
16244 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
16245 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
16246 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
16247 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
16248 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
16249 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
16250 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
16251 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
16252 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
16253
16254 oldoffice01->rc4key[0] = byte_swap_32 (oldoffice01->rc4key[0]);
16255 oldoffice01->rc4key[1] = byte_swap_32 (oldoffice01->rc4key[1]);
16256
16257 /**
16258 * salt
16259 */
16260
16261 salt->salt_len = 16;
16262
16263 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
16264 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
16265 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
16266 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
16267
16268 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
16269 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
16270 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
16271 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
16272
16273 // this is a workaround as office produces multiple documents with the same salt
16274
16275 salt->salt_len += 32;
16276
16277 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
16278 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
16279 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
16280 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
16281 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
16282 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
16283 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
16284 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
16285
16286 /**
16287 * digest
16288 */
16289
16290 digest[0] = oldoffice01->rc4key[0];
16291 digest[1] = oldoffice01->rc4key[1];
16292 digest[2] = 0;
16293 digest[3] = 0;
16294
16295 return (PARSER_OK);
16296 }
16297
16298 int oldoffice34_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16299 {
16300 if ((input_len < DISPLAY_LEN_MIN_9800) || (input_len > DISPLAY_LEN_MAX_9800)) return (PARSER_GLOBAL_LENGTH);
16301
16302 if ((memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE4, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
16303
16304 u32 *digest = (u32 *) hash_buf->digest;
16305
16306 salt_t *salt = hash_buf->salt;
16307
16308 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
16309
16310 /**
16311 * parse line
16312 */
16313
16314 char *version_pos = input_buf + 11;
16315
16316 char *osalt_pos = strchr (version_pos, '*');
16317
16318 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16319
16320 u32 version_len = osalt_pos - version_pos;
16321
16322 if (version_len != 1) return (PARSER_SALT_LENGTH);
16323
16324 osalt_pos++;
16325
16326 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
16327
16328 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16329
16330 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
16331
16332 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
16333
16334 encryptedVerifier_pos++;
16335
16336 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
16337
16338 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16339
16340 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
16341
16342 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
16343
16344 encryptedVerifierHash_pos++;
16345
16346 u32 encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
16347
16348 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
16349
16350 const uint version = *version_pos - 0x30;
16351
16352 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
16353
16354 /**
16355 * esalt
16356 */
16357
16358 oldoffice34->version = version;
16359
16360 oldoffice34->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
16361 oldoffice34->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
16362 oldoffice34->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
16363 oldoffice34->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
16364
16365 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
16366 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
16367 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
16368 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
16369
16370 oldoffice34->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
16371 oldoffice34->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
16372 oldoffice34->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
16373 oldoffice34->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
16374 oldoffice34->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
16375
16376 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
16377 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
16378 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
16379 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
16380 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
16381
16382 /**
16383 * salt
16384 */
16385
16386 salt->salt_len = 16;
16387
16388 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
16389 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
16390 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
16391 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
16392
16393 // this is a workaround as office produces multiple documents with the same salt
16394
16395 salt->salt_len += 32;
16396
16397 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
16398 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
16399 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
16400 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
16401 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
16402 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
16403 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
16404 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
16405
16406 /**
16407 * digest
16408 */
16409
16410 digest[0] = oldoffice34->encryptedVerifierHash[0];
16411 digest[1] = oldoffice34->encryptedVerifierHash[1];
16412 digest[2] = oldoffice34->encryptedVerifierHash[2];
16413 digest[3] = oldoffice34->encryptedVerifierHash[3];
16414
16415 return (PARSER_OK);
16416 }
16417
16418 int oldoffice34cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16419 {
16420 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
16421
16422 return oldoffice34_parse_hash (input_buf, input_len, hash_buf);
16423 }
16424
16425 int oldoffice34cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16426 {
16427 if ((input_len < DISPLAY_LEN_MIN_9820) || (input_len > DISPLAY_LEN_MAX_9820)) return (PARSER_GLOBAL_LENGTH);
16428
16429 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
16430
16431 u32 *digest = (u32 *) hash_buf->digest;
16432
16433 salt_t *salt = hash_buf->salt;
16434
16435 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
16436
16437 /**
16438 * parse line
16439 */
16440
16441 char *version_pos = input_buf + 11;
16442
16443 char *osalt_pos = strchr (version_pos, '*');
16444
16445 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16446
16447 u32 version_len = osalt_pos - version_pos;
16448
16449 if (version_len != 1) return (PARSER_SALT_LENGTH);
16450
16451 osalt_pos++;
16452
16453 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
16454
16455 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16456
16457 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
16458
16459 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
16460
16461 encryptedVerifier_pos++;
16462
16463 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
16464
16465 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16466
16467 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
16468
16469 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
16470
16471 encryptedVerifierHash_pos++;
16472
16473 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
16474
16475 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16476
16477 u32 encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
16478
16479 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
16480
16481 rc4key_pos++;
16482
16483 u32 rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
16484
16485 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
16486
16487 const uint version = *version_pos - 0x30;
16488
16489 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
16490
16491 /**
16492 * esalt
16493 */
16494
16495 oldoffice34->version = version;
16496
16497 oldoffice34->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
16498 oldoffice34->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
16499 oldoffice34->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
16500 oldoffice34->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
16501
16502 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
16503 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
16504 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
16505 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
16506
16507 oldoffice34->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
16508 oldoffice34->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
16509 oldoffice34->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
16510 oldoffice34->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
16511 oldoffice34->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
16512
16513 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
16514 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
16515 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
16516 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
16517 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
16518
16519 oldoffice34->rc4key[1] = 0;
16520 oldoffice34->rc4key[0] = 0;
16521
16522 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
16523 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
16524 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
16525 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
16526 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
16527 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
16528 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
16529 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
16530 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
16531 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
16532
16533 oldoffice34->rc4key[0] = byte_swap_32 (oldoffice34->rc4key[0]);
16534 oldoffice34->rc4key[1] = byte_swap_32 (oldoffice34->rc4key[1]);
16535
16536 /**
16537 * salt
16538 */
16539
16540 salt->salt_len = 16;
16541
16542 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
16543 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
16544 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
16545 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
16546
16547 // this is a workaround as office produces multiple documents with the same salt
16548
16549 salt->salt_len += 32;
16550
16551 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
16552 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
16553 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
16554 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
16555 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
16556 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
16557 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
16558 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
16559
16560 /**
16561 * digest
16562 */
16563
16564 digest[0] = oldoffice34->rc4key[0];
16565 digest[1] = oldoffice34->rc4key[1];
16566 digest[2] = 0;
16567 digest[3] = 0;
16568
16569 return (PARSER_OK);
16570 }
16571
16572 int radmin2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16573 {
16574 if ((input_len < DISPLAY_LEN_MIN_9900) || (input_len > DISPLAY_LEN_MAX_9900)) return (PARSER_GLOBAL_LENGTH);
16575
16576 u32 *digest = (u32 *) hash_buf->digest;
16577
16578 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
16579 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
16580 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
16581 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
16582
16583 digest[0] = byte_swap_32 (digest[0]);
16584 digest[1] = byte_swap_32 (digest[1]);
16585 digest[2] = byte_swap_32 (digest[2]);
16586 digest[3] = byte_swap_32 (digest[3]);
16587
16588 return (PARSER_OK);
16589 }
16590
16591 int djangosha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16592 {
16593 if ((input_len < DISPLAY_LEN_MIN_124) || (input_len > DISPLAY_LEN_MAX_124)) return (PARSER_GLOBAL_LENGTH);
16594
16595 if ((memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5)) && (memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16596
16597 u32 *digest = (u32 *) hash_buf->digest;
16598
16599 salt_t *salt = hash_buf->salt;
16600
16601 char *signature_pos = input_buf;
16602
16603 char *salt_pos = strchr (signature_pos, '$');
16604
16605 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16606
16607 u32 signature_len = salt_pos - signature_pos;
16608
16609 if (signature_len != 4) return (PARSER_SIGNATURE_UNMATCHED);
16610
16611 salt_pos++;
16612
16613 char *hash_pos = strchr (salt_pos, '$');
16614
16615 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16616
16617 u32 salt_len = hash_pos - salt_pos;
16618
16619 if (salt_len > 32) return (PARSER_SALT_LENGTH);
16620
16621 hash_pos++;
16622
16623 u32 hash_len = input_len - signature_len - 1 - salt_len - 1;
16624
16625 if (hash_len != 40) return (PARSER_SALT_LENGTH);
16626
16627 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
16628 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
16629 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
16630 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
16631 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
16632
16633 digest[0] -= SHA1M_A;
16634 digest[1] -= SHA1M_B;
16635 digest[2] -= SHA1M_C;
16636 digest[3] -= SHA1M_D;
16637 digest[4] -= SHA1M_E;
16638
16639 char *salt_buf_ptr = (char *) salt->salt_buf;
16640
16641 memcpy (salt_buf_ptr, salt_pos, salt_len);
16642
16643 salt->salt_len = salt_len;
16644
16645 return (PARSER_OK);
16646 }
16647
16648 int djangopbkdf2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16649 {
16650 if ((input_len < DISPLAY_LEN_MIN_10000) || (input_len > DISPLAY_LEN_MAX_10000)) return (PARSER_GLOBAL_LENGTH);
16651
16652 if (memcmp (SIGNATURE_DJANGOPBKDF2, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
16653
16654 u32 *digest = (u32 *) hash_buf->digest;
16655
16656 salt_t *salt = hash_buf->salt;
16657
16658 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
16659
16660 /**
16661 * parse line
16662 */
16663
16664 char *iter_pos = input_buf + 14;
16665
16666 const int iter = atoi (iter_pos);
16667
16668 if (iter < 1) return (PARSER_SALT_ITERATION);
16669
16670 salt->salt_iter = iter - 1;
16671
16672 char *salt_pos = strchr (iter_pos, '$');
16673
16674 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16675
16676 salt_pos++;
16677
16678 char *hash_pos = strchr (salt_pos, '$');
16679
16680 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16681
16682 const uint salt_len = hash_pos - salt_pos;
16683
16684 hash_pos++;
16685
16686 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
16687
16688 memcpy (salt_buf_ptr, salt_pos, salt_len);
16689
16690 salt->salt_len = salt_len;
16691
16692 salt_buf_ptr[salt_len + 3] = 0x01;
16693 salt_buf_ptr[salt_len + 4] = 0x80;
16694
16695 // add some stuff to normal salt to make sorted happy
16696
16697 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
16698 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
16699 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
16700 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
16701 salt->salt_buf[4] = salt->salt_iter;
16702
16703 // base64 decode hash
16704
16705 u8 tmp_buf[100] = { 0 };
16706
16707 uint hash_len = input_len - (hash_pos - input_buf);
16708
16709 if (hash_len != 44) return (PARSER_HASH_LENGTH);
16710
16711 base64_decode (base64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
16712
16713 memcpy (digest, tmp_buf, 32);
16714
16715 digest[0] = byte_swap_32 (digest[0]);
16716 digest[1] = byte_swap_32 (digest[1]);
16717 digest[2] = byte_swap_32 (digest[2]);
16718 digest[3] = byte_swap_32 (digest[3]);
16719 digest[4] = byte_swap_32 (digest[4]);
16720 digest[5] = byte_swap_32 (digest[5]);
16721 digest[6] = byte_swap_32 (digest[6]);
16722 digest[7] = byte_swap_32 (digest[7]);
16723
16724 return (PARSER_OK);
16725 }
16726
16727 int siphash_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16728 {
16729 if ((input_len < DISPLAY_LEN_MIN_10100) || (input_len > DISPLAY_LEN_MAX_10100)) return (PARSER_GLOBAL_LENGTH);
16730
16731 u32 *digest = (u32 *) hash_buf->digest;
16732
16733 salt_t *salt = hash_buf->salt;
16734
16735 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
16736 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
16737 digest[2] = 0;
16738 digest[3] = 0;
16739
16740 digest[0] = byte_swap_32 (digest[0]);
16741 digest[1] = byte_swap_32 (digest[1]);
16742
16743 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16744 if (input_buf[18] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16745 if (input_buf[20] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16746
16747 char iter_c = input_buf[17];
16748 char iter_d = input_buf[19];
16749
16750 // atm only defaults, let's see if there's more request
16751 if (iter_c != '2') return (PARSER_SALT_ITERATION);
16752 if (iter_d != '4') return (PARSER_SALT_ITERATION);
16753
16754 char *salt_buf = input_buf + 16 + 1 + 1 + 1 + 1 + 1;
16755
16756 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
16757 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
16758 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
16759 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf[24]);
16760
16761 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
16762 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
16763 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
16764 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
16765
16766 salt->salt_len = 16;
16767
16768 return (PARSER_OK);
16769 }
16770
16771 int crammd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16772 {
16773 if ((input_len < DISPLAY_LEN_MIN_10200) || (input_len > DISPLAY_LEN_MAX_10200)) return (PARSER_GLOBAL_LENGTH);
16774
16775 if (memcmp (SIGNATURE_CRAM_MD5, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
16776
16777 u32 *digest = (u32 *) hash_buf->digest;
16778
16779 cram_md5_t *cram_md5 = (cram_md5_t *) hash_buf->esalt;
16780
16781 salt_t *salt = hash_buf->salt;
16782
16783 char *salt_pos = input_buf + 10;
16784
16785 char *hash_pos = strchr (salt_pos, '$');
16786
16787 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16788
16789 uint salt_len = hash_pos - salt_pos;
16790
16791 hash_pos++;
16792
16793 uint hash_len = input_len - 10 - salt_len - 1;
16794
16795 // base64 decode salt
16796
16797 if (salt_len > 133) return (PARSER_SALT_LENGTH);
16798
16799 u8 tmp_buf[100] = { 0 };
16800
16801 salt_len = base64_decode (base64_to_int, (const u8 *) salt_pos, salt_len, tmp_buf);
16802
16803 if (salt_len > 55) return (PARSER_SALT_LENGTH);
16804
16805 tmp_buf[salt_len] = 0x80;
16806
16807 memcpy (&salt->salt_buf, tmp_buf, salt_len + 1);
16808
16809 salt->salt_len = salt_len;
16810
16811 // base64 decode hash
16812
16813 if (hash_len > 133) return (PARSER_HASH_LENGTH);
16814
16815 memset (tmp_buf, 0, sizeof (tmp_buf));
16816
16817 hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
16818
16819 if (hash_len < 32 + 1) return (PARSER_SALT_LENGTH);
16820
16821 uint user_len = hash_len - 32;
16822
16823 const u8 *tmp_hash = tmp_buf + user_len;
16824
16825 user_len--; // skip the trailing space
16826
16827 digest[0] = hex_to_u32 (&tmp_hash[ 0]);
16828 digest[1] = hex_to_u32 (&tmp_hash[ 8]);
16829 digest[2] = hex_to_u32 (&tmp_hash[16]);
16830 digest[3] = hex_to_u32 (&tmp_hash[24]);
16831
16832 digest[0] = byte_swap_32 (digest[0]);
16833 digest[1] = byte_swap_32 (digest[1]);
16834 digest[2] = byte_swap_32 (digest[2]);
16835 digest[3] = byte_swap_32 (digest[3]);
16836
16837 // store username for host only (output hash if cracked)
16838
16839 memset (cram_md5->user, 0, sizeof (cram_md5->user));
16840 memcpy (cram_md5->user, tmp_buf, user_len);
16841
16842 return (PARSER_OK);
16843 }
16844
16845 int saph_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16846 {
16847 if ((input_len < DISPLAY_LEN_MIN_10300) || (input_len > DISPLAY_LEN_MAX_10300)) return (PARSER_GLOBAL_LENGTH);
16848
16849 if (memcmp (SIGNATURE_SAPH_SHA1, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
16850
16851 u32 *digest = (u32 *) hash_buf->digest;
16852
16853 salt_t *salt = hash_buf->salt;
16854
16855 char *iter_pos = input_buf + 10;
16856
16857 u32 iter = atoi (iter_pos);
16858
16859 if (iter < 1)
16860 {
16861 return (PARSER_SALT_ITERATION);
16862 }
16863
16864 iter--; // first iteration is special
16865
16866 salt->salt_iter = iter;
16867
16868 char *base64_pos = strchr (iter_pos, '}');
16869
16870 if (base64_pos == NULL)
16871 {
16872 return (PARSER_SIGNATURE_UNMATCHED);
16873 }
16874
16875 base64_pos++;
16876
16877 // base64 decode salt
16878
16879 u32 base64_len = input_len - (base64_pos - input_buf);
16880
16881 u8 tmp_buf[100] = { 0 };
16882
16883 u32 decoded_len = base64_decode (base64_to_int, (const u8 *) base64_pos, base64_len, tmp_buf);
16884
16885 if (decoded_len < 24)
16886 {
16887 return (PARSER_SALT_LENGTH);
16888 }
16889
16890 // copy the salt
16891
16892 uint salt_len = decoded_len - 20;
16893
16894 if (salt_len < 4) return (PARSER_SALT_LENGTH);
16895 if (salt_len > 16) return (PARSER_SALT_LENGTH);
16896
16897 memcpy (&salt->salt_buf, tmp_buf + 20, salt_len);
16898
16899 salt->salt_len = salt_len;
16900
16901 // set digest
16902
16903 u32 *digest_ptr = (u32*) tmp_buf;
16904
16905 digest[0] = byte_swap_32 (digest_ptr[0]);
16906 digest[1] = byte_swap_32 (digest_ptr[1]);
16907 digest[2] = byte_swap_32 (digest_ptr[2]);
16908 digest[3] = byte_swap_32 (digest_ptr[3]);
16909 digest[4] = byte_swap_32 (digest_ptr[4]);
16910
16911 return (PARSER_OK);
16912 }
16913
16914 int redmine_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16915 {
16916 if ((input_len < DISPLAY_LEN_MIN_7600) || (input_len > DISPLAY_LEN_MAX_7600)) return (PARSER_GLOBAL_LENGTH);
16917
16918 u32 *digest = (u32 *) hash_buf->digest;
16919
16920 salt_t *salt = hash_buf->salt;
16921
16922 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
16923 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
16924 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
16925 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
16926 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
16927
16928 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16929
16930 uint salt_len = input_len - 40 - 1;
16931
16932 char *salt_buf = input_buf + 40 + 1;
16933
16934 char *salt_buf_ptr = (char *) salt->salt_buf;
16935
16936 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
16937
16938 if (salt_len != 32) return (PARSER_SALT_LENGTH);
16939
16940 salt->salt_len = salt_len;
16941
16942 return (PARSER_OK);
16943 }
16944
16945 int pdf11_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16946 {
16947 if ((input_len < DISPLAY_LEN_MIN_10400) || (input_len > DISPLAY_LEN_MAX_10400)) return (PARSER_GLOBAL_LENGTH);
16948
16949 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16950
16951 u32 *digest = (u32 *) hash_buf->digest;
16952
16953 salt_t *salt = hash_buf->salt;
16954
16955 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16956
16957 /**
16958 * parse line
16959 */
16960
16961 char *V_pos = input_buf + 5;
16962
16963 char *R_pos = strchr (V_pos, '*');
16964
16965 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16966
16967 u32 V_len = R_pos - V_pos;
16968
16969 R_pos++;
16970
16971 char *bits_pos = strchr (R_pos, '*');
16972
16973 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16974
16975 u32 R_len = bits_pos - R_pos;
16976
16977 bits_pos++;
16978
16979 char *P_pos = strchr (bits_pos, '*');
16980
16981 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16982
16983 u32 bits_len = P_pos - bits_pos;
16984
16985 P_pos++;
16986
16987 char *enc_md_pos = strchr (P_pos, '*');
16988
16989 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16990
16991 u32 P_len = enc_md_pos - P_pos;
16992
16993 enc_md_pos++;
16994
16995 char *id_len_pos = strchr (enc_md_pos, '*');
16996
16997 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16998
16999 u32 enc_md_len = id_len_pos - enc_md_pos;
17000
17001 id_len_pos++;
17002
17003 char *id_buf_pos = strchr (id_len_pos, '*');
17004
17005 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17006
17007 u32 id_len_len = id_buf_pos - id_len_pos;
17008
17009 id_buf_pos++;
17010
17011 char *u_len_pos = strchr (id_buf_pos, '*');
17012
17013 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17014
17015 u32 id_buf_len = u_len_pos - id_buf_pos;
17016
17017 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
17018
17019 u_len_pos++;
17020
17021 char *u_buf_pos = strchr (u_len_pos, '*');
17022
17023 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17024
17025 u32 u_len_len = u_buf_pos - u_len_pos;
17026
17027 u_buf_pos++;
17028
17029 char *o_len_pos = strchr (u_buf_pos, '*');
17030
17031 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17032
17033 u32 u_buf_len = o_len_pos - u_buf_pos;
17034
17035 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
17036
17037 o_len_pos++;
17038
17039 char *o_buf_pos = strchr (o_len_pos, '*');
17040
17041 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17042
17043 u32 o_len_len = o_buf_pos - o_len_pos;
17044
17045 o_buf_pos++;
17046
17047 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;
17048
17049 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
17050
17051 // validate data
17052
17053 const int V = atoi (V_pos);
17054 const int R = atoi (R_pos);
17055 const int P = atoi (P_pos);
17056
17057 if (V != 1) return (PARSER_SALT_VALUE);
17058 if (R != 2) return (PARSER_SALT_VALUE);
17059
17060 const int enc_md = atoi (enc_md_pos);
17061
17062 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
17063
17064 const int id_len = atoi (id_len_pos);
17065 const int u_len = atoi (u_len_pos);
17066 const int o_len = atoi (o_len_pos);
17067
17068 if (id_len != 16) return (PARSER_SALT_VALUE);
17069 if (u_len != 32) return (PARSER_SALT_VALUE);
17070 if (o_len != 32) return (PARSER_SALT_VALUE);
17071
17072 const int bits = atoi (bits_pos);
17073
17074 if (bits != 40) return (PARSER_SALT_VALUE);
17075
17076 // copy data to esalt
17077
17078 pdf->V = V;
17079 pdf->R = R;
17080 pdf->P = P;
17081
17082 pdf->enc_md = enc_md;
17083
17084 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
17085 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
17086 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
17087 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
17088 pdf->id_len = id_len;
17089
17090 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
17091 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
17092 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
17093 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
17094 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
17095 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
17096 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
17097 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
17098 pdf->u_len = u_len;
17099
17100 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
17101 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
17102 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
17103 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
17104 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
17105 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
17106 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
17107 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
17108 pdf->o_len = o_len;
17109
17110 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
17111 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
17112 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
17113 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
17114
17115 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
17116 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
17117 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
17118 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
17119 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
17120 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
17121 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
17122 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
17123
17124 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
17125 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
17126 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
17127 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
17128 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
17129 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
17130 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
17131 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
17132
17133 // we use ID for salt, maybe needs to change, we will see...
17134
17135 salt->salt_buf[0] = pdf->id_buf[0];
17136 salt->salt_buf[1] = pdf->id_buf[1];
17137 salt->salt_buf[2] = pdf->id_buf[2];
17138 salt->salt_buf[3] = pdf->id_buf[3];
17139 salt->salt_len = pdf->id_len;
17140
17141 digest[0] = pdf->u_buf[0];
17142 digest[1] = pdf->u_buf[1];
17143 digest[2] = pdf->u_buf[2];
17144 digest[3] = pdf->u_buf[3];
17145
17146 return (PARSER_OK);
17147 }
17148
17149 int pdf11cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17150 {
17151 return pdf11_parse_hash (input_buf, input_len, hash_buf);
17152 }
17153
17154 int pdf11cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17155 {
17156 if ((input_len < DISPLAY_LEN_MIN_10420) || (input_len > DISPLAY_LEN_MAX_10420)) return (PARSER_GLOBAL_LENGTH);
17157
17158 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
17159
17160 u32 *digest = (u32 *) hash_buf->digest;
17161
17162 salt_t *salt = hash_buf->salt;
17163
17164 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
17165
17166 /**
17167 * parse line
17168 */
17169
17170 char *V_pos = input_buf + 5;
17171
17172 char *R_pos = strchr (V_pos, '*');
17173
17174 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17175
17176 u32 V_len = R_pos - V_pos;
17177
17178 R_pos++;
17179
17180 char *bits_pos = strchr (R_pos, '*');
17181
17182 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17183
17184 u32 R_len = bits_pos - R_pos;
17185
17186 bits_pos++;
17187
17188 char *P_pos = strchr (bits_pos, '*');
17189
17190 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17191
17192 u32 bits_len = P_pos - bits_pos;
17193
17194 P_pos++;
17195
17196 char *enc_md_pos = strchr (P_pos, '*');
17197
17198 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17199
17200 u32 P_len = enc_md_pos - P_pos;
17201
17202 enc_md_pos++;
17203
17204 char *id_len_pos = strchr (enc_md_pos, '*');
17205
17206 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17207
17208 u32 enc_md_len = id_len_pos - enc_md_pos;
17209
17210 id_len_pos++;
17211
17212 char *id_buf_pos = strchr (id_len_pos, '*');
17213
17214 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17215
17216 u32 id_len_len = id_buf_pos - id_len_pos;
17217
17218 id_buf_pos++;
17219
17220 char *u_len_pos = strchr (id_buf_pos, '*');
17221
17222 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17223
17224 u32 id_buf_len = u_len_pos - id_buf_pos;
17225
17226 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
17227
17228 u_len_pos++;
17229
17230 char *u_buf_pos = strchr (u_len_pos, '*');
17231
17232 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17233
17234 u32 u_len_len = u_buf_pos - u_len_pos;
17235
17236 u_buf_pos++;
17237
17238 char *o_len_pos = strchr (u_buf_pos, '*');
17239
17240 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17241
17242 u32 u_buf_len = o_len_pos - u_buf_pos;
17243
17244 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
17245
17246 o_len_pos++;
17247
17248 char *o_buf_pos = strchr (o_len_pos, '*');
17249
17250 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17251
17252 u32 o_len_len = o_buf_pos - o_len_pos;
17253
17254 o_buf_pos++;
17255
17256 char *rc4key_pos = strchr (o_buf_pos, ':');
17257
17258 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17259
17260 u32 o_buf_len = rc4key_pos - o_buf_pos;
17261
17262 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
17263
17264 rc4key_pos++;
17265
17266 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;
17267
17268 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
17269
17270 // validate data
17271
17272 const int V = atoi (V_pos);
17273 const int R = atoi (R_pos);
17274 const int P = atoi (P_pos);
17275
17276 if (V != 1) return (PARSER_SALT_VALUE);
17277 if (R != 2) return (PARSER_SALT_VALUE);
17278
17279 const int enc_md = atoi (enc_md_pos);
17280
17281 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
17282
17283 const int id_len = atoi (id_len_pos);
17284 const int u_len = atoi (u_len_pos);
17285 const int o_len = atoi (o_len_pos);
17286
17287 if (id_len != 16) return (PARSER_SALT_VALUE);
17288 if (u_len != 32) return (PARSER_SALT_VALUE);
17289 if (o_len != 32) return (PARSER_SALT_VALUE);
17290
17291 const int bits = atoi (bits_pos);
17292
17293 if (bits != 40) return (PARSER_SALT_VALUE);
17294
17295 // copy data to esalt
17296
17297 pdf->V = V;
17298 pdf->R = R;
17299 pdf->P = P;
17300
17301 pdf->enc_md = enc_md;
17302
17303 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
17304 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
17305 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
17306 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
17307 pdf->id_len = id_len;
17308
17309 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
17310 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
17311 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
17312 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
17313 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
17314 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
17315 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
17316 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
17317 pdf->u_len = u_len;
17318
17319 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
17320 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
17321 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
17322 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
17323 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
17324 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
17325 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
17326 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
17327 pdf->o_len = o_len;
17328
17329 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
17330 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
17331 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
17332 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
17333
17334 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
17335 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
17336 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
17337 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
17338 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
17339 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
17340 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
17341 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
17342
17343 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
17344 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
17345 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
17346 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
17347 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
17348 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
17349 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
17350 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
17351
17352 pdf->rc4key[1] = 0;
17353 pdf->rc4key[0] = 0;
17354
17355 pdf->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
17356 pdf->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
17357 pdf->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
17358 pdf->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
17359 pdf->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
17360 pdf->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
17361 pdf->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
17362 pdf->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
17363 pdf->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
17364 pdf->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
17365
17366 pdf->rc4key[0] = byte_swap_32 (pdf->rc4key[0]);
17367 pdf->rc4key[1] = byte_swap_32 (pdf->rc4key[1]);
17368
17369 // we use ID for salt, maybe needs to change, we will see...
17370
17371 salt->salt_buf[0] = pdf->id_buf[0];
17372 salt->salt_buf[1] = pdf->id_buf[1];
17373 salt->salt_buf[2] = pdf->id_buf[2];
17374 salt->salt_buf[3] = pdf->id_buf[3];
17375 salt->salt_buf[4] = pdf->u_buf[0];
17376 salt->salt_buf[5] = pdf->u_buf[1];
17377 salt->salt_buf[6] = pdf->o_buf[0];
17378 salt->salt_buf[7] = pdf->o_buf[1];
17379 salt->salt_len = pdf->id_len + 16;
17380
17381 digest[0] = pdf->rc4key[0];
17382 digest[1] = pdf->rc4key[1];
17383 digest[2] = 0;
17384 digest[3] = 0;
17385
17386 return (PARSER_OK);
17387 }
17388
17389 int pdf14_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17390 {
17391 if ((input_len < DISPLAY_LEN_MIN_10500) || (input_len > DISPLAY_LEN_MAX_10500)) return (PARSER_GLOBAL_LENGTH);
17392
17393 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
17394
17395 u32 *digest = (u32 *) hash_buf->digest;
17396
17397 salt_t *salt = hash_buf->salt;
17398
17399 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
17400
17401 /**
17402 * parse line
17403 */
17404
17405 char *V_pos = input_buf + 5;
17406
17407 char *R_pos = strchr (V_pos, '*');
17408
17409 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17410
17411 u32 V_len = R_pos - V_pos;
17412
17413 R_pos++;
17414
17415 char *bits_pos = strchr (R_pos, '*');
17416
17417 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17418
17419 u32 R_len = bits_pos - R_pos;
17420
17421 bits_pos++;
17422
17423 char *P_pos = strchr (bits_pos, '*');
17424
17425 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17426
17427 u32 bits_len = P_pos - bits_pos;
17428
17429 P_pos++;
17430
17431 char *enc_md_pos = strchr (P_pos, '*');
17432
17433 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17434
17435 u32 P_len = enc_md_pos - P_pos;
17436
17437 enc_md_pos++;
17438
17439 char *id_len_pos = strchr (enc_md_pos, '*');
17440
17441 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17442
17443 u32 enc_md_len = id_len_pos - enc_md_pos;
17444
17445 id_len_pos++;
17446
17447 char *id_buf_pos = strchr (id_len_pos, '*');
17448
17449 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17450
17451 u32 id_len_len = id_buf_pos - id_len_pos;
17452
17453 id_buf_pos++;
17454
17455 char *u_len_pos = strchr (id_buf_pos, '*');
17456
17457 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17458
17459 u32 id_buf_len = u_len_pos - id_buf_pos;
17460
17461 if ((id_buf_len != 32) && (id_buf_len != 64)) return (PARSER_SALT_LENGTH);
17462
17463 u_len_pos++;
17464
17465 char *u_buf_pos = strchr (u_len_pos, '*');
17466
17467 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17468
17469 u32 u_len_len = u_buf_pos - u_len_pos;
17470
17471 u_buf_pos++;
17472
17473 char *o_len_pos = strchr (u_buf_pos, '*');
17474
17475 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17476
17477 u32 u_buf_len = o_len_pos - u_buf_pos;
17478
17479 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
17480
17481 o_len_pos++;
17482
17483 char *o_buf_pos = strchr (o_len_pos, '*');
17484
17485 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17486
17487 u32 o_len_len = o_buf_pos - o_len_pos;
17488
17489 o_buf_pos++;
17490
17491 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;
17492
17493 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
17494
17495 // validate data
17496
17497 const int V = atoi (V_pos);
17498 const int R = atoi (R_pos);
17499 const int P = atoi (P_pos);
17500
17501 int vr_ok = 0;
17502
17503 if ((V == 2) && (R == 3)) vr_ok = 1;
17504 if ((V == 4) && (R == 4)) vr_ok = 1;
17505
17506 if (vr_ok == 0) return (PARSER_SALT_VALUE);
17507
17508 const int id_len = atoi (id_len_pos);
17509 const int u_len = atoi (u_len_pos);
17510 const int o_len = atoi (o_len_pos);
17511
17512 if ((id_len != 16) && (id_len != 32)) return (PARSER_SALT_VALUE);
17513
17514 if (u_len != 32) return (PARSER_SALT_VALUE);
17515 if (o_len != 32) return (PARSER_SALT_VALUE);
17516
17517 const int bits = atoi (bits_pos);
17518
17519 if (bits != 128) return (PARSER_SALT_VALUE);
17520
17521 int enc_md = 1;
17522
17523 if (R >= 4)
17524 {
17525 enc_md = atoi (enc_md_pos);
17526 }
17527
17528 // copy data to esalt
17529
17530 pdf->V = V;
17531 pdf->R = R;
17532 pdf->P = P;
17533
17534 pdf->enc_md = enc_md;
17535
17536 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
17537 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
17538 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
17539 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
17540
17541 if (id_len == 32)
17542 {
17543 pdf->id_buf[4] = hex_to_u32 ((const u8 *) &id_buf_pos[32]);
17544 pdf->id_buf[5] = hex_to_u32 ((const u8 *) &id_buf_pos[40]);
17545 pdf->id_buf[6] = hex_to_u32 ((const u8 *) &id_buf_pos[48]);
17546 pdf->id_buf[7] = hex_to_u32 ((const u8 *) &id_buf_pos[56]);
17547 }
17548
17549 pdf->id_len = id_len;
17550
17551 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
17552 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
17553 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
17554 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
17555 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
17556 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
17557 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
17558 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
17559 pdf->u_len = u_len;
17560
17561 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
17562 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
17563 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
17564 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
17565 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
17566 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
17567 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
17568 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
17569 pdf->o_len = o_len;
17570
17571 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
17572 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
17573 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
17574 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
17575
17576 if (id_len == 32)
17577 {
17578 pdf->id_buf[4] = byte_swap_32 (pdf->id_buf[4]);
17579 pdf->id_buf[5] = byte_swap_32 (pdf->id_buf[5]);
17580 pdf->id_buf[6] = byte_swap_32 (pdf->id_buf[6]);
17581 pdf->id_buf[7] = byte_swap_32 (pdf->id_buf[7]);
17582 }
17583
17584 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
17585 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
17586 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
17587 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
17588 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
17589 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
17590 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
17591 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
17592
17593 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
17594 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
17595 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
17596 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
17597 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
17598 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
17599 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
17600 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
17601
17602 // precompute rc4 data for later use
17603
17604 uint padding[8] =
17605 {
17606 0x5e4ebf28,
17607 0x418a754e,
17608 0x564e0064,
17609 0x0801faff,
17610 0xb6002e2e,
17611 0x803e68d0,
17612 0xfea90c2f,
17613 0x7a695364
17614 };
17615
17616 // md5
17617
17618 uint salt_pc_block[32] = { 0 };
17619
17620 char *salt_pc_ptr = (char *) salt_pc_block;
17621
17622 memcpy (salt_pc_ptr, padding, 32);
17623 memcpy (salt_pc_ptr + 32, pdf->id_buf, pdf->id_len);
17624
17625 uint salt_pc_digest[4] = { 0 };
17626
17627 md5_complete_no_limit (salt_pc_digest, salt_pc_block, 32 + pdf->id_len);
17628
17629 pdf->rc4data[0] = salt_pc_digest[0];
17630 pdf->rc4data[1] = salt_pc_digest[1];
17631
17632 // we use ID for salt, maybe needs to change, we will see...
17633
17634 salt->salt_buf[0] = pdf->id_buf[0];
17635 salt->salt_buf[1] = pdf->id_buf[1];
17636 salt->salt_buf[2] = pdf->id_buf[2];
17637 salt->salt_buf[3] = pdf->id_buf[3];
17638 salt->salt_buf[4] = pdf->u_buf[0];
17639 salt->salt_buf[5] = pdf->u_buf[1];
17640 salt->salt_buf[6] = pdf->o_buf[0];
17641 salt->salt_buf[7] = pdf->o_buf[1];
17642 salt->salt_len = pdf->id_len + 16;
17643
17644 salt->salt_iter = ROUNDS_PDF14;
17645
17646 digest[0] = pdf->u_buf[0];
17647 digest[1] = pdf->u_buf[1];
17648 digest[2] = 0;
17649 digest[3] = 0;
17650
17651 return (PARSER_OK);
17652 }
17653
17654 int pdf17l3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17655 {
17656 int ret = pdf17l8_parse_hash (input_buf, input_len, hash_buf);
17657
17658 if (ret != PARSER_OK)
17659 {
17660 return ret;
17661 }
17662
17663 u32 *digest = (u32 *) hash_buf->digest;
17664
17665 salt_t *salt = hash_buf->salt;
17666
17667 digest[0] -= SHA256M_A;
17668 digest[1] -= SHA256M_B;
17669 digest[2] -= SHA256M_C;
17670 digest[3] -= SHA256M_D;
17671 digest[4] -= SHA256M_E;
17672 digest[5] -= SHA256M_F;
17673 digest[6] -= SHA256M_G;
17674 digest[7] -= SHA256M_H;
17675
17676 salt->salt_buf[2] = 0x80;
17677
17678 return (PARSER_OK);
17679 }
17680
17681 int pdf17l8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17682 {
17683 if ((input_len < DISPLAY_LEN_MIN_10600) || (input_len > DISPLAY_LEN_MAX_10600)) return (PARSER_GLOBAL_LENGTH);
17684
17685 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
17686
17687 u32 *digest = (u32 *) hash_buf->digest;
17688
17689 salt_t *salt = hash_buf->salt;
17690
17691 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
17692
17693 /**
17694 * parse line
17695 */
17696
17697 char *V_pos = input_buf + 5;
17698
17699 char *R_pos = strchr (V_pos, '*');
17700
17701 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17702
17703 u32 V_len = R_pos - V_pos;
17704
17705 R_pos++;
17706
17707 char *bits_pos = strchr (R_pos, '*');
17708
17709 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17710
17711 u32 R_len = bits_pos - R_pos;
17712
17713 bits_pos++;
17714
17715 char *P_pos = strchr (bits_pos, '*');
17716
17717 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17718
17719 u32 bits_len = P_pos - bits_pos;
17720
17721 P_pos++;
17722
17723 char *enc_md_pos = strchr (P_pos, '*');
17724
17725 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17726
17727 u32 P_len = enc_md_pos - P_pos;
17728
17729 enc_md_pos++;
17730
17731 char *id_len_pos = strchr (enc_md_pos, '*');
17732
17733 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17734
17735 u32 enc_md_len = id_len_pos - enc_md_pos;
17736
17737 id_len_pos++;
17738
17739 char *id_buf_pos = strchr (id_len_pos, '*');
17740
17741 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17742
17743 u32 id_len_len = id_buf_pos - id_len_pos;
17744
17745 id_buf_pos++;
17746
17747 char *u_len_pos = strchr (id_buf_pos, '*');
17748
17749 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17750
17751 u32 id_buf_len = u_len_pos - id_buf_pos;
17752
17753 u_len_pos++;
17754
17755 char *u_buf_pos = strchr (u_len_pos, '*');
17756
17757 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17758
17759 u32 u_len_len = u_buf_pos - u_len_pos;
17760
17761 u_buf_pos++;
17762
17763 char *o_len_pos = strchr (u_buf_pos, '*');
17764
17765 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17766
17767 u32 u_buf_len = o_len_pos - u_buf_pos;
17768
17769 o_len_pos++;
17770
17771 char *o_buf_pos = strchr (o_len_pos, '*');
17772
17773 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17774
17775 u32 o_len_len = o_buf_pos - o_len_pos;
17776
17777 o_buf_pos++;
17778
17779 char *last = strchr (o_buf_pos, '*');
17780
17781 if (last == NULL) last = input_buf + input_len;
17782
17783 u32 o_buf_len = last - o_buf_pos;
17784
17785 // validate data
17786
17787 const int V = atoi (V_pos);
17788 const int R = atoi (R_pos);
17789
17790 int vr_ok = 0;
17791
17792 if ((V == 5) && (R == 5)) vr_ok = 1;
17793 if ((V == 5) && (R == 6)) vr_ok = 1;
17794
17795 if (vr_ok == 0) return (PARSER_SALT_VALUE);
17796
17797 const int bits = atoi (bits_pos);
17798
17799 if (bits != 256) return (PARSER_SALT_VALUE);
17800
17801 int enc_md = atoi (enc_md_pos);
17802
17803 if (enc_md != 1) return (PARSER_SALT_VALUE);
17804
17805 const uint id_len = atoi (id_len_pos);
17806 const uint u_len = atoi (u_len_pos);
17807 const uint o_len = atoi (o_len_pos);
17808
17809 if (V_len > 6) return (PARSER_SALT_LENGTH);
17810 if (R_len > 6) return (PARSER_SALT_LENGTH);
17811 if (P_len > 6) return (PARSER_SALT_LENGTH);
17812 if (id_len_len > 6) return (PARSER_SALT_LENGTH);
17813 if (u_len_len > 6) return (PARSER_SALT_LENGTH);
17814 if (o_len_len > 6) return (PARSER_SALT_LENGTH);
17815 if (bits_len > 6) return (PARSER_SALT_LENGTH);
17816 if (enc_md_len > 6) return (PARSER_SALT_LENGTH);
17817
17818 if ((id_len * 2) != id_buf_len) return (PARSER_SALT_VALUE);
17819 if ((u_len * 2) != u_buf_len) return (PARSER_SALT_VALUE);
17820 if ((o_len * 2) != o_buf_len) return (PARSER_SALT_VALUE);
17821
17822 // copy data to esalt
17823
17824 if (u_len < 40) return (PARSER_SALT_VALUE);
17825
17826 for (int i = 0, j = 0; i < 8 + 2; i += 1, j += 8)
17827 {
17828 pdf->u_buf[i] = hex_to_u32 ((const u8 *) &u_buf_pos[j]);
17829 }
17830
17831 salt->salt_buf[0] = pdf->u_buf[8];
17832 salt->salt_buf[1] = pdf->u_buf[9];
17833
17834 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
17835 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
17836
17837 salt->salt_len = 8;
17838 salt->salt_iter = ROUNDS_PDF17L8;
17839
17840 digest[0] = pdf->u_buf[0];
17841 digest[1] = pdf->u_buf[1];
17842 digest[2] = pdf->u_buf[2];
17843 digest[3] = pdf->u_buf[3];
17844 digest[4] = pdf->u_buf[4];
17845 digest[5] = pdf->u_buf[5];
17846 digest[6] = pdf->u_buf[6];
17847 digest[7] = pdf->u_buf[7];
17848
17849 return (PARSER_OK);
17850 }
17851
17852 int pbkdf2_sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17853 {
17854 if ((input_len < DISPLAY_LEN_MIN_10900) || (input_len > DISPLAY_LEN_MAX_10900)) return (PARSER_GLOBAL_LENGTH);
17855
17856 if (memcmp (SIGNATURE_PBKDF2_SHA256, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
17857
17858 u32 *digest = (u32 *) hash_buf->digest;
17859
17860 salt_t *salt = hash_buf->salt;
17861
17862 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
17863
17864 /**
17865 * parse line
17866 */
17867
17868 // iterations
17869
17870 char *iter_pos = input_buf + 7;
17871
17872 u32 iter = atoi (iter_pos);
17873
17874 if (iter < 1) return (PARSER_SALT_ITERATION);
17875 if (iter > 999999) return (PARSER_SALT_ITERATION);
17876
17877 // first is *raw* salt
17878
17879 char *salt_pos = strchr (iter_pos, ':');
17880
17881 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17882
17883 salt_pos++;
17884
17885 char *hash_pos = strchr (salt_pos, ':');
17886
17887 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17888
17889 u32 salt_len = hash_pos - salt_pos;
17890
17891 if (salt_len > 64) return (PARSER_SALT_LENGTH);
17892
17893 hash_pos++;
17894
17895 u32 hash_b64_len = input_len - (hash_pos - input_buf);
17896
17897 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
17898
17899 // decode salt
17900
17901 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
17902
17903 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
17904
17905 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17906
17907 salt_buf_ptr[salt_len + 3] = 0x01;
17908 salt_buf_ptr[salt_len + 4] = 0x80;
17909
17910 salt->salt_len = salt_len;
17911 salt->salt_iter = iter - 1;
17912
17913 // decode hash
17914
17915 u8 tmp_buf[100] = { 0 };
17916
17917 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
17918
17919 if (hash_len < 16) return (PARSER_HASH_LENGTH);
17920
17921 memcpy (digest, tmp_buf, 16);
17922
17923 digest[0] = byte_swap_32 (digest[0]);
17924 digest[1] = byte_swap_32 (digest[1]);
17925 digest[2] = byte_swap_32 (digest[2]);
17926 digest[3] = byte_swap_32 (digest[3]);
17927
17928 // add some stuff to normal salt to make sorted happy
17929
17930 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
17931 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
17932 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
17933 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
17934 salt->salt_buf[4] = salt->salt_iter;
17935
17936 return (PARSER_OK);
17937 }
17938
17939 int prestashop_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17940 {
17941 if ((input_len < DISPLAY_LEN_MIN_11000) || (input_len > DISPLAY_LEN_MAX_11000)) return (PARSER_GLOBAL_LENGTH);
17942
17943 u32 *digest = (u32 *) hash_buf->digest;
17944
17945 salt_t *salt = hash_buf->salt;
17946
17947 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
17948 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
17949 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
17950 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
17951
17952 digest[0] = byte_swap_32 (digest[0]);
17953 digest[1] = byte_swap_32 (digest[1]);
17954 digest[2] = byte_swap_32 (digest[2]);
17955 digest[3] = byte_swap_32 (digest[3]);
17956
17957 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
17958
17959 uint salt_len = input_len - 32 - 1;
17960
17961 char *salt_buf = input_buf + 32 + 1;
17962
17963 char *salt_buf_ptr = (char *) salt->salt_buf;
17964
17965 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
17966
17967 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17968
17969 salt->salt_len = salt_len;
17970
17971 return (PARSER_OK);
17972 }
17973
17974 int postgresql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17975 {
17976 if ((input_len < DISPLAY_LEN_MIN_11100) || (input_len > DISPLAY_LEN_MAX_11100)) return (PARSER_GLOBAL_LENGTH);
17977
17978 if (memcmp (SIGNATURE_POSTGRESQL_AUTH, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
17979
17980 u32 *digest = (u32 *) hash_buf->digest;
17981
17982 salt_t *salt = hash_buf->salt;
17983
17984 char *user_pos = input_buf + 10;
17985
17986 char *salt_pos = strchr (user_pos, '*');
17987
17988 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17989
17990 salt_pos++;
17991
17992 char *hash_pos = strchr (salt_pos, '*');
17993
17994 hash_pos++;
17995
17996 uint hash_len = input_len - (hash_pos - input_buf);
17997
17998 if (hash_len != 32) return (PARSER_HASH_LENGTH);
17999
18000 uint user_len = salt_pos - user_pos - 1;
18001
18002 uint salt_len = hash_pos - salt_pos - 1;
18003
18004 if (salt_len != 8) return (PARSER_SALT_LENGTH);
18005
18006 /*
18007 * store digest
18008 */
18009
18010 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
18011 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
18012 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
18013 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
18014
18015 digest[0] = byte_swap_32 (digest[0]);
18016 digest[1] = byte_swap_32 (digest[1]);
18017 digest[2] = byte_swap_32 (digest[2]);
18018 digest[3] = byte_swap_32 (digest[3]);
18019
18020 digest[0] -= MD5M_A;
18021 digest[1] -= MD5M_B;
18022 digest[2] -= MD5M_C;
18023 digest[3] -= MD5M_D;
18024
18025 /*
18026 * store salt
18027 */
18028
18029 char *salt_buf_ptr = (char *) salt->salt_buf;
18030
18031 // first 4 bytes are the "challenge"
18032
18033 salt_buf_ptr[0] = hex_to_u8 ((const u8 *) &salt_pos[0]);
18034 salt_buf_ptr[1] = hex_to_u8 ((const u8 *) &salt_pos[2]);
18035 salt_buf_ptr[2] = hex_to_u8 ((const u8 *) &salt_pos[4]);
18036 salt_buf_ptr[3] = hex_to_u8 ((const u8 *) &salt_pos[6]);
18037
18038 // append the user name
18039
18040 user_len = parse_and_store_salt (salt_buf_ptr + 4, user_pos, user_len);
18041
18042 salt->salt_len = 4 + user_len;
18043
18044 return (PARSER_OK);
18045 }
18046
18047 int mysql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18048 {
18049 if ((input_len < DISPLAY_LEN_MIN_11200) || (input_len > DISPLAY_LEN_MAX_11200)) return (PARSER_GLOBAL_LENGTH);
18050
18051 if (memcmp (SIGNATURE_MYSQL_AUTH, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
18052
18053 u32 *digest = (u32 *) hash_buf->digest;
18054
18055 salt_t *salt = hash_buf->salt;
18056
18057 char *salt_pos = input_buf + 9;
18058
18059 char *hash_pos = strchr (salt_pos, '*');
18060
18061 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18062
18063 hash_pos++;
18064
18065 uint hash_len = input_len - (hash_pos - input_buf);
18066
18067 if (hash_len != 40) return (PARSER_HASH_LENGTH);
18068
18069 uint salt_len = hash_pos - salt_pos - 1;
18070
18071 if (salt_len != 40) return (PARSER_SALT_LENGTH);
18072
18073 /*
18074 * store digest
18075 */
18076
18077 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
18078 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
18079 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
18080 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
18081 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
18082
18083 /*
18084 * store salt
18085 */
18086
18087 char *salt_buf_ptr = (char *) salt->salt_buf;
18088
18089 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18090
18091 salt->salt_len = salt_len;
18092
18093 return (PARSER_OK);
18094 }
18095
18096 int bitcoin_wallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18097 {
18098 if ((input_len < DISPLAY_LEN_MIN_11300) || (input_len > DISPLAY_LEN_MAX_11300)) return (PARSER_GLOBAL_LENGTH);
18099
18100 if (memcmp (SIGNATURE_BITCOIN_WALLET, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
18101
18102 u32 *digest = (u32 *) hash_buf->digest;
18103
18104 salt_t *salt = hash_buf->salt;
18105
18106 bitcoin_wallet_t *bitcoin_wallet = (bitcoin_wallet_t *) hash_buf->esalt;
18107
18108 /**
18109 * parse line
18110 */
18111
18112 char *cry_master_len_pos = input_buf + 9;
18113
18114 char *cry_master_buf_pos = strchr (cry_master_len_pos, '$');
18115
18116 if (cry_master_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18117
18118 u32 cry_master_len_len = cry_master_buf_pos - cry_master_len_pos;
18119
18120 cry_master_buf_pos++;
18121
18122 char *cry_salt_len_pos = strchr (cry_master_buf_pos, '$');
18123
18124 if (cry_salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18125
18126 u32 cry_master_buf_len = cry_salt_len_pos - cry_master_buf_pos;
18127
18128 cry_salt_len_pos++;
18129
18130 char *cry_salt_buf_pos = strchr (cry_salt_len_pos, '$');
18131
18132 if (cry_salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18133
18134 u32 cry_salt_len_len = cry_salt_buf_pos - cry_salt_len_pos;
18135
18136 cry_salt_buf_pos++;
18137
18138 char *cry_rounds_pos = strchr (cry_salt_buf_pos, '$');
18139
18140 if (cry_rounds_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18141
18142 u32 cry_salt_buf_len = cry_rounds_pos - cry_salt_buf_pos;
18143
18144 cry_rounds_pos++;
18145
18146 char *ckey_len_pos = strchr (cry_rounds_pos, '$');
18147
18148 if (ckey_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18149
18150 u32 cry_rounds_len = ckey_len_pos - cry_rounds_pos;
18151
18152 ckey_len_pos++;
18153
18154 char *ckey_buf_pos = strchr (ckey_len_pos, '$');
18155
18156 if (ckey_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18157
18158 u32 ckey_len_len = ckey_buf_pos - ckey_len_pos;
18159
18160 ckey_buf_pos++;
18161
18162 char *public_key_len_pos = strchr (ckey_buf_pos, '$');
18163
18164 if (public_key_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18165
18166 u32 ckey_buf_len = public_key_len_pos - ckey_buf_pos;
18167
18168 public_key_len_pos++;
18169
18170 char *public_key_buf_pos = strchr (public_key_len_pos, '$');
18171
18172 if (public_key_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18173
18174 u32 public_key_len_len = public_key_buf_pos - public_key_len_pos;
18175
18176 public_key_buf_pos++;
18177
18178 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;
18179
18180 const uint cry_master_len = atoi (cry_master_len_pos);
18181 const uint cry_salt_len = atoi (cry_salt_len_pos);
18182 const uint ckey_len = atoi (ckey_len_pos);
18183 const uint public_key_len = atoi (public_key_len_pos);
18184
18185 if (cry_master_buf_len != cry_master_len) return (PARSER_SALT_VALUE);
18186 if (cry_salt_buf_len != cry_salt_len) return (PARSER_SALT_VALUE);
18187 if (ckey_buf_len != ckey_len) return (PARSER_SALT_VALUE);
18188 if (public_key_buf_len != public_key_len) return (PARSER_SALT_VALUE);
18189
18190 for (uint i = 0, j = 0; j < cry_master_len; i += 1, j += 8)
18191 {
18192 bitcoin_wallet->cry_master_buf[i] = hex_to_u32 ((const u8 *) &cry_master_buf_pos[j]);
18193
18194 bitcoin_wallet->cry_master_buf[i] = byte_swap_32 (bitcoin_wallet->cry_master_buf[i]);
18195 }
18196
18197 for (uint i = 0, j = 0; j < ckey_len; i += 1, j += 8)
18198 {
18199 bitcoin_wallet->ckey_buf[i] = hex_to_u32 ((const u8 *) &ckey_buf_pos[j]);
18200
18201 bitcoin_wallet->ckey_buf[i] = byte_swap_32 (bitcoin_wallet->ckey_buf[i]);
18202 }
18203
18204 for (uint i = 0, j = 0; j < public_key_len; i += 1, j += 8)
18205 {
18206 bitcoin_wallet->public_key_buf[i] = hex_to_u32 ((const u8 *) &public_key_buf_pos[j]);
18207
18208 bitcoin_wallet->public_key_buf[i] = byte_swap_32 (bitcoin_wallet->public_key_buf[i]);
18209 }
18210
18211 bitcoin_wallet->cry_master_len = cry_master_len / 2;
18212 bitcoin_wallet->ckey_len = ckey_len / 2;
18213 bitcoin_wallet->public_key_len = public_key_len / 2;
18214
18215 /*
18216 * store digest (should be unique enought, hopefully)
18217 */
18218
18219 digest[0] = bitcoin_wallet->cry_master_buf[0];
18220 digest[1] = bitcoin_wallet->cry_master_buf[1];
18221 digest[2] = bitcoin_wallet->cry_master_buf[2];
18222 digest[3] = bitcoin_wallet->cry_master_buf[3];
18223
18224 /*
18225 * store salt
18226 */
18227
18228 if (cry_rounds_len >= 7) return (PARSER_SALT_VALUE);
18229
18230 const uint cry_rounds = atoi (cry_rounds_pos);
18231
18232 salt->salt_iter = cry_rounds - 1;
18233
18234 char *salt_buf_ptr = (char *) salt->salt_buf;
18235
18236 const uint salt_len = parse_and_store_salt (salt_buf_ptr, cry_salt_buf_pos, cry_salt_buf_len);
18237
18238 salt->salt_len = salt_len;
18239
18240 return (PARSER_OK);
18241 }
18242
18243 int sip_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18244 {
18245 if ((input_len < DISPLAY_LEN_MIN_11400) || (input_len > DISPLAY_LEN_MAX_11400)) return (PARSER_GLOBAL_LENGTH);
18246
18247 if (memcmp (SIGNATURE_SIP_AUTH, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
18248
18249 u32 *digest = (u32 *) hash_buf->digest;
18250
18251 salt_t *salt = hash_buf->salt;
18252
18253 sip_t *sip = (sip_t *) hash_buf->esalt;
18254
18255 // work with a temporary copy of input_buf (s.t. we can manipulate it directly)
18256
18257 char *temp_input_buf = (char *) mymalloc (input_len + 1);
18258
18259 memcpy (temp_input_buf, input_buf, input_len);
18260
18261 // URI_server:
18262
18263 char *URI_server_pos = temp_input_buf + 6;
18264
18265 char *URI_client_pos = strchr (URI_server_pos, '*');
18266
18267 if (URI_client_pos == NULL)
18268 {
18269 myfree (temp_input_buf);
18270
18271 return (PARSER_SEPARATOR_UNMATCHED);
18272 }
18273
18274 URI_client_pos[0] = 0;
18275 URI_client_pos++;
18276
18277 uint URI_server_len = strlen (URI_server_pos);
18278
18279 if (URI_server_len > 512)
18280 {
18281 myfree (temp_input_buf);
18282
18283 return (PARSER_SALT_LENGTH);
18284 }
18285
18286 // URI_client:
18287
18288 char *user_pos = strchr (URI_client_pos, '*');
18289
18290 if (user_pos == NULL)
18291 {
18292 myfree (temp_input_buf);
18293
18294 return (PARSER_SEPARATOR_UNMATCHED);
18295 }
18296
18297 user_pos[0] = 0;
18298 user_pos++;
18299
18300 uint URI_client_len = strlen (URI_client_pos);
18301
18302 if (URI_client_len > 512)
18303 {
18304 myfree (temp_input_buf);
18305
18306 return (PARSER_SALT_LENGTH);
18307 }
18308
18309 // user:
18310
18311 char *realm_pos = strchr (user_pos, '*');
18312
18313 if (realm_pos == NULL)
18314 {
18315 myfree (temp_input_buf);
18316
18317 return (PARSER_SEPARATOR_UNMATCHED);
18318 }
18319
18320 realm_pos[0] = 0;
18321 realm_pos++;
18322
18323 uint user_len = strlen (user_pos);
18324
18325 if (user_len > 116)
18326 {
18327 myfree (temp_input_buf);
18328
18329 return (PARSER_SALT_LENGTH);
18330 }
18331
18332 // realm:
18333
18334 char *method_pos = strchr (realm_pos, '*');
18335
18336 if (method_pos == NULL)
18337 {
18338 myfree (temp_input_buf);
18339
18340 return (PARSER_SEPARATOR_UNMATCHED);
18341 }
18342
18343 method_pos[0] = 0;
18344 method_pos++;
18345
18346 uint realm_len = strlen (realm_pos);
18347
18348 if (realm_len > 116)
18349 {
18350 myfree (temp_input_buf);
18351
18352 return (PARSER_SALT_LENGTH);
18353 }
18354
18355 // method:
18356
18357 char *URI_prefix_pos = strchr (method_pos, '*');
18358
18359 if (URI_prefix_pos == NULL)
18360 {
18361 myfree (temp_input_buf);
18362
18363 return (PARSER_SEPARATOR_UNMATCHED);
18364 }
18365
18366 URI_prefix_pos[0] = 0;
18367 URI_prefix_pos++;
18368
18369 uint method_len = strlen (method_pos);
18370
18371 if (method_len > 246)
18372 {
18373 myfree (temp_input_buf);
18374
18375 return (PARSER_SALT_LENGTH);
18376 }
18377
18378 // URI_prefix:
18379
18380 char *URI_resource_pos = strchr (URI_prefix_pos, '*');
18381
18382 if (URI_resource_pos == NULL)
18383 {
18384 myfree (temp_input_buf);
18385
18386 return (PARSER_SEPARATOR_UNMATCHED);
18387 }
18388
18389 URI_resource_pos[0] = 0;
18390 URI_resource_pos++;
18391
18392 uint URI_prefix_len = strlen (URI_prefix_pos);
18393
18394 if (URI_prefix_len > 245)
18395 {
18396 myfree (temp_input_buf);
18397
18398 return (PARSER_SALT_LENGTH);
18399 }
18400
18401 // URI_resource:
18402
18403 char *URI_suffix_pos = strchr (URI_resource_pos, '*');
18404
18405 if (URI_suffix_pos == NULL)
18406 {
18407 myfree (temp_input_buf);
18408
18409 return (PARSER_SEPARATOR_UNMATCHED);
18410 }
18411
18412 URI_suffix_pos[0] = 0;
18413 URI_suffix_pos++;
18414
18415 uint URI_resource_len = strlen (URI_resource_pos);
18416
18417 if (URI_resource_len < 1 || URI_resource_len > 246)
18418 {
18419 myfree (temp_input_buf);
18420
18421 return (PARSER_SALT_LENGTH);
18422 }
18423
18424 // URI_suffix:
18425
18426 char *nonce_pos = strchr (URI_suffix_pos, '*');
18427
18428 if (nonce_pos == NULL)
18429 {
18430 myfree (temp_input_buf);
18431
18432 return (PARSER_SEPARATOR_UNMATCHED);
18433 }
18434
18435 nonce_pos[0] = 0;
18436 nonce_pos++;
18437
18438 uint URI_suffix_len = strlen (URI_suffix_pos);
18439
18440 if (URI_suffix_len > 245)
18441 {
18442 myfree (temp_input_buf);
18443
18444 return (PARSER_SALT_LENGTH);
18445 }
18446
18447 // nonce:
18448
18449 char *nonce_client_pos = strchr (nonce_pos, '*');
18450
18451 if (nonce_client_pos == NULL)
18452 {
18453 myfree (temp_input_buf);
18454
18455 return (PARSER_SEPARATOR_UNMATCHED);
18456 }
18457
18458 nonce_client_pos[0] = 0;
18459 nonce_client_pos++;
18460
18461 uint nonce_len = strlen (nonce_pos);
18462
18463 if (nonce_len < 1 || nonce_len > 50)
18464 {
18465 myfree (temp_input_buf);
18466
18467 return (PARSER_SALT_LENGTH);
18468 }
18469
18470 // nonce_client:
18471
18472 char *nonce_count_pos = strchr (nonce_client_pos, '*');
18473
18474 if (nonce_count_pos == NULL)
18475 {
18476 myfree (temp_input_buf);
18477
18478 return (PARSER_SEPARATOR_UNMATCHED);
18479 }
18480
18481 nonce_count_pos[0] = 0;
18482 nonce_count_pos++;
18483
18484 uint nonce_client_len = strlen (nonce_client_pos);
18485
18486 if (nonce_client_len > 50)
18487 {
18488 myfree (temp_input_buf);
18489
18490 return (PARSER_SALT_LENGTH);
18491 }
18492
18493 // nonce_count:
18494
18495 char *qop_pos = strchr (nonce_count_pos, '*');
18496
18497 if (qop_pos == NULL)
18498 {
18499 myfree (temp_input_buf);
18500
18501 return (PARSER_SEPARATOR_UNMATCHED);
18502 }
18503
18504 qop_pos[0] = 0;
18505 qop_pos++;
18506
18507 uint nonce_count_len = strlen (nonce_count_pos);
18508
18509 if (nonce_count_len > 50)
18510 {
18511 myfree (temp_input_buf);
18512
18513 return (PARSER_SALT_LENGTH);
18514 }
18515
18516 // qop:
18517
18518 char *directive_pos = strchr (qop_pos, '*');
18519
18520 if (directive_pos == NULL)
18521 {
18522 myfree (temp_input_buf);
18523
18524 return (PARSER_SEPARATOR_UNMATCHED);
18525 }
18526
18527 directive_pos[0] = 0;
18528 directive_pos++;
18529
18530 uint qop_len = strlen (qop_pos);
18531
18532 if (qop_len > 50)
18533 {
18534 myfree (temp_input_buf);
18535
18536 return (PARSER_SALT_LENGTH);
18537 }
18538
18539 // directive
18540
18541 char *digest_pos = strchr (directive_pos, '*');
18542
18543 if (digest_pos == NULL)
18544 {
18545 myfree (temp_input_buf);
18546
18547 return (PARSER_SEPARATOR_UNMATCHED);
18548 }
18549
18550 digest_pos[0] = 0;
18551 digest_pos++;
18552
18553 uint directive_len = strlen (directive_pos);
18554
18555 if (directive_len != 3)
18556 {
18557 myfree (temp_input_buf);
18558
18559 return (PARSER_SALT_LENGTH);
18560 }
18561
18562 if (memcmp (directive_pos, "MD5", 3))
18563 {
18564 log_info ("ERROR: only the MD5 directive is currently supported\n");
18565
18566 myfree (temp_input_buf);
18567
18568 return (PARSER_SIP_AUTH_DIRECTIVE);
18569 }
18570
18571 /*
18572 * first (pre-)compute: HA2 = md5 ($method . ":" . $uri)
18573 */
18574
18575 uint md5_len = 0;
18576
18577 uint md5_max_len = 4 * 64;
18578
18579 uint md5_remaining_len = md5_max_len;
18580
18581 uint tmp_md5_buf[64] = { 0 };
18582
18583 char *tmp_md5_ptr = (char *) tmp_md5_buf;
18584
18585 snprintf (tmp_md5_ptr, md5_remaining_len, "%s:", method_pos);
18586
18587 md5_len += method_len + 1;
18588 tmp_md5_ptr += method_len + 1;
18589
18590 if (URI_prefix_len > 0)
18591 {
18592 md5_remaining_len = md5_max_len - md5_len;
18593
18594 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s:", URI_prefix_pos);
18595
18596 md5_len += URI_prefix_len + 1;
18597 tmp_md5_ptr += URI_prefix_len + 1;
18598 }
18599
18600 md5_remaining_len = md5_max_len - md5_len;
18601
18602 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s", URI_resource_pos);
18603
18604 md5_len += URI_resource_len;
18605 tmp_md5_ptr += URI_resource_len;
18606
18607 if (URI_suffix_len > 0)
18608 {
18609 md5_remaining_len = md5_max_len - md5_len;
18610
18611 snprintf (tmp_md5_ptr, md5_remaining_len + 1, ":%s", URI_suffix_pos);
18612
18613 md5_len += 1 + URI_suffix_len;
18614 }
18615
18616 uint tmp_digest[4] = { 0 };
18617
18618 md5_complete_no_limit (tmp_digest, tmp_md5_buf, md5_len);
18619
18620 tmp_digest[0] = byte_swap_32 (tmp_digest[0]);
18621 tmp_digest[1] = byte_swap_32 (tmp_digest[1]);
18622 tmp_digest[2] = byte_swap_32 (tmp_digest[2]);
18623 tmp_digest[3] = byte_swap_32 (tmp_digest[3]);
18624
18625 /*
18626 * esalt
18627 */
18628
18629 char *esalt_buf_ptr = (char *) sip->esalt_buf;
18630
18631 uint esalt_len = 0;
18632
18633 uint max_esalt_len = sizeof (sip->esalt_buf); // 151 = (64 + 64 + 55) - 32, where 32 is the hexadecimal MD5 HA1 hash
18634
18635 // there are 2 possibilities for the esalt:
18636
18637 if ((strcmp (qop_pos, "auth") == 0) || (strcmp (qop_pos, "auth-int") == 0))
18638 {
18639 esalt_len = 1 + nonce_len + 1 + nonce_count_len + 1 + nonce_client_len + 1 + qop_len + 1 + 32;
18640
18641 if (esalt_len > max_esalt_len)
18642 {
18643 myfree (temp_input_buf);
18644
18645 return (PARSER_SALT_LENGTH);
18646 }
18647
18648 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%s:%s:%s:%08x%08x%08x%08x",
18649 nonce_pos,
18650 nonce_count_pos,
18651 nonce_client_pos,
18652 qop_pos,
18653 tmp_digest[0],
18654 tmp_digest[1],
18655 tmp_digest[2],
18656 tmp_digest[3]);
18657 }
18658 else
18659 {
18660 esalt_len = 1 + nonce_len + 1 + 32;
18661
18662 if (esalt_len > max_esalt_len)
18663 {
18664 myfree (temp_input_buf);
18665
18666 return (PARSER_SALT_LENGTH);
18667 }
18668
18669 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%08x%08x%08x%08x",
18670 nonce_pos,
18671 tmp_digest[0],
18672 tmp_digest[1],
18673 tmp_digest[2],
18674 tmp_digest[3]);
18675 }
18676
18677 // add 0x80 to esalt
18678
18679 esalt_buf_ptr[esalt_len] = 0x80;
18680
18681 sip->esalt_len = esalt_len;
18682
18683 /*
18684 * actual salt
18685 */
18686
18687 char *sip_salt_ptr = (char *) sip->salt_buf;
18688
18689 uint salt_len = user_len + 1 + realm_len + 1;
18690
18691 uint max_salt_len = 119;
18692
18693 if (salt_len > max_salt_len)
18694 {
18695 myfree (temp_input_buf);
18696
18697 return (PARSER_SALT_LENGTH);
18698 }
18699
18700 snprintf (sip_salt_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
18701
18702 sip->salt_len = salt_len;
18703
18704 /*
18705 * fake salt (for sorting)
18706 */
18707
18708 char *salt_buf_ptr = (char *) salt->salt_buf;
18709
18710 max_salt_len = 55;
18711
18712 uint fake_salt_len = salt_len;
18713
18714 if (fake_salt_len > max_salt_len)
18715 {
18716 fake_salt_len = max_salt_len;
18717 }
18718
18719 snprintf (salt_buf_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
18720
18721 salt->salt_len = fake_salt_len;
18722
18723 /*
18724 * digest
18725 */
18726
18727 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
18728 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
18729 digest[2] = hex_to_u32 ((const u8 *) &digest_pos[16]);
18730 digest[3] = hex_to_u32 ((const u8 *) &digest_pos[24]);
18731
18732 digest[0] = byte_swap_32 (digest[0]);
18733 digest[1] = byte_swap_32 (digest[1]);
18734 digest[2] = byte_swap_32 (digest[2]);
18735 digest[3] = byte_swap_32 (digest[3]);
18736
18737 myfree (temp_input_buf);
18738
18739 return (PARSER_OK);
18740 }
18741
18742 int crc32_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18743 {
18744 if ((input_len < DISPLAY_LEN_MIN_11500) || (input_len > DISPLAY_LEN_MAX_11500)) return (PARSER_GLOBAL_LENGTH);
18745
18746 if (input_buf[8] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
18747
18748 u32 *digest = (u32 *) hash_buf->digest;
18749
18750 salt_t *salt = hash_buf->salt;
18751
18752 // digest
18753
18754 char *digest_pos = input_buf;
18755
18756 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[0]);
18757 digest[1] = 0;
18758 digest[2] = 0;
18759 digest[3] = 0;
18760
18761 // salt
18762
18763 char *salt_buf = input_buf + 8 + 1;
18764
18765 uint salt_len = 8;
18766
18767 char *salt_buf_ptr = (char *) salt->salt_buf;
18768
18769 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
18770
18771 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18772
18773 salt->salt_len = salt_len;
18774
18775 return (PARSER_OK);
18776 }
18777
18778 int seven_zip_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18779 {
18780 if ((input_len < DISPLAY_LEN_MIN_11600) || (input_len > DISPLAY_LEN_MAX_11600)) return (PARSER_GLOBAL_LENGTH);
18781
18782 if (memcmp (SIGNATURE_SEVEN_ZIP, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
18783
18784 u32 *digest = (u32 *) hash_buf->digest;
18785
18786 salt_t *salt = hash_buf->salt;
18787
18788 seven_zip_t *seven_zip = (seven_zip_t *) hash_buf->esalt;
18789
18790 /**
18791 * parse line
18792 */
18793
18794 char *p_buf_pos = input_buf + 4;
18795
18796 char *NumCyclesPower_pos = strchr (p_buf_pos, '$');
18797
18798 if (NumCyclesPower_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18799
18800 u32 p_buf_len = NumCyclesPower_pos - p_buf_pos;
18801
18802 NumCyclesPower_pos++;
18803
18804 char *salt_len_pos = strchr (NumCyclesPower_pos, '$');
18805
18806 if (salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18807
18808 u32 NumCyclesPower_len = salt_len_pos - NumCyclesPower_pos;
18809
18810 salt_len_pos++;
18811
18812 char *salt_buf_pos = strchr (salt_len_pos, '$');
18813
18814 if (salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18815
18816 u32 salt_len_len = salt_buf_pos - salt_len_pos;
18817
18818 salt_buf_pos++;
18819
18820 char *iv_len_pos = strchr (salt_buf_pos, '$');
18821
18822 if (iv_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18823
18824 u32 salt_buf_len = iv_len_pos - salt_buf_pos;
18825
18826 iv_len_pos++;
18827
18828 char *iv_buf_pos = strchr (iv_len_pos, '$');
18829
18830 if (iv_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18831
18832 u32 iv_len_len = iv_buf_pos - iv_len_pos;
18833
18834 iv_buf_pos++;
18835
18836 char *crc_buf_pos = strchr (iv_buf_pos, '$');
18837
18838 if (crc_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18839
18840 u32 iv_buf_len = crc_buf_pos - iv_buf_pos;
18841
18842 crc_buf_pos++;
18843
18844 char *data_len_pos = strchr (crc_buf_pos, '$');
18845
18846 if (data_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18847
18848 u32 crc_buf_len = data_len_pos - crc_buf_pos;
18849
18850 data_len_pos++;
18851
18852 char *unpack_size_pos = strchr (data_len_pos, '$');
18853
18854 if (unpack_size_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18855
18856 u32 data_len_len = unpack_size_pos - data_len_pos;
18857
18858 unpack_size_pos++;
18859
18860 char *data_buf_pos = strchr (unpack_size_pos, '$');
18861
18862 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18863
18864 u32 unpack_size_len = data_buf_pos - unpack_size_pos;
18865
18866 data_buf_pos++;
18867
18868 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;
18869
18870 const uint iter = atoi (NumCyclesPower_pos);
18871 const uint crc = atoi (crc_buf_pos);
18872 const uint p_buf = atoi (p_buf_pos);
18873 const uint salt_len = atoi (salt_len_pos);
18874 const uint iv_len = atoi (iv_len_pos);
18875 const uint unpack_size = atoi (unpack_size_pos);
18876 const uint data_len = atoi (data_len_pos);
18877
18878 /**
18879 * verify some data
18880 */
18881
18882 if (p_buf != 0) return (PARSER_SALT_VALUE);
18883 if (salt_len != 0) return (PARSER_SALT_VALUE);
18884
18885 if ((data_len * 2) != data_buf_len) return (PARSER_SALT_VALUE);
18886
18887 if (data_len > 384) return (PARSER_SALT_VALUE);
18888
18889 if (unpack_size > data_len) return (PARSER_SALT_VALUE);
18890
18891 /**
18892 * store data
18893 */
18894
18895 seven_zip->iv_buf[0] = hex_to_u32 ((const u8 *) &iv_buf_pos[ 0]);
18896 seven_zip->iv_buf[1] = hex_to_u32 ((const u8 *) &iv_buf_pos[ 8]);
18897 seven_zip->iv_buf[2] = hex_to_u32 ((const u8 *) &iv_buf_pos[16]);
18898 seven_zip->iv_buf[3] = hex_to_u32 ((const u8 *) &iv_buf_pos[24]);
18899
18900 seven_zip->iv_len = iv_len;
18901
18902 memcpy (seven_zip->salt_buf, salt_buf_pos, salt_buf_len); // we just need that for later ascii_digest()
18903
18904 seven_zip->salt_len = 0;
18905
18906 seven_zip->crc = crc;
18907
18908 for (uint i = 0, j = 0; j < data_buf_len; i += 1, j += 8)
18909 {
18910 seven_zip->data_buf[i] = hex_to_u32 ((const u8 *) &data_buf_pos[j]);
18911
18912 seven_zip->data_buf[i] = byte_swap_32 (seven_zip->data_buf[i]);
18913 }
18914
18915 seven_zip->data_len = data_len;
18916
18917 seven_zip->unpack_size = unpack_size;
18918
18919 // real salt
18920
18921 salt->salt_buf[0] = seven_zip->data_buf[0];
18922 salt->salt_buf[1] = seven_zip->data_buf[1];
18923 salt->salt_buf[2] = seven_zip->data_buf[2];
18924 salt->salt_buf[3] = seven_zip->data_buf[3];
18925
18926 salt->salt_len = 16;
18927
18928 salt->salt_sign[0] = iter;
18929
18930 salt->salt_iter = 1 << iter;
18931
18932 /**
18933 * digest
18934 */
18935
18936 digest[0] = crc;
18937 digest[1] = 0;
18938 digest[2] = 0;
18939 digest[3] = 0;
18940
18941 return (PARSER_OK);
18942 }
18943
18944 int gost2012sbog_256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18945 {
18946 if ((input_len < DISPLAY_LEN_MIN_11700) || (input_len > DISPLAY_LEN_MAX_11700)) return (PARSER_GLOBAL_LENGTH);
18947
18948 u32 *digest = (u32 *) hash_buf->digest;
18949
18950 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
18951 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
18952 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
18953 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
18954 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
18955 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
18956 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
18957 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
18958
18959 digest[0] = byte_swap_32 (digest[0]);
18960 digest[1] = byte_swap_32 (digest[1]);
18961 digest[2] = byte_swap_32 (digest[2]);
18962 digest[3] = byte_swap_32 (digest[3]);
18963 digest[4] = byte_swap_32 (digest[4]);
18964 digest[5] = byte_swap_32 (digest[5]);
18965 digest[6] = byte_swap_32 (digest[6]);
18966 digest[7] = byte_swap_32 (digest[7]);
18967
18968 return (PARSER_OK);
18969 }
18970
18971 int gost2012sbog_512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18972 {
18973 if ((input_len < DISPLAY_LEN_MIN_11800) || (input_len > DISPLAY_LEN_MAX_11800)) return (PARSER_GLOBAL_LENGTH);
18974
18975 u32 *digest = (u32 *) hash_buf->digest;
18976
18977 digest[ 0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
18978 digest[ 1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
18979 digest[ 2] = hex_to_u32 ((const u8 *) &input_buf[ 16]);
18980 digest[ 3] = hex_to_u32 ((const u8 *) &input_buf[ 24]);
18981 digest[ 4] = hex_to_u32 ((const u8 *) &input_buf[ 32]);
18982 digest[ 5] = hex_to_u32 ((const u8 *) &input_buf[ 40]);
18983 digest[ 6] = hex_to_u32 ((const u8 *) &input_buf[ 48]);
18984 digest[ 7] = hex_to_u32 ((const u8 *) &input_buf[ 56]);
18985 digest[ 8] = hex_to_u32 ((const u8 *) &input_buf[ 64]);
18986 digest[ 9] = hex_to_u32 ((const u8 *) &input_buf[ 72]);
18987 digest[10] = hex_to_u32 ((const u8 *) &input_buf[ 80]);
18988 digest[11] = hex_to_u32 ((const u8 *) &input_buf[ 88]);
18989 digest[12] = hex_to_u32 ((const u8 *) &input_buf[ 96]);
18990 digest[13] = hex_to_u32 ((const u8 *) &input_buf[104]);
18991 digest[14] = hex_to_u32 ((const u8 *) &input_buf[112]);
18992 digest[15] = hex_to_u32 ((const u8 *) &input_buf[120]);
18993
18994 digest[ 0] = byte_swap_32 (digest[ 0]);
18995 digest[ 1] = byte_swap_32 (digest[ 1]);
18996 digest[ 2] = byte_swap_32 (digest[ 2]);
18997 digest[ 3] = byte_swap_32 (digest[ 3]);
18998 digest[ 4] = byte_swap_32 (digest[ 4]);
18999 digest[ 5] = byte_swap_32 (digest[ 5]);
19000 digest[ 6] = byte_swap_32 (digest[ 6]);
19001 digest[ 7] = byte_swap_32 (digest[ 7]);
19002 digest[ 8] = byte_swap_32 (digest[ 8]);
19003 digest[ 9] = byte_swap_32 (digest[ 9]);
19004 digest[10] = byte_swap_32 (digest[10]);
19005 digest[11] = byte_swap_32 (digest[11]);
19006 digest[12] = byte_swap_32 (digest[12]);
19007 digest[13] = byte_swap_32 (digest[13]);
19008 digest[14] = byte_swap_32 (digest[14]);
19009 digest[15] = byte_swap_32 (digest[15]);
19010
19011 return (PARSER_OK);
19012 }
19013
19014 int pbkdf2_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19015 {
19016 if ((input_len < DISPLAY_LEN_MIN_11900) || (input_len > DISPLAY_LEN_MAX_11900)) return (PARSER_GLOBAL_LENGTH);
19017
19018 if (memcmp (SIGNATURE_PBKDF2_MD5, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
19019
19020 u32 *digest = (u32 *) hash_buf->digest;
19021
19022 salt_t *salt = hash_buf->salt;
19023
19024 pbkdf2_md5_t *pbkdf2_md5 = (pbkdf2_md5_t *) hash_buf->esalt;
19025
19026 /**
19027 * parse line
19028 */
19029
19030 // iterations
19031
19032 char *iter_pos = input_buf + 4;
19033
19034 u32 iter = atoi (iter_pos);
19035
19036 if (iter < 1) return (PARSER_SALT_ITERATION);
19037 if (iter > 999999) return (PARSER_SALT_ITERATION);
19038
19039 // first is *raw* salt
19040
19041 char *salt_pos = strchr (iter_pos, ':');
19042
19043 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19044
19045 salt_pos++;
19046
19047 char *hash_pos = strchr (salt_pos, ':');
19048
19049 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19050
19051 u32 salt_len = hash_pos - salt_pos;
19052
19053 if (salt_len > 64) return (PARSER_SALT_LENGTH);
19054
19055 hash_pos++;
19056
19057 u32 hash_b64_len = input_len - (hash_pos - input_buf);
19058
19059 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
19060
19061 // decode salt
19062
19063 char *salt_buf_ptr = (char *) pbkdf2_md5->salt_buf;
19064
19065 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
19066
19067 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
19068
19069 salt_buf_ptr[salt_len + 3] = 0x01;
19070 salt_buf_ptr[salt_len + 4] = 0x80;
19071
19072 salt->salt_len = salt_len;
19073 salt->salt_iter = iter - 1;
19074
19075 // decode hash
19076
19077 u8 tmp_buf[100] = { 0 };
19078
19079 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
19080
19081 if (hash_len < 16) return (PARSER_HASH_LENGTH);
19082
19083 memcpy (digest, tmp_buf, 16);
19084
19085 // add some stuff to normal salt to make sorted happy
19086
19087 salt->salt_buf[0] = pbkdf2_md5->salt_buf[0];
19088 salt->salt_buf[1] = pbkdf2_md5->salt_buf[1];
19089 salt->salt_buf[2] = pbkdf2_md5->salt_buf[2];
19090 salt->salt_buf[3] = pbkdf2_md5->salt_buf[3];
19091 salt->salt_buf[4] = salt->salt_iter;
19092
19093 return (PARSER_OK);
19094 }
19095
19096 int pbkdf2_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19097 {
19098 if ((input_len < DISPLAY_LEN_MIN_12000) || (input_len > DISPLAY_LEN_MAX_12000)) return (PARSER_GLOBAL_LENGTH);
19099
19100 if (memcmp (SIGNATURE_PBKDF2_SHA1, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
19101
19102 u32 *digest = (u32 *) hash_buf->digest;
19103
19104 salt_t *salt = hash_buf->salt;
19105
19106 pbkdf2_sha1_t *pbkdf2_sha1 = (pbkdf2_sha1_t *) hash_buf->esalt;
19107
19108 /**
19109 * parse line
19110 */
19111
19112 // iterations
19113
19114 char *iter_pos = input_buf + 5;
19115
19116 u32 iter = atoi (iter_pos);
19117
19118 if (iter < 1) return (PARSER_SALT_ITERATION);
19119 if (iter > 999999) return (PARSER_SALT_ITERATION);
19120
19121 // first is *raw* salt
19122
19123 char *salt_pos = strchr (iter_pos, ':');
19124
19125 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19126
19127 salt_pos++;
19128
19129 char *hash_pos = strchr (salt_pos, ':');
19130
19131 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19132
19133 u32 salt_len = hash_pos - salt_pos;
19134
19135 if (salt_len > 64) return (PARSER_SALT_LENGTH);
19136
19137 hash_pos++;
19138
19139 u32 hash_b64_len = input_len - (hash_pos - input_buf);
19140
19141 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
19142
19143 // decode salt
19144
19145 char *salt_buf_ptr = (char *) pbkdf2_sha1->salt_buf;
19146
19147 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
19148
19149 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
19150
19151 salt_buf_ptr[salt_len + 3] = 0x01;
19152 salt_buf_ptr[salt_len + 4] = 0x80;
19153
19154 salt->salt_len = salt_len;
19155 salt->salt_iter = iter - 1;
19156
19157 // decode hash
19158
19159 u8 tmp_buf[100] = { 0 };
19160
19161 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
19162
19163 if (hash_len < 16) return (PARSER_HASH_LENGTH);
19164
19165 memcpy (digest, tmp_buf, 16);
19166
19167 digest[0] = byte_swap_32 (digest[0]);
19168 digest[1] = byte_swap_32 (digest[1]);
19169 digest[2] = byte_swap_32 (digest[2]);
19170 digest[3] = byte_swap_32 (digest[3]);
19171
19172 // add some stuff to normal salt to make sorted happy
19173
19174 salt->salt_buf[0] = pbkdf2_sha1->salt_buf[0];
19175 salt->salt_buf[1] = pbkdf2_sha1->salt_buf[1];
19176 salt->salt_buf[2] = pbkdf2_sha1->salt_buf[2];
19177 salt->salt_buf[3] = pbkdf2_sha1->salt_buf[3];
19178 salt->salt_buf[4] = salt->salt_iter;
19179
19180 return (PARSER_OK);
19181 }
19182
19183 int pbkdf2_sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19184 {
19185 if ((input_len < DISPLAY_LEN_MIN_12100) || (input_len > DISPLAY_LEN_MAX_12100)) return (PARSER_GLOBAL_LENGTH);
19186
19187 if (memcmp (SIGNATURE_PBKDF2_SHA512, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
19188
19189 u64 *digest = (u64 *) hash_buf->digest;
19190
19191 salt_t *salt = hash_buf->salt;
19192
19193 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
19194
19195 /**
19196 * parse line
19197 */
19198
19199 // iterations
19200
19201 char *iter_pos = input_buf + 7;
19202
19203 u32 iter = atoi (iter_pos);
19204
19205 if (iter < 1) return (PARSER_SALT_ITERATION);
19206 if (iter > 999999) return (PARSER_SALT_ITERATION);
19207
19208 // first is *raw* salt
19209
19210 char *salt_pos = strchr (iter_pos, ':');
19211
19212 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19213
19214 salt_pos++;
19215
19216 char *hash_pos = strchr (salt_pos, ':');
19217
19218 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19219
19220 u32 salt_len = hash_pos - salt_pos;
19221
19222 if (salt_len > 64) return (PARSER_SALT_LENGTH);
19223
19224 hash_pos++;
19225
19226 u32 hash_b64_len = input_len - (hash_pos - input_buf);
19227
19228 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
19229
19230 // decode salt
19231
19232 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
19233
19234 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
19235
19236 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
19237
19238 salt_buf_ptr[salt_len + 3] = 0x01;
19239 salt_buf_ptr[salt_len + 4] = 0x80;
19240
19241 salt->salt_len = salt_len;
19242 salt->salt_iter = iter - 1;
19243
19244 // decode hash
19245
19246 u8 tmp_buf[100] = { 0 };
19247
19248 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
19249
19250 if (hash_len < 16) return (PARSER_HASH_LENGTH);
19251
19252 memcpy (digest, tmp_buf, 64);
19253
19254 digest[0] = byte_swap_64 (digest[0]);
19255 digest[1] = byte_swap_64 (digest[1]);
19256 digest[2] = byte_swap_64 (digest[2]);
19257 digest[3] = byte_swap_64 (digest[3]);
19258 digest[4] = byte_swap_64 (digest[4]);
19259 digest[5] = byte_swap_64 (digest[5]);
19260 digest[6] = byte_swap_64 (digest[6]);
19261 digest[7] = byte_swap_64 (digest[7]);
19262
19263 // add some stuff to normal salt to make sorted happy
19264
19265 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
19266 salt->salt_buf[1] = pbkdf2_sha512->salt_buf[1];
19267 salt->salt_buf[2] = pbkdf2_sha512->salt_buf[2];
19268 salt->salt_buf[3] = pbkdf2_sha512->salt_buf[3];
19269 salt->salt_buf[4] = salt->salt_iter;
19270
19271 return (PARSER_OK);
19272 }
19273
19274 int ecryptfs_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19275 {
19276 if ((input_len < DISPLAY_LEN_MIN_12200) || (input_len > DISPLAY_LEN_MAX_12200)) return (PARSER_GLOBAL_LENGTH);
19277
19278 if (memcmp (SIGNATURE_ECRYPTFS, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
19279
19280 uint *digest = (uint *) hash_buf->digest;
19281
19282 salt_t *salt = hash_buf->salt;
19283
19284 /**
19285 * parse line
19286 */
19287
19288 char *salt_pos = input_buf + 10 + 2 + 2; // skip over "0$" and "1$"
19289
19290 char *hash_pos = strchr (salt_pos, '$');
19291
19292 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19293
19294 u32 salt_len = hash_pos - salt_pos;
19295
19296 if (salt_len != 16) return (PARSER_SALT_LENGTH);
19297
19298 hash_pos++;
19299
19300 u32 hash_len = input_len - 10 - 2 - 2 - salt_len - 1;
19301
19302 if (hash_len != 16) return (PARSER_HASH_LENGTH);
19303
19304 // decode hash
19305
19306 digest[ 0] = hex_to_u32 ((const u8 *) &hash_pos[0]);
19307 digest[ 1] = hex_to_u32 ((const u8 *) &hash_pos[8]);
19308 digest[ 2] = 0;
19309 digest[ 3] = 0;
19310 digest[ 4] = 0;
19311 digest[ 5] = 0;
19312 digest[ 6] = 0;
19313 digest[ 7] = 0;
19314 digest[ 8] = 0;
19315 digest[ 9] = 0;
19316 digest[10] = 0;
19317 digest[11] = 0;
19318 digest[12] = 0;
19319 digest[13] = 0;
19320 digest[14] = 0;
19321 digest[15] = 0;
19322
19323 // decode salt
19324
19325 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[0]);
19326 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[8]);
19327
19328 salt->salt_iter = ROUNDS_ECRYPTFS;
19329 salt->salt_len = 8;
19330
19331 return (PARSER_OK);
19332 }
19333
19334 int bsdicrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19335 {
19336 if ((input_len < DISPLAY_LEN_MIN_12400) || (input_len > DISPLAY_LEN_MAX_12400)) return (PARSER_GLOBAL_LENGTH);
19337
19338 if (memcmp (SIGNATURE_BSDICRYPT, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
19339
19340 unsigned char c19 = itoa64_to_int (input_buf[19]);
19341
19342 if (c19 & 3) return (PARSER_HASH_VALUE);
19343
19344 salt_t *salt = hash_buf->salt;
19345
19346 u32 *digest = (u32 *) hash_buf->digest;
19347
19348 // iteration count
19349
19350 salt->salt_iter = itoa64_to_int (input_buf[1])
19351 | itoa64_to_int (input_buf[2]) << 6
19352 | itoa64_to_int (input_buf[3]) << 12
19353 | itoa64_to_int (input_buf[4]) << 18;
19354
19355 // set salt
19356
19357 salt->salt_buf[0] = itoa64_to_int (input_buf[5])
19358 | itoa64_to_int (input_buf[6]) << 6
19359 | itoa64_to_int (input_buf[7]) << 12
19360 | itoa64_to_int (input_buf[8]) << 18;
19361
19362 salt->salt_len = 4;
19363
19364 u8 tmp_buf[100] = { 0 };
19365
19366 base64_decode (itoa64_to_int, (const u8 *) input_buf + 9, 11, tmp_buf);
19367
19368 memcpy (digest, tmp_buf, 8);
19369
19370 uint tt;
19371
19372 IP (digest[0], digest[1], tt);
19373
19374 digest[0] = rotr32 (digest[0], 31);
19375 digest[1] = rotr32 (digest[1], 31);
19376 digest[2] = 0;
19377 digest[3] = 0;
19378
19379 return (PARSER_OK);
19380 }
19381
19382 int rar3hp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19383 {
19384 if ((input_len < DISPLAY_LEN_MIN_12500) || (input_len > DISPLAY_LEN_MAX_12500)) return (PARSER_GLOBAL_LENGTH);
19385
19386 if (memcmp (SIGNATURE_RAR3, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
19387
19388 u32 *digest = (u32 *) hash_buf->digest;
19389
19390 salt_t *salt = hash_buf->salt;
19391
19392 /**
19393 * parse line
19394 */
19395
19396 char *type_pos = input_buf + 6 + 1;
19397
19398 char *salt_pos = strchr (type_pos, '*');
19399
19400 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19401
19402 u32 type_len = salt_pos - type_pos;
19403
19404 if (type_len != 1) return (PARSER_SALT_LENGTH);
19405
19406 salt_pos++;
19407
19408 char *crypted_pos = strchr (salt_pos, '*');
19409
19410 if (crypted_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19411
19412 u32 salt_len = crypted_pos - salt_pos;
19413
19414 if (salt_len != 16) return (PARSER_SALT_LENGTH);
19415
19416 crypted_pos++;
19417
19418 u32 crypted_len = input_len - 6 - 1 - type_len - 1 - salt_len - 1;
19419
19420 if (crypted_len != 32) return (PARSER_SALT_LENGTH);
19421
19422 /**
19423 * copy data
19424 */
19425
19426 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[0]);
19427 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[8]);
19428
19429 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
19430 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
19431
19432 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &crypted_pos[ 0]);
19433 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &crypted_pos[ 8]);
19434 salt->salt_buf[4] = hex_to_u32 ((const u8 *) &crypted_pos[16]);
19435 salt->salt_buf[5] = hex_to_u32 ((const u8 *) &crypted_pos[24]);
19436
19437 salt->salt_len = 24;
19438 salt->salt_iter = ROUNDS_RAR3;
19439
19440 // there's no hash for rar3. the data which is in crypted_pos is some encrypted data and
19441 // if it matches the value \xc4\x3d\x7b\x00\x40\x07\x00 after decrypt we know that we successfully cracked it.
19442
19443 digest[0] = 0xc43d7b00;
19444 digest[1] = 0x40070000;
19445 digest[2] = 0;
19446 digest[3] = 0;
19447
19448 return (PARSER_OK);
19449 }
19450
19451 int rar5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19452 {
19453 if ((input_len < DISPLAY_LEN_MIN_13000) || (input_len > DISPLAY_LEN_MAX_13000)) return (PARSER_GLOBAL_LENGTH);
19454
19455 if (memcmp (SIGNATURE_RAR5, input_buf, 1 + 4 + 1)) return (PARSER_SIGNATURE_UNMATCHED);
19456
19457 u32 *digest = (u32 *) hash_buf->digest;
19458
19459 salt_t *salt = hash_buf->salt;
19460
19461 rar5_t *rar5 = (rar5_t *) hash_buf->esalt;
19462
19463 /**
19464 * parse line
19465 */
19466
19467 char *param0_pos = input_buf + 1 + 4 + 1;
19468
19469 char *param1_pos = strchr (param0_pos, '$');
19470
19471 if (param1_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19472
19473 u32 param0_len = param1_pos - param0_pos;
19474
19475 param1_pos++;
19476
19477 char *param2_pos = strchr (param1_pos, '$');
19478
19479 if (param2_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19480
19481 u32 param1_len = param2_pos - param1_pos;
19482
19483 param2_pos++;
19484
19485 char *param3_pos = strchr (param2_pos, '$');
19486
19487 if (param3_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19488
19489 u32 param2_len = param3_pos - param2_pos;
19490
19491 param3_pos++;
19492
19493 char *param4_pos = strchr (param3_pos, '$');
19494
19495 if (param4_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19496
19497 u32 param3_len = param4_pos - param3_pos;
19498
19499 param4_pos++;
19500
19501 char *param5_pos = strchr (param4_pos, '$');
19502
19503 if (param5_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19504
19505 u32 param4_len = param5_pos - param4_pos;
19506
19507 param5_pos++;
19508
19509 u32 param5_len = input_len - 1 - 4 - 1 - param0_len - 1 - param1_len - 1 - param2_len - 1 - param3_len - 1 - param4_len - 1;
19510
19511 char *salt_buf = param1_pos;
19512 char *iv = param3_pos;
19513 char *pswcheck = param5_pos;
19514
19515 const uint salt_len = atoi (param0_pos);
19516 const uint iterations = atoi (param2_pos);
19517 const uint pswcheck_len = atoi (param4_pos);
19518
19519 /**
19520 * verify some data
19521 */
19522
19523 if (param1_len != 32) return (PARSER_SALT_VALUE);
19524 if (param3_len != 32) return (PARSER_SALT_VALUE);
19525 if (param5_len != 16) return (PARSER_SALT_VALUE);
19526
19527 if (salt_len != 16) return (PARSER_SALT_VALUE);
19528 if (iterations == 0) return (PARSER_SALT_VALUE);
19529 if (pswcheck_len != 8) return (PARSER_SALT_VALUE);
19530
19531 /**
19532 * store data
19533 */
19534
19535 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
19536 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
19537 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
19538 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf[24]);
19539
19540 rar5->iv[0] = hex_to_u32 ((const u8 *) &iv[ 0]);
19541 rar5->iv[1] = hex_to_u32 ((const u8 *) &iv[ 8]);
19542 rar5->iv[2] = hex_to_u32 ((const u8 *) &iv[16]);
19543 rar5->iv[3] = hex_to_u32 ((const u8 *) &iv[24]);
19544
19545 salt->salt_len = 16;
19546
19547 salt->salt_sign[0] = iterations;
19548
19549 salt->salt_iter = ((1 << iterations) + 32) - 1;
19550
19551 /**
19552 * digest buf
19553 */
19554
19555 digest[0] = hex_to_u32 ((const u8 *) &pswcheck[ 0]);
19556 digest[1] = hex_to_u32 ((const u8 *) &pswcheck[ 8]);
19557 digest[2] = 0;
19558 digest[3] = 0;
19559
19560 return (PARSER_OK);
19561 }
19562
19563 int krb5tgs_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19564 {
19565 if ((input_len < DISPLAY_LEN_MIN_13100) || (input_len > DISPLAY_LEN_MAX_13100)) return (PARSER_GLOBAL_LENGTH);
19566
19567 if (memcmp (SIGNATURE_KRB5TGS, input_buf, 11)) return (PARSER_SIGNATURE_UNMATCHED);
19568
19569 u32 *digest = (u32 *) hash_buf->digest;
19570
19571 salt_t *salt = hash_buf->salt;
19572
19573 krb5tgs_t *krb5tgs = (krb5tgs_t *) hash_buf->esalt;
19574
19575 /**
19576 * parse line
19577 */
19578
19579 /* Skip '$' */
19580 char *account_pos = input_buf + 11 + 1;
19581
19582 char *data_pos;
19583
19584 uint data_len;
19585
19586 if (account_pos[0] == '*')
19587 {
19588 account_pos++;
19589
19590 data_pos = strchr (account_pos, '*');
19591
19592 /* Skip '*' */
19593 data_pos++;
19594
19595 if (data_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19596
19597 uint account_len = data_pos - account_pos + 1;
19598
19599 if (account_len >= 512) return (PARSER_SALT_LENGTH);
19600
19601 /* Skip '$' */
19602 data_pos++;
19603
19604 data_len = input_len - 11 - 1 - account_len - 2;
19605
19606 memcpy (krb5tgs->account_info, account_pos - 1, account_len);
19607 }
19608 else
19609 {
19610 /* assume $krb5tgs$23$checksum$edata2 */
19611 data_pos = account_pos;
19612
19613 memcpy (krb5tgs->account_info, "**", 3);
19614
19615 data_len = input_len - 11 - 1 - 1;
19616 }
19617
19618 if (data_len < ((16 + 32) * 2)) return (PARSER_SALT_LENGTH);
19619
19620 char *checksum_ptr = (char *) krb5tgs->checksum;
19621
19622 for (uint i = 0; i < 16 * 2; i += 2)
19623 {
19624 const char p0 = data_pos[i + 0];
19625 const char p1 = data_pos[i + 1];
19626
19627 *checksum_ptr++ = hex_convert (p1) << 0
19628 | hex_convert (p0) << 4;
19629 }
19630
19631 char *edata_ptr = (char *) krb5tgs->edata2;
19632
19633 krb5tgs->edata2_len = (data_len - 32) / 2 ;
19634
19635 /* skip '$' */
19636 for (uint i = 16 * 2 + 1; i < (krb5tgs->edata2_len * 2) + (16 * 2 + 1); i += 2)
19637 {
19638 const char p0 = data_pos[i + 0];
19639 const char p1 = data_pos[i + 1];
19640 *edata_ptr++ = hex_convert (p1) << 0
19641 | hex_convert (p0) << 4;
19642 }
19643
19644 /* this is needed for hmac_md5 */
19645 *edata_ptr++ = 0x80;
19646
19647 salt->salt_buf[0] = krb5tgs->checksum[0];
19648 salt->salt_buf[1] = krb5tgs->checksum[1];
19649 salt->salt_buf[2] = krb5tgs->checksum[2];
19650 salt->salt_buf[3] = krb5tgs->checksum[3];
19651
19652 salt->salt_len = 32;
19653
19654 digest[0] = krb5tgs->checksum[0];
19655 digest[1] = krb5tgs->checksum[1];
19656 digest[2] = krb5tgs->checksum[2];
19657 digest[3] = krb5tgs->checksum[3];
19658
19659 return (PARSER_OK);
19660 }
19661
19662 int axcrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19663 {
19664 if ((input_len < DISPLAY_LEN_MIN_13200) || (input_len > DISPLAY_LEN_MAX_13200)) return (PARSER_GLOBAL_LENGTH);
19665
19666 if (memcmp (SIGNATURE_AXCRYPT, input_buf, 11)) return (PARSER_SIGNATURE_UNMATCHED);
19667
19668 u32 *digest = (u32 *) hash_buf->digest;
19669
19670 salt_t *salt = hash_buf->salt;
19671
19672 /**
19673 * parse line
19674 */
19675
19676 /* Skip '*' */
19677 char *wrapping_rounds_pos = input_buf + 11 + 1;
19678
19679 char *salt_pos;
19680
19681 char *wrapped_key_pos;
19682
19683 char *data_pos;
19684
19685 salt->salt_iter = atoi (wrapping_rounds_pos);
19686
19687 salt_pos = strchr (wrapping_rounds_pos, '*');
19688
19689 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19690
19691 uint wrapping_rounds_len = salt_pos - wrapping_rounds_pos;
19692
19693 /* Skip '*' */
19694 salt_pos++;
19695
19696 data_pos = salt_pos;
19697
19698 wrapped_key_pos = strchr (salt_pos, '*');
19699
19700 if (wrapped_key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19701
19702 uint salt_len = wrapped_key_pos - salt_pos;
19703
19704 if (salt_len != 32) return (PARSER_SALT_LENGTH);
19705
19706 /* Skip '*' */
19707 wrapped_key_pos++;
19708
19709 uint wrapped_key_len = input_len - 11 - 1 - wrapping_rounds_len - 1 - salt_len - 1;
19710
19711 if (wrapped_key_len != 48) return (PARSER_SALT_LENGTH);
19712
19713 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &data_pos[ 0]);
19714 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &data_pos[ 8]);
19715 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &data_pos[16]);
19716 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &data_pos[24]);
19717
19718 data_pos += 33;
19719
19720 salt->salt_buf[4] = hex_to_u32 ((const u8 *) &data_pos[ 0]);
19721 salt->salt_buf[5] = hex_to_u32 ((const u8 *) &data_pos[ 8]);
19722 salt->salt_buf[6] = hex_to_u32 ((const u8 *) &data_pos[16]);
19723 salt->salt_buf[7] = hex_to_u32 ((const u8 *) &data_pos[24]);
19724 salt->salt_buf[8] = hex_to_u32 ((const u8 *) &data_pos[32]);
19725 salt->salt_buf[9] = hex_to_u32 ((const u8 *) &data_pos[40]);
19726
19727 salt->salt_len = 40;
19728
19729 digest[0] = salt->salt_buf[0];
19730 digest[1] = salt->salt_buf[1];
19731 digest[2] = salt->salt_buf[2];
19732 digest[3] = salt->salt_buf[3];
19733
19734 return (PARSER_OK);
19735 }
19736
19737 int keepass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19738 {
19739 if ((input_len < DISPLAY_LEN_MIN_13400) || (input_len > DISPLAY_LEN_MAX_13400)) return (PARSER_GLOBAL_LENGTH);
19740
19741 if (memcmp (SIGNATURE_KEEPASS, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
19742
19743 u32 *digest = (u32 *) hash_buf->digest;
19744
19745 salt_t *salt = hash_buf->salt;
19746
19747 keepass_t *keepass = (keepass_t *) hash_buf->esalt;
19748
19749 /**
19750 * parse line
19751 */
19752
19753 char *version_pos;
19754
19755 char *rounds_pos;
19756
19757 char *algorithm_pos;
19758
19759 char *final_random_seed_pos;
19760 u32 final_random_seed_len;
19761
19762 char *transf_random_seed_pos;
19763 u32 transf_random_seed_len;
19764
19765 char *enc_iv_pos;
19766 u32 enc_iv_len;
19767
19768 /* default is no keyfile provided */
19769 char *keyfile_len_pos;
19770 u32 keyfile_len = 0;
19771 u32 is_keyfile_present = 0;
19772 char *keyfile_inline_pos;
19773 char *keyfile_pos;
19774
19775 /* specific to version 1 */
19776 char *contents_len_pos;
19777 u32 contents_len;
19778 char *contents_pos;
19779
19780 /* specific to version 2 */
19781 char *expected_bytes_pos;
19782 u32 expected_bytes_len;
19783
19784 char *contents_hash_pos;
19785 u32 contents_hash_len;
19786
19787 version_pos = input_buf + 8 + 1 + 1;
19788
19789 keepass->version = atoi (version_pos);
19790
19791 rounds_pos = strchr (version_pos, '*');
19792
19793 if (rounds_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19794
19795 rounds_pos++;
19796
19797 salt->salt_iter = (atoi (rounds_pos));
19798
19799 algorithm_pos = strchr (rounds_pos, '*');
19800
19801 if (algorithm_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19802
19803 algorithm_pos++;
19804
19805 keepass->algorithm = atoi (algorithm_pos);
19806
19807 final_random_seed_pos = strchr (algorithm_pos, '*');
19808
19809 if (final_random_seed_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19810
19811 final_random_seed_pos++;
19812
19813 keepass->final_random_seed[0] = hex_to_u32 ((const u8 *) &final_random_seed_pos[ 0]);
19814 keepass->final_random_seed[1] = hex_to_u32 ((const u8 *) &final_random_seed_pos[ 8]);
19815 keepass->final_random_seed[2] = hex_to_u32 ((const u8 *) &final_random_seed_pos[16]);
19816 keepass->final_random_seed[3] = hex_to_u32 ((const u8 *) &final_random_seed_pos[24]);
19817
19818 if (keepass->version == 2)
19819 {
19820 keepass->final_random_seed[4] = hex_to_u32 ((const u8 *) &final_random_seed_pos[32]);
19821 keepass->final_random_seed[5] = hex_to_u32 ((const u8 *) &final_random_seed_pos[40]);
19822 keepass->final_random_seed[6] = hex_to_u32 ((const u8 *) &final_random_seed_pos[48]);
19823 keepass->final_random_seed[7] = hex_to_u32 ((const u8 *) &final_random_seed_pos[56]);
19824 }
19825
19826 transf_random_seed_pos = strchr (final_random_seed_pos, '*');
19827
19828 if (transf_random_seed_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19829
19830 final_random_seed_len = transf_random_seed_pos - final_random_seed_pos;
19831
19832 if (keepass->version == 1 && final_random_seed_len != 32) return (PARSER_SALT_LENGTH);
19833 if (keepass->version == 2 && final_random_seed_len != 64) return (PARSER_SALT_LENGTH);
19834
19835 transf_random_seed_pos++;
19836
19837 keepass->transf_random_seed[0] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[ 0]);
19838 keepass->transf_random_seed[1] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[ 8]);
19839 keepass->transf_random_seed[2] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[16]);
19840 keepass->transf_random_seed[3] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[24]);
19841 keepass->transf_random_seed[4] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[32]);
19842 keepass->transf_random_seed[5] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[40]);
19843 keepass->transf_random_seed[6] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[48]);
19844 keepass->transf_random_seed[7] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[56]);
19845
19846 enc_iv_pos = strchr (transf_random_seed_pos, '*');
19847
19848 if (enc_iv_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19849
19850 transf_random_seed_len = enc_iv_pos - transf_random_seed_pos;
19851
19852 if (transf_random_seed_len != 64) return (PARSER_SALT_LENGTH);
19853
19854 enc_iv_pos++;
19855
19856 keepass->enc_iv[0] = hex_to_u32 ((const u8 *) &enc_iv_pos[ 0]);
19857 keepass->enc_iv[1] = hex_to_u32 ((const u8 *) &enc_iv_pos[ 8]);
19858 keepass->enc_iv[2] = hex_to_u32 ((const u8 *) &enc_iv_pos[16]);
19859 keepass->enc_iv[3] = hex_to_u32 ((const u8 *) &enc_iv_pos[24]);
19860
19861 if (keepass->version == 1)
19862 {
19863 contents_hash_pos = strchr (enc_iv_pos, '*');
19864
19865 if (contents_hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19866
19867 enc_iv_len = contents_hash_pos - enc_iv_pos;
19868
19869 if (enc_iv_len != 32) return (PARSER_SALT_LENGTH);
19870
19871 contents_hash_pos++;
19872
19873 keepass->contents_hash[0] = hex_to_u32 ((const u8 *) &contents_hash_pos[ 0]);
19874 keepass->contents_hash[1] = hex_to_u32 ((const u8 *) &contents_hash_pos[ 8]);
19875 keepass->contents_hash[2] = hex_to_u32 ((const u8 *) &contents_hash_pos[16]);
19876 keepass->contents_hash[3] = hex_to_u32 ((const u8 *) &contents_hash_pos[24]);
19877 keepass->contents_hash[4] = hex_to_u32 ((const u8 *) &contents_hash_pos[32]);
19878 keepass->contents_hash[5] = hex_to_u32 ((const u8 *) &contents_hash_pos[40]);
19879 keepass->contents_hash[6] = hex_to_u32 ((const u8 *) &contents_hash_pos[48]);
19880 keepass->contents_hash[7] = hex_to_u32 ((const u8 *) &contents_hash_pos[56]);
19881
19882 /* get length of contents following */
19883 char *inline_flag_pos = strchr (contents_hash_pos, '*');
19884
19885 if (inline_flag_pos == NULL) return (PARSER_SALT_LENGTH);
19886
19887 contents_hash_len = inline_flag_pos - contents_hash_pos;
19888
19889 if (contents_hash_len != 64) return (PARSER_SALT_LENGTH);
19890
19891 inline_flag_pos++;
19892
19893 u32 inline_flag = atoi (inline_flag_pos);
19894
19895 if (inline_flag != 1) return (PARSER_SALT_LENGTH);
19896
19897 contents_len_pos = strchr (inline_flag_pos, '*');
19898
19899 if (contents_len_pos == NULL) return (PARSER_SALT_LENGTH);
19900
19901 contents_len_pos++;
19902
19903 contents_len = atoi (contents_len_pos);
19904
19905 if (contents_len > 50000) return (PARSER_SALT_LENGTH);
19906
19907 contents_pos = strchr (contents_len_pos, '*');
19908
19909 if (contents_pos == NULL) return (PARSER_SALT_LENGTH);
19910
19911 contents_pos++;
19912
19913 u32 i;
19914
19915 keepass->contents_len = contents_len;
19916
19917 contents_len = contents_len / 4;
19918
19919 keyfile_inline_pos = strchr (contents_pos, '*');
19920
19921 u32 real_contents_len;
19922
19923 if (keyfile_inline_pos == NULL)
19924 real_contents_len = input_len - (contents_pos - input_buf);
19925 else
19926 {
19927 real_contents_len = keyfile_inline_pos - contents_pos;
19928 keyfile_inline_pos++;
19929 is_keyfile_present = 1;
19930 }
19931
19932 if (real_contents_len != keepass->contents_len * 2) return (PARSER_SALT_LENGTH);
19933
19934 for (i = 0; i < contents_len; i++)
19935 keepass->contents[i] = hex_to_u32 ((const u8 *) &contents_pos[i * 8]);
19936 }
19937 else if (keepass->version == 2)
19938 {
19939 expected_bytes_pos = strchr (enc_iv_pos, '*');
19940
19941 if (expected_bytes_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19942
19943 enc_iv_len = expected_bytes_pos - enc_iv_pos;
19944
19945 if (enc_iv_len != 32) return (PARSER_SALT_LENGTH);
19946
19947 expected_bytes_pos++;
19948
19949 keepass->expected_bytes[0] = hex_to_u32 ((const u8 *) &expected_bytes_pos[ 0]);
19950 keepass->expected_bytes[1] = hex_to_u32 ((const u8 *) &expected_bytes_pos[ 8]);
19951 keepass->expected_bytes[2] = hex_to_u32 ((const u8 *) &expected_bytes_pos[16]);
19952 keepass->expected_bytes[3] = hex_to_u32 ((const u8 *) &expected_bytes_pos[24]);
19953 keepass->expected_bytes[4] = hex_to_u32 ((const u8 *) &expected_bytes_pos[32]);
19954 keepass->expected_bytes[5] = hex_to_u32 ((const u8 *) &expected_bytes_pos[40]);
19955 keepass->expected_bytes[6] = hex_to_u32 ((const u8 *) &expected_bytes_pos[48]);
19956 keepass->expected_bytes[7] = hex_to_u32 ((const u8 *) &expected_bytes_pos[56]);
19957
19958 contents_hash_pos = strchr (expected_bytes_pos, '*');
19959
19960 if (contents_hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19961
19962 expected_bytes_len = contents_hash_pos - expected_bytes_pos;
19963
19964 if (expected_bytes_len != 64) return (PARSER_SALT_LENGTH);
19965
19966 contents_hash_pos++;
19967
19968 keepass->contents_hash[0] = hex_to_u32 ((const u8 *) &contents_hash_pos[ 0]);
19969 keepass->contents_hash[1] = hex_to_u32 ((const u8 *) &contents_hash_pos[ 8]);
19970 keepass->contents_hash[2] = hex_to_u32 ((const u8 *) &contents_hash_pos[16]);
19971 keepass->contents_hash[3] = hex_to_u32 ((const u8 *) &contents_hash_pos[24]);
19972 keepass->contents_hash[4] = hex_to_u32 ((const u8 *) &contents_hash_pos[32]);
19973 keepass->contents_hash[5] = hex_to_u32 ((const u8 *) &contents_hash_pos[40]);
19974 keepass->contents_hash[6] = hex_to_u32 ((const u8 *) &contents_hash_pos[48]);
19975 keepass->contents_hash[7] = hex_to_u32 ((const u8 *) &contents_hash_pos[56]);
19976
19977 keyfile_inline_pos = strchr (contents_hash_pos, '*');
19978
19979 if (keyfile_inline_pos == NULL)
19980 contents_hash_len = input_len - (int) (contents_hash_pos - input_buf);
19981 else
19982 {
19983 contents_hash_len = keyfile_inline_pos - contents_hash_pos;
19984 keyfile_inline_pos++;
19985 is_keyfile_present = 1;
19986 }
19987 if (contents_hash_len != 64) return (PARSER_SALT_LENGTH);
19988 }
19989
19990 if (is_keyfile_present != 0)
19991 {
19992 keyfile_len_pos = strchr (keyfile_inline_pos, '*');
19993
19994 keyfile_len_pos++;
19995
19996 keyfile_len = atoi (keyfile_len_pos);
19997
19998 keepass->keyfile_len = keyfile_len;
19999
20000 if (keyfile_len != 64) return (PARSER_SALT_LENGTH);
20001
20002 keyfile_pos = strchr (keyfile_len_pos, '*');
20003
20004 if (keyfile_pos == NULL) return (PARSER_SALT_LENGTH);
20005
20006 keyfile_pos++;
20007
20008 u32 real_keyfile_len = input_len - (keyfile_pos - input_buf);
20009
20010 if (real_keyfile_len != 64) return (PARSER_SALT_LENGTH);
20011
20012 keepass->keyfile[0] = hex_to_u32 ((const u8 *) &keyfile_pos[ 0]);
20013 keepass->keyfile[1] = hex_to_u32 ((const u8 *) &keyfile_pos[ 8]);
20014 keepass->keyfile[2] = hex_to_u32 ((const u8 *) &keyfile_pos[16]);
20015 keepass->keyfile[3] = hex_to_u32 ((const u8 *) &keyfile_pos[24]);
20016 keepass->keyfile[4] = hex_to_u32 ((const u8 *) &keyfile_pos[32]);
20017 keepass->keyfile[5] = hex_to_u32 ((const u8 *) &keyfile_pos[40]);
20018 keepass->keyfile[6] = hex_to_u32 ((const u8 *) &keyfile_pos[48]);
20019 keepass->keyfile[7] = hex_to_u32 ((const u8 *) &keyfile_pos[56]);
20020 }
20021
20022 digest[0] = keepass->enc_iv[0];
20023 digest[1] = keepass->enc_iv[1];
20024 digest[2] = keepass->enc_iv[2];
20025 digest[3] = keepass->enc_iv[3];
20026
20027 salt->salt_buf[0] = keepass->transf_random_seed[0];
20028 salt->salt_buf[1] = keepass->transf_random_seed[1];
20029 salt->salt_buf[2] = keepass->transf_random_seed[2];
20030 salt->salt_buf[3] = keepass->transf_random_seed[3];
20031 salt->salt_buf[4] = keepass->transf_random_seed[4];
20032 salt->salt_buf[5] = keepass->transf_random_seed[5];
20033 salt->salt_buf[6] = keepass->transf_random_seed[6];
20034 salt->salt_buf[7] = keepass->transf_random_seed[7];
20035
20036 return (PARSER_OK);
20037 }
20038
20039 int cf10_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
20040 {
20041 if ((input_len < DISPLAY_LEN_MIN_12600) || (input_len > DISPLAY_LEN_MAX_12600)) return (PARSER_GLOBAL_LENGTH);
20042
20043 u32 *digest = (u32 *) hash_buf->digest;
20044
20045 salt_t *salt = hash_buf->salt;
20046
20047 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
20048 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
20049 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
20050 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
20051 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
20052 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
20053 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
20054 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
20055
20056 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
20057
20058 uint salt_len = input_len - 64 - 1;
20059
20060 char *salt_buf = input_buf + 64 + 1;
20061
20062 char *salt_buf_ptr = (char *) salt->salt_buf;
20063
20064 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
20065
20066 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
20067
20068 salt->salt_len = salt_len;
20069
20070 /**
20071 * we can precompute the first sha256 transform
20072 */
20073
20074 uint w[16] = { 0 };
20075
20076 w[ 0] = byte_swap_32 (salt->salt_buf[ 0]);
20077 w[ 1] = byte_swap_32 (salt->salt_buf[ 1]);
20078 w[ 2] = byte_swap_32 (salt->salt_buf[ 2]);
20079 w[ 3] = byte_swap_32 (salt->salt_buf[ 3]);
20080 w[ 4] = byte_swap_32 (salt->salt_buf[ 4]);
20081 w[ 5] = byte_swap_32 (salt->salt_buf[ 5]);
20082 w[ 6] = byte_swap_32 (salt->salt_buf[ 6]);
20083 w[ 7] = byte_swap_32 (salt->salt_buf[ 7]);
20084 w[ 8] = byte_swap_32 (salt->salt_buf[ 8]);
20085 w[ 9] = byte_swap_32 (salt->salt_buf[ 9]);
20086 w[10] = byte_swap_32 (salt->salt_buf[10]);
20087 w[11] = byte_swap_32 (salt->salt_buf[11]);
20088 w[12] = byte_swap_32 (salt->salt_buf[12]);
20089 w[13] = byte_swap_32 (salt->salt_buf[13]);
20090 w[14] = byte_swap_32 (salt->salt_buf[14]);
20091 w[15] = byte_swap_32 (salt->salt_buf[15]);
20092
20093 uint pc256[8] = { SHA256M_A, SHA256M_B, SHA256M_C, SHA256M_D, SHA256M_E, SHA256M_F, SHA256M_G, SHA256M_H };
20094
20095 sha256_64 (w, pc256);
20096
20097 salt->salt_buf_pc[0] = pc256[0];
20098 salt->salt_buf_pc[1] = pc256[1];
20099 salt->salt_buf_pc[2] = pc256[2];
20100 salt->salt_buf_pc[3] = pc256[3];
20101 salt->salt_buf_pc[4] = pc256[4];
20102 salt->salt_buf_pc[5] = pc256[5];
20103 salt->salt_buf_pc[6] = pc256[6];
20104 salt->salt_buf_pc[7] = pc256[7];
20105
20106 digest[0] -= pc256[0];
20107 digest[1] -= pc256[1];
20108 digest[2] -= pc256[2];
20109 digest[3] -= pc256[3];
20110 digest[4] -= pc256[4];
20111 digest[5] -= pc256[5];
20112 digest[6] -= pc256[6];
20113 digest[7] -= pc256[7];
20114
20115 return (PARSER_OK);
20116 }
20117
20118 int mywallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
20119 {
20120 if ((input_len < DISPLAY_LEN_MIN_12700) || (input_len > DISPLAY_LEN_MAX_12700)) return (PARSER_GLOBAL_LENGTH);
20121
20122 if (memcmp (SIGNATURE_MYWALLET, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
20123
20124 u32 *digest = (u32 *) hash_buf->digest;
20125
20126 salt_t *salt = hash_buf->salt;
20127
20128 /**
20129 * parse line
20130 */
20131
20132 char *data_len_pos = input_buf + 1 + 10 + 1;
20133
20134 char *data_buf_pos = strchr (data_len_pos, '$');
20135
20136 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20137
20138 u32 data_len_len = data_buf_pos - data_len_pos;
20139
20140 if (data_len_len < 1) return (PARSER_SALT_LENGTH);
20141 if (data_len_len > 5) return (PARSER_SALT_LENGTH);
20142
20143 data_buf_pos++;
20144
20145 u32 data_buf_len = input_len - 1 - 10 - 1 - data_len_len - 1;
20146
20147 if (data_buf_len < 64) return (PARSER_HASH_LENGTH);
20148
20149 if (data_buf_len % 16) return (PARSER_HASH_LENGTH);
20150
20151 u32 data_len = atoi (data_len_pos);
20152
20153 if ((data_len * 2) != data_buf_len) return (PARSER_HASH_LENGTH);
20154
20155 /**
20156 * salt
20157 */
20158
20159 char *salt_pos = data_buf_pos;
20160
20161 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
20162 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
20163 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
20164 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
20165
20166 // this is actually the CT, which is also the hash later (if matched)
20167
20168 salt->salt_buf[4] = hex_to_u32 ((const u8 *) &salt_pos[32]);
20169 salt->salt_buf[5] = hex_to_u32 ((const u8 *) &salt_pos[40]);
20170 salt->salt_buf[6] = hex_to_u32 ((const u8 *) &salt_pos[48]);
20171 salt->salt_buf[7] = hex_to_u32 ((const u8 *) &salt_pos[56]);
20172
20173 salt->salt_len = 32; // note we need to fix this to 16 in kernel
20174
20175 salt->salt_iter = 10 - 1;
20176
20177 /**
20178 * digest buf
20179 */
20180
20181 digest[0] = salt->salt_buf[4];
20182 digest[1] = salt->salt_buf[5];
20183 digest[2] = salt->salt_buf[6];
20184 digest[3] = salt->salt_buf[7];
20185
20186 return (PARSER_OK);
20187 }
20188
20189 int ms_drsr_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
20190 {
20191 if ((input_len < DISPLAY_LEN_MIN_12800) || (input_len > DISPLAY_LEN_MAX_12800)) return (PARSER_GLOBAL_LENGTH);
20192
20193 if (memcmp (SIGNATURE_MS_DRSR, input_buf, 11)) return (PARSER_SIGNATURE_UNMATCHED);
20194
20195 u32 *digest = (u32 *) hash_buf->digest;
20196
20197 salt_t *salt = hash_buf->salt;
20198
20199 /**
20200 * parse line
20201 */
20202
20203 char *salt_pos = input_buf + 11 + 1;
20204
20205 char *iter_pos = strchr (salt_pos, ',');
20206
20207 if (iter_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20208
20209 u32 salt_len = iter_pos - salt_pos;
20210
20211 if (salt_len != 20) return (PARSER_SALT_LENGTH);
20212
20213 iter_pos++;
20214
20215 char *hash_pos = strchr (iter_pos, ',');
20216
20217 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20218
20219 u32 iter_len = hash_pos - iter_pos;
20220
20221 if (iter_len > 5) return (PARSER_SALT_LENGTH);
20222
20223 hash_pos++;
20224
20225 u32 hash_len = input_len - 11 - 1 - salt_len - 1 - iter_len - 1;
20226
20227 if (hash_len != 64) return (PARSER_HASH_LENGTH);
20228
20229 /**
20230 * salt
20231 */
20232
20233 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
20234 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
20235 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]) & 0xffff0000;
20236 salt->salt_buf[3] = 0x00018000;
20237
20238 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
20239 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
20240 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
20241 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
20242
20243 salt->salt_len = salt_len / 2;
20244
20245 salt->salt_iter = atoi (iter_pos) - 1;
20246
20247 /**
20248 * digest buf
20249 */
20250
20251 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
20252 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
20253 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
20254 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
20255 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
20256 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
20257 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
20258 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
20259
20260 return (PARSER_OK);
20261 }
20262
20263 int androidfde_samsung_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
20264 {
20265 if ((input_len < DISPLAY_LEN_MIN_12900) || (input_len > DISPLAY_LEN_MAX_12900)) return (PARSER_GLOBAL_LENGTH);
20266
20267 u32 *digest = (u32 *) hash_buf->digest;
20268
20269 salt_t *salt = hash_buf->salt;
20270
20271 /**
20272 * parse line
20273 */
20274
20275 char *hash_pos = input_buf + 64;
20276 char *salt1_pos = input_buf + 128;
20277 char *salt2_pos = input_buf;
20278
20279 /**
20280 * salt
20281 */
20282
20283 salt->salt_buf[ 0] = hex_to_u32 ((const u8 *) &salt1_pos[ 0]);
20284 salt->salt_buf[ 1] = hex_to_u32 ((const u8 *) &salt1_pos[ 8]);
20285 salt->salt_buf[ 2] = hex_to_u32 ((const u8 *) &salt1_pos[16]);
20286 salt->salt_buf[ 3] = hex_to_u32 ((const u8 *) &salt1_pos[24]);
20287
20288 salt->salt_buf[ 4] = hex_to_u32 ((const u8 *) &salt2_pos[ 0]);
20289 salt->salt_buf[ 5] = hex_to_u32 ((const u8 *) &salt2_pos[ 8]);
20290 salt->salt_buf[ 6] = hex_to_u32 ((const u8 *) &salt2_pos[16]);
20291 salt->salt_buf[ 7] = hex_to_u32 ((const u8 *) &salt2_pos[24]);
20292
20293 salt->salt_buf[ 8] = hex_to_u32 ((const u8 *) &salt2_pos[32]);
20294 salt->salt_buf[ 9] = hex_to_u32 ((const u8 *) &salt2_pos[40]);
20295 salt->salt_buf[10] = hex_to_u32 ((const u8 *) &salt2_pos[48]);
20296 salt->salt_buf[11] = hex_to_u32 ((const u8 *) &salt2_pos[56]);
20297
20298 salt->salt_len = 48;
20299
20300 salt->salt_iter = ROUNDS_ANDROIDFDE_SAMSUNG - 1;
20301
20302 /**
20303 * digest buf
20304 */
20305
20306 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
20307 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
20308 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
20309 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
20310 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
20311 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
20312 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
20313 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
20314
20315 return (PARSER_OK);
20316 }
20317
20318 int zip2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
20319 {
20320 if ((input_len < DISPLAY_LEN_MIN_13600) || (input_len > DISPLAY_LEN_MAX_13600)) return (PARSER_GLOBAL_LENGTH);
20321
20322 if (memcmp (SIGNATURE_ZIP2_START, input_buf , 6)) return (PARSER_SIGNATURE_UNMATCHED);
20323 if (memcmp (SIGNATURE_ZIP2_STOP , input_buf + input_len - 7, 7)) return (PARSER_SIGNATURE_UNMATCHED);
20324
20325 u32 *digest = (u32 *) hash_buf->digest;
20326
20327 salt_t *salt = hash_buf->salt;
20328
20329 zip2_t *zip2 = (zip2_t *) hash_buf->esalt;
20330
20331 /**
20332 * parse line
20333 */
20334
20335 char *param0_pos = input_buf + 6 + 1;
20336
20337 char *param1_pos = strchr (param0_pos, '*');
20338
20339 if (param1_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20340
20341 u32 param0_len = param1_pos - param0_pos;
20342
20343 param1_pos++;
20344
20345 char *param2_pos = strchr (param1_pos, '*');
20346
20347 if (param2_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20348
20349 u32 param1_len = param2_pos - param1_pos;
20350
20351 param2_pos++;
20352
20353 char *param3_pos = strchr (param2_pos, '*');
20354
20355 if (param3_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20356
20357 u32 param2_len = param3_pos - param2_pos;
20358
20359 param3_pos++;
20360
20361 char *param4_pos = strchr (param3_pos, '*');
20362
20363 if (param4_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20364
20365 u32 param3_len = param4_pos - param3_pos;
20366
20367 param4_pos++;
20368
20369 char *param5_pos = strchr (param4_pos, '*');
20370
20371 if (param5_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20372
20373 u32 param4_len = param5_pos - param4_pos;
20374
20375 param5_pos++;
20376
20377 char *param6_pos = strchr (param5_pos, '*');
20378
20379 if (param6_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20380
20381 u32 param5_len = param6_pos - param5_pos;
20382
20383 param6_pos++;
20384
20385 char *param7_pos = strchr (param6_pos, '*');
20386
20387 if (param7_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20388
20389 u32 param6_len = param7_pos - param6_pos;
20390
20391 param7_pos++;
20392
20393 char *param8_pos = strchr (param7_pos, '*');
20394
20395 if (param8_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20396
20397 u32 param7_len = param8_pos - param7_pos;
20398
20399 param8_pos++;
20400
20401 const uint type = atoi (param0_pos);
20402 const uint mode = atoi (param1_pos);
20403 const uint magic = atoi (param2_pos);
20404
20405 char *salt_buf = param3_pos;
20406
20407 uint verify_bytes; sscanf (param4_pos, "%4x*", &verify_bytes);
20408
20409 const uint compress_length = atoi (param5_pos);
20410
20411 char *data_buf = param6_pos;
20412 char *auth = param7_pos;
20413
20414 /**
20415 * verify some data
20416 */
20417
20418 if (param0_len != 1) return (PARSER_SALT_VALUE);
20419
20420 if (param1_len != 1) return (PARSER_SALT_VALUE);
20421
20422 if (param2_len != 1) return (PARSER_SALT_VALUE);
20423
20424 if ((param3_len != 16) && (param3_len != 24) && (param3_len != 32)) return (PARSER_SALT_VALUE);
20425
20426 if (param4_len >= 5) return (PARSER_SALT_VALUE);
20427
20428 if (param5_len >= 5) return (PARSER_SALT_VALUE);
20429
20430 if (param6_len >= 8192) return (PARSER_SALT_VALUE);
20431
20432 if (param6_len & 1) return (PARSER_SALT_VALUE);
20433
20434 if (param7_len != 20) return (PARSER_SALT_VALUE);
20435
20436 if (type != 0) return (PARSER_SALT_VALUE);
20437
20438 if ((mode != 1) && (mode != 2) && (mode != 3)) return (PARSER_SALT_VALUE);
20439
20440 if (magic != 0) return (PARSER_SALT_VALUE);
20441
20442 if (verify_bytes >= 0x10000) return (PARSER_SALT_VALUE);
20443
20444 /**
20445 * store data
20446 */
20447
20448 zip2->type = type;
20449 zip2->mode = mode;
20450 zip2->magic = magic;
20451
20452 if (mode == 1)
20453 {
20454 zip2->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
20455 zip2->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
20456 zip2->salt_buf[2] = 0;
20457 zip2->salt_buf[3] = 0;
20458
20459 zip2->salt_len = 8;
20460 }
20461 else if (mode == 2)
20462 {
20463 zip2->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
20464 zip2->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
20465 zip2->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
20466 zip2->salt_buf[3] = 0;
20467
20468 zip2->salt_len = 12;
20469 }
20470 else if (mode == 3)
20471 {
20472 zip2->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
20473 zip2->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
20474 zip2->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
20475 zip2->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf[24]);
20476
20477 zip2->salt_len = 16;
20478 }
20479
20480 zip2->salt_buf[0] = byte_swap_32 (zip2->salt_buf[0]);
20481 zip2->salt_buf[1] = byte_swap_32 (zip2->salt_buf[1]);
20482 zip2->salt_buf[2] = byte_swap_32 (zip2->salt_buf[2]);
20483 zip2->salt_buf[3] = byte_swap_32 (zip2->salt_buf[3]);
20484
20485 zip2->verify_bytes = verify_bytes;
20486
20487 zip2->compress_length = compress_length;
20488
20489 char *data_buf_ptr = (char *) zip2->data_buf;
20490
20491 for (uint i = 0; i < param6_len; i += 2)
20492 {
20493 const char p0 = data_buf[i + 0];
20494 const char p1 = data_buf[i + 1];
20495
20496 *data_buf_ptr++ = hex_convert (p1) << 0
20497 | hex_convert (p0) << 4;
20498
20499 zip2->data_len++;
20500 }
20501
20502 *data_buf_ptr = 0x80;
20503
20504 char *auth_ptr = (char *) zip2->auth_buf;
20505
20506 for (uint i = 0; i < param7_len; i += 2)
20507 {
20508 const char p0 = auth[i + 0];
20509 const char p1 = auth[i + 1];
20510
20511 *auth_ptr++ = hex_convert (p1) << 0
20512 | hex_convert (p0) << 4;
20513
20514 zip2->auth_len++;
20515 }
20516
20517 /**
20518 * salt buf (fake)
20519 */
20520
20521 salt->salt_buf[0] = zip2->salt_buf[0];
20522 salt->salt_buf[1] = zip2->salt_buf[1];
20523 salt->salt_buf[2] = zip2->salt_buf[2];
20524 salt->salt_buf[3] = zip2->salt_buf[3];
20525 salt->salt_buf[4] = zip2->data_buf[0];
20526 salt->salt_buf[5] = zip2->data_buf[1];
20527 salt->salt_buf[6] = zip2->data_buf[2];
20528 salt->salt_buf[7] = zip2->data_buf[3];
20529
20530 salt->salt_len = 32;
20531
20532 salt->salt_iter = ROUNDS_ZIP2 - 1;
20533
20534 /**
20535 * digest buf (fake)
20536 */
20537
20538 digest[0] = zip2->auth_buf[0];
20539 digest[1] = zip2->auth_buf[1];
20540 digest[2] = zip2->auth_buf[2];
20541 digest[3] = zip2->auth_buf[3];
20542
20543 return (PARSER_OK);
20544 }
20545
20546 /**
20547 * parallel running threads
20548 */
20549
20550 #ifdef WIN
20551
20552 BOOL WINAPI sigHandler_default (DWORD sig)
20553 {
20554 switch (sig)
20555 {
20556 case CTRL_CLOSE_EVENT:
20557
20558 /*
20559 * special case see: https://stackoverflow.com/questions/3640633/c-setconsolectrlhandler-routine-issue/5610042#5610042
20560 * if the user interacts w/ the user-interface (GUI/cmd), we need to do the finalization job within this signal handler
20561 * function otherwise it is too late (e.g. after returning from this function)
20562 */
20563
20564 myabort ();
20565
20566 SetConsoleCtrlHandler (NULL, TRUE);
20567
20568 hc_sleep (10);
20569
20570 return TRUE;
20571
20572 case CTRL_C_EVENT:
20573 case CTRL_LOGOFF_EVENT:
20574 case CTRL_SHUTDOWN_EVENT:
20575
20576 myabort ();
20577
20578 SetConsoleCtrlHandler (NULL, TRUE);
20579
20580 return TRUE;
20581 }
20582
20583 return FALSE;
20584 }
20585
20586 BOOL WINAPI sigHandler_benchmark (DWORD sig)
20587 {
20588 switch (sig)
20589 {
20590 case CTRL_CLOSE_EVENT:
20591
20592 myabort ();
20593
20594 SetConsoleCtrlHandler (NULL, TRUE);
20595
20596 hc_sleep (10);
20597
20598 return TRUE;
20599
20600 case CTRL_C_EVENT:
20601 case CTRL_LOGOFF_EVENT:
20602 case CTRL_SHUTDOWN_EVENT:
20603
20604 myquit ();
20605
20606 SetConsoleCtrlHandler (NULL, TRUE);
20607
20608 return TRUE;
20609 }
20610
20611 return FALSE;
20612 }
20613
20614 void hc_signal (BOOL WINAPI (callback) (DWORD))
20615 {
20616 if (callback == NULL)
20617 {
20618 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, FALSE);
20619 }
20620 else
20621 {
20622 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, TRUE);
20623 }
20624 }
20625
20626 #else
20627
20628 void sigHandler_default (int sig)
20629 {
20630 myabort ();
20631
20632 signal (sig, NULL);
20633 }
20634
20635 void sigHandler_benchmark (int sig)
20636 {
20637 myquit ();
20638
20639 signal (sig, NULL);
20640 }
20641
20642 void hc_signal (void (callback) (int))
20643 {
20644 if (callback == NULL) callback = SIG_DFL;
20645
20646 signal (SIGINT, callback);
20647 signal (SIGTERM, callback);
20648 signal (SIGABRT, callback);
20649 }
20650
20651 #endif
20652
20653 void status_display ();
20654
20655 void *thread_keypress (void *p)
20656 {
20657 int benchmark = *((int *) p);
20658
20659 uint quiet = data.quiet;
20660
20661 tty_break();
20662
20663 while ((data.devices_status != STATUS_EXHAUSTED) && (data.devices_status != STATUS_CRACKED) && (data.devices_status != STATUS_ABORTED) && (data.devices_status != STATUS_QUIT))
20664 {
20665 int ch = tty_getchar();
20666
20667 if (ch == -1) break;
20668
20669 if (ch == 0) continue;
20670
20671 //https://github.com/hashcat/hashcat/issues/302
20672 //#ifdef _POSIX
20673 //if (ch != '\n')
20674 //#endif
20675
20676 hc_thread_mutex_lock (mux_display);
20677
20678 log_info ("");
20679
20680 switch (ch)
20681 {
20682 case 's':
20683 case '\r':
20684 case '\n':
20685
20686 log_info ("");
20687
20688 status_display ();
20689
20690 log_info ("");
20691
20692 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
20693 if (quiet == 0) fflush (stdout);
20694
20695 break;
20696
20697 case 'b':
20698
20699 log_info ("");
20700
20701 bypass ();
20702
20703 log_info ("");
20704
20705 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
20706 if (quiet == 0) fflush (stdout);
20707
20708 break;
20709
20710 case 'p':
20711
20712 log_info ("");
20713
20714 SuspendThreads ();
20715
20716 log_info ("");
20717
20718 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
20719 if (quiet == 0) fflush (stdout);
20720
20721 break;
20722
20723 case 'r':
20724
20725 log_info ("");
20726
20727 ResumeThreads ();
20728
20729 log_info ("");
20730
20731 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
20732 if (quiet == 0) fflush (stdout);
20733
20734 break;
20735
20736 case 'c':
20737
20738 log_info ("");
20739
20740 if (benchmark == 1) break;
20741
20742 stop_at_checkpoint ();
20743
20744 log_info ("");
20745
20746 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
20747 if (quiet == 0) fflush (stdout);
20748
20749 break;
20750
20751 case 'q':
20752
20753 log_info ("");
20754
20755 if (benchmark == 1)
20756 {
20757 myquit ();
20758 }
20759 else
20760 {
20761 myabort ();
20762 }
20763
20764 break;
20765 }
20766
20767 //https://github.com/hashcat/hashcat/issues/302
20768 //#ifdef _POSIX
20769 //if (ch != '\n')
20770 //#endif
20771
20772 hc_thread_mutex_unlock (mux_display);
20773 }
20774
20775 tty_fix();
20776
20777 return (p);
20778 }
20779
20780 /**
20781 * rules common
20782 */
20783
20784 bool class_num (const u8 c)
20785 {
20786 return ((c >= '0') && (c <= '9'));
20787 }
20788
20789 bool class_lower (const u8 c)
20790 {
20791 return ((c >= 'a') && (c <= 'z'));
20792 }
20793
20794 bool class_upper (const u8 c)
20795 {
20796 return ((c >= 'A') && (c <= 'Z'));
20797 }
20798
20799 bool class_alpha (const u8 c)
20800 {
20801 return (class_lower (c) || class_upper (c));
20802 }
20803
20804 int conv_ctoi (const u8 c)
20805 {
20806 if (class_num (c))
20807 {
20808 return c - '0';
20809 }
20810 else if (class_upper (c))
20811 {
20812 return c - 'A' + 10;
20813 }
20814
20815 return -1;
20816 }
20817
20818 int conv_itoc (const u8 c)
20819 {
20820 if (c < 10)
20821 {
20822 return c + '0';
20823 }
20824 else if (c < 37)
20825 {
20826 return c + 'A' - 10;
20827 }
20828
20829 return -1;
20830 }
20831
20832 /**
20833 * device rules
20834 */
20835
20836 #define INCR_POS if (++rule_pos == rule_len) return (-1)
20837 #define SET_NAME(rule,val) (rule)->cmds[rule_cnt] = ((val) & 0xff) << 0
20838 #define SET_P0(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 8
20839 #define SET_P1(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 16
20840 #define MAX_KERNEL_RULES 255
20841 #define GET_NAME(rule) rule_cmd = (((rule)->cmds[rule_cnt] >> 0) & 0xff)
20842 #define GET_P0(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 8) & 0xff)
20843 #define GET_P1(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 16) & 0xff)
20844
20845 #define SET_P0_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 8
20846 #define SET_P1_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 16
20847 #define GET_P0_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 8) & 0xff)
20848 #define GET_P1_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 16) & 0xff)
20849
20850 int cpu_rule_to_kernel_rule (char *rule_buf, uint rule_len, kernel_rule_t *rule)
20851 {
20852 uint rule_pos;
20853 uint rule_cnt;
20854
20855 for (rule_pos = 0, rule_cnt = 0; rule_pos < rule_len && rule_cnt < MAX_KERNEL_RULES; rule_pos++, rule_cnt++)
20856 {
20857 switch (rule_buf[rule_pos])
20858 {
20859 case ' ':
20860 rule_cnt--;
20861 break;
20862
20863 case RULE_OP_MANGLE_NOOP:
20864 SET_NAME (rule, rule_buf[rule_pos]);
20865 break;
20866
20867 case RULE_OP_MANGLE_LREST:
20868 SET_NAME (rule, rule_buf[rule_pos]);
20869 break;
20870
20871 case RULE_OP_MANGLE_UREST:
20872 SET_NAME (rule, rule_buf[rule_pos]);
20873 break;
20874
20875 case RULE_OP_MANGLE_LREST_UFIRST:
20876 SET_NAME (rule, rule_buf[rule_pos]);
20877 break;
20878
20879 case RULE_OP_MANGLE_UREST_LFIRST:
20880 SET_NAME (rule, rule_buf[rule_pos]);
20881 break;
20882
20883 case RULE_OP_MANGLE_TREST:
20884 SET_NAME (rule, rule_buf[rule_pos]);
20885 break;
20886
20887 case RULE_OP_MANGLE_TOGGLE_AT:
20888 SET_NAME (rule, rule_buf[rule_pos]);
20889 SET_P0_CONV (rule, rule_buf[rule_pos]);
20890 break;
20891
20892 case RULE_OP_MANGLE_REVERSE:
20893 SET_NAME (rule, rule_buf[rule_pos]);
20894 break;
20895
20896 case RULE_OP_MANGLE_DUPEWORD:
20897 SET_NAME (rule, rule_buf[rule_pos]);
20898 break;
20899
20900 case RULE_OP_MANGLE_DUPEWORD_TIMES:
20901 SET_NAME (rule, rule_buf[rule_pos]);
20902 SET_P0_CONV (rule, rule_buf[rule_pos]);
20903 break;
20904
20905 case RULE_OP_MANGLE_REFLECT:
20906 SET_NAME (rule, rule_buf[rule_pos]);
20907 break;
20908
20909 case RULE_OP_MANGLE_ROTATE_LEFT:
20910 SET_NAME (rule, rule_buf[rule_pos]);
20911 break;
20912
20913 case RULE_OP_MANGLE_ROTATE_RIGHT:
20914 SET_NAME (rule, rule_buf[rule_pos]);
20915 break;
20916
20917 case RULE_OP_MANGLE_APPEND:
20918 SET_NAME (rule, rule_buf[rule_pos]);
20919 SET_P0 (rule, rule_buf[rule_pos]);
20920 break;
20921
20922 case RULE_OP_MANGLE_PREPEND:
20923 SET_NAME (rule, rule_buf[rule_pos]);
20924 SET_P0 (rule, rule_buf[rule_pos]);
20925 break;
20926
20927 case RULE_OP_MANGLE_DELETE_FIRST:
20928 SET_NAME (rule, rule_buf[rule_pos]);
20929 break;
20930
20931 case RULE_OP_MANGLE_DELETE_LAST:
20932 SET_NAME (rule, rule_buf[rule_pos]);
20933 break;
20934
20935 case RULE_OP_MANGLE_DELETE_AT:
20936 SET_NAME (rule, rule_buf[rule_pos]);
20937 SET_P0_CONV (rule, rule_buf[rule_pos]);
20938 break;
20939
20940 case RULE_OP_MANGLE_EXTRACT:
20941 SET_NAME (rule, rule_buf[rule_pos]);
20942 SET_P0_CONV (rule, rule_buf[rule_pos]);
20943 SET_P1_CONV (rule, rule_buf[rule_pos]);
20944 break;
20945
20946 case RULE_OP_MANGLE_OMIT:
20947 SET_NAME (rule, rule_buf[rule_pos]);
20948 SET_P0_CONV (rule, rule_buf[rule_pos]);
20949 SET_P1_CONV (rule, rule_buf[rule_pos]);
20950 break;
20951
20952 case RULE_OP_MANGLE_INSERT:
20953 SET_NAME (rule, rule_buf[rule_pos]);
20954 SET_P0_CONV (rule, rule_buf[rule_pos]);
20955 SET_P1 (rule, rule_buf[rule_pos]);
20956 break;
20957
20958 case RULE_OP_MANGLE_OVERSTRIKE:
20959 SET_NAME (rule, rule_buf[rule_pos]);
20960 SET_P0_CONV (rule, rule_buf[rule_pos]);
20961 SET_P1 (rule, rule_buf[rule_pos]);
20962 break;
20963
20964 case RULE_OP_MANGLE_TRUNCATE_AT:
20965 SET_NAME (rule, rule_buf[rule_pos]);
20966 SET_P0_CONV (rule, rule_buf[rule_pos]);
20967 break;
20968
20969 case RULE_OP_MANGLE_REPLACE:
20970 SET_NAME (rule, rule_buf[rule_pos]);
20971 SET_P0 (rule, rule_buf[rule_pos]);
20972 SET_P1 (rule, rule_buf[rule_pos]);
20973 break;
20974
20975 case RULE_OP_MANGLE_PURGECHAR:
20976 return (-1);
20977 break;
20978
20979 case RULE_OP_MANGLE_TOGGLECASE_REC:
20980 return (-1);
20981 break;
20982
20983 case RULE_OP_MANGLE_DUPECHAR_FIRST:
20984 SET_NAME (rule, rule_buf[rule_pos]);
20985 SET_P0_CONV (rule, rule_buf[rule_pos]);
20986 break;
20987
20988 case RULE_OP_MANGLE_DUPECHAR_LAST:
20989 SET_NAME (rule, rule_buf[rule_pos]);
20990 SET_P0_CONV (rule, rule_buf[rule_pos]);
20991 break;
20992
20993 case RULE_OP_MANGLE_DUPECHAR_ALL:
20994 SET_NAME (rule, rule_buf[rule_pos]);
20995 break;
20996
20997 case RULE_OP_MANGLE_SWITCH_FIRST:
20998 SET_NAME (rule, rule_buf[rule_pos]);
20999 break;
21000
21001 case RULE_OP_MANGLE_SWITCH_LAST:
21002 SET_NAME (rule, rule_buf[rule_pos]);
21003 break;
21004
21005 case RULE_OP_MANGLE_SWITCH_AT:
21006 SET_NAME (rule, rule_buf[rule_pos]);
21007 SET_P0_CONV (rule, rule_buf[rule_pos]);
21008 SET_P1_CONV (rule, rule_buf[rule_pos]);
21009 break;
21010
21011 case RULE_OP_MANGLE_CHR_SHIFTL:
21012 SET_NAME (rule, rule_buf[rule_pos]);
21013 SET_P0_CONV (rule, rule_buf[rule_pos]);
21014 break;
21015
21016 case RULE_OP_MANGLE_CHR_SHIFTR:
21017 SET_NAME (rule, rule_buf[rule_pos]);
21018 SET_P0_CONV (rule, rule_buf[rule_pos]);
21019 break;
21020
21021 case RULE_OP_MANGLE_CHR_INCR:
21022 SET_NAME (rule, rule_buf[rule_pos]);
21023 SET_P0_CONV (rule, rule_buf[rule_pos]);
21024 break;
21025
21026 case RULE_OP_MANGLE_CHR_DECR:
21027 SET_NAME (rule, rule_buf[rule_pos]);
21028 SET_P0_CONV (rule, rule_buf[rule_pos]);
21029 break;
21030
21031 case RULE_OP_MANGLE_REPLACE_NP1:
21032 SET_NAME (rule, rule_buf[rule_pos]);
21033 SET_P0_CONV (rule, rule_buf[rule_pos]);
21034 break;
21035
21036 case RULE_OP_MANGLE_REPLACE_NM1:
21037 SET_NAME (rule, rule_buf[rule_pos]);
21038 SET_P0_CONV (rule, rule_buf[rule_pos]);
21039 break;
21040
21041 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
21042 SET_NAME (rule, rule_buf[rule_pos]);
21043 SET_P0_CONV (rule, rule_buf[rule_pos]);
21044 break;
21045
21046 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
21047 SET_NAME (rule, rule_buf[rule_pos]);
21048 SET_P0_CONV (rule, rule_buf[rule_pos]);
21049 break;
21050
21051 case RULE_OP_MANGLE_TITLE:
21052 SET_NAME (rule, rule_buf[rule_pos]);
21053 break;
21054
21055 default:
21056 return (-1);
21057 break;
21058 }
21059 }
21060
21061 if (rule_pos < rule_len) return (-1);
21062
21063 return (0);
21064 }
21065
21066 int kernel_rule_to_cpu_rule (char *rule_buf, kernel_rule_t *rule)
21067 {
21068 uint rule_cnt;
21069 uint rule_pos;
21070 uint rule_len = HCBUFSIZ - 1; // maximum possible len
21071
21072 char rule_cmd;
21073
21074 for (rule_cnt = 0, rule_pos = 0; rule_pos < rule_len && rule_cnt < MAX_KERNEL_RULES; rule_pos++, rule_cnt++)
21075 {
21076 GET_NAME (rule);
21077
21078 if (rule_cnt > 0) rule_buf[rule_pos++] = ' ';
21079
21080 switch (rule_cmd)
21081 {
21082 case RULE_OP_MANGLE_NOOP:
21083 rule_buf[rule_pos] = rule_cmd;
21084 break;
21085
21086 case RULE_OP_MANGLE_LREST:
21087 rule_buf[rule_pos] = rule_cmd;
21088 break;
21089
21090 case RULE_OP_MANGLE_UREST:
21091 rule_buf[rule_pos] = rule_cmd;
21092 break;
21093
21094 case RULE_OP_MANGLE_LREST_UFIRST:
21095 rule_buf[rule_pos] = rule_cmd;
21096 break;
21097
21098 case RULE_OP_MANGLE_UREST_LFIRST:
21099 rule_buf[rule_pos] = rule_cmd;
21100 break;
21101
21102 case RULE_OP_MANGLE_TREST:
21103 rule_buf[rule_pos] = rule_cmd;
21104 break;
21105
21106 case RULE_OP_MANGLE_TOGGLE_AT:
21107 rule_buf[rule_pos] = rule_cmd;
21108 GET_P0_CONV (rule);
21109 break;
21110
21111 case RULE_OP_MANGLE_REVERSE:
21112 rule_buf[rule_pos] = rule_cmd;
21113 break;
21114
21115 case RULE_OP_MANGLE_DUPEWORD:
21116 rule_buf[rule_pos] = rule_cmd;
21117 break;
21118
21119 case RULE_OP_MANGLE_DUPEWORD_TIMES:
21120 rule_buf[rule_pos] = rule_cmd;
21121 GET_P0_CONV (rule);
21122 break;
21123
21124 case RULE_OP_MANGLE_REFLECT:
21125 rule_buf[rule_pos] = rule_cmd;
21126 break;
21127
21128 case RULE_OP_MANGLE_ROTATE_LEFT:
21129 rule_buf[rule_pos] = rule_cmd;
21130 break;
21131
21132 case RULE_OP_MANGLE_ROTATE_RIGHT:
21133 rule_buf[rule_pos] = rule_cmd;
21134 break;
21135
21136 case RULE_OP_MANGLE_APPEND:
21137 rule_buf[rule_pos] = rule_cmd;
21138 GET_P0 (rule);
21139 break;
21140
21141 case RULE_OP_MANGLE_PREPEND:
21142 rule_buf[rule_pos] = rule_cmd;
21143 GET_P0 (rule);
21144 break;
21145
21146 case RULE_OP_MANGLE_DELETE_FIRST:
21147 rule_buf[rule_pos] = rule_cmd;
21148 break;
21149
21150 case RULE_OP_MANGLE_DELETE_LAST:
21151 rule_buf[rule_pos] = rule_cmd;
21152 break;
21153
21154 case RULE_OP_MANGLE_DELETE_AT:
21155 rule_buf[rule_pos] = rule_cmd;
21156 GET_P0_CONV (rule);
21157 break;
21158
21159 case RULE_OP_MANGLE_EXTRACT:
21160 rule_buf[rule_pos] = rule_cmd;
21161 GET_P0_CONV (rule);
21162 GET_P1_CONV (rule);
21163 break;
21164
21165 case RULE_OP_MANGLE_OMIT:
21166 rule_buf[rule_pos] = rule_cmd;
21167 GET_P0_CONV (rule);
21168 GET_P1_CONV (rule);
21169 break;
21170
21171 case RULE_OP_MANGLE_INSERT:
21172 rule_buf[rule_pos] = rule_cmd;
21173 GET_P0_CONV (rule);
21174 GET_P1 (rule);
21175 break;
21176
21177 case RULE_OP_MANGLE_OVERSTRIKE:
21178 rule_buf[rule_pos] = rule_cmd;
21179 GET_P0_CONV (rule);
21180 GET_P1 (rule);
21181 break;
21182
21183 case RULE_OP_MANGLE_TRUNCATE_AT:
21184 rule_buf[rule_pos] = rule_cmd;
21185 GET_P0_CONV (rule);
21186 break;
21187
21188 case RULE_OP_MANGLE_REPLACE:
21189 rule_buf[rule_pos] = rule_cmd;
21190 GET_P0 (rule);
21191 GET_P1 (rule);
21192 break;
21193
21194 case RULE_OP_MANGLE_PURGECHAR:
21195 return (-1);
21196 break;
21197
21198 case RULE_OP_MANGLE_TOGGLECASE_REC:
21199 return (-1);
21200 break;
21201
21202 case RULE_OP_MANGLE_DUPECHAR_FIRST:
21203 rule_buf[rule_pos] = rule_cmd;
21204 GET_P0_CONV (rule);
21205 break;
21206
21207 case RULE_OP_MANGLE_DUPECHAR_LAST:
21208 rule_buf[rule_pos] = rule_cmd;
21209 GET_P0_CONV (rule);
21210 break;
21211
21212 case RULE_OP_MANGLE_DUPECHAR_ALL:
21213 rule_buf[rule_pos] = rule_cmd;
21214 break;
21215
21216 case RULE_OP_MANGLE_SWITCH_FIRST:
21217 rule_buf[rule_pos] = rule_cmd;
21218 break;
21219
21220 case RULE_OP_MANGLE_SWITCH_LAST:
21221 rule_buf[rule_pos] = rule_cmd;
21222 break;
21223
21224 case RULE_OP_MANGLE_SWITCH_AT:
21225 rule_buf[rule_pos] = rule_cmd;
21226 GET_P0_CONV (rule);
21227 GET_P1_CONV (rule);
21228 break;
21229
21230 case RULE_OP_MANGLE_CHR_SHIFTL:
21231 rule_buf[rule_pos] = rule_cmd;
21232 GET_P0_CONV (rule);
21233 break;
21234
21235 case RULE_OP_MANGLE_CHR_SHIFTR:
21236 rule_buf[rule_pos] = rule_cmd;
21237 GET_P0_CONV (rule);
21238 break;
21239
21240 case RULE_OP_MANGLE_CHR_INCR:
21241 rule_buf[rule_pos] = rule_cmd;
21242 GET_P0_CONV (rule);
21243 break;
21244
21245 case RULE_OP_MANGLE_CHR_DECR:
21246 rule_buf[rule_pos] = rule_cmd;
21247 GET_P0_CONV (rule);
21248 break;
21249
21250 case RULE_OP_MANGLE_REPLACE_NP1:
21251 rule_buf[rule_pos] = rule_cmd;
21252 GET_P0_CONV (rule);
21253 break;
21254
21255 case RULE_OP_MANGLE_REPLACE_NM1:
21256 rule_buf[rule_pos] = rule_cmd;
21257 GET_P0_CONV (rule);
21258 break;
21259
21260 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
21261 rule_buf[rule_pos] = rule_cmd;
21262 GET_P0_CONV (rule);
21263 break;
21264
21265 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
21266 rule_buf[rule_pos] = rule_cmd;
21267 GET_P0_CONV (rule);
21268 break;
21269
21270 case RULE_OP_MANGLE_TITLE:
21271 rule_buf[rule_pos] = rule_cmd;
21272 break;
21273
21274 case 0:
21275 return rule_pos - 1;
21276 break;
21277
21278 default:
21279 return (-1);
21280 break;
21281 }
21282 }
21283
21284 if (rule_cnt > 0)
21285 {
21286 return rule_pos;
21287 }
21288
21289 return (-1);
21290 }
21291
21292 /**
21293 * CPU rules : this is from hashcat sources, cpu based rules
21294 */
21295
21296 #define NEXT_RULEPOS(rp) if (++(rp) == rule_len) return (RULE_RC_SYNTAX_ERROR)
21297 #define NEXT_RPTOI(r,rp,up) if (((up) = conv_ctoi ((r)[(rp)])) == -1) return (RULE_RC_SYNTAX_ERROR)
21298
21299 #define MANGLE_TOGGLE_AT(a,p) if (class_alpha ((a)[(p)])) (a)[(p)] ^= 0x20
21300 #define MANGLE_LOWER_AT(a,p) if (class_upper ((a)[(p)])) (a)[(p)] ^= 0x20
21301 #define MANGLE_UPPER_AT(a,p) if (class_lower ((a)[(p)])) (a)[(p)] ^= 0x20
21302
21303 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); arr[(r)] = arr[(l)]; arr[(l)] = c; } */
21304 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); (a)[(r)] = (a)[(l)]; (a)[(l)] = c; } */
21305 #define MANGLE_SWITCH(a,l,r) { char c = (a)[(r)]; (a)[(r)] = (a)[(l)]; (a)[(l)] = c; }
21306
21307 int mangle_lrest (char arr[BLOCK_SIZE], int arr_len)
21308 {
21309 int pos;
21310
21311 for (pos = 0; pos < arr_len; pos++) MANGLE_LOWER_AT (arr, pos);
21312
21313 return (arr_len);
21314 }
21315
21316 int mangle_urest (char arr[BLOCK_SIZE], int arr_len)
21317 {
21318 int pos;
21319
21320 for (pos = 0; pos < arr_len; pos++) MANGLE_UPPER_AT (arr, pos);
21321
21322 return (arr_len);
21323 }
21324
21325 int mangle_trest (char arr[BLOCK_SIZE], int arr_len)
21326 {
21327 int pos;
21328
21329 for (pos = 0; pos < arr_len; pos++) MANGLE_TOGGLE_AT (arr, pos);
21330
21331 return (arr_len);
21332 }
21333
21334 int mangle_reverse (char arr[BLOCK_SIZE], int arr_len)
21335 {
21336 int l;
21337 int r;
21338
21339 for (l = 0; l < arr_len; l++)
21340 {
21341 r = arr_len - 1 - l;
21342
21343 if (l >= r) break;
21344
21345 MANGLE_SWITCH (arr, l, r);
21346 }
21347
21348 return (arr_len);
21349 }
21350
21351 int mangle_double (char arr[BLOCK_SIZE], int arr_len)
21352 {
21353 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
21354
21355 memcpy (&arr[arr_len], arr, (size_t) arr_len);
21356
21357 return (arr_len * 2);
21358 }
21359
21360 int mangle_double_times (char arr[BLOCK_SIZE], int arr_len, int times)
21361 {
21362 if (((arr_len * times) + arr_len) >= BLOCK_SIZE) return (arr_len);
21363
21364 int orig_len = arr_len;
21365
21366 int i;
21367
21368 for (i = 0; i < times; i++)
21369 {
21370 memcpy (&arr[arr_len], arr, orig_len);
21371
21372 arr_len += orig_len;
21373 }
21374
21375 return (arr_len);
21376 }
21377
21378 int mangle_reflect (char arr[BLOCK_SIZE], int arr_len)
21379 {
21380 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
21381
21382 mangle_double (arr, arr_len);
21383
21384 mangle_reverse (arr + arr_len, arr_len);
21385
21386 return (arr_len * 2);
21387 }
21388
21389 int mangle_rotate_left (char arr[BLOCK_SIZE], int arr_len)
21390 {
21391 int l;
21392 int r;
21393
21394 for (l = 0, r = arr_len - 1; r > 0; r--)
21395 {
21396 MANGLE_SWITCH (arr, l, r);
21397 }
21398
21399 return (arr_len);
21400 }
21401
21402 int mangle_rotate_right (char arr[BLOCK_SIZE], int arr_len)
21403 {
21404 int l;
21405 int r;
21406
21407 for (l = 0, r = arr_len - 1; l < r; l++)
21408 {
21409 MANGLE_SWITCH (arr, l, r);
21410 }
21411
21412 return (arr_len);
21413 }
21414
21415 int mangle_append (char arr[BLOCK_SIZE], int arr_len, char c)
21416 {
21417 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
21418
21419 arr[arr_len] = c;
21420
21421 return (arr_len + 1);
21422 }
21423
21424 int mangle_prepend (char arr[BLOCK_SIZE], int arr_len, char c)
21425 {
21426 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
21427
21428 int arr_pos;
21429
21430 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
21431 {
21432 arr[arr_pos + 1] = arr[arr_pos];
21433 }
21434
21435 arr[0] = c;
21436
21437 return (arr_len + 1);
21438 }
21439
21440 int mangle_delete_at (char arr[BLOCK_SIZE], int arr_len, int upos)
21441 {
21442 if (upos >= arr_len) return (arr_len);
21443
21444 int arr_pos;
21445
21446 for (arr_pos = upos; arr_pos < arr_len - 1; arr_pos++)
21447 {
21448 arr[arr_pos] = arr[arr_pos + 1];
21449 }
21450
21451 return (arr_len - 1);
21452 }
21453
21454 int mangle_extract (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
21455 {
21456 if (upos >= arr_len) return (arr_len);
21457
21458 if ((upos + ulen) > arr_len) return (arr_len);
21459
21460 int arr_pos;
21461
21462 for (arr_pos = 0; arr_pos < ulen; arr_pos++)
21463 {
21464 arr[arr_pos] = arr[upos + arr_pos];
21465 }
21466
21467 return (ulen);
21468 }
21469
21470 int mangle_omit (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
21471 {
21472 if (upos >= arr_len) return (arr_len);
21473
21474 if ((upos + ulen) >= arr_len) return (arr_len);
21475
21476 int arr_pos;
21477
21478 for (arr_pos = upos; arr_pos < arr_len - ulen; arr_pos++)
21479 {
21480 arr[arr_pos] = arr[arr_pos + ulen];
21481 }
21482
21483 return (arr_len - ulen);
21484 }
21485
21486 int mangle_insert (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
21487 {
21488 if (upos >= arr_len) return (arr_len);
21489
21490 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
21491
21492 int arr_pos;
21493
21494 for (arr_pos = arr_len - 1; arr_pos > upos - 1; arr_pos--)
21495 {
21496 arr[arr_pos + 1] = arr[arr_pos];
21497 }
21498
21499 arr[upos] = c;
21500
21501 return (arr_len + 1);
21502 }
21503
21504 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)
21505 {
21506 if ((arr_len + arr2_cpy) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
21507
21508 if (arr_pos > arr_len) return (RULE_RC_REJECT_ERROR);
21509
21510 if (arr2_pos > arr2_len) return (RULE_RC_REJECT_ERROR);
21511
21512 if ((arr2_pos + arr2_cpy) > arr2_len) return (RULE_RC_REJECT_ERROR);
21513
21514 if (arr2_cpy < 1) return (RULE_RC_SYNTAX_ERROR);
21515
21516 memcpy (arr2, arr2 + arr2_pos, arr2_len - arr2_pos);
21517
21518 memcpy (arr2 + arr2_cpy, arr + arr_pos, arr_len - arr_pos);
21519
21520 memcpy (arr + arr_pos, arr2, arr_len - arr_pos + arr2_cpy);
21521
21522 return (arr_len + arr2_cpy);
21523 }
21524
21525 int mangle_overstrike (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
21526 {
21527 if (upos >= arr_len) return (arr_len);
21528
21529 arr[upos] = c;
21530
21531 return (arr_len);
21532 }
21533
21534 int mangle_truncate_at (char arr[BLOCK_SIZE], int arr_len, int upos)
21535 {
21536 if (upos >= arr_len) return (arr_len);
21537
21538 memset (arr + upos, 0, arr_len - upos);
21539
21540 return (upos);
21541 }
21542
21543 int mangle_replace (char arr[BLOCK_SIZE], int arr_len, char oldc, char newc)
21544 {
21545 int arr_pos;
21546
21547 for (arr_pos = 0; arr_pos < arr_len; arr_pos++)
21548 {
21549 if (arr[arr_pos] != oldc) continue;
21550
21551 arr[arr_pos] = newc;
21552 }
21553
21554 return (arr_len);
21555 }
21556
21557 int mangle_purgechar (char arr[BLOCK_SIZE], int arr_len, char c)
21558 {
21559 int arr_pos;
21560
21561 int ret_len;
21562
21563 for (ret_len = 0, arr_pos = 0; arr_pos < arr_len; arr_pos++)
21564 {
21565 if (arr[arr_pos] == c) continue;
21566
21567 arr[ret_len] = arr[arr_pos];
21568
21569 ret_len++;
21570 }
21571
21572 return (ret_len);
21573 }
21574
21575 int mangle_dupeblock_prepend (char arr[BLOCK_SIZE], int arr_len, int ulen)
21576 {
21577 if (ulen > arr_len) return (arr_len);
21578
21579 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
21580
21581 char cs[100] = { 0 };
21582
21583 memcpy (cs, arr, ulen);
21584
21585 int i;
21586
21587 for (i = 0; i < ulen; i++)
21588 {
21589 char c = cs[i];
21590
21591 arr_len = mangle_insert (arr, arr_len, i, c);
21592 }
21593
21594 return (arr_len);
21595 }
21596
21597 int mangle_dupeblock_append (char arr[BLOCK_SIZE], int arr_len, int ulen)
21598 {
21599 if (ulen > arr_len) return (arr_len);
21600
21601 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
21602
21603 int upos = arr_len - ulen;
21604
21605 int i;
21606
21607 for (i = 0; i < ulen; i++)
21608 {
21609 char c = arr[upos + i];
21610
21611 arr_len = mangle_append (arr, arr_len, c);
21612 }
21613
21614 return (arr_len);
21615 }
21616
21617 int mangle_dupechar_at (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
21618 {
21619 if ( arr_len == 0) return (arr_len);
21620 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
21621
21622 char c = arr[upos];
21623
21624 int i;
21625
21626 for (i = 0; i < ulen; i++)
21627 {
21628 arr_len = mangle_insert (arr, arr_len, upos, c);
21629 }
21630
21631 return (arr_len);
21632 }
21633
21634 int mangle_dupechar (char arr[BLOCK_SIZE], int arr_len)
21635 {
21636 if ( arr_len == 0) return (arr_len);
21637 if ((arr_len + arr_len) >= BLOCK_SIZE) return (arr_len);
21638
21639 int arr_pos;
21640
21641 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
21642 {
21643 int new_pos = arr_pos * 2;
21644
21645 arr[new_pos] = arr[arr_pos];
21646
21647 arr[new_pos + 1] = arr[arr_pos];
21648 }
21649
21650 return (arr_len * 2);
21651 }
21652
21653 int mangle_switch_at_check (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
21654 {
21655 if (upos >= arr_len) return (arr_len);
21656 if (upos2 >= arr_len) return (arr_len);
21657
21658 MANGLE_SWITCH (arr, upos, upos2);
21659
21660 return (arr_len);
21661 }
21662
21663 int mangle_switch_at (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
21664 {
21665 MANGLE_SWITCH (arr, upos, upos2);
21666
21667 return (arr_len);
21668 }
21669
21670 int mangle_chr_shiftl (char arr[BLOCK_SIZE], int arr_len, int upos)
21671 {
21672 if (upos >= arr_len) return (arr_len);
21673
21674 arr[upos] <<= 1;
21675
21676 return (arr_len);
21677 }
21678
21679 int mangle_chr_shiftr (char arr[BLOCK_SIZE], int arr_len, int upos)
21680 {
21681 if (upos >= arr_len) return (arr_len);
21682
21683 arr[upos] >>= 1;
21684
21685 return (arr_len);
21686 }
21687
21688 int mangle_chr_incr (char arr[BLOCK_SIZE], int arr_len, int upos)
21689 {
21690 if (upos >= arr_len) return (arr_len);
21691
21692 arr[upos] += 1;
21693
21694 return (arr_len);
21695 }
21696
21697 int mangle_chr_decr (char arr[BLOCK_SIZE], int arr_len, int upos)
21698 {
21699 if (upos >= arr_len) return (arr_len);
21700
21701 arr[upos] -= 1;
21702
21703 return (arr_len);
21704 }
21705
21706 int mangle_title (char arr[BLOCK_SIZE], int arr_len)
21707 {
21708 int upper_next = 1;
21709
21710 int pos;
21711
21712 for (pos = 0; pos < arr_len; pos++)
21713 {
21714 if (arr[pos] == ' ')
21715 {
21716 upper_next = 1;
21717
21718 continue;
21719 }
21720
21721 if (upper_next)
21722 {
21723 upper_next = 0;
21724
21725 MANGLE_UPPER_AT (arr, pos);
21726 }
21727 else
21728 {
21729 MANGLE_LOWER_AT (arr, pos);
21730 }
21731 }
21732
21733 return (arr_len);
21734 }
21735
21736 int generate_random_rule (char rule_buf[RP_RULE_BUFSIZ], u32 rp_gen_func_min, u32 rp_gen_func_max)
21737 {
21738 u32 rp_gen_num = get_random_num (rp_gen_func_min, rp_gen_func_max);
21739
21740 u32 j;
21741
21742 u32 rule_pos = 0;
21743
21744 for (j = 0; j < rp_gen_num; j++)
21745 {
21746 u32 r = 0;
21747 u32 p1 = 0;
21748 u32 p2 = 0;
21749 u32 p3 = 0;
21750
21751 switch ((char) get_random_num (0, 9))
21752 {
21753 case 0:
21754 r = get_random_num (0, sizeof (grp_op_nop));
21755 rule_buf[rule_pos++] = grp_op_nop[r];
21756 break;
21757
21758 case 1:
21759 r = get_random_num (0, sizeof (grp_op_pos_p0));
21760 rule_buf[rule_pos++] = grp_op_pos_p0[r];
21761 p1 = get_random_num (0, sizeof (grp_pos));
21762 rule_buf[rule_pos++] = grp_pos[p1];
21763 break;
21764
21765 case 2:
21766 r = get_random_num (0, sizeof (grp_op_pos_p1));
21767 rule_buf[rule_pos++] = grp_op_pos_p1[r];
21768 p1 = get_random_num (1, 6);
21769 rule_buf[rule_pos++] = grp_pos[p1];
21770 break;
21771
21772 case 3:
21773 r = get_random_num (0, sizeof (grp_op_chr));
21774 rule_buf[rule_pos++] = grp_op_chr[r];
21775 p1 = get_random_num (0x20, 0x7e);
21776 rule_buf[rule_pos++] = (char) p1;
21777 break;
21778
21779 case 4:
21780 r = get_random_num (0, sizeof (grp_op_chr_chr));
21781 rule_buf[rule_pos++] = grp_op_chr_chr[r];
21782 p1 = get_random_num (0x20, 0x7e);
21783 rule_buf[rule_pos++] = (char) p1;
21784 p2 = get_random_num (0x20, 0x7e);
21785 while (p1 == p2)
21786 p2 = get_random_num (0x20, 0x7e);
21787 rule_buf[rule_pos++] = (char) p2;
21788 break;
21789
21790 case 5:
21791 r = get_random_num (0, sizeof (grp_op_pos_chr));
21792 rule_buf[rule_pos++] = grp_op_pos_chr[r];
21793 p1 = get_random_num (0, sizeof (grp_pos));
21794 rule_buf[rule_pos++] = grp_pos[p1];
21795 p2 = get_random_num (0x20, 0x7e);
21796 rule_buf[rule_pos++] = (char) p2;
21797 break;
21798
21799 case 6:
21800 r = get_random_num (0, sizeof (grp_op_pos_pos0));
21801 rule_buf[rule_pos++] = grp_op_pos_pos0[r];
21802 p1 = get_random_num (0, sizeof (grp_pos));
21803 rule_buf[rule_pos++] = grp_pos[p1];
21804 p2 = get_random_num (0, sizeof (grp_pos));
21805 while (p1 == p2)
21806 p2 = get_random_num (0, sizeof (grp_pos));
21807 rule_buf[rule_pos++] = grp_pos[p2];
21808 break;
21809
21810 case 7:
21811 r = get_random_num (0, sizeof (grp_op_pos_pos1));
21812 rule_buf[rule_pos++] = grp_op_pos_pos1[r];
21813 p1 = get_random_num (0, sizeof (grp_pos));
21814 rule_buf[rule_pos++] = grp_pos[p1];
21815 p2 = get_random_num (1, sizeof (grp_pos));
21816 while (p1 == p2)
21817 p2 = get_random_num (1, sizeof (grp_pos));
21818 rule_buf[rule_pos++] = grp_pos[p2];
21819 break;
21820
21821 case 8:
21822 r = get_random_num (0, sizeof (grp_op_pos1_pos2_pos3));
21823 rule_buf[rule_pos++] = grp_op_pos1_pos2_pos3[r];
21824 p1 = get_random_num (0, sizeof (grp_pos));
21825 rule_buf[rule_pos++] = grp_pos[p1];
21826 p2 = get_random_num (1, sizeof (grp_pos));
21827 rule_buf[rule_pos++] = grp_pos[p1];
21828 p3 = get_random_num (0, sizeof (grp_pos));
21829 rule_buf[rule_pos++] = grp_pos[p3];
21830 break;
21831 }
21832 }
21833
21834 return (rule_pos);
21835 }
21836
21837 int _old_apply_rule (char *rule, int rule_len, char in[BLOCK_SIZE], int in_len, char out[BLOCK_SIZE])
21838 {
21839 char mem[BLOCK_SIZE] = { 0 };
21840
21841 if (in == NULL) return (RULE_RC_REJECT_ERROR);
21842
21843 if (out == NULL) return (RULE_RC_REJECT_ERROR);
21844
21845 if (in_len < 1 || in_len > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
21846
21847 if (rule_len < 1) return (RULE_RC_REJECT_ERROR);
21848
21849 int out_len = in_len;
21850 int mem_len = in_len;
21851
21852 memcpy (out, in, out_len);
21853
21854 int rule_pos;
21855
21856 for (rule_pos = 0; rule_pos < rule_len; rule_pos++)
21857 {
21858 int upos, upos2;
21859 int ulen;
21860
21861 switch (rule[rule_pos])
21862 {
21863 case ' ':
21864 break;
21865
21866 case RULE_OP_MANGLE_NOOP:
21867 break;
21868
21869 case RULE_OP_MANGLE_LREST:
21870 out_len = mangle_lrest (out, out_len);
21871 break;
21872
21873 case RULE_OP_MANGLE_UREST:
21874 out_len = mangle_urest (out, out_len);
21875 break;
21876
21877 case RULE_OP_MANGLE_LREST_UFIRST:
21878 out_len = mangle_lrest (out, out_len);
21879 if (out_len) MANGLE_UPPER_AT (out, 0);
21880 break;
21881
21882 case RULE_OP_MANGLE_UREST_LFIRST:
21883 out_len = mangle_urest (out, out_len);
21884 if (out_len) MANGLE_LOWER_AT (out, 0);
21885 break;
21886
21887 case RULE_OP_MANGLE_TREST:
21888 out_len = mangle_trest (out, out_len);
21889 break;
21890
21891 case RULE_OP_MANGLE_TOGGLE_AT:
21892 NEXT_RULEPOS (rule_pos);
21893 NEXT_RPTOI (rule, rule_pos, upos);
21894 if (upos < out_len) MANGLE_TOGGLE_AT (out, upos);
21895 break;
21896
21897 case RULE_OP_MANGLE_REVERSE:
21898 out_len = mangle_reverse (out, out_len);
21899 break;
21900
21901 case RULE_OP_MANGLE_DUPEWORD:
21902 out_len = mangle_double (out, out_len);
21903 break;
21904
21905 case RULE_OP_MANGLE_DUPEWORD_TIMES:
21906 NEXT_RULEPOS (rule_pos);
21907 NEXT_RPTOI (rule, rule_pos, ulen);
21908 out_len = mangle_double_times (out, out_len, ulen);
21909 break;
21910
21911 case RULE_OP_MANGLE_REFLECT:
21912 out_len = mangle_reflect (out, out_len);
21913 break;
21914
21915 case RULE_OP_MANGLE_ROTATE_LEFT:
21916 mangle_rotate_left (out, out_len);
21917 break;
21918
21919 case RULE_OP_MANGLE_ROTATE_RIGHT:
21920 mangle_rotate_right (out, out_len);
21921 break;
21922
21923 case RULE_OP_MANGLE_APPEND:
21924 NEXT_RULEPOS (rule_pos);
21925 out_len = mangle_append (out, out_len, rule[rule_pos]);
21926 break;
21927
21928 case RULE_OP_MANGLE_PREPEND:
21929 NEXT_RULEPOS (rule_pos);
21930 out_len = mangle_prepend (out, out_len, rule[rule_pos]);
21931 break;
21932
21933 case RULE_OP_MANGLE_DELETE_FIRST:
21934 out_len = mangle_delete_at (out, out_len, 0);
21935 break;
21936
21937 case RULE_OP_MANGLE_DELETE_LAST:
21938 out_len = mangle_delete_at (out, out_len, (out_len) ? out_len - 1 : 0);
21939 break;
21940
21941 case RULE_OP_MANGLE_DELETE_AT:
21942 NEXT_RULEPOS (rule_pos);
21943 NEXT_RPTOI (rule, rule_pos, upos);
21944 out_len = mangle_delete_at (out, out_len, upos);
21945 break;
21946
21947 case RULE_OP_MANGLE_EXTRACT:
21948 NEXT_RULEPOS (rule_pos);
21949 NEXT_RPTOI (rule, rule_pos, upos);
21950 NEXT_RULEPOS (rule_pos);
21951 NEXT_RPTOI (rule, rule_pos, ulen);
21952 out_len = mangle_extract (out, out_len, upos, ulen);
21953 break;
21954
21955 case RULE_OP_MANGLE_OMIT:
21956 NEXT_RULEPOS (rule_pos);
21957 NEXT_RPTOI (rule, rule_pos, upos);
21958 NEXT_RULEPOS (rule_pos);
21959 NEXT_RPTOI (rule, rule_pos, ulen);
21960 out_len = mangle_omit (out, out_len, upos, ulen);
21961 break;
21962
21963 case RULE_OP_MANGLE_INSERT:
21964 NEXT_RULEPOS (rule_pos);
21965 NEXT_RPTOI (rule, rule_pos, upos);
21966 NEXT_RULEPOS (rule_pos);
21967 out_len = mangle_insert (out, out_len, upos, rule[rule_pos]);
21968 break;
21969
21970 case RULE_OP_MANGLE_OVERSTRIKE:
21971 NEXT_RULEPOS (rule_pos);
21972 NEXT_RPTOI (rule, rule_pos, upos);
21973 NEXT_RULEPOS (rule_pos);
21974 out_len = mangle_overstrike (out, out_len, upos, rule[rule_pos]);
21975 break;
21976
21977 case RULE_OP_MANGLE_TRUNCATE_AT:
21978 NEXT_RULEPOS (rule_pos);
21979 NEXT_RPTOI (rule, rule_pos, upos);
21980 out_len = mangle_truncate_at (out, out_len, upos);
21981 break;
21982
21983 case RULE_OP_MANGLE_REPLACE:
21984 NEXT_RULEPOS (rule_pos);
21985 NEXT_RULEPOS (rule_pos);
21986 out_len = mangle_replace (out, out_len, rule[rule_pos - 1], rule[rule_pos]);
21987 break;
21988
21989 case RULE_OP_MANGLE_PURGECHAR:
21990 NEXT_RULEPOS (rule_pos);
21991 out_len = mangle_purgechar (out, out_len, rule[rule_pos]);
21992 break;
21993
21994 case RULE_OP_MANGLE_TOGGLECASE_REC:
21995 /* todo */
21996 break;
21997
21998 case RULE_OP_MANGLE_DUPECHAR_FIRST:
21999 NEXT_RULEPOS (rule_pos);
22000 NEXT_RPTOI (rule, rule_pos, ulen);
22001 out_len = mangle_dupechar_at (out, out_len, 0, ulen);
22002 break;
22003
22004 case RULE_OP_MANGLE_DUPECHAR_LAST:
22005 NEXT_RULEPOS (rule_pos);
22006 NEXT_RPTOI (rule, rule_pos, ulen);
22007 out_len = mangle_dupechar_at (out, out_len, out_len - 1, ulen);
22008 break;
22009
22010 case RULE_OP_MANGLE_DUPECHAR_ALL:
22011 out_len = mangle_dupechar (out, out_len);
22012 break;
22013
22014 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
22015 NEXT_RULEPOS (rule_pos);
22016 NEXT_RPTOI (rule, rule_pos, ulen);
22017 out_len = mangle_dupeblock_prepend (out, out_len, ulen);
22018 break;
22019
22020 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
22021 NEXT_RULEPOS (rule_pos);
22022 NEXT_RPTOI (rule, rule_pos, ulen);
22023 out_len = mangle_dupeblock_append (out, out_len, ulen);
22024 break;
22025
22026 case RULE_OP_MANGLE_SWITCH_FIRST:
22027 if (out_len >= 2) mangle_switch_at (out, out_len, 0, 1);
22028 break;
22029
22030 case RULE_OP_MANGLE_SWITCH_LAST:
22031 if (out_len >= 2) mangle_switch_at (out, out_len, out_len - 1, out_len - 2);
22032 break;
22033
22034 case RULE_OP_MANGLE_SWITCH_AT:
22035 NEXT_RULEPOS (rule_pos);
22036 NEXT_RPTOI (rule, rule_pos, upos);
22037 NEXT_RULEPOS (rule_pos);
22038 NEXT_RPTOI (rule, rule_pos, upos2);
22039 out_len = mangle_switch_at_check (out, out_len, upos, upos2);
22040 break;
22041
22042 case RULE_OP_MANGLE_CHR_SHIFTL:
22043 NEXT_RULEPOS (rule_pos);
22044 NEXT_RPTOI (rule, rule_pos, upos);
22045 mangle_chr_shiftl (out, out_len, upos);
22046 break;
22047
22048 case RULE_OP_MANGLE_CHR_SHIFTR:
22049 NEXT_RULEPOS (rule_pos);
22050 NEXT_RPTOI (rule, rule_pos, upos);
22051 mangle_chr_shiftr (out, out_len, upos);
22052 break;
22053
22054 case RULE_OP_MANGLE_CHR_INCR:
22055 NEXT_RULEPOS (rule_pos);
22056 NEXT_RPTOI (rule, rule_pos, upos);
22057 mangle_chr_incr (out, out_len, upos);
22058 break;
22059
22060 case RULE_OP_MANGLE_CHR_DECR:
22061 NEXT_RULEPOS (rule_pos);
22062 NEXT_RPTOI (rule, rule_pos, upos);
22063 mangle_chr_decr (out, out_len, upos);
22064 break;
22065
22066 case RULE_OP_MANGLE_REPLACE_NP1:
22067 NEXT_RULEPOS (rule_pos);
22068 NEXT_RPTOI (rule, rule_pos, upos);
22069 if ((upos >= 0) && ((upos + 1) < out_len)) mangle_overstrike (out, out_len, upos, out[upos + 1]);
22070 break;
22071
22072 case RULE_OP_MANGLE_REPLACE_NM1:
22073 NEXT_RULEPOS (rule_pos);
22074 NEXT_RPTOI (rule, rule_pos, upos);
22075 if ((upos >= 1) && ((upos + 0) < out_len)) mangle_overstrike (out, out_len, upos, out[upos - 1]);
22076 break;
22077
22078 case RULE_OP_MANGLE_TITLE:
22079 out_len = mangle_title (out, out_len);
22080 break;
22081
22082 case RULE_OP_MANGLE_EXTRACT_MEMORY:
22083 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
22084 NEXT_RULEPOS (rule_pos);
22085 NEXT_RPTOI (rule, rule_pos, upos);
22086 NEXT_RULEPOS (rule_pos);
22087 NEXT_RPTOI (rule, rule_pos, ulen);
22088 NEXT_RULEPOS (rule_pos);
22089 NEXT_RPTOI (rule, rule_pos, upos2);
22090 if ((out_len = mangle_insert_multi (out, out_len, upos2, mem, mem_len, upos, ulen)) < 1) return (out_len);
22091 break;
22092
22093 case RULE_OP_MANGLE_APPEND_MEMORY:
22094 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
22095 if ((out_len + mem_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
22096 memcpy (out + out_len, mem, mem_len);
22097 out_len += mem_len;
22098 break;
22099
22100 case RULE_OP_MANGLE_PREPEND_MEMORY:
22101 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
22102 if ((mem_len + out_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
22103 memcpy (mem + mem_len, out, out_len);
22104 out_len += mem_len;
22105 memcpy (out, mem, out_len);
22106 break;
22107
22108 case RULE_OP_MEMORIZE_WORD:
22109 memcpy (mem, out, out_len);
22110 mem_len = out_len;
22111 break;
22112
22113 case RULE_OP_REJECT_LESS:
22114 NEXT_RULEPOS (rule_pos);
22115 NEXT_RPTOI (rule, rule_pos, upos);
22116 if (out_len > upos) return (RULE_RC_REJECT_ERROR);
22117 break;
22118
22119 case RULE_OP_REJECT_GREATER:
22120 NEXT_RULEPOS (rule_pos);
22121 NEXT_RPTOI (rule, rule_pos, upos);
22122 if (out_len < upos) return (RULE_RC_REJECT_ERROR);
22123 break;
22124
22125 case RULE_OP_REJECT_CONTAIN:
22126 NEXT_RULEPOS (rule_pos);
22127 if (strchr (out, rule[rule_pos]) != NULL) return (RULE_RC_REJECT_ERROR);
22128 break;
22129
22130 case RULE_OP_REJECT_NOT_CONTAIN:
22131 NEXT_RULEPOS (rule_pos);
22132 if (strchr (out, rule[rule_pos]) == NULL) return (RULE_RC_REJECT_ERROR);
22133 break;
22134
22135 case RULE_OP_REJECT_EQUAL_FIRST:
22136 NEXT_RULEPOS (rule_pos);
22137 if (out[0] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
22138 break;
22139
22140 case RULE_OP_REJECT_EQUAL_LAST:
22141 NEXT_RULEPOS (rule_pos);
22142 if (out[out_len - 1] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
22143 break;
22144
22145 case RULE_OP_REJECT_EQUAL_AT:
22146 NEXT_RULEPOS (rule_pos);
22147 NEXT_RPTOI (rule, rule_pos, upos);
22148 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
22149 NEXT_RULEPOS (rule_pos);
22150 if (out[upos] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
22151 break;
22152
22153 case RULE_OP_REJECT_CONTAINS:
22154 NEXT_RULEPOS (rule_pos);
22155 NEXT_RPTOI (rule, rule_pos, upos);
22156 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
22157 NEXT_RULEPOS (rule_pos);
22158 int c; int cnt; for (c = 0, cnt = 0; c < out_len; c++) if (out[c] == rule[rule_pos]) cnt++;
22159 if (cnt < upos) return (RULE_RC_REJECT_ERROR);
22160 break;
22161
22162 case RULE_OP_REJECT_MEMORY:
22163 if ((out_len == mem_len) && (memcmp (out, mem, out_len) == 0)) return (RULE_RC_REJECT_ERROR);
22164 break;
22165
22166 default:
22167 return (RULE_RC_SYNTAX_ERROR);
22168 break;
22169 }
22170 }
22171
22172 memset (out + out_len, 0, BLOCK_SIZE - out_len);
22173
22174 return (out_len);
22175 }