Add ADL_Overdrive6_TargetTemperatureData_Get() which for some reason does not work
[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_utilization_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.iActivityPercent;
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 nvmlUtilization_t utilization;
3260
3261 hm_NVML_nvmlDeviceGetUtilizationRates (data.hm_nv, data.hm_device[device_id].adapter_index.nv, &utilization);
3262
3263 return utilization.gpu;
3264 #endif
3265
3266 #if defined(WIN) && defined(HAVE_NVAPI)
3267 NV_GPU_DYNAMIC_PSTATES_INFO_EX pDynamicPstatesInfoEx;
3268
3269 pDynamicPstatesInfoEx.version = NV_GPU_DYNAMIC_PSTATES_INFO_EX_VER;
3270
3271 if (hm_NvAPI_GPU_GetDynamicPstatesInfoEx (data.hm_nv, data.hm_device[device_id].adapter_index.nv, &pDynamicPstatesInfoEx) != NVAPI_OK) return -1;
3272
3273 return pDynamicPstatesInfoEx.utilization[0].percentage;
3274 #endif
3275 }
3276 #endif // HAVE_NVML || HAVE_NVAPI
3277
3278 return -1;
3279 }
3280
3281 int hm_get_memoryspeed_with_device_id (const uint device_id)
3282 {
3283 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3284
3285 #ifdef HAVE_ADL
3286 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_AMD)
3287 {
3288 if (data.hm_amd)
3289 {
3290 ADLPMActivity PMActivity;
3291
3292 PMActivity.iSize = sizeof (ADLPMActivity);
3293
3294 if (hm_ADL_Overdrive_CurrentActivity_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, &PMActivity) != ADL_OK) return -1;
3295
3296 return PMActivity.iMemoryClock / 100;
3297 }
3298 }
3299 #endif // HAVE_ADL
3300
3301 #if defined(HAVE_NVML) || defined(HAVE_NVAPI)
3302 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_NV)
3303 {
3304 #if defined(LINUX) && defined(HAVE_NVML)
3305 unsigned int clock;
3306
3307 hm_NVML_nvmlDeviceGetClockInfo (data.hm_nv, data.hm_device[device_id].adapter_index.nv, NVML_CLOCK_MEM, &clock);
3308
3309 return clock;
3310 #endif
3311
3312 #if defined(WIN) && defined(HAVE_NVAPI)
3313 NV_GPU_CLOCK_FREQUENCIES pClkFreqs = { 0 };
3314
3315 pClkFreqs.version = NV_GPU_CLOCK_FREQUENCIES_VER;
3316 pClkFreqs.ClockType = NV_GPU_CLOCK_FREQUENCIES_CURRENT_FREQ;
3317
3318 if (hm_NvAPI_GPU_GetAllClockFrequencies (data.hm_nv, data.hm_device[device_id].adapter_index.nv, &pClkFreqs) != NVAPI_OK) return -1;
3319
3320 return pClkFreqs.domain[NVAPI_GPU_PUBLIC_CLOCK_MEMORY].frequency / 1000;
3321 #endif
3322 }
3323 #endif // HAVE_NVML || HAVE_NVAPI
3324
3325 return -1;
3326 }
3327
3328 int hm_get_corespeed_with_device_id (const uint device_id)
3329 {
3330 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3331
3332 #ifdef HAVE_ADL
3333 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_AMD)
3334 {
3335 if (data.hm_amd)
3336 {
3337 ADLPMActivity PMActivity;
3338
3339 PMActivity.iSize = sizeof (ADLPMActivity);
3340
3341 if (hm_ADL_Overdrive_CurrentActivity_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, &PMActivity) != ADL_OK) return -1;
3342
3343 return PMActivity.iEngineClock / 100;
3344 }
3345 }
3346 #endif // HAVE_ADL
3347
3348 #if defined(HAVE_NVML) || defined(HAVE_NVAPI)
3349 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_NV)
3350 {
3351 #if defined(LINUX) && defined(HAVE_NVML)
3352 unsigned int clock;
3353
3354 hm_NVML_nvmlDeviceGetClockInfo (data.hm_nv, data.hm_device[device_id].adapter_index.nv, NVML_CLOCK_SM, &clock);
3355
3356 return clock;
3357 #endif
3358
3359 #if defined(WIN) && defined(HAVE_NVAPI)
3360 NV_GPU_CLOCK_FREQUENCIES pClkFreqs = { 0 };
3361
3362 pClkFreqs.version = NV_GPU_CLOCK_FREQUENCIES_VER;
3363 pClkFreqs.ClockType = NV_GPU_CLOCK_FREQUENCIES_CURRENT_FREQ;
3364
3365 if (hm_NvAPI_GPU_GetAllClockFrequencies (data.hm_nv, data.hm_device[device_id].adapter_index.nv, &pClkFreqs) != NVAPI_OK) return -1;
3366
3367 return pClkFreqs.domain[NVAPI_GPU_PUBLIC_CLOCK_GRAPHICS].frequency / 1000;
3368 #endif
3369 }
3370 #endif // HAVE_NVML || HAVE_NVAPI
3371
3372 return -1;
3373 }
3374
3375 #ifdef HAVE_ADL
3376 int hm_set_fanspeed_with_device_id_amd (const uint device_id, const int fanspeed)
3377 {
3378 if (data.hm_device[device_id].fan_supported == 1)
3379 {
3380 if (data.hm_amd)
3381 {
3382 if (data.hm_device[device_id].od_version == 5)
3383 {
3384 ADLFanSpeedValue lpFanSpeedValue;
3385
3386 memset (&lpFanSpeedValue, 0, sizeof (lpFanSpeedValue));
3387
3388 lpFanSpeedValue.iSize = sizeof (lpFanSpeedValue);
3389 lpFanSpeedValue.iSpeedType = ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
3390 lpFanSpeedValue.iFlags = ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED;
3391 lpFanSpeedValue.iFanSpeed = fanspeed;
3392
3393 if (hm_ADL_Overdrive5_FanSpeed_Set (data.hm_amd, data.hm_device[device_id].adapter_index.amd, 0, &lpFanSpeedValue) != ADL_OK) return -1;
3394
3395 return 0;
3396 }
3397 else // od_version == 6
3398 {
3399 ADLOD6FanSpeedValue fan_speed_value;
3400
3401 memset (&fan_speed_value, 0, sizeof (fan_speed_value));
3402
3403 fan_speed_value.iSpeedType = ADL_OD6_FANSPEED_TYPE_PERCENT;
3404 fan_speed_value.iFanSpeed = fanspeed;
3405
3406 if (hm_ADL_Overdrive6_FanSpeed_Set (data.hm_amd, data.hm_device[device_id].adapter_index.amd, &fan_speed_value) != ADL_OK) return -1;
3407
3408 return 0;
3409 }
3410 }
3411 }
3412
3413 return -1;
3414 }
3415 #endif
3416
3417 // helper function for status display
3418
3419 void hm_device_val_to_str (char *target_buf, int max_buf_size, char *suffix, int value)
3420 {
3421 #define VALUE_NOT_AVAILABLE "N/A"
3422
3423 if (value == -1)
3424 {
3425 snprintf (target_buf, max_buf_size, VALUE_NOT_AVAILABLE);
3426 }
3427 else
3428 {
3429 snprintf (target_buf, max_buf_size, "%2d%s", value, suffix);
3430 }
3431 }
3432 #endif // HAVE_HWMON
3433
3434 /**
3435 * maskprocessor
3436 */
3437
3438 void mp_css_to_uniq_tbl (uint css_cnt, cs_t *css, uint uniq_tbls[SP_PW_MAX][CHARSIZ])
3439 {
3440 /* generates a lookup table where key is the char itself for fastest possible lookup performance */
3441
3442 if (css_cnt > SP_PW_MAX)
3443 {
3444 log_error ("ERROR: mask length is too long");
3445
3446 exit (-1);
3447 }
3448
3449 for (uint css_pos = 0; css_pos < css_cnt; css_pos++)
3450 {
3451 uint *uniq_tbl = uniq_tbls[css_pos];
3452
3453 uint *cs_buf = css[css_pos].cs_buf;
3454 uint cs_len = css[css_pos].cs_len;
3455
3456 for (uint cs_pos = 0; cs_pos < cs_len; cs_pos++)
3457 {
3458 uint c = cs_buf[cs_pos] & 0xff;
3459
3460 uniq_tbl[c] = 1;
3461 }
3462 }
3463 }
3464
3465 void mp_add_cs_buf (uint *in_buf, size_t in_len, cs_t *css, int css_cnt)
3466 {
3467 cs_t *cs = &css[css_cnt];
3468
3469 size_t css_uniq_sz = CHARSIZ * sizeof (uint);
3470
3471 uint *css_uniq = (uint *) mymalloc (css_uniq_sz);
3472
3473 size_t i;
3474
3475 for (i = 0; i < cs->cs_len; i++)
3476 {
3477 const uint u = cs->cs_buf[i];
3478
3479 css_uniq[u] = 1;
3480 }
3481
3482 for (i = 0; i < in_len; i++)
3483 {
3484 uint u = in_buf[i] & 0xff;
3485
3486 if (data.opts_type & OPTS_TYPE_PT_UPPER) u = toupper (u);
3487
3488 if (css_uniq[u] == 1) continue;
3489
3490 css_uniq[u] = 1;
3491
3492 cs->cs_buf[cs->cs_len] = u;
3493
3494 cs->cs_len++;
3495 }
3496
3497 myfree (css_uniq);
3498 }
3499
3500 void mp_expand (char *in_buf, size_t in_len, cs_t *mp_sys, cs_t *mp_usr, int mp_usr_offset, int interpret)
3501 {
3502 size_t in_pos;
3503
3504 for (in_pos = 0; in_pos < in_len; in_pos++)
3505 {
3506 uint p0 = in_buf[in_pos] & 0xff;
3507
3508 if (interpret == 1 && p0 == '?')
3509 {
3510 in_pos++;
3511
3512 if (in_pos == in_len) break;
3513
3514 uint p1 = in_buf[in_pos] & 0xff;
3515
3516 switch (p1)
3517 {
3518 case 'l': mp_add_cs_buf (mp_sys[0].cs_buf, mp_sys[0].cs_len, mp_usr, mp_usr_offset);
3519 break;
3520 case 'u': mp_add_cs_buf (mp_sys[1].cs_buf, mp_sys[1].cs_len, mp_usr, mp_usr_offset);
3521 break;
3522 case 'd': mp_add_cs_buf (mp_sys[2].cs_buf, mp_sys[2].cs_len, mp_usr, mp_usr_offset);
3523 break;
3524 case 's': mp_add_cs_buf (mp_sys[3].cs_buf, mp_sys[3].cs_len, mp_usr, mp_usr_offset);
3525 break;
3526 case 'a': mp_add_cs_buf (mp_sys[4].cs_buf, mp_sys[4].cs_len, mp_usr, mp_usr_offset);
3527 break;
3528 case 'b': mp_add_cs_buf (mp_sys[5].cs_buf, mp_sys[5].cs_len, mp_usr, mp_usr_offset);
3529 break;
3530 case '1': if (mp_usr[0].cs_len == 0) { log_error ("ERROR: Custom-charset 1 is undefined\n"); exit (-1); }
3531 mp_add_cs_buf (mp_usr[0].cs_buf, mp_usr[0].cs_len, mp_usr, mp_usr_offset);
3532 break;
3533 case '2': if (mp_usr[1].cs_len == 0) { log_error ("ERROR: Custom-charset 2 is undefined\n"); exit (-1); }
3534 mp_add_cs_buf (mp_usr[1].cs_buf, mp_usr[1].cs_len, mp_usr, mp_usr_offset);
3535 break;
3536 case '3': if (mp_usr[2].cs_len == 0) { log_error ("ERROR: Custom-charset 3 is undefined\n"); exit (-1); }
3537 mp_add_cs_buf (mp_usr[2].cs_buf, mp_usr[2].cs_len, mp_usr, mp_usr_offset);
3538 break;
3539 case '4': if (mp_usr[3].cs_len == 0) { log_error ("ERROR: Custom-charset 4 is undefined\n"); exit (-1); }
3540 mp_add_cs_buf (mp_usr[3].cs_buf, mp_usr[3].cs_len, mp_usr, mp_usr_offset);
3541 break;
3542 case '?': mp_add_cs_buf (&p0, 1, mp_usr, mp_usr_offset);
3543 break;
3544 default: log_error ("Syntax error: %s", in_buf);
3545 exit (-1);
3546 }
3547 }
3548 else
3549 {
3550 if (data.hex_charset)
3551 {
3552 in_pos++;
3553
3554 if (in_pos == in_len)
3555 {
3556 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", in_buf);
3557
3558 exit (-1);
3559 }
3560
3561 uint p1 = in_buf[in_pos] & 0xff;
3562
3563 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3564 {
3565 log_error ("ERROR: invalid hex character detected in mask %s", in_buf);
3566
3567 exit (-1);
3568 }
3569
3570 uint chr = 0;
3571
3572 chr = hex_convert (p1) << 0;
3573 chr |= hex_convert (p0) << 4;
3574
3575 mp_add_cs_buf (&chr, 1, mp_usr, mp_usr_offset);
3576 }
3577 else
3578 {
3579 uint chr = p0;
3580
3581 mp_add_cs_buf (&chr, 1, mp_usr, mp_usr_offset);
3582 }
3583 }
3584 }
3585 }
3586
3587 u64 mp_get_sum (uint css_cnt, cs_t *css)
3588 {
3589 u64 sum = 1;
3590
3591 for (uint css_pos = 0; css_pos < css_cnt; css_pos++)
3592 {
3593 sum *= css[css_pos].cs_len;
3594 }
3595
3596 return (sum);
3597 }
3598
3599 cs_t *mp_gen_css (char *mask_buf, size_t mask_len, cs_t *mp_sys, cs_t *mp_usr, uint *css_cnt)
3600 {
3601 cs_t *css = (cs_t *) mycalloc (256, sizeof (cs_t));
3602
3603 uint mask_pos;
3604 uint css_pos;
3605
3606 for (mask_pos = 0, css_pos = 0; mask_pos < mask_len; mask_pos++, css_pos++)
3607 {
3608 char p0 = mask_buf[mask_pos];
3609
3610 if (p0 == '?')
3611 {
3612 mask_pos++;
3613
3614 if (mask_pos == mask_len) break;
3615
3616 char p1 = mask_buf[mask_pos];
3617
3618 uint chr = p1;
3619
3620 switch (p1)
3621 {
3622 case 'l': mp_add_cs_buf (mp_sys[0].cs_buf, mp_sys[0].cs_len, css, css_pos);
3623 break;
3624 case 'u': mp_add_cs_buf (mp_sys[1].cs_buf, mp_sys[1].cs_len, css, css_pos);
3625 break;
3626 case 'd': mp_add_cs_buf (mp_sys[2].cs_buf, mp_sys[2].cs_len, css, css_pos);
3627 break;
3628 case 's': mp_add_cs_buf (mp_sys[3].cs_buf, mp_sys[3].cs_len, css, css_pos);
3629 break;
3630 case 'a': mp_add_cs_buf (mp_sys[4].cs_buf, mp_sys[4].cs_len, css, css_pos);
3631 break;
3632 case 'b': mp_add_cs_buf (mp_sys[5].cs_buf, mp_sys[5].cs_len, css, css_pos);
3633 break;
3634 case '1': if (mp_usr[0].cs_len == 0) { log_error ("ERROR: Custom-charset 1 is undefined\n"); exit (-1); }
3635 mp_add_cs_buf (mp_usr[0].cs_buf, mp_usr[0].cs_len, css, css_pos);
3636 break;
3637 case '2': if (mp_usr[1].cs_len == 0) { log_error ("ERROR: Custom-charset 2 is undefined\n"); exit (-1); }
3638 mp_add_cs_buf (mp_usr[1].cs_buf, mp_usr[1].cs_len, css, css_pos);
3639 break;
3640 case '3': if (mp_usr[2].cs_len == 0) { log_error ("ERROR: Custom-charset 3 is undefined\n"); exit (-1); }
3641 mp_add_cs_buf (mp_usr[2].cs_buf, mp_usr[2].cs_len, css, css_pos);
3642 break;
3643 case '4': if (mp_usr[3].cs_len == 0) { log_error ("ERROR: Custom-charset 4 is undefined\n"); exit (-1); }
3644 mp_add_cs_buf (mp_usr[3].cs_buf, mp_usr[3].cs_len, css, css_pos);
3645 break;
3646 case '?': mp_add_cs_buf (&chr, 1, css, css_pos);
3647 break;
3648 default: log_error ("ERROR: syntax error: %s", mask_buf);
3649 exit (-1);
3650 }
3651 }
3652 else
3653 {
3654 if (data.hex_charset)
3655 {
3656 mask_pos++;
3657
3658 // if there is no 2nd hex character, show an error:
3659
3660 if (mask_pos == mask_len)
3661 {
3662 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", mask_buf);
3663
3664 exit (-1);
3665 }
3666
3667 char p1 = mask_buf[mask_pos];
3668
3669 // if they are not valid hex character, show an error:
3670
3671 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3672 {
3673 log_error ("ERROR: invalid hex character detected in mask %s", mask_buf);
3674
3675 exit (-1);
3676 }
3677
3678 uint chr = 0;
3679
3680 chr |= hex_convert (p1) << 0;
3681 chr |= hex_convert (p0) << 4;
3682
3683 mp_add_cs_buf (&chr, 1, css, css_pos);
3684 }
3685 else
3686 {
3687 uint chr = p0;
3688
3689 mp_add_cs_buf (&chr, 1, css, css_pos);
3690 }
3691 }
3692 }
3693
3694 if (css_pos == 0)
3695 {
3696 log_error ("ERROR: invalid mask length (0)");
3697
3698 exit (-1);
3699 }
3700
3701 *css_cnt = css_pos;
3702
3703 return (css);
3704 }
3705
3706 void mp_exec (u64 val, char *buf, cs_t *css, int css_cnt)
3707 {
3708 for (int i = 0; i < css_cnt; i++)
3709 {
3710 uint len = css[i].cs_len;
3711 u64 next = val / len;
3712 uint pos = val % len;
3713 buf[i] = (char) css[i].cs_buf[pos] & 0xff;
3714 val = next;
3715 }
3716 }
3717
3718 void mp_cut_at (char *mask, uint max)
3719 {
3720 uint i;
3721 uint j;
3722 uint mask_len = strlen (mask);
3723
3724 for (i = 0, j = 0; i < mask_len && j < max; i++, j++)
3725 {
3726 if (mask[i] == '?') i++;
3727 }
3728
3729 mask[i] = 0;
3730 }
3731
3732 void mp_setup_sys (cs_t *mp_sys)
3733 {
3734 uint pos;
3735 uint chr;
3736 uint donec[CHARSIZ] = { 0 };
3737
3738 for (pos = 0, chr = 'a'; chr <= 'z'; chr++) { donec[chr] = 1;
3739 mp_sys[0].cs_buf[pos++] = chr;
3740 mp_sys[0].cs_len = pos; }
3741
3742 for (pos = 0, chr = 'A'; chr <= 'Z'; chr++) { donec[chr] = 1;
3743 mp_sys[1].cs_buf[pos++] = chr;
3744 mp_sys[1].cs_len = pos; }
3745
3746 for (pos = 0, chr = '0'; chr <= '9'; chr++) { donec[chr] = 1;
3747 mp_sys[2].cs_buf[pos++] = chr;
3748 mp_sys[2].cs_len = pos; }
3749
3750 for (pos = 0, chr = 0x20; chr <= 0x7e; chr++) { if (donec[chr]) continue;
3751 mp_sys[3].cs_buf[pos++] = chr;
3752 mp_sys[3].cs_len = pos; }
3753
3754 for (pos = 0, chr = 0x20; chr <= 0x7e; chr++) { mp_sys[4].cs_buf[pos++] = chr;
3755 mp_sys[4].cs_len = pos; }
3756
3757 for (pos = 0, chr = 0x00; chr <= 0xff; chr++) { mp_sys[5].cs_buf[pos++] = chr;
3758 mp_sys[5].cs_len = pos; }
3759 }
3760
3761 void mp_setup_usr (cs_t *mp_sys, cs_t *mp_usr, char *buf, uint index)
3762 {
3763 FILE *fp = fopen (buf, "rb");
3764
3765 if (fp == NULL || feof (fp)) // feof() in case if file is empty
3766 {
3767 mp_expand (buf, strlen (buf), mp_sys, mp_usr, index, 1);
3768 }
3769 else
3770 {
3771 char mp_file[1024] = { 0 };
3772
3773 size_t len = fread (mp_file, 1, sizeof (mp_file) - 1, fp);
3774
3775 fclose (fp);
3776
3777 len = in_superchop (mp_file);
3778
3779 if (len == 0)
3780 {
3781 log_info ("WARNING: charset file corrupted");
3782
3783 mp_expand (buf, strlen (buf), mp_sys, mp_usr, index, 1);
3784 }
3785 else
3786 {
3787 mp_expand (mp_file, len, mp_sys, mp_usr, index, 0);
3788 }
3789 }
3790 }
3791
3792 void mp_reset_usr (cs_t *mp_usr, uint index)
3793 {
3794 mp_usr[index].cs_len = 0;
3795
3796 memset (mp_usr[index].cs_buf, 0, sizeof (mp_usr[index].cs_buf));
3797 }
3798
3799 char *mp_get_truncated_mask (char *mask_buf, size_t mask_len, uint len)
3800 {
3801 char *new_mask_buf = (char *) mymalloc (256);
3802
3803 uint mask_pos;
3804
3805 uint css_pos;
3806
3807 for (mask_pos = 0, css_pos = 0; mask_pos < mask_len; mask_pos++, css_pos++)
3808 {
3809 if (css_pos == len) break;
3810
3811 char p0 = mask_buf[mask_pos];
3812
3813 new_mask_buf[mask_pos] = p0;
3814
3815 if (p0 == '?')
3816 {
3817 mask_pos++;
3818
3819 if (mask_pos == mask_len) break;
3820
3821 new_mask_buf[mask_pos] = mask_buf[mask_pos];
3822 }
3823 else
3824 {
3825 if (data.hex_charset)
3826 {
3827 mask_pos++;
3828
3829 if (mask_pos == mask_len)
3830 {
3831 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", mask_buf);
3832
3833 exit (-1);
3834 }
3835
3836 char p1 = mask_buf[mask_pos];
3837
3838 // if they are not valid hex character, show an error:
3839
3840 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3841 {
3842 log_error ("ERROR: invalid hex character detected in mask: %s", mask_buf);
3843
3844 exit (-1);
3845 }
3846
3847 new_mask_buf[mask_pos] = p1;
3848 }
3849 }
3850 }
3851
3852 if (css_pos == len) return (new_mask_buf);
3853
3854 myfree (new_mask_buf);
3855
3856 return (NULL);
3857 }
3858
3859 /**
3860 * statprocessor
3861 */
3862
3863 u64 sp_get_sum (uint start, uint stop, cs_t *root_css_buf)
3864 {
3865 u64 sum = 1;
3866
3867 uint i;
3868
3869 for (i = start; i < stop; i++)
3870 {
3871 sum *= root_css_buf[i].cs_len;
3872 }
3873
3874 return (sum);
3875 }
3876
3877 void sp_exec (u64 ctx, char *pw_buf, cs_t *root_css_buf, cs_t *markov_css_buf, uint start, uint stop)
3878 {
3879 u64 v = ctx;
3880
3881 cs_t *cs = &root_css_buf[start];
3882
3883 uint i;
3884
3885 for (i = start; i < stop; i++)
3886 {
3887 const u64 m = v % cs->cs_len;
3888 const u64 d = v / cs->cs_len;
3889
3890 v = d;
3891
3892 const uint k = cs->cs_buf[m];
3893
3894 pw_buf[i - start] = (char) k;
3895
3896 cs = &markov_css_buf[(i * CHARSIZ) + k];
3897 }
3898 }
3899
3900 int sp_comp_val (const void *p1, const void *p2)
3901 {
3902 hcstat_table_t *b1 = (hcstat_table_t *) p1;
3903 hcstat_table_t *b2 = (hcstat_table_t *) p2;
3904
3905 return b2->val - b1->val;
3906 }
3907
3908 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)
3909 {
3910 uint i;
3911 uint j;
3912 uint k;
3913
3914 /**
3915 * Initialize hcstats
3916 */
3917
3918 u64 *root_stats_buf = (u64 *) mycalloc (SP_ROOT_CNT, sizeof (u64));
3919
3920 u64 *root_stats_ptr = root_stats_buf;
3921
3922 u64 *root_stats_buf_by_pos[SP_PW_MAX];
3923
3924 for (i = 0; i < SP_PW_MAX; i++)
3925 {
3926 root_stats_buf_by_pos[i] = root_stats_ptr;
3927
3928 root_stats_ptr += CHARSIZ;
3929 }
3930
3931 u64 *markov_stats_buf = (u64 *) mycalloc (SP_MARKOV_CNT, sizeof (u64));
3932
3933 u64 *markov_stats_ptr = markov_stats_buf;
3934
3935 u64 *markov_stats_buf_by_key[SP_PW_MAX][CHARSIZ];
3936
3937 for (i = 0; i < SP_PW_MAX; i++)
3938 {
3939 for (j = 0; j < CHARSIZ; j++)
3940 {
3941 markov_stats_buf_by_key[i][j] = markov_stats_ptr;
3942
3943 markov_stats_ptr += CHARSIZ;
3944 }
3945 }
3946
3947 /**
3948 * Load hcstats File
3949 */
3950
3951 if (hcstat == NULL)
3952 {
3953 char hcstat_tmp[256] = { 0 };
3954
3955 snprintf (hcstat_tmp, sizeof (hcstat_tmp) - 1, "%s/%s", shared_dir, SP_HCSTAT);
3956
3957 hcstat = hcstat_tmp;
3958 }
3959
3960 FILE *fd = fopen (hcstat, "rb");
3961
3962 if (fd == NULL)
3963 {
3964 log_error ("%s: %s", hcstat, strerror (errno));
3965
3966 exit (-1);
3967 }
3968
3969 if (fread (root_stats_buf, sizeof (u64), SP_ROOT_CNT, fd) != SP_ROOT_CNT)
3970 {
3971 log_error ("%s: Could not load data", hcstat);
3972
3973 fclose (fd);
3974
3975 exit (-1);
3976 }
3977
3978 if (fread (markov_stats_buf, sizeof (u64), SP_MARKOV_CNT, fd) != SP_MARKOV_CNT)
3979 {
3980 log_error ("%s: Could not load data", hcstat);
3981
3982 fclose (fd);
3983
3984 exit (-1);
3985 }
3986
3987 fclose (fd);
3988
3989 /**
3990 * Markov modifier of hcstat_table on user request
3991 */
3992
3993 if (disable)
3994 {
3995 memset (root_stats_buf, 0, SP_ROOT_CNT * sizeof (u64));
3996 memset (markov_stats_buf, 0, SP_MARKOV_CNT * sizeof (u64));
3997 }
3998
3999 if (classic)
4000 {
4001 /* Add all stats to first position */
4002
4003 for (i = 1; i < SP_PW_MAX; i++)
4004 {
4005 u64 *out = root_stats_buf_by_pos[0];
4006 u64 *in = root_stats_buf_by_pos[i];
4007
4008 for (j = 0; j < CHARSIZ; j++)
4009 {
4010 *out++ += *in++;
4011 }
4012 }
4013
4014 for (i = 1; i < SP_PW_MAX; i++)
4015 {
4016 u64 *out = markov_stats_buf_by_key[0][0];
4017 u64 *in = markov_stats_buf_by_key[i][0];
4018
4019 for (j = 0; j < CHARSIZ; j++)
4020 {
4021 for (k = 0; k < CHARSIZ; k++)
4022 {
4023 *out++ += *in++;
4024 }
4025 }
4026 }
4027
4028 /* copy them to all pw_positions */
4029
4030 for (i = 1; i < SP_PW_MAX; i++)
4031 {
4032 memcpy (root_stats_buf_by_pos[i], root_stats_buf_by_pos[0], CHARSIZ * sizeof (u64));
4033 }
4034
4035 for (i = 1; i < SP_PW_MAX; i++)
4036 {
4037 memcpy (markov_stats_buf_by_key[i][0], markov_stats_buf_by_key[0][0], CHARSIZ * CHARSIZ * sizeof (u64));
4038 }
4039 }
4040
4041 /**
4042 * Initialize tables
4043 */
4044
4045 hcstat_table_t *root_table_ptr = root_table_buf;
4046
4047 hcstat_table_t *root_table_buf_by_pos[SP_PW_MAX];
4048
4049 for (i = 0; i < SP_PW_MAX; i++)
4050 {
4051 root_table_buf_by_pos[i] = root_table_ptr;
4052
4053 root_table_ptr += CHARSIZ;
4054 }
4055
4056 hcstat_table_t *markov_table_ptr = markov_table_buf;
4057
4058 hcstat_table_t *markov_table_buf_by_key[SP_PW_MAX][CHARSIZ];
4059
4060 for (i = 0; i < SP_PW_MAX; i++)
4061 {
4062 for (j = 0; j < CHARSIZ; j++)
4063 {
4064 markov_table_buf_by_key[i][j] = markov_table_ptr;
4065
4066 markov_table_ptr += CHARSIZ;
4067 }
4068 }
4069
4070 /**
4071 * Convert hcstat to tables
4072 */
4073
4074 for (i = 0; i < SP_ROOT_CNT; i++)
4075 {
4076 uint key = i % CHARSIZ;
4077
4078 root_table_buf[i].key = key;
4079 root_table_buf[i].val = root_stats_buf[i];
4080 }
4081
4082 for (i = 0; i < SP_MARKOV_CNT; i++)
4083 {
4084 uint key = i % CHARSIZ;
4085
4086 markov_table_buf[i].key = key;
4087 markov_table_buf[i].val = markov_stats_buf[i];
4088 }
4089
4090 myfree (root_stats_buf);
4091 myfree (markov_stats_buf);
4092
4093 /**
4094 * Finally sort them
4095 */
4096
4097 for (i = 0; i < SP_PW_MAX; i++)
4098 {
4099 qsort (root_table_buf_by_pos[i], CHARSIZ, sizeof (hcstat_table_t), sp_comp_val);
4100 }
4101
4102 for (i = 0; i < SP_PW_MAX; i++)
4103 {
4104 for (j = 0; j < CHARSIZ; j++)
4105 {
4106 qsort (markov_table_buf_by_key[i][j], CHARSIZ, sizeof (hcstat_table_t), sp_comp_val);
4107 }
4108 }
4109 }
4110
4111 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])
4112 {
4113 /**
4114 * Convert tables to css
4115 */
4116
4117 for (uint i = 0; i < SP_ROOT_CNT; i++)
4118 {
4119 uint pw_pos = i / CHARSIZ;
4120
4121 cs_t *cs = &root_css_buf[pw_pos];
4122
4123 if (cs->cs_len == threshold) continue;
4124
4125 uint key = root_table_buf[i].key;
4126
4127 if (uniq_tbls[pw_pos][key] == 0) continue;
4128
4129 cs->cs_buf[cs->cs_len] = key;
4130
4131 cs->cs_len++;
4132 }
4133
4134 /**
4135 * Convert table to css
4136 */
4137
4138 for (uint i = 0; i < SP_MARKOV_CNT; i++)
4139 {
4140 uint c = i / CHARSIZ;
4141
4142 cs_t *cs = &markov_css_buf[c];
4143
4144 if (cs->cs_len == threshold) continue;
4145
4146 uint pw_pos = c / CHARSIZ;
4147
4148 uint key = markov_table_buf[i].key;
4149
4150 if ((pw_pos + 1) < SP_PW_MAX) if (uniq_tbls[pw_pos + 1][key] == 0) continue;
4151
4152 cs->cs_buf[cs->cs_len] = key;
4153
4154 cs->cs_len++;
4155 }
4156
4157 /*
4158 for (uint i = 0; i < 8; i++)
4159 {
4160 for (uint j = 0x20; j < 0x80; j++)
4161 {
4162 cs_t *ptr = &markov_css_buf[(i * CHARSIZ) + j];
4163
4164 printf ("pos:%u key:%u len:%u\n", i, j, ptr->cs_len);
4165
4166 for (uint k = 0; k < 10; k++)
4167 {
4168 printf (" %u\n", ptr->cs_buf[k]);
4169 }
4170 }
4171 }
4172 */
4173 }
4174
4175 void sp_stretch_root (hcstat_table_t *in, hcstat_table_t *out)
4176 {
4177 for (uint i = 0; i < SP_PW_MAX; i += 2)
4178 {
4179 memcpy (out, in, CHARSIZ * sizeof (hcstat_table_t));
4180
4181 out += CHARSIZ;
4182 in += CHARSIZ;
4183
4184 out->key = 0;
4185 out->val = 1;
4186
4187 out++;
4188
4189 for (uint j = 1; j < CHARSIZ; j++)
4190 {
4191 out->key = j;
4192 out->val = 0;
4193
4194 out++;
4195 }
4196 }
4197 }
4198
4199 void sp_stretch_markov (hcstat_table_t *in, hcstat_table_t *out)
4200 {
4201 for (uint i = 0; i < SP_PW_MAX; i += 2)
4202 {
4203 memcpy (out, in, CHARSIZ * CHARSIZ * sizeof (hcstat_table_t));
4204
4205 out += CHARSIZ * CHARSIZ;
4206 in += CHARSIZ * CHARSIZ;
4207
4208 for (uint j = 0; j < CHARSIZ; j++)
4209 {
4210 out->key = 0;
4211 out->val = 1;
4212
4213 out++;
4214
4215 for (uint k = 1; k < CHARSIZ; k++)
4216 {
4217 out->key = k;
4218 out->val = 0;
4219
4220 out++;
4221 }
4222 }
4223 }
4224 }
4225
4226 /**
4227 * mixed shared functions
4228 */
4229
4230 void dump_hex (const u8 *s, const int sz)
4231 {
4232 for (int i = 0; i < sz; i++)
4233 {
4234 log_info_nn ("%02x ", s[i]);
4235 }
4236
4237 log_info ("");
4238 }
4239
4240 void usage_mini_print (const char *progname)
4241 {
4242 for (uint i = 0; USAGE_MINI[i] != NULL; i++) log_info (USAGE_MINI[i], progname);
4243 }
4244
4245 void usage_big_print (const char *progname)
4246 {
4247 for (uint i = 0; USAGE_BIG[i] != NULL; i++) log_info (USAGE_BIG[i], progname);
4248 }
4249
4250 char *get_exec_path ()
4251 {
4252 int exec_path_len = 1024;
4253
4254 char *exec_path = (char *) mymalloc (exec_path_len);
4255
4256 #ifdef LINUX
4257
4258 char tmp[32] = { 0 };
4259
4260 snprintf (tmp, sizeof (tmp) - 1, "/proc/%d/exe", getpid ());
4261
4262 const int len = readlink (tmp, exec_path, exec_path_len - 1);
4263
4264 #elif WIN
4265
4266 const int len = GetModuleFileName (NULL, exec_path, exec_path_len - 1);
4267
4268 #elif OSX
4269
4270 uint size = exec_path_len;
4271
4272 if (_NSGetExecutablePath (exec_path, &size) != 0)
4273 {
4274 log_error("! executable path buffer too small\n");
4275
4276 exit (-1);
4277 }
4278
4279 const int len = strlen (exec_path);
4280
4281 #else
4282 #error Your Operating System is not supported or detected
4283 #endif
4284
4285 exec_path[len] = 0;
4286
4287 return exec_path;
4288 }
4289
4290 char *get_install_dir (const char *progname)
4291 {
4292 char *install_dir = mystrdup (progname);
4293 char *last_slash = NULL;
4294
4295 if ((last_slash = strrchr (install_dir, '/')) != NULL)
4296 {
4297 *last_slash = 0;
4298 }
4299 else if ((last_slash = strrchr (install_dir, '\\')) != NULL)
4300 {
4301 *last_slash = 0;
4302 }
4303 else
4304 {
4305 install_dir[0] = '.';
4306 install_dir[1] = 0;
4307 }
4308
4309 return (install_dir);
4310 }
4311
4312 char *get_profile_dir (const char *homedir)
4313 {
4314 #define DOT_HASHCAT ".hashcat"
4315
4316 size_t len = strlen (homedir) + 1 + strlen (DOT_HASHCAT) + 1;
4317
4318 char *profile_dir = (char *) mymalloc (len + 1);
4319
4320 snprintf (profile_dir, len, "%s/%s", homedir, DOT_HASHCAT);
4321
4322 return profile_dir;
4323 }
4324
4325 char *get_session_dir (const char *profile_dir)
4326 {
4327 #define SESSIONS_FOLDER "sessions"
4328
4329 size_t len = strlen (profile_dir) + 1 + strlen (SESSIONS_FOLDER) + 1;
4330
4331 char *session_dir = (char *) mymalloc (len + 1);
4332
4333 snprintf (session_dir, len, "%s/%s", profile_dir, SESSIONS_FOLDER);
4334
4335 return session_dir;
4336 }
4337
4338 uint count_lines (FILE *fd)
4339 {
4340 uint cnt = 0;
4341
4342 char *buf = (char *) mymalloc (HCBUFSIZ + 1);
4343
4344 char prev = '\n';
4345
4346 while (!feof (fd))
4347 {
4348 size_t nread = fread (buf, sizeof (char), HCBUFSIZ, fd);
4349
4350 if (nread < 1) continue;
4351
4352 size_t i;
4353
4354 for (i = 0; i < nread; i++)
4355 {
4356 if (prev == '\n') cnt++;
4357
4358 prev = buf[i];
4359 }
4360 }
4361
4362 myfree (buf);
4363
4364 return cnt;
4365 }
4366
4367 void truecrypt_crc32 (const char *filename, u8 keytab[64])
4368 {
4369 uint crc = ~0;
4370
4371 FILE *fd = fopen (filename, "rb");
4372
4373 if (fd == NULL)
4374 {
4375 log_error ("%s: %s", filename, strerror (errno));
4376
4377 exit (-1);
4378 }
4379
4380 #define MAX_KEY_SIZE (1024 * 1024)
4381
4382 u8 *buf = (u8 *) mymalloc (MAX_KEY_SIZE + 1);
4383
4384 int nread = fread (buf, sizeof (u8), MAX_KEY_SIZE, fd);
4385
4386 fclose (fd);
4387
4388 int kpos = 0;
4389
4390 for (int fpos = 0; fpos < nread; fpos++)
4391 {
4392 crc = crc32tab[(crc ^ buf[fpos]) & 0xff] ^ (crc >> 8);
4393
4394 keytab[kpos++] += (crc >> 24) & 0xff;
4395 keytab[kpos++] += (crc >> 16) & 0xff;
4396 keytab[kpos++] += (crc >> 8) & 0xff;
4397 keytab[kpos++] += (crc >> 0) & 0xff;
4398
4399 if (kpos >= 64) kpos = 0;
4400 }
4401
4402 myfree (buf);
4403 }
4404
4405 #ifdef OSX
4406 int pthread_setaffinity_np (pthread_t thread, size_t cpu_size, cpu_set_t *cpu_set)
4407 {
4408 int core;
4409
4410 for (core = 0; core < (8 * (int)cpu_size); core++)
4411 if (CPU_ISSET(core, cpu_set)) break;
4412
4413 thread_affinity_policy_data_t policy = { core };
4414
4415 const int rc = thread_policy_set (pthread_mach_thread_np (thread), THREAD_AFFINITY_POLICY, (thread_policy_t) &policy, 1);
4416
4417 if (data.quiet == 0)
4418 {
4419 if (rc != KERN_SUCCESS)
4420 {
4421 log_error ("ERROR: %s : %d", "thread_policy_set()", rc);
4422 }
4423 }
4424
4425 return rc;
4426 }
4427 #endif
4428
4429 void set_cpu_affinity (char *cpu_affinity)
4430 {
4431 #ifdef WIN
4432 DWORD_PTR aff_mask = 0;
4433 #elif _POSIX
4434 cpu_set_t cpuset;
4435 CPU_ZERO (&cpuset);
4436 #endif
4437
4438 if (cpu_affinity)
4439 {
4440 char *devices = strdup (cpu_affinity);
4441
4442 char *next = strtok (devices, ",");
4443
4444 do
4445 {
4446 uint cpu_id = atoi (next);
4447
4448 if (cpu_id == 0)
4449 {
4450 #ifdef WIN
4451 aff_mask = 0;
4452 #elif _POSIX
4453 CPU_ZERO (&cpuset);
4454 #endif
4455
4456 break;
4457 }
4458
4459 if (cpu_id > 32)
4460 {
4461 log_error ("ERROR: invalid cpu_id %u specified", cpu_id);
4462
4463 exit (-1);
4464 }
4465
4466 #ifdef WIN
4467 aff_mask |= 1 << (cpu_id - 1);
4468 #elif _POSIX
4469 CPU_SET ((cpu_id - 1), &cpuset);
4470 #endif
4471
4472 } while ((next = strtok (NULL, ",")) != NULL);
4473
4474 free (devices);
4475 }
4476
4477 #ifdef WIN
4478 SetProcessAffinityMask (GetCurrentProcess (), aff_mask);
4479 SetThreadAffinityMask (GetCurrentThread (), aff_mask);
4480 #elif _POSIX
4481 pthread_t thread = pthread_self ();
4482 pthread_setaffinity_np (thread, sizeof (cpu_set_t), &cpuset);
4483 #endif
4484 }
4485
4486 void *rulefind (const void *key, void *base, int nmemb, size_t size, int (*compar) (const void *, const void *))
4487 {
4488 char *element, *end;
4489
4490 end = (char *) base + nmemb * size;
4491
4492 for (element = (char *) base; element < end; element += size)
4493 if (!compar (element, key))
4494 return element;
4495
4496 return NULL;
4497 }
4498
4499 int sort_by_u32 (const void *v1, const void *v2)
4500 {
4501 const u32 *s1 = (const u32 *) v1;
4502 const u32 *s2 = (const u32 *) v2;
4503
4504 return *s1 - *s2;
4505 }
4506
4507 int sort_by_salt (const void *v1, const void *v2)
4508 {
4509 const salt_t *s1 = (const salt_t *) v1;
4510 const salt_t *s2 = (const salt_t *) v2;
4511
4512 const int res1 = s1->salt_len - s2->salt_len;
4513
4514 if (res1 != 0) return (res1);
4515
4516 const int res2 = s1->salt_iter - s2->salt_iter;
4517
4518 if (res2 != 0) return (res2);
4519
4520 uint n;
4521
4522 n = 16;
4523
4524 while (n--)
4525 {
4526 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4527 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4528 }
4529
4530 n = 8;
4531
4532 while (n--)
4533 {
4534 if (s1->salt_buf_pc[n] > s2->salt_buf_pc[n]) return ( 1);
4535 if (s1->salt_buf_pc[n] < s2->salt_buf_pc[n]) return (-1);
4536 }
4537
4538 return (0);
4539 }
4540
4541 int sort_by_salt_buf (const void *v1, const void *v2)
4542 {
4543 const pot_t *p1 = (const pot_t *) v1;
4544 const pot_t *p2 = (const pot_t *) v2;
4545
4546 const hash_t *h1 = &p1->hash;
4547 const hash_t *h2 = &p2->hash;
4548
4549 const salt_t *s1 = h1->salt;
4550 const salt_t *s2 = h2->salt;
4551
4552 uint n = 16;
4553
4554 while (n--)
4555 {
4556 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4557 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4558 }
4559
4560 return 0;
4561 }
4562
4563 int sort_by_hash_t_salt (const void *v1, const void *v2)
4564 {
4565 const hash_t *h1 = (const hash_t *) v1;
4566 const hash_t *h2 = (const hash_t *) v2;
4567
4568 const salt_t *s1 = h1->salt;
4569 const salt_t *s2 = h2->salt;
4570
4571 // testphase: this should work
4572 uint n = 16;
4573
4574 while (n--)
4575 {
4576 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4577 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4578 }
4579
4580 /* original code, seems buggy since salt_len can be very big (had a case with 131 len)
4581 also it thinks salt_buf[x] is a char but its a uint so salt_len should be / 4
4582 if (s1->salt_len > s2->salt_len) return ( 1);
4583 if (s1->salt_len < s2->salt_len) return (-1);
4584
4585 uint n = s1->salt_len;
4586
4587 while (n--)
4588 {
4589 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4590 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4591 }
4592 */
4593
4594 return 0;
4595 }
4596
4597 int sort_by_hash_t_salt_hccap (const void *v1, const void *v2)
4598 {
4599 const hash_t *h1 = (const hash_t *) v1;
4600 const hash_t *h2 = (const hash_t *) v2;
4601
4602 const salt_t *s1 = h1->salt;
4603 const salt_t *s2 = h2->salt;
4604
4605 // 16 - 2 (since last 2 uints contain the digest)
4606 uint n = 14;
4607
4608 while (n--)
4609 {
4610 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4611 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4612 }
4613
4614 return 0;
4615 }
4616
4617 int sort_by_hash_no_salt (const void *v1, const void *v2)
4618 {
4619 const hash_t *h1 = (const hash_t *) v1;
4620 const hash_t *h2 = (const hash_t *) v2;
4621
4622 const void *d1 = h1->digest;
4623 const void *d2 = h2->digest;
4624
4625 return data.sort_by_digest (d1, d2);
4626 }
4627
4628 int sort_by_hash (const void *v1, const void *v2)
4629 {
4630 const hash_t *h1 = (const hash_t *) v1;
4631 const hash_t *h2 = (const hash_t *) v2;
4632
4633 if (data.isSalted)
4634 {
4635 const salt_t *s1 = h1->salt;
4636 const salt_t *s2 = h2->salt;
4637
4638 int res = sort_by_salt (s1, s2);
4639
4640 if (res != 0) return (res);
4641 }
4642
4643 const void *d1 = h1->digest;
4644 const void *d2 = h2->digest;
4645
4646 return data.sort_by_digest (d1, d2);
4647 }
4648
4649 int sort_by_pot (const void *v1, const void *v2)
4650 {
4651 const pot_t *p1 = (const pot_t *) v1;
4652 const pot_t *p2 = (const pot_t *) v2;
4653
4654 const hash_t *h1 = &p1->hash;
4655 const hash_t *h2 = &p2->hash;
4656
4657 return sort_by_hash (h1, h2);
4658 }
4659
4660 int sort_by_mtime (const void *p1, const void *p2)
4661 {
4662 const char **f1 = (const char **) p1;
4663 const char **f2 = (const char **) p2;
4664
4665 struct stat s1; stat (*f1, &s1);
4666 struct stat s2; stat (*f2, &s2);
4667
4668 return s2.st_mtime - s1.st_mtime;
4669 }
4670
4671 int sort_by_cpu_rule (const void *p1, const void *p2)
4672 {
4673 const cpu_rule_t *r1 = (const cpu_rule_t *) p1;
4674 const cpu_rule_t *r2 = (const cpu_rule_t *) p2;
4675
4676 return memcmp (r1, r2, sizeof (cpu_rule_t));
4677 }
4678
4679 int sort_by_kernel_rule (const void *p1, const void *p2)
4680 {
4681 const kernel_rule_t *r1 = (const kernel_rule_t *) p1;
4682 const kernel_rule_t *r2 = (const kernel_rule_t *) p2;
4683
4684 return memcmp (r1, r2, sizeof (kernel_rule_t));
4685 }
4686
4687 int sort_by_stringptr (const void *p1, const void *p2)
4688 {
4689 const char **s1 = (const char **) p1;
4690 const char **s2 = (const char **) p2;
4691
4692 return strcmp (*s1, *s2);
4693 }
4694
4695 int sort_by_dictstat (const void *s1, const void *s2)
4696 {
4697 dictstat_t *d1 = (dictstat_t *) s1;
4698 dictstat_t *d2 = (dictstat_t *) s2;
4699
4700 #ifdef LINUX
4701 d2->stat.st_atim = d1->stat.st_atim;
4702 #else
4703 d2->stat.st_atime = d1->stat.st_atime;
4704 #endif
4705
4706 return memcmp (&d1->stat, &d2->stat, sizeof (struct stat));
4707 }
4708
4709 int sort_by_bitmap (const void *p1, const void *p2)
4710 {
4711 const bitmap_result_t *b1 = (const bitmap_result_t *) p1;
4712 const bitmap_result_t *b2 = (const bitmap_result_t *) p2;
4713
4714 return b1->collisions - b2->collisions;
4715 }
4716
4717 int sort_by_digest_4_2 (const void *v1, const void *v2)
4718 {
4719 const u32 *d1 = (const u32 *) v1;
4720 const u32 *d2 = (const u32 *) v2;
4721
4722 uint n = 2;
4723
4724 while (n--)
4725 {
4726 if (d1[n] > d2[n]) return ( 1);
4727 if (d1[n] < d2[n]) return (-1);
4728 }
4729
4730 return (0);
4731 }
4732
4733 int sort_by_digest_4_4 (const void *v1, const void *v2)
4734 {
4735 const u32 *d1 = (const u32 *) v1;
4736 const u32 *d2 = (const u32 *) v2;
4737
4738 uint n = 4;
4739
4740 while (n--)
4741 {
4742 if (d1[n] > d2[n]) return ( 1);
4743 if (d1[n] < d2[n]) return (-1);
4744 }
4745
4746 return (0);
4747 }
4748
4749 int sort_by_digest_4_5 (const void *v1, const void *v2)
4750 {
4751 const u32 *d1 = (const u32 *) v1;
4752 const u32 *d2 = (const u32 *) v2;
4753
4754 uint n = 5;
4755
4756 while (n--)
4757 {
4758 if (d1[n] > d2[n]) return ( 1);
4759 if (d1[n] < d2[n]) return (-1);
4760 }
4761
4762 return (0);
4763 }
4764
4765 int sort_by_digest_4_6 (const void *v1, const void *v2)
4766 {
4767 const u32 *d1 = (const u32 *) v1;
4768 const u32 *d2 = (const u32 *) v2;
4769
4770 uint n = 6;
4771
4772 while (n--)
4773 {
4774 if (d1[n] > d2[n]) return ( 1);
4775 if (d1[n] < d2[n]) return (-1);
4776 }
4777
4778 return (0);
4779 }
4780
4781 int sort_by_digest_4_8 (const void *v1, const void *v2)
4782 {
4783 const u32 *d1 = (const u32 *) v1;
4784 const u32 *d2 = (const u32 *) v2;
4785
4786 uint n = 8;
4787
4788 while (n--)
4789 {
4790 if (d1[n] > d2[n]) return ( 1);
4791 if (d1[n] < d2[n]) return (-1);
4792 }
4793
4794 return (0);
4795 }
4796
4797 int sort_by_digest_4_16 (const void *v1, const void *v2)
4798 {
4799 const u32 *d1 = (const u32 *) v1;
4800 const u32 *d2 = (const u32 *) v2;
4801
4802 uint n = 16;
4803
4804 while (n--)
4805 {
4806 if (d1[n] > d2[n]) return ( 1);
4807 if (d1[n] < d2[n]) return (-1);
4808 }
4809
4810 return (0);
4811 }
4812
4813 int sort_by_digest_4_32 (const void *v1, const void *v2)
4814 {
4815 const u32 *d1 = (const u32 *) v1;
4816 const u32 *d2 = (const u32 *) v2;
4817
4818 uint n = 32;
4819
4820 while (n--)
4821 {
4822 if (d1[n] > d2[n]) return ( 1);
4823 if (d1[n] < d2[n]) return (-1);
4824 }
4825
4826 return (0);
4827 }
4828
4829 int sort_by_digest_4_64 (const void *v1, const void *v2)
4830 {
4831 const u32 *d1 = (const u32 *) v1;
4832 const u32 *d2 = (const u32 *) v2;
4833
4834 uint n = 64;
4835
4836 while (n--)
4837 {
4838 if (d1[n] > d2[n]) return ( 1);
4839 if (d1[n] < d2[n]) return (-1);
4840 }
4841
4842 return (0);
4843 }
4844
4845 int sort_by_digest_8_8 (const void *v1, const void *v2)
4846 {
4847 const u64 *d1 = (const u64 *) v1;
4848 const u64 *d2 = (const u64 *) v2;
4849
4850 uint n = 8;
4851
4852 while (n--)
4853 {
4854 if (d1[n] > d2[n]) return ( 1);
4855 if (d1[n] < d2[n]) return (-1);
4856 }
4857
4858 return (0);
4859 }
4860
4861 int sort_by_digest_8_16 (const void *v1, const void *v2)
4862 {
4863 const u64 *d1 = (const u64 *) v1;
4864 const u64 *d2 = (const u64 *) v2;
4865
4866 uint n = 16;
4867
4868 while (n--)
4869 {
4870 if (d1[n] > d2[n]) return ( 1);
4871 if (d1[n] < d2[n]) return (-1);
4872 }
4873
4874 return (0);
4875 }
4876
4877 int sort_by_digest_8_25 (const void *v1, const void *v2)
4878 {
4879 const u64 *d1 = (const u64 *) v1;
4880 const u64 *d2 = (const u64 *) v2;
4881
4882 uint n = 25;
4883
4884 while (n--)
4885 {
4886 if (d1[n] > d2[n]) return ( 1);
4887 if (d1[n] < d2[n]) return (-1);
4888 }
4889
4890 return (0);
4891 }
4892
4893 int sort_by_digest_p0p1 (const void *v1, const void *v2)
4894 {
4895 const u32 *d1 = (const u32 *) v1;
4896 const u32 *d2 = (const u32 *) v2;
4897
4898 const uint dgst_pos0 = data.dgst_pos0;
4899 const uint dgst_pos1 = data.dgst_pos1;
4900 const uint dgst_pos2 = data.dgst_pos2;
4901 const uint dgst_pos3 = data.dgst_pos3;
4902
4903 if (d1[dgst_pos3] > d2[dgst_pos3]) return ( 1);
4904 if (d1[dgst_pos3] < d2[dgst_pos3]) return (-1);
4905 if (d1[dgst_pos2] > d2[dgst_pos2]) return ( 1);
4906 if (d1[dgst_pos2] < d2[dgst_pos2]) return (-1);
4907 if (d1[dgst_pos1] > d2[dgst_pos1]) return ( 1);
4908 if (d1[dgst_pos1] < d2[dgst_pos1]) return (-1);
4909 if (d1[dgst_pos0] > d2[dgst_pos0]) return ( 1);
4910 if (d1[dgst_pos0] < d2[dgst_pos0]) return (-1);
4911
4912 return (0);
4913 }
4914
4915 int sort_by_tuning_db_alias (const void *v1, const void *v2)
4916 {
4917 const tuning_db_alias_t *t1 = (const tuning_db_alias_t *) v1;
4918 const tuning_db_alias_t *t2 = (const tuning_db_alias_t *) v2;
4919
4920 const int res1 = strcmp (t1->device_name, t2->device_name);
4921
4922 if (res1 != 0) return (res1);
4923
4924 return 0;
4925 }
4926
4927 int sort_by_tuning_db_entry (const void *v1, const void *v2)
4928 {
4929 const tuning_db_entry_t *t1 = (const tuning_db_entry_t *) v1;
4930 const tuning_db_entry_t *t2 = (const tuning_db_entry_t *) v2;
4931
4932 const int res1 = strcmp (t1->device_name, t2->device_name);
4933
4934 if (res1 != 0) return (res1);
4935
4936 const int res2 = t1->attack_mode
4937 - t2->attack_mode;
4938
4939 if (res2 != 0) return (res2);
4940
4941 const int res3 = t1->hash_type
4942 - t2->hash_type;
4943
4944 if (res3 != 0) return (res3);
4945
4946 return 0;
4947 }
4948
4949 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)
4950 {
4951 uint outfile_autohex = data.outfile_autohex;
4952
4953 unsigned char *rule_ptr = (unsigned char *) rule_buf;
4954
4955 FILE *debug_fp = NULL;
4956
4957 if (debug_file != NULL)
4958 {
4959 debug_fp = fopen (debug_file, "ab");
4960
4961 lock_file (debug_fp);
4962 }
4963 else
4964 {
4965 debug_fp = stderr;
4966 }
4967
4968 if (debug_fp == NULL)
4969 {
4970 log_info ("WARNING: Could not open debug-file for writing");
4971 }
4972 else
4973 {
4974 if ((debug_mode == 2) || (debug_mode == 3) || (debug_mode == 4))
4975 {
4976 format_plain (debug_fp, orig_plain_ptr, orig_plain_len, outfile_autohex);
4977
4978 if ((debug_mode == 3) || (debug_mode == 4)) fputc (':', debug_fp);
4979 }
4980
4981 fwrite (rule_ptr, rule_len, 1, debug_fp);
4982
4983 if (debug_mode == 4)
4984 {
4985 fputc (':', debug_fp);
4986
4987 format_plain (debug_fp, mod_plain_ptr, mod_plain_len, outfile_autohex);
4988 }
4989
4990 fputc ('\n', debug_fp);
4991
4992 if (debug_file != NULL) fclose (debug_fp);
4993 }
4994 }
4995
4996 void format_plain (FILE *fp, unsigned char *plain_ptr, uint plain_len, uint outfile_autohex)
4997 {
4998 int needs_hexify = 0;
4999
5000 if (outfile_autohex == 1)
5001 {
5002 for (uint i = 0; i < plain_len; i++)
5003 {
5004 if (plain_ptr[i] < 0x20)
5005 {
5006 needs_hexify = 1;
5007
5008 break;
5009 }
5010
5011 if (plain_ptr[i] > 0x7f)
5012 {
5013 needs_hexify = 1;
5014
5015 break;
5016 }
5017 }
5018 }
5019
5020 if (needs_hexify == 1)
5021 {
5022 fprintf (fp, "$HEX[");
5023
5024 for (uint i = 0; i < plain_len; i++)
5025 {
5026 fprintf (fp, "%02x", plain_ptr[i]);
5027 }
5028
5029 fprintf (fp, "]");
5030 }
5031 else
5032 {
5033 fwrite (plain_ptr, plain_len, 1, fp);
5034 }
5035 }
5036
5037 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)
5038 {
5039 uint outfile_format = data.outfile_format;
5040
5041 char separator = data.separator;
5042
5043 if (outfile_format & OUTFILE_FMT_HASH)
5044 {
5045 fprintf (out_fp, "%s", out_buf);
5046
5047 if (outfile_format & (OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
5048 {
5049 fputc (separator, out_fp);
5050 }
5051 }
5052 else if (data.username)
5053 {
5054 if (username != NULL)
5055 {
5056 for (uint i = 0; i < user_len; i++)
5057 {
5058 fprintf (out_fp, "%c", username[i]);
5059 }
5060
5061 if (outfile_format & (OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
5062 {
5063 fputc (separator, out_fp);
5064 }
5065 }
5066 }
5067
5068 if (outfile_format & OUTFILE_FMT_PLAIN)
5069 {
5070 format_plain (out_fp, plain_ptr, plain_len, data.outfile_autohex);
5071
5072 if (outfile_format & (OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
5073 {
5074 fputc (separator, out_fp);
5075 }
5076 }
5077
5078 if (outfile_format & OUTFILE_FMT_HEXPLAIN)
5079 {
5080 for (uint i = 0; i < plain_len; i++)
5081 {
5082 fprintf (out_fp, "%02x", plain_ptr[i]);
5083 }
5084
5085 if (outfile_format & (OUTFILE_FMT_CRACKPOS))
5086 {
5087 fputc (separator, out_fp);
5088 }
5089 }
5090
5091 if (outfile_format & OUTFILE_FMT_CRACKPOS)
5092 {
5093 #ifdef _WIN
5094 __mingw_fprintf (out_fp, "%llu", crackpos);
5095 #endif
5096
5097 #ifdef _POSIX
5098 #ifdef __x86_64__
5099 fprintf (out_fp, "%lu", (unsigned long) crackpos);
5100 #else
5101 fprintf (out_fp, "%llu", crackpos);
5102 #endif
5103 #endif
5104 }
5105
5106 fputc ('\n', out_fp);
5107 }
5108
5109 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)
5110 {
5111 pot_t pot_key;
5112
5113 pot_key.hash.salt = hashes_buf->salt;
5114 pot_key.hash.digest = hashes_buf->digest;
5115
5116 pot_t *pot_ptr = (pot_t *) bsearch (&pot_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5117
5118 if (pot_ptr)
5119 {
5120 log_info_nn ("");
5121
5122 input_buf[input_len] = 0;
5123
5124 // user
5125 unsigned char *username = NULL;
5126 uint user_len = 0;
5127
5128 if (data.username)
5129 {
5130 user_t *user = hashes_buf->hash_info->user;
5131
5132 if (user)
5133 {
5134 username = (unsigned char *) (user->user_name);
5135
5136 user_len = user->user_len;
5137 }
5138 }
5139
5140 // do output the line
5141 format_output (out_fp, input_buf, (unsigned char *) pot_ptr->plain_buf, pot_ptr->plain_len, 0, username, user_len);
5142 }
5143 }
5144
5145 #define LM_WEAK_HASH "\x4e\xcf\x0d\x0c\x0a\xe2\xfb\xc1"
5146 #define LM_MASKED_PLAIN "[notfound]"
5147
5148 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)
5149 {
5150 // left
5151
5152 pot_t pot_left_key;
5153
5154 pot_left_key.hash.salt = hash_left->salt;
5155 pot_left_key.hash.digest = hash_left->digest;
5156
5157 pot_t *pot_left_ptr = (pot_t *) bsearch (&pot_left_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5158
5159 // right
5160
5161 uint weak_hash_found = 0;
5162
5163 pot_t pot_right_key;
5164
5165 pot_right_key.hash.salt = hash_right->salt;
5166 pot_right_key.hash.digest = hash_right->digest;
5167
5168 pot_t *pot_right_ptr = (pot_t *) bsearch (&pot_right_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5169
5170 if (pot_right_ptr == NULL)
5171 {
5172 // special case, if "weak hash"
5173
5174 if (memcmp (hash_right->digest, LM_WEAK_HASH, 8) == 0)
5175 {
5176 weak_hash_found = 1;
5177
5178 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5179
5180 // in theory this is not needed, but we are paranoia:
5181
5182 memset (pot_right_ptr->plain_buf, 0, sizeof (pot_right_ptr->plain_buf));
5183 pot_right_ptr->plain_len = 0;
5184 }
5185 }
5186
5187 if ((pot_left_ptr == NULL) && (pot_right_ptr == NULL))
5188 {
5189 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
5190
5191 return;
5192 }
5193
5194 // at least one half was found:
5195
5196 log_info_nn ("");
5197
5198 input_buf[input_len] = 0;
5199
5200 // user
5201
5202 unsigned char *username = NULL;
5203 uint user_len = 0;
5204
5205 if (data.username)
5206 {
5207 user_t *user = hash_left->hash_info->user;
5208
5209 if (user)
5210 {
5211 username = (unsigned char *) (user->user_name);
5212
5213 user_len = user->user_len;
5214 }
5215 }
5216
5217 // mask the part which was not found
5218
5219 uint left_part_masked = 0;
5220 uint right_part_masked = 0;
5221
5222 uint mask_plain_len = strlen (LM_MASKED_PLAIN);
5223
5224 if (pot_left_ptr == NULL)
5225 {
5226 left_part_masked = 1;
5227
5228 pot_left_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5229
5230 memset (pot_left_ptr->plain_buf, 0, sizeof (pot_left_ptr->plain_buf));
5231
5232 memcpy (pot_left_ptr->plain_buf, LM_MASKED_PLAIN, mask_plain_len);
5233 pot_left_ptr->plain_len = mask_plain_len;
5234 }
5235
5236 if (pot_right_ptr == NULL)
5237 {
5238 right_part_masked = 1;
5239
5240 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5241
5242 memset (pot_right_ptr->plain_buf, 0, sizeof (pot_right_ptr->plain_buf));
5243
5244 memcpy (pot_right_ptr->plain_buf, LM_MASKED_PLAIN, mask_plain_len);
5245 pot_right_ptr->plain_len = mask_plain_len;
5246 }
5247
5248 // create the pot_ptr out of pot_left_ptr and pot_right_ptr
5249
5250 pot_t pot_ptr;
5251
5252 pot_ptr.plain_len = pot_left_ptr->plain_len + pot_right_ptr->plain_len;
5253
5254 memcpy (pot_ptr.plain_buf, pot_left_ptr->plain_buf, pot_left_ptr->plain_len);
5255
5256 memcpy (pot_ptr.plain_buf + pot_left_ptr->plain_len, pot_right_ptr->plain_buf, pot_right_ptr->plain_len);
5257
5258 // do output the line
5259
5260 format_output (out_fp, input_buf, (unsigned char *) pot_ptr.plain_buf, pot_ptr.plain_len, 0, username, user_len);
5261
5262 if (weak_hash_found == 1) myfree (pot_right_ptr);
5263
5264 if (left_part_masked == 1) myfree (pot_left_ptr);
5265 if (right_part_masked == 1) myfree (pot_right_ptr);
5266 }
5267
5268 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)
5269 {
5270 pot_t pot_key;
5271
5272 memcpy (&pot_key.hash, hashes_buf, sizeof (hash_t));
5273
5274 pot_t *pot_ptr = (pot_t *) bsearch (&pot_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5275
5276 if (pot_ptr == NULL)
5277 {
5278 log_info_nn ("");
5279
5280 input_buf[input_len] = 0;
5281
5282 format_output (out_fp, input_buf, NULL, 0, 0, NULL, 0);
5283 }
5284 }
5285
5286 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)
5287 {
5288 // left
5289
5290 pot_t pot_left_key;
5291
5292 memcpy (&pot_left_key.hash, hash_left, sizeof (hash_t));
5293
5294 pot_t *pot_left_ptr = (pot_t *) bsearch (&pot_left_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5295
5296 // right
5297
5298 pot_t pot_right_key;
5299
5300 memcpy (&pot_right_key.hash, hash_right, sizeof (hash_t));
5301
5302 pot_t *pot_right_ptr = (pot_t *) bsearch (&pot_right_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5303
5304 uint weak_hash_found = 0;
5305
5306 if (pot_right_ptr == NULL)
5307 {
5308 // special case, if "weak hash"
5309
5310 if (memcmp (hash_right->digest, LM_WEAK_HASH, 8) == 0)
5311 {
5312 weak_hash_found = 1;
5313
5314 // we just need that pot_right_ptr is not a NULL pointer
5315
5316 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5317 }
5318 }
5319
5320 if ((pot_left_ptr != NULL) && (pot_right_ptr != NULL))
5321 {
5322 if (weak_hash_found == 1) myfree (pot_right_ptr);
5323
5324 return;
5325 }
5326
5327 // ... at least one part was not cracked
5328
5329 log_info_nn ("");
5330
5331 input_buf[input_len] = 0;
5332
5333 // only show the hash part which is still not cracked
5334
5335 uint user_len = input_len - 32;
5336
5337 char *hash_output = (char *) mymalloc (33);
5338
5339 memcpy (hash_output, input_buf, input_len);
5340
5341 if (pot_left_ptr != NULL)
5342 {
5343 // only show right part (because left part was already found)
5344
5345 memcpy (hash_output + user_len, input_buf + user_len + 16, 16);
5346
5347 hash_output[user_len + 16] = 0;
5348 }
5349
5350 if (pot_right_ptr != NULL)
5351 {
5352 // only show left part (because right part was already found)
5353
5354 memcpy (hash_output + user_len, input_buf + user_len, 16);
5355
5356 hash_output[user_len + 16] = 0;
5357 }
5358
5359 format_output (out_fp, hash_output, NULL, 0, 0, NULL, 0);
5360
5361 myfree (hash_output);
5362
5363 if (weak_hash_found == 1) myfree (pot_right_ptr);
5364 }
5365
5366 uint setup_opencl_platforms_filter (char *opencl_platforms)
5367 {
5368 uint opencl_platforms_filter = 0;
5369
5370 if (opencl_platforms)
5371 {
5372 char *platforms = strdup (opencl_platforms);
5373
5374 char *next = strtok (platforms, ",");
5375
5376 do
5377 {
5378 int platform = atoi (next);
5379
5380 if (platform < 1 || platform > 32)
5381 {
5382 log_error ("ERROR: invalid OpenCL platform %u specified", platform);
5383
5384 exit (-1);
5385 }
5386
5387 opencl_platforms_filter |= 1 << (platform - 1);
5388
5389 } while ((next = strtok (NULL, ",")) != NULL);
5390
5391 free (platforms);
5392 }
5393 else
5394 {
5395 opencl_platforms_filter = -1;
5396 }
5397
5398 return opencl_platforms_filter;
5399 }
5400
5401 u32 setup_devices_filter (char *opencl_devices)
5402 {
5403 u32 devices_filter = 0;
5404
5405 if (opencl_devices)
5406 {
5407 char *devices = strdup (opencl_devices);
5408
5409 char *next = strtok (devices, ",");
5410
5411 do
5412 {
5413 int device_id = atoi (next);
5414
5415 if (device_id < 1 || device_id > 32)
5416 {
5417 log_error ("ERROR: invalid device_id %u specified", device_id);
5418
5419 exit (-1);
5420 }
5421
5422 devices_filter |= 1 << (device_id - 1);
5423
5424 } while ((next = strtok (NULL, ",")) != NULL);
5425
5426 free (devices);
5427 }
5428 else
5429 {
5430 devices_filter = -1;
5431 }
5432
5433 return devices_filter;
5434 }
5435
5436 cl_device_type setup_device_types_filter (char *opencl_device_types)
5437 {
5438 cl_device_type device_types_filter = 0;
5439
5440 if (opencl_device_types)
5441 {
5442 char *device_types = strdup (opencl_device_types);
5443
5444 char *next = strtok (device_types, ",");
5445
5446 do
5447 {
5448 int device_type = atoi (next);
5449
5450 if (device_type < 1 || device_type > 3)
5451 {
5452 log_error ("ERROR: invalid device_type %u specified", device_type);
5453
5454 exit (-1);
5455 }
5456
5457 device_types_filter |= 1 << device_type;
5458
5459 } while ((next = strtok (NULL, ",")) != NULL);
5460
5461 free (device_types);
5462 }
5463 else
5464 {
5465 // Do not use CPU by default, this often reduces GPU performance because
5466 // the CPU is too busy to handle GPU synchronization
5467
5468 device_types_filter = CL_DEVICE_TYPE_ALL & ~CL_DEVICE_TYPE_CPU;
5469 }
5470
5471 return device_types_filter;
5472 }
5473
5474 u32 get_random_num (const u32 min, const u32 max)
5475 {
5476 if (min == max) return (min);
5477
5478 return ((rand () % (max - min)) + min);
5479 }
5480
5481 u32 mydivc32 (const u32 dividend, const u32 divisor)
5482 {
5483 u32 quotient = dividend / divisor;
5484
5485 if (dividend % divisor) quotient++;
5486
5487 return quotient;
5488 }
5489
5490 u64 mydivc64 (const u64 dividend, const u64 divisor)
5491 {
5492 u64 quotient = dividend / divisor;
5493
5494 if (dividend % divisor) quotient++;
5495
5496 return quotient;
5497 }
5498
5499 void format_timer_display (struct tm *tm, char *buf, size_t len)
5500 {
5501 const char *time_entities_s[] = { "year", "day", "hour", "min", "sec" };
5502 const char *time_entities_m[] = { "years", "days", "hours", "mins", "secs" };
5503
5504 if (tm->tm_year - 70)
5505 {
5506 char *time_entity1 = ((tm->tm_year - 70) == 1) ? (char *) time_entities_s[0] : (char *) time_entities_m[0];
5507 char *time_entity2 = ( tm->tm_yday == 1) ? (char *) time_entities_s[1] : (char *) time_entities_m[1];
5508
5509 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_year - 70, time_entity1, tm->tm_yday, time_entity2);
5510 }
5511 else if (tm->tm_yday)
5512 {
5513 char *time_entity1 = (tm->tm_yday == 1) ? (char *) time_entities_s[1] : (char *) time_entities_m[1];
5514 char *time_entity2 = (tm->tm_hour == 1) ? (char *) time_entities_s[2] : (char *) time_entities_m[2];
5515
5516 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_yday, time_entity1, tm->tm_hour, time_entity2);
5517 }
5518 else if (tm->tm_hour)
5519 {
5520 char *time_entity1 = (tm->tm_hour == 1) ? (char *) time_entities_s[2] : (char *) time_entities_m[2];
5521 char *time_entity2 = (tm->tm_min == 1) ? (char *) time_entities_s[3] : (char *) time_entities_m[3];
5522
5523 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_hour, time_entity1, tm->tm_min, time_entity2);
5524 }
5525 else if (tm->tm_min)
5526 {
5527 char *time_entity1 = (tm->tm_min == 1) ? (char *) time_entities_s[3] : (char *) time_entities_m[3];
5528 char *time_entity2 = (tm->tm_sec == 1) ? (char *) time_entities_s[4] : (char *) time_entities_m[4];
5529
5530 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_min, time_entity1, tm->tm_sec, time_entity2);
5531 }
5532 else
5533 {
5534 char *time_entity1 = (tm->tm_sec == 1) ? (char *) time_entities_s[4] : (char *) time_entities_m[4];
5535
5536 snprintf (buf, len - 1, "%d %s", tm->tm_sec, time_entity1);
5537 }
5538 }
5539
5540 void format_speed_display (float val, char *buf, size_t len)
5541 {
5542 if (val <= 0)
5543 {
5544 buf[0] = '0';
5545 buf[1] = ' ';
5546 buf[2] = 0;
5547
5548 return;
5549 }
5550
5551 char units[7] = { ' ', 'k', 'M', 'G', 'T', 'P', 'E' };
5552
5553 uint level = 0;
5554
5555 while (val > 99999)
5556 {
5557 val /= 1000;
5558
5559 level++;
5560 }
5561
5562 /* generate output */
5563
5564 if (level == 0)
5565 {
5566 snprintf (buf, len - 1, "%.0f ", val);
5567 }
5568 else
5569 {
5570 snprintf (buf, len - 1, "%.1f %c", val, units[level]);
5571 }
5572 }
5573
5574 void lowercase (u8 *buf, int len)
5575 {
5576 for (int i = 0; i < len; i++) buf[i] = tolower (buf[i]);
5577 }
5578
5579 void uppercase (u8 *buf, int len)
5580 {
5581 for (int i = 0; i < len; i++) buf[i] = toupper (buf[i]);
5582 }
5583
5584 int fgetl (FILE *fp, char *line_buf)
5585 {
5586 int line_len = 0;
5587
5588 while (!feof (fp))
5589 {
5590 const int c = fgetc (fp);
5591
5592 if (c == EOF) break;
5593
5594 line_buf[line_len] = (char) c;
5595
5596 line_len++;
5597
5598 if (line_len == HCBUFSIZ) line_len--;
5599
5600 if (c == '\n') break;
5601 }
5602
5603 if (line_len == 0) return 0;
5604
5605 if (line_buf[line_len - 1] == '\n')
5606 {
5607 line_len--;
5608
5609 line_buf[line_len] = 0;
5610 }
5611
5612 if (line_len == 0) return 0;
5613
5614 if (line_buf[line_len - 1] == '\r')
5615 {
5616 line_len--;
5617
5618 line_buf[line_len] = 0;
5619 }
5620
5621 return (line_len);
5622 }
5623
5624 int in_superchop (char *buf)
5625 {
5626 int len = strlen (buf);
5627
5628 while (len)
5629 {
5630 if (buf[len - 1] == '\n')
5631 {
5632 len--;
5633
5634 continue;
5635 }
5636
5637 if (buf[len - 1] == '\r')
5638 {
5639 len--;
5640
5641 continue;
5642 }
5643
5644 break;
5645 }
5646
5647 buf[len] = 0;
5648
5649 return len;
5650 }
5651
5652 char **scan_directory (const char *path)
5653 {
5654 char *tmp_path = mystrdup (path);
5655
5656 size_t tmp_path_len = strlen (tmp_path);
5657
5658 while (tmp_path[tmp_path_len - 1] == '/' || tmp_path[tmp_path_len - 1] == '\\')
5659 {
5660 tmp_path[tmp_path_len - 1] = 0;
5661
5662 tmp_path_len = strlen (tmp_path);
5663 }
5664
5665 char **files = NULL;
5666
5667 int num_files = 0;
5668
5669 DIR *d = NULL;
5670
5671 if ((d = opendir (tmp_path)) != NULL)
5672 {
5673 #ifdef OSX
5674 struct dirent e;
5675
5676 for (;;) {
5677 memset (&e, 0, sizeof (e));
5678 struct dirent *de = NULL;
5679
5680 if (readdir_r (d, &e, &de) != 0)
5681 {
5682 log_error ("ERROR: readdir_r() failed");
5683
5684 break;
5685 }
5686
5687 if (de == NULL) break;
5688 #else
5689 struct dirent *de;
5690
5691 while ((de = readdir (d)) != NULL)
5692 {
5693 #endif
5694 if ((strcmp (de->d_name, ".") == 0) || (strcmp (de->d_name, "..") == 0)) continue;
5695
5696 int path_size = strlen (tmp_path) + 1 + strlen (de->d_name);
5697
5698 char *path_file = (char *) mymalloc (path_size + 1);
5699
5700 snprintf (path_file, path_size + 1, "%s/%s", tmp_path, de->d_name);
5701
5702 path_file[path_size] = 0;
5703
5704 DIR *d_test;
5705
5706 if ((d_test = opendir (path_file)) != NULL)
5707 {
5708 closedir (d_test);
5709
5710 myfree (path_file);
5711 }
5712 else
5713 {
5714 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5715
5716 num_files++;
5717
5718 files[num_files - 1] = path_file;
5719 }
5720 }
5721
5722 closedir (d);
5723 }
5724 else if (errno == ENOTDIR)
5725 {
5726 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5727
5728 num_files++;
5729
5730 files[num_files - 1] = mystrdup (path);
5731 }
5732
5733 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5734
5735 num_files++;
5736
5737 files[num_files - 1] = NULL;
5738
5739 myfree (tmp_path);
5740
5741 return (files);
5742 }
5743
5744 int count_dictionaries (char **dictionary_files)
5745 {
5746 if (dictionary_files == NULL) return 0;
5747
5748 int cnt = 0;
5749
5750 for (int d = 0; dictionary_files[d] != NULL; d++)
5751 {
5752 cnt++;
5753 }
5754
5755 return (cnt);
5756 }
5757
5758 char *stroptitype (const uint opti_type)
5759 {
5760 switch (opti_type)
5761 {
5762 case OPTI_TYPE_ZERO_BYTE: return ((char *) OPTI_STR_ZERO_BYTE); break;
5763 case OPTI_TYPE_PRECOMPUTE_INIT: return ((char *) OPTI_STR_PRECOMPUTE_INIT); break;
5764 case OPTI_TYPE_PRECOMPUTE_MERKLE: return ((char *) OPTI_STR_PRECOMPUTE_MERKLE); break;
5765 case OPTI_TYPE_PRECOMPUTE_PERMUT: return ((char *) OPTI_STR_PRECOMPUTE_PERMUT); break;
5766 case OPTI_TYPE_MEET_IN_MIDDLE: return ((char *) OPTI_STR_MEET_IN_MIDDLE); break;
5767 case OPTI_TYPE_EARLY_SKIP: return ((char *) OPTI_STR_EARLY_SKIP); break;
5768 case OPTI_TYPE_NOT_SALTED: return ((char *) OPTI_STR_NOT_SALTED); break;
5769 case OPTI_TYPE_NOT_ITERATED: return ((char *) OPTI_STR_NOT_ITERATED); break;
5770 case OPTI_TYPE_PREPENDED_SALT: return ((char *) OPTI_STR_PREPENDED_SALT); break;
5771 case OPTI_TYPE_APPENDED_SALT: return ((char *) OPTI_STR_APPENDED_SALT); break;
5772 case OPTI_TYPE_SINGLE_HASH: return ((char *) OPTI_STR_SINGLE_HASH); break;
5773 case OPTI_TYPE_SINGLE_SALT: return ((char *) OPTI_STR_SINGLE_SALT); break;
5774 case OPTI_TYPE_BRUTE_FORCE: return ((char *) OPTI_STR_BRUTE_FORCE); break;
5775 case OPTI_TYPE_RAW_HASH: return ((char *) OPTI_STR_RAW_HASH); break;
5776 case OPTI_TYPE_SLOW_HASH_SIMD: return ((char *) OPTI_STR_SLOW_HASH_SIMD); break;
5777 case OPTI_TYPE_USES_BITS_8: return ((char *) OPTI_STR_USES_BITS_8); break;
5778 case OPTI_TYPE_USES_BITS_16: return ((char *) OPTI_STR_USES_BITS_16); break;
5779 case OPTI_TYPE_USES_BITS_32: return ((char *) OPTI_STR_USES_BITS_32); break;
5780 case OPTI_TYPE_USES_BITS_64: return ((char *) OPTI_STR_USES_BITS_64); break;
5781 }
5782
5783 return (NULL);
5784 }
5785
5786 char *strparser (const uint parser_status)
5787 {
5788 switch (parser_status)
5789 {
5790 case PARSER_OK: return ((char *) PA_000); break;
5791 case PARSER_COMMENT: return ((char *) PA_001); break;
5792 case PARSER_GLOBAL_ZERO: return ((char *) PA_002); break;
5793 case PARSER_GLOBAL_LENGTH: return ((char *) PA_003); break;
5794 case PARSER_HASH_LENGTH: return ((char *) PA_004); break;
5795 case PARSER_HASH_VALUE: return ((char *) PA_005); break;
5796 case PARSER_SALT_LENGTH: return ((char *) PA_006); break;
5797 case PARSER_SALT_VALUE: return ((char *) PA_007); break;
5798 case PARSER_SALT_ITERATION: return ((char *) PA_008); break;
5799 case PARSER_SEPARATOR_UNMATCHED: return ((char *) PA_009); break;
5800 case PARSER_SIGNATURE_UNMATCHED: return ((char *) PA_010); break;
5801 case PARSER_HCCAP_FILE_SIZE: return ((char *) PA_011); break;
5802 case PARSER_HCCAP_EAPOL_SIZE: return ((char *) PA_012); break;
5803 case PARSER_PSAFE2_FILE_SIZE: return ((char *) PA_013); break;
5804 case PARSER_PSAFE3_FILE_SIZE: return ((char *) PA_014); break;
5805 case PARSER_TC_FILE_SIZE: return ((char *) PA_015); break;
5806 case PARSER_SIP_AUTH_DIRECTIVE: return ((char *) PA_016); break;
5807 }
5808
5809 return ((char *) PA_255);
5810 }
5811
5812 char *strhashtype (const uint hash_mode)
5813 {
5814 switch (hash_mode)
5815 {
5816 case 0: return ((char *) HT_00000); break;
5817 case 10: return ((char *) HT_00010); break;
5818 case 11: return ((char *) HT_00011); break;
5819 case 12: return ((char *) HT_00012); break;
5820 case 20: return ((char *) HT_00020); break;
5821 case 21: return ((char *) HT_00021); break;
5822 case 22: return ((char *) HT_00022); break;
5823 case 23: return ((char *) HT_00023); break;
5824 case 30: return ((char *) HT_00030); break;
5825 case 40: return ((char *) HT_00040); break;
5826 case 50: return ((char *) HT_00050); break;
5827 case 60: return ((char *) HT_00060); break;
5828 case 100: return ((char *) HT_00100); break;
5829 case 101: return ((char *) HT_00101); break;
5830 case 110: return ((char *) HT_00110); break;
5831 case 111: return ((char *) HT_00111); break;
5832 case 112: return ((char *) HT_00112); break;
5833 case 120: return ((char *) HT_00120); break;
5834 case 121: return ((char *) HT_00121); break;
5835 case 122: return ((char *) HT_00122); break;
5836 case 124: return ((char *) HT_00124); break;
5837 case 125: return ((char *) HT_00125); break;
5838 case 130: return ((char *) HT_00130); break;
5839 case 131: return ((char *) HT_00131); break;
5840 case 132: return ((char *) HT_00132); break;
5841 case 133: return ((char *) HT_00133); break;
5842 case 140: return ((char *) HT_00140); break;
5843 case 141: return ((char *) HT_00141); break;
5844 case 150: return ((char *) HT_00150); break;
5845 case 160: return ((char *) HT_00160); break;
5846 case 190: return ((char *) HT_00190); break;
5847 case 200: return ((char *) HT_00200); break;
5848 case 300: return ((char *) HT_00300); break;
5849 case 400: return ((char *) HT_00400); break;
5850 case 500: return ((char *) HT_00500); break;
5851 case 501: return ((char *) HT_00501); break;
5852 case 900: return ((char *) HT_00900); break;
5853 case 910: return ((char *) HT_00910); break;
5854 case 1000: return ((char *) HT_01000); break;
5855 case 1100: return ((char *) HT_01100); break;
5856 case 1400: return ((char *) HT_01400); break;
5857 case 1410: return ((char *) HT_01410); break;
5858 case 1420: return ((char *) HT_01420); break;
5859 case 1421: return ((char *) HT_01421); break;
5860 case 1430: return ((char *) HT_01430); break;
5861 case 1440: return ((char *) HT_01440); break;
5862 case 1441: return ((char *) HT_01441); break;
5863 case 1450: return ((char *) HT_01450); break;
5864 case 1460: return ((char *) HT_01460); break;
5865 case 1500: return ((char *) HT_01500); break;
5866 case 1600: return ((char *) HT_01600); break;
5867 case 1700: return ((char *) HT_01700); break;
5868 case 1710: return ((char *) HT_01710); break;
5869 case 1711: return ((char *) HT_01711); break;
5870 case 1720: return ((char *) HT_01720); break;
5871 case 1722: return ((char *) HT_01722); break;
5872 case 1730: return ((char *) HT_01730); break;
5873 case 1731: return ((char *) HT_01731); break;
5874 case 1740: return ((char *) HT_01740); break;
5875 case 1750: return ((char *) HT_01750); break;
5876 case 1760: return ((char *) HT_01760); break;
5877 case 1800: return ((char *) HT_01800); break;
5878 case 2100: return ((char *) HT_02100); break;
5879 case 2400: return ((char *) HT_02400); break;
5880 case 2410: return ((char *) HT_02410); break;
5881 case 2500: return ((char *) HT_02500); break;
5882 case 2600: return ((char *) HT_02600); break;
5883 case 2611: return ((char *) HT_02611); break;
5884 case 2612: return ((char *) HT_02612); break;
5885 case 2711: return ((char *) HT_02711); break;
5886 case 2811: return ((char *) HT_02811); break;
5887 case 3000: return ((char *) HT_03000); break;
5888 case 3100: return ((char *) HT_03100); break;
5889 case 3200: return ((char *) HT_03200); break;
5890 case 3710: return ((char *) HT_03710); break;
5891 case 3711: return ((char *) HT_03711); break;
5892 case 3800: return ((char *) HT_03800); break;
5893 case 4300: return ((char *) HT_04300); break;
5894 case 4400: return ((char *) HT_04400); break;
5895 case 4500: return ((char *) HT_04500); break;
5896 case 4700: return ((char *) HT_04700); break;
5897 case 4800: return ((char *) HT_04800); break;
5898 case 4900: return ((char *) HT_04900); break;
5899 case 5000: return ((char *) HT_05000); break;
5900 case 5100: return ((char *) HT_05100); break;
5901 case 5200: return ((char *) HT_05200); break;
5902 case 5300: return ((char *) HT_05300); break;
5903 case 5400: return ((char *) HT_05400); break;
5904 case 5500: return ((char *) HT_05500); break;
5905 case 5600: return ((char *) HT_05600); break;
5906 case 5700: return ((char *) HT_05700); break;
5907 case 5800: return ((char *) HT_05800); break;
5908 case 6000: return ((char *) HT_06000); break;
5909 case 6100: return ((char *) HT_06100); break;
5910 case 6211: return ((char *) HT_06211); break;
5911 case 6212: return ((char *) HT_06212); break;
5912 case 6213: return ((char *) HT_06213); break;
5913 case 6221: return ((char *) HT_06221); break;
5914 case 6222: return ((char *) HT_06222); break;
5915 case 6223: return ((char *) HT_06223); break;
5916 case 6231: return ((char *) HT_06231); break;
5917 case 6232: return ((char *) HT_06232); break;
5918 case 6233: return ((char *) HT_06233); break;
5919 case 6241: return ((char *) HT_06241); break;
5920 case 6242: return ((char *) HT_06242); break;
5921 case 6243: return ((char *) HT_06243); break;
5922 case 6300: return ((char *) HT_06300); break;
5923 case 6400: return ((char *) HT_06400); break;
5924 case 6500: return ((char *) HT_06500); break;
5925 case 6600: return ((char *) HT_06600); break;
5926 case 6700: return ((char *) HT_06700); break;
5927 case 6800: return ((char *) HT_06800); break;
5928 case 6900: return ((char *) HT_06900); break;
5929 case 7100: return ((char *) HT_07100); break;
5930 case 7200: return ((char *) HT_07200); break;
5931 case 7300: return ((char *) HT_07300); break;
5932 case 7400: return ((char *) HT_07400); break;
5933 case 7500: return ((char *) HT_07500); break;
5934 case 7600: return ((char *) HT_07600); break;
5935 case 7700: return ((char *) HT_07700); break;
5936 case 7800: return ((char *) HT_07800); break;
5937 case 7900: return ((char *) HT_07900); break;
5938 case 8000: return ((char *) HT_08000); break;
5939 case 8100: return ((char *) HT_08100); break;
5940 case 8200: return ((char *) HT_08200); break;
5941 case 8300: return ((char *) HT_08300); break;
5942 case 8400: return ((char *) HT_08400); break;
5943 case 8500: return ((char *) HT_08500); break;
5944 case 8600: return ((char *) HT_08600); break;
5945 case 8700: return ((char *) HT_08700); break;
5946 case 8800: return ((char *) HT_08800); break;
5947 case 8900: return ((char *) HT_08900); break;
5948 case 9000: return ((char *) HT_09000); break;
5949 case 9100: return ((char *) HT_09100); break;
5950 case 9200: return ((char *) HT_09200); break;
5951 case 9300: return ((char *) HT_09300); break;
5952 case 9400: return ((char *) HT_09400); break;
5953 case 9500: return ((char *) HT_09500); break;
5954 case 9600: return ((char *) HT_09600); break;
5955 case 9700: return ((char *) HT_09700); break;
5956 case 9710: return ((char *) HT_09710); break;
5957 case 9720: return ((char *) HT_09720); break;
5958 case 9800: return ((char *) HT_09800); break;
5959 case 9810: return ((char *) HT_09810); break;
5960 case 9820: return ((char *) HT_09820); break;
5961 case 9900: return ((char *) HT_09900); break;
5962 case 10000: return ((char *) HT_10000); break;
5963 case 10100: return ((char *) HT_10100); break;
5964 case 10200: return ((char *) HT_10200); break;
5965 case 10300: return ((char *) HT_10300); break;
5966 case 10400: return ((char *) HT_10400); break;
5967 case 10410: return ((char *) HT_10410); break;
5968 case 10420: return ((char *) HT_10420); break;
5969 case 10500: return ((char *) HT_10500); break;
5970 case 10600: return ((char *) HT_10600); break;
5971 case 10700: return ((char *) HT_10700); break;
5972 case 10800: return ((char *) HT_10800); break;
5973 case 10900: return ((char *) HT_10900); break;
5974 case 11000: return ((char *) HT_11000); break;
5975 case 11100: return ((char *) HT_11100); break;
5976 case 11200: return ((char *) HT_11200); break;
5977 case 11300: return ((char *) HT_11300); break;
5978 case 11400: return ((char *) HT_11400); break;
5979 case 11500: return ((char *) HT_11500); break;
5980 case 11600: return ((char *) HT_11600); break;
5981 case 11700: return ((char *) HT_11700); break;
5982 case 11800: return ((char *) HT_11800); break;
5983 case 11900: return ((char *) HT_11900); break;
5984 case 12000: return ((char *) HT_12000); break;
5985 case 12100: return ((char *) HT_12100); break;
5986 case 12200: return ((char *) HT_12200); break;
5987 case 12300: return ((char *) HT_12300); break;
5988 case 12400: return ((char *) HT_12400); break;
5989 case 12500: return ((char *) HT_12500); break;
5990 case 12600: return ((char *) HT_12600); break;
5991 case 12700: return ((char *) HT_12700); break;
5992 case 12800: return ((char *) HT_12800); break;
5993 case 12900: return ((char *) HT_12900); break;
5994 case 13000: return ((char *) HT_13000); break;
5995 case 13100: return ((char *) HT_13100); break;
5996 case 13200: return ((char *) HT_13200); break;
5997 case 13300: return ((char *) HT_13300); break;
5998 case 13400: return ((char *) HT_13400); break;
5999 case 13500: return ((char *) HT_13500); break;
6000 case 13600: return ((char *) HT_13600); break;
6001 case 13711: return ((char *) HT_13711); break;
6002 case 13712: return ((char *) HT_13712); break;
6003 case 13713: return ((char *) HT_13713); break;
6004 case 13721: return ((char *) HT_13721); break;
6005 case 13722: return ((char *) HT_13722); break;
6006 case 13723: return ((char *) HT_13723); break;
6007 case 13731: return ((char *) HT_13731); break;
6008 case 13732: return ((char *) HT_13732); break;
6009 case 13733: return ((char *) HT_13733); break;
6010 case 13741: return ((char *) HT_13741); break;
6011 case 13742: return ((char *) HT_13742); break;
6012 case 13743: return ((char *) HT_13743); break;
6013 case 13751: return ((char *) HT_13751); break;
6014 case 13752: return ((char *) HT_13752); break;
6015 case 13753: return ((char *) HT_13753); break;
6016 case 13761: return ((char *) HT_13761); break;
6017 case 13762: return ((char *) HT_13762); break;
6018 case 13763: return ((char *) HT_13763); break;
6019 }
6020
6021 return ((char *) "Unknown");
6022 }
6023
6024 char *strstatus (const uint devices_status)
6025 {
6026 switch (devices_status)
6027 {
6028 case STATUS_INIT: return ((char *) ST_0000); break;
6029 case STATUS_STARTING: return ((char *) ST_0001); break;
6030 case STATUS_RUNNING: return ((char *) ST_0002); break;
6031 case STATUS_PAUSED: return ((char *) ST_0003); break;
6032 case STATUS_EXHAUSTED: return ((char *) ST_0004); break;
6033 case STATUS_CRACKED: return ((char *) ST_0005); break;
6034 case STATUS_ABORTED: return ((char *) ST_0006); break;
6035 case STATUS_QUIT: return ((char *) ST_0007); break;
6036 case STATUS_BYPASS: return ((char *) ST_0008); break;
6037 case STATUS_STOP_AT_CHECKPOINT: return ((char *) ST_0009); break;
6038 case STATUS_AUTOTUNE: return ((char *) ST_0010); break;
6039 }
6040
6041 return ((char *) "Unknown");
6042 }
6043
6044 void ascii_digest (char *out_buf, uint salt_pos, uint digest_pos)
6045 {
6046 uint hash_type = data.hash_type;
6047 uint hash_mode = data.hash_mode;
6048 uint salt_type = data.salt_type;
6049 uint opts_type = data.opts_type;
6050 uint opti_type = data.opti_type;
6051 uint dgst_size = data.dgst_size;
6052
6053 char *hashfile = data.hashfile;
6054
6055 uint len = 4096;
6056
6057 uint digest_buf[64] = { 0 };
6058
6059 u64 *digest_buf64 = (u64 *) digest_buf;
6060
6061 char *digests_buf_ptr = (char *) data.digests_buf;
6062
6063 memcpy (digest_buf, digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size), dgst_size);
6064
6065 if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT)
6066 {
6067 uint tt;
6068
6069 switch (hash_type)
6070 {
6071 case HASH_TYPE_DESCRYPT:
6072 FP (digest_buf[1], digest_buf[0], tt);
6073 break;
6074
6075 case HASH_TYPE_DESRACF:
6076 digest_buf[0] = rotl32 (digest_buf[0], 29);
6077 digest_buf[1] = rotl32 (digest_buf[1], 29);
6078
6079 FP (digest_buf[1], digest_buf[0], tt);
6080 break;
6081
6082 case HASH_TYPE_LM:
6083 FP (digest_buf[1], digest_buf[0], tt);
6084 break;
6085
6086 case HASH_TYPE_NETNTLM:
6087 digest_buf[0] = rotl32 (digest_buf[0], 29);
6088 digest_buf[1] = rotl32 (digest_buf[1], 29);
6089 digest_buf[2] = rotl32 (digest_buf[2], 29);
6090 digest_buf[3] = rotl32 (digest_buf[3], 29);
6091
6092 FP (digest_buf[1], digest_buf[0], tt);
6093 FP (digest_buf[3], digest_buf[2], tt);
6094 break;
6095
6096 case HASH_TYPE_BSDICRYPT:
6097 digest_buf[0] = rotl32 (digest_buf[0], 31);
6098 digest_buf[1] = rotl32 (digest_buf[1], 31);
6099
6100 FP (digest_buf[1], digest_buf[0], tt);
6101 break;
6102 }
6103 }
6104
6105 if (opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE)
6106 {
6107 switch (hash_type)
6108 {
6109 case HASH_TYPE_MD4:
6110 digest_buf[0] += MD4M_A;
6111 digest_buf[1] += MD4M_B;
6112 digest_buf[2] += MD4M_C;
6113 digest_buf[3] += MD4M_D;
6114 break;
6115
6116 case HASH_TYPE_MD5:
6117 digest_buf[0] += MD5M_A;
6118 digest_buf[1] += MD5M_B;
6119 digest_buf[2] += MD5M_C;
6120 digest_buf[3] += MD5M_D;
6121 break;
6122
6123 case HASH_TYPE_SHA1:
6124 digest_buf[0] += SHA1M_A;
6125 digest_buf[1] += SHA1M_B;
6126 digest_buf[2] += SHA1M_C;
6127 digest_buf[3] += SHA1M_D;
6128 digest_buf[4] += SHA1M_E;
6129 break;
6130
6131 case HASH_TYPE_SHA256:
6132 digest_buf[0] += SHA256M_A;
6133 digest_buf[1] += SHA256M_B;
6134 digest_buf[2] += SHA256M_C;
6135 digest_buf[3] += SHA256M_D;
6136 digest_buf[4] += SHA256M_E;
6137 digest_buf[5] += SHA256M_F;
6138 digest_buf[6] += SHA256M_G;
6139 digest_buf[7] += SHA256M_H;
6140 break;
6141
6142 case HASH_TYPE_SHA384:
6143 digest_buf64[0] += SHA384M_A;
6144 digest_buf64[1] += SHA384M_B;
6145 digest_buf64[2] += SHA384M_C;
6146 digest_buf64[3] += SHA384M_D;
6147 digest_buf64[4] += SHA384M_E;
6148 digest_buf64[5] += SHA384M_F;
6149 digest_buf64[6] += 0;
6150 digest_buf64[7] += 0;
6151 break;
6152
6153 case HASH_TYPE_SHA512:
6154 digest_buf64[0] += SHA512M_A;
6155 digest_buf64[1] += SHA512M_B;
6156 digest_buf64[2] += SHA512M_C;
6157 digest_buf64[3] += SHA512M_D;
6158 digest_buf64[4] += SHA512M_E;
6159 digest_buf64[5] += SHA512M_F;
6160 digest_buf64[6] += SHA512M_G;
6161 digest_buf64[7] += SHA512M_H;
6162 break;
6163 }
6164 }
6165
6166 if (opts_type & OPTS_TYPE_PT_GENERATE_LE)
6167 {
6168 if (dgst_size == DGST_SIZE_4_2)
6169 {
6170 for (int i = 0; i < 2; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6171 }
6172 else if (dgst_size == DGST_SIZE_4_4)
6173 {
6174 for (int i = 0; i < 4; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6175 }
6176 else if (dgst_size == DGST_SIZE_4_5)
6177 {
6178 for (int i = 0; i < 5; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6179 }
6180 else if (dgst_size == DGST_SIZE_4_6)
6181 {
6182 for (int i = 0; i < 6; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6183 }
6184 else if (dgst_size == DGST_SIZE_4_8)
6185 {
6186 for (int i = 0; i < 8; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6187 }
6188 else if ((dgst_size == DGST_SIZE_4_16) || (dgst_size == DGST_SIZE_8_8)) // same size, same result :)
6189 {
6190 if (hash_type == HASH_TYPE_WHIRLPOOL)
6191 {
6192 for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6193 }
6194 else if (hash_type == HASH_TYPE_SHA384)
6195 {
6196 for (int i = 0; i < 8; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
6197 }
6198 else if (hash_type == HASH_TYPE_SHA512)
6199 {
6200 for (int i = 0; i < 8; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
6201 }
6202 else if (hash_type == HASH_TYPE_GOST)
6203 {
6204 for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6205 }
6206 }
6207 else if (dgst_size == DGST_SIZE_4_64)
6208 {
6209 for (int i = 0; i < 64; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6210 }
6211 else if (dgst_size == DGST_SIZE_8_25)
6212 {
6213 for (int i = 0; i < 25; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
6214 }
6215 }
6216
6217 uint isSalted = ((data.salt_type == SALT_TYPE_INTERN)
6218 | (data.salt_type == SALT_TYPE_EXTERN)
6219 | (data.salt_type == SALT_TYPE_EMBEDDED));
6220
6221 salt_t salt;
6222
6223 if (isSalted)
6224 {
6225 memset (&salt, 0, sizeof (salt_t));
6226
6227 memcpy (&salt, &data.salts_buf[salt_pos], sizeof (salt_t));
6228
6229 char *ptr = (char *) salt.salt_buf;
6230
6231 uint len = salt.salt_len;
6232
6233 if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT)
6234 {
6235 uint tt;
6236
6237 switch (hash_type)
6238 {
6239 case HASH_TYPE_NETNTLM:
6240
6241 salt.salt_buf[0] = rotr32 (salt.salt_buf[0], 3);
6242 salt.salt_buf[1] = rotr32 (salt.salt_buf[1], 3);
6243
6244 FP (salt.salt_buf[1], salt.salt_buf[0], tt);
6245
6246 break;
6247 }
6248 }
6249
6250 if (opts_type & OPTS_TYPE_ST_UNICODE)
6251 {
6252 for (uint i = 0, j = 0; i < len; i += 1, j += 2)
6253 {
6254 ptr[i] = ptr[j];
6255 }
6256
6257 len = len / 2;
6258 }
6259
6260 if (opts_type & OPTS_TYPE_ST_GENERATE_LE)
6261 {
6262 uint max = salt.salt_len / 4;
6263
6264 if (len % 4) max++;
6265
6266 for (uint i = 0; i < max; i++)
6267 {
6268 salt.salt_buf[i] = byte_swap_32 (salt.salt_buf[i]);
6269 }
6270 }
6271
6272 if (opts_type & OPTS_TYPE_ST_HEX)
6273 {
6274 char tmp[64] = { 0 };
6275
6276 for (uint i = 0, j = 0; i < len; i += 1, j += 2)
6277 {
6278 sprintf (tmp + j, "%02x", (unsigned char) ptr[i]);
6279 }
6280
6281 len = len * 2;
6282
6283 memcpy (ptr, tmp, len);
6284 }
6285
6286 uint memset_size = ((48 - (int) len) > 0) ? (48 - len) : 0;
6287
6288 memset (ptr + len, 0, memset_size);
6289
6290 salt.salt_len = len;
6291 }
6292
6293 //
6294 // some modes require special encoding
6295 //
6296
6297 uint out_buf_plain[256] = { 0 };
6298 uint out_buf_salt[256] = { 0 };
6299
6300 char tmp_buf[1024] = { 0 };
6301
6302 char *ptr_plain = (char *) out_buf_plain;
6303 char *ptr_salt = (char *) out_buf_salt;
6304
6305 if (hash_mode == 22)
6306 {
6307 char username[30] = { 0 };
6308
6309 memcpy (username, salt.salt_buf, salt.salt_len - 22);
6310
6311 char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' };
6312
6313 u16 *ptr = (u16 *) digest_buf;
6314
6315 tmp_buf[ 0] = sig[0];
6316 tmp_buf[ 1] = int_to_base64 (((ptr[1]) >> 12) & 0x3f);
6317 tmp_buf[ 2] = int_to_base64 (((ptr[1]) >> 6) & 0x3f);
6318 tmp_buf[ 3] = int_to_base64 (((ptr[1]) >> 0) & 0x3f);
6319 tmp_buf[ 4] = int_to_base64 (((ptr[0]) >> 12) & 0x3f);
6320 tmp_buf[ 5] = int_to_base64 (((ptr[0]) >> 6) & 0x3f);
6321 tmp_buf[ 6] = sig[1];
6322 tmp_buf[ 7] = int_to_base64 (((ptr[0]) >> 0) & 0x3f);
6323 tmp_buf[ 8] = int_to_base64 (((ptr[3]) >> 12) & 0x3f);
6324 tmp_buf[ 9] = int_to_base64 (((ptr[3]) >> 6) & 0x3f);
6325 tmp_buf[10] = int_to_base64 (((ptr[3]) >> 0) & 0x3f);
6326 tmp_buf[11] = int_to_base64 (((ptr[2]) >> 12) & 0x3f);
6327 tmp_buf[12] = sig[2];
6328 tmp_buf[13] = int_to_base64 (((ptr[2]) >> 6) & 0x3f);
6329 tmp_buf[14] = int_to_base64 (((ptr[2]) >> 0) & 0x3f);
6330 tmp_buf[15] = int_to_base64 (((ptr[5]) >> 12) & 0x3f);
6331 tmp_buf[16] = int_to_base64 (((ptr[5]) >> 6) & 0x3f);
6332 tmp_buf[17] = sig[3];
6333 tmp_buf[18] = int_to_base64 (((ptr[5]) >> 0) & 0x3f);
6334 tmp_buf[19] = int_to_base64 (((ptr[4]) >> 12) & 0x3f);
6335 tmp_buf[20] = int_to_base64 (((ptr[4]) >> 6) & 0x3f);
6336 tmp_buf[21] = int_to_base64 (((ptr[4]) >> 0) & 0x3f);
6337 tmp_buf[22] = int_to_base64 (((ptr[7]) >> 12) & 0x3f);
6338 tmp_buf[23] = sig[4];
6339 tmp_buf[24] = int_to_base64 (((ptr[7]) >> 6) & 0x3f);
6340 tmp_buf[25] = int_to_base64 (((ptr[7]) >> 0) & 0x3f);
6341 tmp_buf[26] = int_to_base64 (((ptr[6]) >> 12) & 0x3f);
6342 tmp_buf[27] = int_to_base64 (((ptr[6]) >> 6) & 0x3f);
6343 tmp_buf[28] = int_to_base64 (((ptr[6]) >> 0) & 0x3f);
6344 tmp_buf[29] = sig[5];
6345
6346 snprintf (out_buf, len-1, "%s:%s",
6347 tmp_buf,
6348 username);
6349 }
6350 else if (hash_mode == 23)
6351 {
6352 // do not show the skyper part in output
6353
6354 char *salt_buf_ptr = (char *) salt.salt_buf;
6355
6356 salt_buf_ptr[salt.salt_len - 8] = 0;
6357
6358 snprintf (out_buf, len-1, "%08x%08x%08x%08x:%s",
6359 digest_buf[0],
6360 digest_buf[1],
6361 digest_buf[2],
6362 digest_buf[3],
6363 salt_buf_ptr);
6364 }
6365 else if (hash_mode == 101)
6366 {
6367 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6368
6369 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6370 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6371 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6372 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6373 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6374
6375 memcpy (tmp_buf, digest_buf, 20);
6376
6377 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6378
6379 snprintf (out_buf, len-1, "{SHA}%s", ptr_plain);
6380 }
6381 else if (hash_mode == 111)
6382 {
6383 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6384
6385 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6386 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6387 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6388 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6389 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6390
6391 memcpy (tmp_buf, digest_buf, 20);
6392 memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len);
6393
6394 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20 + salt.salt_len, (u8 *) ptr_plain);
6395
6396 snprintf (out_buf, len-1, "{SSHA}%s", ptr_plain);
6397 }
6398 else if ((hash_mode == 122) || (hash_mode == 125))
6399 {
6400 snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x",
6401 (char *) salt.salt_buf,
6402 digest_buf[0],
6403 digest_buf[1],
6404 digest_buf[2],
6405 digest_buf[3],
6406 digest_buf[4]);
6407 }
6408 else if (hash_mode == 124)
6409 {
6410 snprintf (out_buf, len-1, "sha1$%s$%08x%08x%08x%08x%08x",
6411 (char *) salt.salt_buf,
6412 digest_buf[0],
6413 digest_buf[1],
6414 digest_buf[2],
6415 digest_buf[3],
6416 digest_buf[4]);
6417 }
6418 else if (hash_mode == 131)
6419 {
6420 snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6421 (char *) salt.salt_buf,
6422 0, 0, 0, 0, 0,
6423 digest_buf[0],
6424 digest_buf[1],
6425 digest_buf[2],
6426 digest_buf[3],
6427 digest_buf[4]);
6428 }
6429 else if (hash_mode == 132)
6430 {
6431 snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x",
6432 (char *) salt.salt_buf,
6433 digest_buf[0],
6434 digest_buf[1],
6435 digest_buf[2],
6436 digest_buf[3],
6437 digest_buf[4]);
6438 }
6439 else if (hash_mode == 133)
6440 {
6441 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6442
6443 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6444 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6445 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6446 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6447 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6448
6449 memcpy (tmp_buf, digest_buf, 20);
6450
6451 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6452
6453 snprintf (out_buf, len-1, "%s", ptr_plain);
6454 }
6455 else if (hash_mode == 141)
6456 {
6457 memcpy (tmp_buf, salt.salt_buf, salt.salt_len);
6458
6459 base64_encode (int_to_base64, (const u8 *) tmp_buf, salt.salt_len, (u8 *) ptr_salt);
6460
6461 memset (tmp_buf, 0, sizeof (tmp_buf));
6462
6463 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6464
6465 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6466 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6467 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6468 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6469 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6470
6471 memcpy (tmp_buf, digest_buf, 20);
6472
6473 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6474
6475 ptr_plain[27] = 0;
6476
6477 snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER, ptr_salt, ptr_plain);
6478 }
6479 else if (hash_mode == 400)
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
6488 phpass_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6489
6490 snprintf (out_buf, len-1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, (char *) ptr_plain);
6491 }
6492 else if (hash_mode == 500)
6493 {
6494 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6495
6496 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6497 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6498 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6499 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6500
6501 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6502
6503 if (salt.salt_iter == ROUNDS_MD5CRYPT)
6504 {
6505 snprintf (out_buf, len-1, "$1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6506 }
6507 else
6508 {
6509 snprintf (out_buf, len-1, "$1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6510 }
6511 }
6512 else if (hash_mode == 501)
6513 {
6514 uint digest_idx = salt.digests_offset + digest_pos;
6515
6516 hashinfo_t **hashinfo_ptr = data.hash_info;
6517 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
6518
6519 snprintf (out_buf, len-1, "%s", hash_buf);
6520 }
6521 else if (hash_mode == 1421)
6522 {
6523 u8 *salt_ptr = (u8 *) salt.salt_buf;
6524
6525 snprintf (out_buf, len-1, "%c%c%c%c%c%c%08x%08x%08x%08x%08x%08x%08x%08x",
6526 salt_ptr[0],
6527 salt_ptr[1],
6528 salt_ptr[2],
6529 salt_ptr[3],
6530 salt_ptr[4],
6531 salt_ptr[5],
6532 digest_buf[0],
6533 digest_buf[1],
6534 digest_buf[2],
6535 digest_buf[3],
6536 digest_buf[4],
6537 digest_buf[5],
6538 digest_buf[6],
6539 digest_buf[7]);
6540 }
6541 else if (hash_mode == 1441)
6542 {
6543 memcpy (tmp_buf, salt.salt_buf, salt.salt_len);
6544
6545 base64_encode (int_to_base64, (const u8 *) tmp_buf, salt.salt_len, (u8 *) ptr_salt);
6546
6547 memset (tmp_buf, 0, sizeof (tmp_buf));
6548
6549 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6550
6551 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6552 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6553 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6554 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6555 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6556 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6557 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6558 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6559
6560 memcpy (tmp_buf, digest_buf, 32);
6561
6562 base64_encode (int_to_base64, (const u8 *) tmp_buf, 32, (u8 *) ptr_plain);
6563
6564 ptr_plain[43] = 0;
6565
6566 snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER4, ptr_salt, ptr_plain);
6567 }
6568 else if (hash_mode == 1500)
6569 {
6570 out_buf[0] = salt.salt_sign[0] & 0xff;
6571 out_buf[1] = salt.salt_sign[1] & 0xff;
6572 //original method, but changed because of this ticket: https://hashcat.net/trac/ticket/269
6573 //out_buf[0] = int_to_itoa64 ((salt.salt_buf[0] >> 0) & 0x3f);
6574 //out_buf[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f);
6575
6576 memset (tmp_buf, 0, sizeof (tmp_buf));
6577
6578 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6579
6580 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6581 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6582
6583 memcpy (tmp_buf, digest_buf, 8);
6584
6585 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 8, (u8 *) ptr_plain);
6586
6587 snprintf (out_buf + 2, len-1-2, "%s", ptr_plain);
6588
6589 out_buf[13] = 0;
6590 }
6591 else if (hash_mode == 1600)
6592 {
6593 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6594
6595 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6596 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6597 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6598 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6599
6600 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6601
6602 if (salt.salt_iter == ROUNDS_MD5CRYPT)
6603 {
6604 snprintf (out_buf, len-1, "$apr1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6605 }
6606 else
6607 {
6608 snprintf (out_buf, len-1, "$apr1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6609 }
6610 }
6611 else if (hash_mode == 1711)
6612 {
6613 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6614
6615 digest_buf64[0] = byte_swap_64 (digest_buf64[0]);
6616 digest_buf64[1] = byte_swap_64 (digest_buf64[1]);
6617 digest_buf64[2] = byte_swap_64 (digest_buf64[2]);
6618 digest_buf64[3] = byte_swap_64 (digest_buf64[3]);
6619 digest_buf64[4] = byte_swap_64 (digest_buf64[4]);
6620 digest_buf64[5] = byte_swap_64 (digest_buf64[5]);
6621 digest_buf64[6] = byte_swap_64 (digest_buf64[6]);
6622 digest_buf64[7] = byte_swap_64 (digest_buf64[7]);
6623
6624 memcpy (tmp_buf, digest_buf, 64);
6625 memcpy (tmp_buf + 64, salt.salt_buf, salt.salt_len);
6626
6627 base64_encode (int_to_base64, (const u8 *) tmp_buf, 64 + salt.salt_len, (u8 *) ptr_plain);
6628
6629 snprintf (out_buf, len-1, "%s%s", SIGNATURE_SHA512B64S, ptr_plain);
6630 }
6631 else if (hash_mode == 1722)
6632 {
6633 uint *ptr = digest_buf;
6634
6635 snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6636 (unsigned char *) salt.salt_buf,
6637 ptr[ 1], ptr[ 0],
6638 ptr[ 3], ptr[ 2],
6639 ptr[ 5], ptr[ 4],
6640 ptr[ 7], ptr[ 6],
6641 ptr[ 9], ptr[ 8],
6642 ptr[11], ptr[10],
6643 ptr[13], ptr[12],
6644 ptr[15], ptr[14]);
6645 }
6646 else if (hash_mode == 1731)
6647 {
6648 uint *ptr = digest_buf;
6649
6650 snprintf (out_buf, len-1, "0x0200%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6651 (unsigned char *) salt.salt_buf,
6652 ptr[ 1], ptr[ 0],
6653 ptr[ 3], ptr[ 2],
6654 ptr[ 5], ptr[ 4],
6655 ptr[ 7], ptr[ 6],
6656 ptr[ 9], ptr[ 8],
6657 ptr[11], ptr[10],
6658 ptr[13], ptr[12],
6659 ptr[15], ptr[14]);
6660 }
6661 else if (hash_mode == 1800)
6662 {
6663 // temp workaround
6664
6665 digest_buf64[0] = byte_swap_64 (digest_buf64[0]);
6666 digest_buf64[1] = byte_swap_64 (digest_buf64[1]);
6667 digest_buf64[2] = byte_swap_64 (digest_buf64[2]);
6668 digest_buf64[3] = byte_swap_64 (digest_buf64[3]);
6669 digest_buf64[4] = byte_swap_64 (digest_buf64[4]);
6670 digest_buf64[5] = byte_swap_64 (digest_buf64[5]);
6671 digest_buf64[6] = byte_swap_64 (digest_buf64[6]);
6672 digest_buf64[7] = byte_swap_64 (digest_buf64[7]);
6673
6674 sha512crypt_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
6675
6676 if (salt.salt_iter == ROUNDS_SHA512CRYPT)
6677 {
6678 snprintf (out_buf, len-1, "$6$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6679 }
6680 else
6681 {
6682 snprintf (out_buf, len-1, "$6$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6683 }
6684 }
6685 else if (hash_mode == 2100)
6686 {
6687 uint pos = 0;
6688
6689 snprintf (out_buf + pos, len-1, "%s%i#",
6690 SIGNATURE_DCC2,
6691 salt.salt_iter + 1);
6692
6693 uint signature_len = strlen (out_buf);
6694
6695 pos += signature_len;
6696 len -= signature_len;
6697
6698 char *salt_ptr = (char *) salt.salt_buf;
6699
6700 for (uint i = 0; i < salt.salt_len; i++, pos++, len--) snprintf (out_buf + pos, len-1, "%c", salt_ptr[i]);
6701
6702 snprintf (out_buf + pos, len-1, "#%08x%08x%08x%08x",
6703 byte_swap_32 (digest_buf[0]),
6704 byte_swap_32 (digest_buf[1]),
6705 byte_swap_32 (digest_buf[2]),
6706 byte_swap_32 (digest_buf[3]));
6707 }
6708 else if ((hash_mode == 2400) || (hash_mode == 2410))
6709 {
6710 memcpy (tmp_buf, digest_buf, 16);
6711
6712 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6713
6714 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6715 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6716 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6717 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6718
6719 out_buf[ 0] = int_to_itoa64 ((digest_buf[0] >> 0) & 0x3f);
6720 out_buf[ 1] = int_to_itoa64 ((digest_buf[0] >> 6) & 0x3f);
6721 out_buf[ 2] = int_to_itoa64 ((digest_buf[0] >> 12) & 0x3f);
6722 out_buf[ 3] = int_to_itoa64 ((digest_buf[0] >> 18) & 0x3f);
6723
6724 out_buf[ 4] = int_to_itoa64 ((digest_buf[1] >> 0) & 0x3f);
6725 out_buf[ 5] = int_to_itoa64 ((digest_buf[1] >> 6) & 0x3f);
6726 out_buf[ 6] = int_to_itoa64 ((digest_buf[1] >> 12) & 0x3f);
6727 out_buf[ 7] = int_to_itoa64 ((digest_buf[1] >> 18) & 0x3f);
6728
6729 out_buf[ 8] = int_to_itoa64 ((digest_buf[2] >> 0) & 0x3f);
6730 out_buf[ 9] = int_to_itoa64 ((digest_buf[2] >> 6) & 0x3f);
6731 out_buf[10] = int_to_itoa64 ((digest_buf[2] >> 12) & 0x3f);
6732 out_buf[11] = int_to_itoa64 ((digest_buf[2] >> 18) & 0x3f);
6733
6734 out_buf[12] = int_to_itoa64 ((digest_buf[3] >> 0) & 0x3f);
6735 out_buf[13] = int_to_itoa64 ((digest_buf[3] >> 6) & 0x3f);
6736 out_buf[14] = int_to_itoa64 ((digest_buf[3] >> 12) & 0x3f);
6737 out_buf[15] = int_to_itoa64 ((digest_buf[3] >> 18) & 0x3f);
6738
6739 out_buf[16] = 0;
6740 }
6741 else if (hash_mode == 2500)
6742 {
6743 wpa_t *wpas = (wpa_t *) data.esalts_buf;
6744
6745 wpa_t *wpa = &wpas[salt_pos];
6746
6747 snprintf (out_buf, len-1, "%s:%02x%02x%02x%02x%02x%02x:%02x%02x%02x%02x%02x%02x",
6748 (char *) salt.salt_buf,
6749 wpa->orig_mac1[0],
6750 wpa->orig_mac1[1],
6751 wpa->orig_mac1[2],
6752 wpa->orig_mac1[3],
6753 wpa->orig_mac1[4],
6754 wpa->orig_mac1[5],
6755 wpa->orig_mac2[0],
6756 wpa->orig_mac2[1],
6757 wpa->orig_mac2[2],
6758 wpa->orig_mac2[3],
6759 wpa->orig_mac2[4],
6760 wpa->orig_mac2[5]);
6761 }
6762 else if (hash_mode == 4400)
6763 {
6764 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
6765 byte_swap_32 (digest_buf[0]),
6766 byte_swap_32 (digest_buf[1]),
6767 byte_swap_32 (digest_buf[2]),
6768 byte_swap_32 (digest_buf[3]));
6769 }
6770 else if (hash_mode == 4700)
6771 {
6772 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6773 byte_swap_32 (digest_buf[0]),
6774 byte_swap_32 (digest_buf[1]),
6775 byte_swap_32 (digest_buf[2]),
6776 byte_swap_32 (digest_buf[3]),
6777 byte_swap_32 (digest_buf[4]));
6778 }
6779 else if (hash_mode == 4800)
6780 {
6781 u8 chap_id_byte = (u8) salt.salt_buf[4];
6782
6783 snprintf (out_buf, len-1, "%08x%08x%08x%08x:%08x%08x%08x%08x:%02x",
6784 digest_buf[0],
6785 digest_buf[1],
6786 digest_buf[2],
6787 digest_buf[3],
6788 byte_swap_32 (salt.salt_buf[0]),
6789 byte_swap_32 (salt.salt_buf[1]),
6790 byte_swap_32 (salt.salt_buf[2]),
6791 byte_swap_32 (salt.salt_buf[3]),
6792 chap_id_byte);
6793 }
6794 else if (hash_mode == 4900)
6795 {
6796 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6797 byte_swap_32 (digest_buf[0]),
6798 byte_swap_32 (digest_buf[1]),
6799 byte_swap_32 (digest_buf[2]),
6800 byte_swap_32 (digest_buf[3]),
6801 byte_swap_32 (digest_buf[4]));
6802 }
6803 else if (hash_mode == 5100)
6804 {
6805 snprintf (out_buf, len-1, "%08x%08x",
6806 digest_buf[0],
6807 digest_buf[1]);
6808 }
6809 else if (hash_mode == 5200)
6810 {
6811 snprintf (out_buf, len-1, "%s", hashfile);
6812 }
6813 else if (hash_mode == 5300)
6814 {
6815 ikepsk_t *ikepsks = (ikepsk_t *) data.esalts_buf;
6816
6817 ikepsk_t *ikepsk = &ikepsks[salt_pos];
6818
6819 int buf_len = len -1;
6820
6821 // msg_buf
6822
6823 uint ikepsk_msg_len = ikepsk->msg_len / 4;
6824
6825 for (uint i = 0; i < ikepsk_msg_len; i++)
6826 {
6827 if ((i == 32) || (i == 64) || (i == 66) || (i == 68) || (i == 108))
6828 {
6829 snprintf (out_buf, buf_len, ":");
6830
6831 buf_len--;
6832 out_buf++;
6833 }
6834
6835 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->msg_buf[i]));
6836
6837 buf_len -= 8;
6838 out_buf += 8;
6839 }
6840
6841 // nr_buf
6842
6843 uint ikepsk_nr_len = ikepsk->nr_len / 4;
6844
6845 for (uint i = 0; i < ikepsk_nr_len; i++)
6846 {
6847 if ((i == 0) || (i == 5))
6848 {
6849 snprintf (out_buf, buf_len, ":");
6850
6851 buf_len--;
6852 out_buf++;
6853 }
6854
6855 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->nr_buf[i]));
6856
6857 buf_len -= 8;
6858 out_buf += 8;
6859 }
6860
6861 // digest_buf
6862
6863 for (uint i = 0; i < 4; i++)
6864 {
6865 if (i == 0)
6866 {
6867 snprintf (out_buf, buf_len, ":");
6868
6869 buf_len--;
6870 out_buf++;
6871 }
6872
6873 snprintf (out_buf, buf_len, "%08x", digest_buf[i]);
6874
6875 buf_len -= 8;
6876 out_buf += 8;
6877 }
6878 }
6879 else if (hash_mode == 5400)
6880 {
6881 ikepsk_t *ikepsks = (ikepsk_t *) data.esalts_buf;
6882
6883 ikepsk_t *ikepsk = &ikepsks[salt_pos];
6884
6885 int buf_len = len -1;
6886
6887 // msg_buf
6888
6889 uint ikepsk_msg_len = ikepsk->msg_len / 4;
6890
6891 for (uint i = 0; i < ikepsk_msg_len; i++)
6892 {
6893 if ((i == 32) || (i == 64) || (i == 66) || (i == 68) || (i == 108))
6894 {
6895 snprintf (out_buf, buf_len, ":");
6896
6897 buf_len--;
6898 out_buf++;
6899 }
6900
6901 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->msg_buf[i]));
6902
6903 buf_len -= 8;
6904 out_buf += 8;
6905 }
6906
6907 // nr_buf
6908
6909 uint ikepsk_nr_len = ikepsk->nr_len / 4;
6910
6911 for (uint i = 0; i < ikepsk_nr_len; i++)
6912 {
6913 if ((i == 0) || (i == 5))
6914 {
6915 snprintf (out_buf, buf_len, ":");
6916
6917 buf_len--;
6918 out_buf++;
6919 }
6920
6921 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->nr_buf[i]));
6922
6923 buf_len -= 8;
6924 out_buf += 8;
6925 }
6926
6927 // digest_buf
6928
6929 for (uint i = 0; i < 5; i++)
6930 {
6931 if (i == 0)
6932 {
6933 snprintf (out_buf, buf_len, ":");
6934
6935 buf_len--;
6936 out_buf++;
6937 }
6938
6939 snprintf (out_buf, buf_len, "%08x", digest_buf[i]);
6940
6941 buf_len -= 8;
6942 out_buf += 8;
6943 }
6944 }
6945 else if (hash_mode == 5500)
6946 {
6947 netntlm_t *netntlms = (netntlm_t *) data.esalts_buf;
6948
6949 netntlm_t *netntlm = &netntlms[salt_pos];
6950
6951 char user_buf[64] = { 0 };
6952 char domain_buf[64] = { 0 };
6953 char srvchall_buf[1024] = { 0 };
6954 char clichall_buf[1024] = { 0 };
6955
6956 for (uint i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2)
6957 {
6958 char *ptr = (char *) netntlm->userdomain_buf;
6959
6960 user_buf[i] = ptr[j];
6961 }
6962
6963 for (uint i = 0, j = 0; j < netntlm->domain_len; i += 1, j += 2)
6964 {
6965 char *ptr = (char *) netntlm->userdomain_buf;
6966
6967 domain_buf[i] = ptr[netntlm->user_len + j];
6968 }
6969
6970 for (uint i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2)
6971 {
6972 u8 *ptr = (u8 *) netntlm->chall_buf;
6973
6974 sprintf (srvchall_buf + j, "%02x", ptr[i]);
6975 }
6976
6977 for (uint i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2)
6978 {
6979 u8 *ptr = (u8 *) netntlm->chall_buf;
6980
6981 sprintf (clichall_buf + j, "%02x", ptr[netntlm->srvchall_len + i]);
6982 }
6983
6984 snprintf (out_buf, len-1, "%s::%s:%s:%08x%08x%08x%08x%08x%08x:%s",
6985 user_buf,
6986 domain_buf,
6987 srvchall_buf,
6988 digest_buf[0],
6989 digest_buf[1],
6990 digest_buf[2],
6991 digest_buf[3],
6992 byte_swap_32 (salt.salt_buf_pc[0]),
6993 byte_swap_32 (salt.salt_buf_pc[1]),
6994 clichall_buf);
6995 }
6996 else if (hash_mode == 5600)
6997 {
6998 netntlm_t *netntlms = (netntlm_t *) data.esalts_buf;
6999
7000 netntlm_t *netntlm = &netntlms[salt_pos];
7001
7002 char user_buf[64] = { 0 };
7003 char domain_buf[64] = { 0 };
7004 char srvchall_buf[1024] = { 0 };
7005 char clichall_buf[1024] = { 0 };
7006
7007 for (uint i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2)
7008 {
7009 char *ptr = (char *) netntlm->userdomain_buf;
7010
7011 user_buf[i] = ptr[j];
7012 }
7013
7014 for (uint i = 0, j = 0; j < netntlm->domain_len; i += 1, j += 2)
7015 {
7016 char *ptr = (char *) netntlm->userdomain_buf;
7017
7018 domain_buf[i] = ptr[netntlm->user_len + j];
7019 }
7020
7021 for (uint i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2)
7022 {
7023 u8 *ptr = (u8 *) netntlm->chall_buf;
7024
7025 sprintf (srvchall_buf + j, "%02x", ptr[i]);
7026 }
7027
7028 for (uint i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2)
7029 {
7030 u8 *ptr = (u8 *) netntlm->chall_buf;
7031
7032 sprintf (clichall_buf + j, "%02x", ptr[netntlm->srvchall_len + i]);
7033 }
7034
7035 snprintf (out_buf, len-1, "%s::%s:%s:%08x%08x%08x%08x:%s",
7036 user_buf,
7037 domain_buf,
7038 srvchall_buf,
7039 digest_buf[0],
7040 digest_buf[1],
7041 digest_buf[2],
7042 digest_buf[3],
7043 clichall_buf);
7044 }
7045 else if (hash_mode == 5700)
7046 {
7047 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
7048
7049 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7050 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7051 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7052 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7053 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7054 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7055 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7056 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7057
7058 memcpy (tmp_buf, digest_buf, 32);
7059
7060 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 32, (u8 *) ptr_plain);
7061
7062 ptr_plain[43] = 0;
7063
7064 snprintf (out_buf, len-1, "%s", ptr_plain);
7065 }
7066 else if (hash_mode == 5800)
7067 {
7068 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7069 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7070 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7071 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7072 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7073
7074 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
7075 digest_buf[0],
7076 digest_buf[1],
7077 digest_buf[2],
7078 digest_buf[3],
7079 digest_buf[4]);
7080 }
7081 else if ((hash_mode >= 6200) && (hash_mode <= 6299))
7082 {
7083 snprintf (out_buf, len-1, "%s", hashfile);
7084 }
7085 else if (hash_mode == 6300)
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
7094 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
7095
7096 snprintf (out_buf, len-1, "{smd5}%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
7097 }
7098 else if (hash_mode == 6400)
7099 {
7100 sha256aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
7101
7102 snprintf (out_buf, len-1, "{ssha256}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
7103 }
7104 else if (hash_mode == 6500)
7105 {
7106 sha512aix_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
7107
7108 snprintf (out_buf, len-1, "{ssha512}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
7109 }
7110 else if (hash_mode == 6600)
7111 {
7112 agilekey_t *agilekeys = (agilekey_t *) data.esalts_buf;
7113
7114 agilekey_t *agilekey = &agilekeys[salt_pos];
7115
7116 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
7117 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
7118
7119 uint buf_len = len - 1;
7120
7121 uint off = snprintf (out_buf, buf_len, "%d:%08x%08x:", salt.salt_iter + 1, salt.salt_buf[0], salt.salt_buf[1]);
7122 buf_len -= 22;
7123
7124 for (uint i = 0, j = off; i < 1040; i++, j += 2)
7125 {
7126 snprintf (out_buf + j, buf_len, "%02x", agilekey->cipher[i]);
7127
7128 buf_len -= 2;
7129 }
7130 }
7131 else if (hash_mode == 6700)
7132 {
7133 sha1aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
7134
7135 snprintf (out_buf, len-1, "{ssha1}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
7136 }
7137 else if (hash_mode == 6800)
7138 {
7139 snprintf (out_buf, len-1, "%s", (char *) salt.salt_buf);
7140 }
7141 else if (hash_mode == 7100)
7142 {
7143 uint *ptr = digest_buf;
7144
7145 pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) data.esalts_buf;
7146
7147 pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[salt_pos];
7148
7149 uint esalt[8] = { 0 };
7150
7151 esalt[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]);
7152 esalt[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]);
7153 esalt[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]);
7154 esalt[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]);
7155 esalt[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]);
7156 esalt[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]);
7157 esalt[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]);
7158 esalt[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]);
7159
7160 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",
7161 SIGNATURE_SHA512OSX,
7162 salt.salt_iter + 1,
7163 esalt[ 0], esalt[ 1],
7164 esalt[ 2], esalt[ 3],
7165 esalt[ 4], esalt[ 5],
7166 esalt[ 6], esalt[ 7],
7167 ptr [ 1], ptr [ 0],
7168 ptr [ 3], ptr [ 2],
7169 ptr [ 5], ptr [ 4],
7170 ptr [ 7], ptr [ 6],
7171 ptr [ 9], ptr [ 8],
7172 ptr [11], ptr [10],
7173 ptr [13], ptr [12],
7174 ptr [15], ptr [14]);
7175 }
7176 else if (hash_mode == 7200)
7177 {
7178 uint *ptr = digest_buf;
7179
7180 pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) data.esalts_buf;
7181
7182 pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[salt_pos];
7183
7184 uint len_used = 0;
7185
7186 snprintf (out_buf + len_used, len - len_used - 1, "%s%i.", SIGNATURE_SHA512GRUB, salt.salt_iter + 1);
7187
7188 len_used = strlen (out_buf);
7189
7190 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha512->salt_buf;
7191
7192 for (uint i = 0; i < salt.salt_len; i++, len_used += 2)
7193 {
7194 snprintf (out_buf + len_used, len - len_used - 1, "%02x", salt_buf_ptr[i]);
7195 }
7196
7197 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",
7198 ptr [ 1], ptr [ 0],
7199 ptr [ 3], ptr [ 2],
7200 ptr [ 5], ptr [ 4],
7201 ptr [ 7], ptr [ 6],
7202 ptr [ 9], ptr [ 8],
7203 ptr [11], ptr [10],
7204 ptr [13], ptr [12],
7205 ptr [15], ptr [14]);
7206 }
7207 else if (hash_mode == 7300)
7208 {
7209 rakp_t *rakps = (rakp_t *) data.esalts_buf;
7210
7211 rakp_t *rakp = &rakps[salt_pos];
7212
7213 for (uint i = 0, j = 0; (i * 4) < rakp->salt_len; i += 1, j += 8)
7214 {
7215 sprintf (out_buf + j, "%08x", rakp->salt_buf[i]);
7216 }
7217
7218 snprintf (out_buf + rakp->salt_len * 2, len - 1, ":%08x%08x%08x%08x%08x",
7219 digest_buf[0],
7220 digest_buf[1],
7221 digest_buf[2],
7222 digest_buf[3],
7223 digest_buf[4]);
7224 }
7225 else if (hash_mode == 7400)
7226 {
7227 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
7228
7229 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7230 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7231 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7232 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7233 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7234 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7235 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7236 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7237
7238 sha256crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
7239
7240 if (salt.salt_iter == ROUNDS_SHA256CRYPT)
7241 {
7242 snprintf (out_buf, len-1, "$5$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
7243 }
7244 else
7245 {
7246 snprintf (out_buf, len-1, "$5$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
7247 }
7248 }
7249 else if (hash_mode == 7500)
7250 {
7251 krb5pa_t *krb5pas = (krb5pa_t *) data.esalts_buf;
7252
7253 krb5pa_t *krb5pa = &krb5pas[salt_pos];
7254
7255 u8 *ptr_timestamp = (u8 *) krb5pa->timestamp;
7256 u8 *ptr_checksum = (u8 *) krb5pa->checksum;
7257
7258 char data[128] = { 0 };
7259
7260 char *ptr_data = data;
7261
7262 for (uint i = 0; i < 36; i++, ptr_data += 2)
7263 {
7264 sprintf (ptr_data, "%02x", ptr_timestamp[i]);
7265 }
7266
7267 for (uint i = 0; i < 16; i++, ptr_data += 2)
7268 {
7269 sprintf (ptr_data, "%02x", ptr_checksum[i]);
7270 }
7271
7272 *ptr_data = 0;
7273
7274 snprintf (out_buf, len-1, "%s$%s$%s$%s$%s",
7275 SIGNATURE_KRB5PA,
7276 (char *) krb5pa->user,
7277 (char *) krb5pa->realm,
7278 (char *) krb5pa->salt,
7279 data);
7280 }
7281 else if (hash_mode == 7700)
7282 {
7283 snprintf (out_buf, len-1, "%s$%08X%08X",
7284 (char *) salt.salt_buf,
7285 digest_buf[0],
7286 digest_buf[1]);
7287 }
7288 else if (hash_mode == 7800)
7289 {
7290 snprintf (out_buf, len-1, "%s$%08X%08X%08X%08X%08X",
7291 (char *) salt.salt_buf,
7292 digest_buf[0],
7293 digest_buf[1],
7294 digest_buf[2],
7295 digest_buf[3],
7296 digest_buf[4]);
7297 }
7298 else if (hash_mode == 7900)
7299 {
7300 drupal7_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
7301
7302 // ugly hack start
7303
7304 char *tmp = (char *) salt.salt_buf_pc;
7305
7306 ptr_plain[42] = tmp[0];
7307
7308 // ugly hack end
7309
7310 ptr_plain[43] = 0;
7311
7312 snprintf (out_buf, len-1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, (char *) ptr_plain);
7313 }
7314 else if (hash_mode == 8000)
7315 {
7316 snprintf (out_buf, len-1, "0xc007%s%08x%08x%08x%08x%08x%08x%08x%08x",
7317 (unsigned char *) salt.salt_buf,
7318 digest_buf[0],
7319 digest_buf[1],
7320 digest_buf[2],
7321 digest_buf[3],
7322 digest_buf[4],
7323 digest_buf[5],
7324 digest_buf[6],
7325 digest_buf[7]);
7326 }
7327 else if (hash_mode == 8100)
7328 {
7329 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
7330 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
7331
7332 snprintf (out_buf, len-1, "1%s%08x%08x%08x%08x%08x",
7333 (unsigned char *) salt.salt_buf,
7334 digest_buf[0],
7335 digest_buf[1],
7336 digest_buf[2],
7337 digest_buf[3],
7338 digest_buf[4]);
7339 }
7340 else if (hash_mode == 8200)
7341 {
7342 cloudkey_t *cloudkeys = (cloudkey_t *) data.esalts_buf;
7343
7344 cloudkey_t *cloudkey = &cloudkeys[salt_pos];
7345
7346 char data_buf[4096] = { 0 };
7347
7348 for (int i = 0, j = 0; i < 512; i += 1, j += 8)
7349 {
7350 sprintf (data_buf + j, "%08x", cloudkey->data_buf[i]);
7351 }
7352
7353 data_buf[cloudkey->data_len * 2] = 0;
7354
7355 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7356 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7357 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7358 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7359 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7360 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7361 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7362 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7363
7364 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
7365 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
7366 salt.salt_buf[2] = byte_swap_32 (salt.salt_buf[2]);
7367 salt.salt_buf[3] = byte_swap_32 (salt.salt_buf[3]);
7368
7369 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x:%08x%08x%08x%08x:%u:%s",
7370 digest_buf[0],
7371 digest_buf[1],
7372 digest_buf[2],
7373 digest_buf[3],
7374 digest_buf[4],
7375 digest_buf[5],
7376 digest_buf[6],
7377 digest_buf[7],
7378 salt.salt_buf[0],
7379 salt.salt_buf[1],
7380 salt.salt_buf[2],
7381 salt.salt_buf[3],
7382 salt.salt_iter + 1,
7383 data_buf);
7384 }
7385 else if (hash_mode == 8300)
7386 {
7387 char digest_buf_c[34] = { 0 };
7388
7389 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7390 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7391 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7392 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7393 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7394
7395 base32_encode (int_to_itoa32, (const u8 *) digest_buf, 20, (u8 *) digest_buf_c);
7396
7397 digest_buf_c[32] = 0;
7398
7399 // domain
7400
7401 const uint salt_pc_len = salt.salt_buf_pc[7]; // what a hack
7402
7403 char domain_buf_c[33] = { 0 };
7404
7405 memcpy (domain_buf_c, (char *) salt.salt_buf_pc, salt_pc_len);
7406
7407 for (uint i = 0; i < salt_pc_len; i++)
7408 {
7409 const char next = domain_buf_c[i];
7410
7411 domain_buf_c[i] = '.';
7412
7413 i += next;
7414 }
7415
7416 domain_buf_c[salt_pc_len] = 0;
7417
7418 // final
7419
7420 snprintf (out_buf, len-1, "%s:%s:%s:%u", digest_buf_c, domain_buf_c, (char *) salt.salt_buf, salt.salt_iter);
7421 }
7422 else if (hash_mode == 8500)
7423 {
7424 snprintf (out_buf, len-1, "%s*%s*%08X%08X", SIGNATURE_RACF, (char *) salt.salt_buf, digest_buf[0], digest_buf[1]);
7425 }
7426 else if (hash_mode == 2612)
7427 {
7428 snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x",
7429 SIGNATURE_PHPS,
7430 (char *) salt.salt_buf,
7431 digest_buf[0],
7432 digest_buf[1],
7433 digest_buf[2],
7434 digest_buf[3]);
7435 }
7436 else if (hash_mode == 3711)
7437 {
7438 char *salt_ptr = (char *) salt.salt_buf;
7439
7440 salt_ptr[salt.salt_len - 1] = 0;
7441
7442 snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x",
7443 SIGNATURE_MEDIAWIKI_B,
7444 salt_ptr,
7445 digest_buf[0],
7446 digest_buf[1],
7447 digest_buf[2],
7448 digest_buf[3]);
7449 }
7450 else if (hash_mode == 8800)
7451 {
7452 androidfde_t *androidfdes = (androidfde_t *) data.esalts_buf;
7453
7454 androidfde_t *androidfde = &androidfdes[salt_pos];
7455
7456 char tmp[3073] = { 0 };
7457
7458 for (uint i = 0, j = 0; i < 384; i += 1, j += 8)
7459 {
7460 sprintf (tmp + j, "%08x", androidfde->data[i]);
7461 }
7462
7463 tmp[3072] = 0;
7464
7465 snprintf (out_buf, len-1, "%s16$%08x%08x%08x%08x$16$%08x%08x%08x%08x$%s",
7466 SIGNATURE_ANDROIDFDE,
7467 byte_swap_32 (salt.salt_buf[0]),
7468 byte_swap_32 (salt.salt_buf[1]),
7469 byte_swap_32 (salt.salt_buf[2]),
7470 byte_swap_32 (salt.salt_buf[3]),
7471 byte_swap_32 (digest_buf[0]),
7472 byte_swap_32 (digest_buf[1]),
7473 byte_swap_32 (digest_buf[2]),
7474 byte_swap_32 (digest_buf[3]),
7475 tmp);
7476 }
7477 else if (hash_mode == 8900)
7478 {
7479 uint N = salt.scrypt_N;
7480 uint r = salt.scrypt_r;
7481 uint p = salt.scrypt_p;
7482
7483 char base64_salt[32] = { 0 };
7484
7485 base64_encode (int_to_base64, (const u8 *) salt.salt_buf, salt.salt_len, (u8 *) base64_salt);
7486
7487 memset (tmp_buf, 0, 46);
7488
7489 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7490 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7491 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7492 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7493 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7494 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7495 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7496 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7497 digest_buf[8] = 0; // needed for base64_encode ()
7498
7499 base64_encode (int_to_base64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7500
7501 snprintf (out_buf, len-1, "%s:%i:%i:%i:%s:%s",
7502 SIGNATURE_SCRYPT,
7503 N,
7504 r,
7505 p,
7506 base64_salt,
7507 tmp_buf);
7508 }
7509 else if (hash_mode == 9000)
7510 {
7511 snprintf (out_buf, len-1, "%s", hashfile);
7512 }
7513 else if (hash_mode == 9200)
7514 {
7515 // salt
7516
7517 pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) data.esalts_buf;
7518
7519 pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[salt_pos];
7520
7521 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf;
7522
7523 // hash
7524
7525 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7526 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7527 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7528 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7529 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7530 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7531 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7532 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7533 digest_buf[8] = 0; // needed for base64_encode ()
7534
7535 char tmp_buf[64] = { 0 };
7536
7537 base64_encode (int_to_itoa64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7538 tmp_buf[43] = 0; // cut it here
7539
7540 // output
7541
7542 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO8, salt_buf_ptr, tmp_buf);
7543 }
7544 else if (hash_mode == 9300)
7545 {
7546 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7547 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7548 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7549 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7550 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7551 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7552 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7553 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7554 digest_buf[8] = 0; // needed for base64_encode ()
7555
7556 char tmp_buf[64] = { 0 };
7557
7558 base64_encode (int_to_itoa64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7559 tmp_buf[43] = 0; // cut it here
7560
7561 unsigned char *salt_buf_ptr = (unsigned char *) salt.salt_buf;
7562
7563 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO9, salt_buf_ptr, tmp_buf);
7564 }
7565 else if (hash_mode == 9400)
7566 {
7567 office2007_t *office2007s = (office2007_t *) data.esalts_buf;
7568
7569 office2007_t *office2007 = &office2007s[salt_pos];
7570
7571 snprintf (out_buf, len-1, "%s*%u*%u*%u*%u*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7572 SIGNATURE_OFFICE2007,
7573 2007,
7574 20,
7575 office2007->keySize,
7576 16,
7577 salt.salt_buf[0],
7578 salt.salt_buf[1],
7579 salt.salt_buf[2],
7580 salt.salt_buf[3],
7581 office2007->encryptedVerifier[0],
7582 office2007->encryptedVerifier[1],
7583 office2007->encryptedVerifier[2],
7584 office2007->encryptedVerifier[3],
7585 office2007->encryptedVerifierHash[0],
7586 office2007->encryptedVerifierHash[1],
7587 office2007->encryptedVerifierHash[2],
7588 office2007->encryptedVerifierHash[3],
7589 office2007->encryptedVerifierHash[4]);
7590 }
7591 else if (hash_mode == 9500)
7592 {
7593 office2010_t *office2010s = (office2010_t *) data.esalts_buf;
7594
7595 office2010_t *office2010 = &office2010s[salt_pos];
7596
7597 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,
7598
7599 salt.salt_buf[0],
7600 salt.salt_buf[1],
7601 salt.salt_buf[2],
7602 salt.salt_buf[3],
7603 office2010->encryptedVerifier[0],
7604 office2010->encryptedVerifier[1],
7605 office2010->encryptedVerifier[2],
7606 office2010->encryptedVerifier[3],
7607 office2010->encryptedVerifierHash[0],
7608 office2010->encryptedVerifierHash[1],
7609 office2010->encryptedVerifierHash[2],
7610 office2010->encryptedVerifierHash[3],
7611 office2010->encryptedVerifierHash[4],
7612 office2010->encryptedVerifierHash[5],
7613 office2010->encryptedVerifierHash[6],
7614 office2010->encryptedVerifierHash[7]);
7615 }
7616 else if (hash_mode == 9600)
7617 {
7618 office2013_t *office2013s = (office2013_t *) data.esalts_buf;
7619
7620 office2013_t *office2013 = &office2013s[salt_pos];
7621
7622 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,
7623
7624 salt.salt_buf[0],
7625 salt.salt_buf[1],
7626 salt.salt_buf[2],
7627 salt.salt_buf[3],
7628 office2013->encryptedVerifier[0],
7629 office2013->encryptedVerifier[1],
7630 office2013->encryptedVerifier[2],
7631 office2013->encryptedVerifier[3],
7632 office2013->encryptedVerifierHash[0],
7633 office2013->encryptedVerifierHash[1],
7634 office2013->encryptedVerifierHash[2],
7635 office2013->encryptedVerifierHash[3],
7636 office2013->encryptedVerifierHash[4],
7637 office2013->encryptedVerifierHash[5],
7638 office2013->encryptedVerifierHash[6],
7639 office2013->encryptedVerifierHash[7]);
7640 }
7641 else if (hash_mode == 9700)
7642 {
7643 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7644
7645 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7646
7647 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7648 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7649 byte_swap_32 (salt.salt_buf[0]),
7650 byte_swap_32 (salt.salt_buf[1]),
7651 byte_swap_32 (salt.salt_buf[2]),
7652 byte_swap_32 (salt.salt_buf[3]),
7653 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7654 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7655 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7656 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7657 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7658 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7659 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7660 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]));
7661 }
7662 else if (hash_mode == 9710)
7663 {
7664 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7665
7666 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7667
7668 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7669 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7670 byte_swap_32 (salt.salt_buf[0]),
7671 byte_swap_32 (salt.salt_buf[1]),
7672 byte_swap_32 (salt.salt_buf[2]),
7673 byte_swap_32 (salt.salt_buf[3]),
7674 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7675 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7676 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7677 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7678 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7679 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7680 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7681 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]));
7682 }
7683 else if (hash_mode == 9720)
7684 {
7685 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7686
7687 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7688
7689 u8 *rc4key = (u8 *) oldoffice01->rc4key;
7690
7691 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7692 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7693 byte_swap_32 (salt.salt_buf[0]),
7694 byte_swap_32 (salt.salt_buf[1]),
7695 byte_swap_32 (salt.salt_buf[2]),
7696 byte_swap_32 (salt.salt_buf[3]),
7697 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7698 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7699 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7700 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7701 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7702 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7703 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7704 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]),
7705 rc4key[0],
7706 rc4key[1],
7707 rc4key[2],
7708 rc4key[3],
7709 rc4key[4]);
7710 }
7711 else if (hash_mode == 9800)
7712 {
7713 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7714
7715 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7716
7717 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7718 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7719 salt.salt_buf[0],
7720 salt.salt_buf[1],
7721 salt.salt_buf[2],
7722 salt.salt_buf[3],
7723 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7724 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7725 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7726 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7727 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7728 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7729 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7730 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7731 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]));
7732 }
7733 else if (hash_mode == 9810)
7734 {
7735 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7736
7737 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7738
7739 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7740 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7741 salt.salt_buf[0],
7742 salt.salt_buf[1],
7743 salt.salt_buf[2],
7744 salt.salt_buf[3],
7745 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7746 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7747 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7748 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7749 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7750 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7751 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7752 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7753 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]));
7754 }
7755 else if (hash_mode == 9820)
7756 {
7757 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7758
7759 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7760
7761 u8 *rc4key = (u8 *) oldoffice34->rc4key;
7762
7763 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7764 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7765 salt.salt_buf[0],
7766 salt.salt_buf[1],
7767 salt.salt_buf[2],
7768 salt.salt_buf[3],
7769 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7770 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7771 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7772 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7773 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7774 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7775 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7776 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7777 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]),
7778 rc4key[0],
7779 rc4key[1],
7780 rc4key[2],
7781 rc4key[3],
7782 rc4key[4]);
7783 }
7784 else if (hash_mode == 10000)
7785 {
7786 // salt
7787
7788 pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) data.esalts_buf;
7789
7790 pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[salt_pos];
7791
7792 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf;
7793
7794 // hash
7795
7796 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7797 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7798 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7799 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7800 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7801 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7802 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7803 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7804 digest_buf[8] = 0; // needed for base64_encode ()
7805
7806 char tmp_buf[64] = { 0 };
7807
7808 base64_encode (int_to_base64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7809
7810 // output
7811
7812 snprintf (out_buf, len-1, "%s%i$%s$%s", SIGNATURE_DJANGOPBKDF2, salt.salt_iter + 1, salt_buf_ptr, tmp_buf);
7813 }
7814 else if (hash_mode == 10100)
7815 {
7816 snprintf (out_buf, len-1, "%08x%08x:%u:%u:%08x%08x%08x%08x",
7817 digest_buf[0],
7818 digest_buf[1],
7819 2,
7820 4,
7821 byte_swap_32 (salt.salt_buf[0]),
7822 byte_swap_32 (salt.salt_buf[1]),
7823 byte_swap_32 (salt.salt_buf[2]),
7824 byte_swap_32 (salt.salt_buf[3]));
7825 }
7826 else if (hash_mode == 10200)
7827 {
7828 cram_md5_t *cram_md5s = (cram_md5_t *) data.esalts_buf;
7829
7830 cram_md5_t *cram_md5 = &cram_md5s[salt_pos];
7831
7832 // challenge
7833
7834 char challenge[100] = { 0 };
7835
7836 base64_encode (int_to_base64, (const u8 *) salt.salt_buf, salt.salt_len, (u8 *) challenge);
7837
7838 // response
7839
7840 char tmp_buf[100] = { 0 };
7841
7842 uint tmp_len = snprintf (tmp_buf, 100, "%s %08x%08x%08x%08x",
7843 (char *) cram_md5->user,
7844 digest_buf[0],
7845 digest_buf[1],
7846 digest_buf[2],
7847 digest_buf[3]);
7848
7849 char response[100] = { 0 };
7850
7851 base64_encode (int_to_base64, (const u8 *) tmp_buf, tmp_len, (u8 *) response);
7852
7853 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CRAM_MD5, challenge, response);
7854 }
7855 else if (hash_mode == 10300)
7856 {
7857 char tmp_buf[100] = { 0 };
7858
7859 memcpy (tmp_buf + 0, digest_buf, 20);
7860 memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len);
7861
7862 uint tmp_len = 20 + salt.salt_len;
7863
7864 // base64 encode it
7865
7866 char base64_encoded[100] = { 0 };
7867
7868 base64_encode (int_to_base64, (const u8 *) tmp_buf, tmp_len, (u8 *) base64_encoded);
7869
7870 snprintf (out_buf, len-1, "%s%i}%s", SIGNATURE_SAPH_SHA1, salt.salt_iter + 1, base64_encoded);
7871 }
7872 else if (hash_mode == 10400)
7873 {
7874 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7875
7876 pdf_t *pdf = &pdfs[salt_pos];
7877
7878 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",
7879
7880 pdf->V,
7881 pdf->R,
7882 40,
7883 pdf->P,
7884 pdf->enc_md,
7885 pdf->id_len,
7886 byte_swap_32 (pdf->id_buf[0]),
7887 byte_swap_32 (pdf->id_buf[1]),
7888 byte_swap_32 (pdf->id_buf[2]),
7889 byte_swap_32 (pdf->id_buf[3]),
7890 pdf->u_len,
7891 byte_swap_32 (pdf->u_buf[0]),
7892 byte_swap_32 (pdf->u_buf[1]),
7893 byte_swap_32 (pdf->u_buf[2]),
7894 byte_swap_32 (pdf->u_buf[3]),
7895 byte_swap_32 (pdf->u_buf[4]),
7896 byte_swap_32 (pdf->u_buf[5]),
7897 byte_swap_32 (pdf->u_buf[6]),
7898 byte_swap_32 (pdf->u_buf[7]),
7899 pdf->o_len,
7900 byte_swap_32 (pdf->o_buf[0]),
7901 byte_swap_32 (pdf->o_buf[1]),
7902 byte_swap_32 (pdf->o_buf[2]),
7903 byte_swap_32 (pdf->o_buf[3]),
7904 byte_swap_32 (pdf->o_buf[4]),
7905 byte_swap_32 (pdf->o_buf[5]),
7906 byte_swap_32 (pdf->o_buf[6]),
7907 byte_swap_32 (pdf->o_buf[7])
7908 );
7909 }
7910 else if (hash_mode == 10410)
7911 {
7912 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7913
7914 pdf_t *pdf = &pdfs[salt_pos];
7915
7916 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",
7917
7918 pdf->V,
7919 pdf->R,
7920 40,
7921 pdf->P,
7922 pdf->enc_md,
7923 pdf->id_len,
7924 byte_swap_32 (pdf->id_buf[0]),
7925 byte_swap_32 (pdf->id_buf[1]),
7926 byte_swap_32 (pdf->id_buf[2]),
7927 byte_swap_32 (pdf->id_buf[3]),
7928 pdf->u_len,
7929 byte_swap_32 (pdf->u_buf[0]),
7930 byte_swap_32 (pdf->u_buf[1]),
7931 byte_swap_32 (pdf->u_buf[2]),
7932 byte_swap_32 (pdf->u_buf[3]),
7933 byte_swap_32 (pdf->u_buf[4]),
7934 byte_swap_32 (pdf->u_buf[5]),
7935 byte_swap_32 (pdf->u_buf[6]),
7936 byte_swap_32 (pdf->u_buf[7]),
7937 pdf->o_len,
7938 byte_swap_32 (pdf->o_buf[0]),
7939 byte_swap_32 (pdf->o_buf[1]),
7940 byte_swap_32 (pdf->o_buf[2]),
7941 byte_swap_32 (pdf->o_buf[3]),
7942 byte_swap_32 (pdf->o_buf[4]),
7943 byte_swap_32 (pdf->o_buf[5]),
7944 byte_swap_32 (pdf->o_buf[6]),
7945 byte_swap_32 (pdf->o_buf[7])
7946 );
7947 }
7948 else if (hash_mode == 10420)
7949 {
7950 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7951
7952 pdf_t *pdf = &pdfs[salt_pos];
7953
7954 u8 *rc4key = (u8 *) pdf->rc4key;
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:%02x%02x%02x%02x%02x",
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 rc4key[0],
7987 rc4key[1],
7988 rc4key[2],
7989 rc4key[3],
7990 rc4key[4]
7991 );
7992 }
7993 else if (hash_mode == 10500)
7994 {
7995 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7996
7997 pdf_t *pdf = &pdfs[salt_pos];
7998
7999 if (pdf->id_len == 32)
8000 {
8001 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",
8002
8003 pdf->V,
8004 pdf->R,
8005 128,
8006 pdf->P,
8007 pdf->enc_md,
8008 pdf->id_len,
8009 byte_swap_32 (pdf->id_buf[0]),
8010 byte_swap_32 (pdf->id_buf[1]),
8011 byte_swap_32 (pdf->id_buf[2]),
8012 byte_swap_32 (pdf->id_buf[3]),
8013 byte_swap_32 (pdf->id_buf[4]),
8014 byte_swap_32 (pdf->id_buf[5]),
8015 byte_swap_32 (pdf->id_buf[6]),
8016 byte_swap_32 (pdf->id_buf[7]),
8017 pdf->u_len,
8018 byte_swap_32 (pdf->u_buf[0]),
8019 byte_swap_32 (pdf->u_buf[1]),
8020 byte_swap_32 (pdf->u_buf[2]),
8021 byte_swap_32 (pdf->u_buf[3]),
8022 byte_swap_32 (pdf->u_buf[4]),
8023 byte_swap_32 (pdf->u_buf[5]),
8024 byte_swap_32 (pdf->u_buf[6]),
8025 byte_swap_32 (pdf->u_buf[7]),
8026 pdf->o_len,
8027 byte_swap_32 (pdf->o_buf[0]),
8028 byte_swap_32 (pdf->o_buf[1]),
8029 byte_swap_32 (pdf->o_buf[2]),
8030 byte_swap_32 (pdf->o_buf[3]),
8031 byte_swap_32 (pdf->o_buf[4]),
8032 byte_swap_32 (pdf->o_buf[5]),
8033 byte_swap_32 (pdf->o_buf[6]),
8034 byte_swap_32 (pdf->o_buf[7])
8035 );
8036 }
8037 else
8038 {
8039 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",
8040
8041 pdf->V,
8042 pdf->R,
8043 128,
8044 pdf->P,
8045 pdf->enc_md,
8046 pdf->id_len,
8047 byte_swap_32 (pdf->id_buf[0]),
8048 byte_swap_32 (pdf->id_buf[1]),
8049 byte_swap_32 (pdf->id_buf[2]),
8050 byte_swap_32 (pdf->id_buf[3]),
8051 pdf->u_len,
8052 byte_swap_32 (pdf->u_buf[0]),
8053 byte_swap_32 (pdf->u_buf[1]),
8054 byte_swap_32 (pdf->u_buf[2]),
8055 byte_swap_32 (pdf->u_buf[3]),
8056 byte_swap_32 (pdf->u_buf[4]),
8057 byte_swap_32 (pdf->u_buf[5]),
8058 byte_swap_32 (pdf->u_buf[6]),
8059 byte_swap_32 (pdf->u_buf[7]),
8060 pdf->o_len,
8061 byte_swap_32 (pdf->o_buf[0]),
8062 byte_swap_32 (pdf->o_buf[1]),
8063 byte_swap_32 (pdf->o_buf[2]),
8064 byte_swap_32 (pdf->o_buf[3]),
8065 byte_swap_32 (pdf->o_buf[4]),
8066 byte_swap_32 (pdf->o_buf[5]),
8067 byte_swap_32 (pdf->o_buf[6]),
8068 byte_swap_32 (pdf->o_buf[7])
8069 );
8070 }
8071 }
8072 else if (hash_mode == 10600)
8073 {
8074 uint digest_idx = salt.digests_offset + digest_pos;
8075
8076 hashinfo_t **hashinfo_ptr = data.hash_info;
8077 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8078
8079 snprintf (out_buf, len-1, "%s", hash_buf);
8080 }
8081 else if (hash_mode == 10700)
8082 {
8083 uint digest_idx = salt.digests_offset + digest_pos;
8084
8085 hashinfo_t **hashinfo_ptr = data.hash_info;
8086 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8087
8088 snprintf (out_buf, len-1, "%s", hash_buf);
8089 }
8090 else if (hash_mode == 10900)
8091 {
8092 uint digest_idx = salt.digests_offset + digest_pos;
8093
8094 hashinfo_t **hashinfo_ptr = data.hash_info;
8095 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8096
8097 snprintf (out_buf, len-1, "%s", hash_buf);
8098 }
8099 else if (hash_mode == 11100)
8100 {
8101 u32 salt_challenge = salt.salt_buf[0];
8102
8103 salt_challenge = byte_swap_32 (salt_challenge);
8104
8105 unsigned char *user_name = (unsigned char *) (salt.salt_buf + 1);
8106
8107 snprintf (out_buf, len-1, "%s%s*%08x*%08x%08x%08x%08x",
8108 SIGNATURE_POSTGRESQL_AUTH,
8109 user_name,
8110 salt_challenge,
8111 digest_buf[0],
8112 digest_buf[1],
8113 digest_buf[2],
8114 digest_buf[3]);
8115 }
8116 else if (hash_mode == 11200)
8117 {
8118 snprintf (out_buf, len-1, "%s%s*%08x%08x%08x%08x%08x",
8119 SIGNATURE_MYSQL_AUTH,
8120 (unsigned char *) salt.salt_buf,
8121 digest_buf[0],
8122 digest_buf[1],
8123 digest_buf[2],
8124 digest_buf[3],
8125 digest_buf[4]);
8126 }
8127 else if (hash_mode == 11300)
8128 {
8129 bitcoin_wallet_t *bitcoin_wallets = (bitcoin_wallet_t *) data.esalts_buf;
8130
8131 bitcoin_wallet_t *bitcoin_wallet = &bitcoin_wallets[salt_pos];
8132
8133 const uint cry_master_len = bitcoin_wallet->cry_master_len;
8134 const uint ckey_len = bitcoin_wallet->ckey_len;
8135 const uint public_key_len = bitcoin_wallet->public_key_len;
8136
8137 char *cry_master_buf = (char *) mymalloc ((cry_master_len * 2) + 1);
8138 char *ckey_buf = (char *) mymalloc ((ckey_len * 2) + 1);
8139 char *public_key_buf = (char *) mymalloc ((public_key_len * 2) + 1);
8140
8141 for (uint i = 0, j = 0; i < cry_master_len; i += 1, j += 2)
8142 {
8143 const u8 *ptr = (const u8 *) bitcoin_wallet->cry_master_buf;
8144
8145 sprintf (cry_master_buf + j, "%02x", ptr[i]);
8146 }
8147
8148 for (uint i = 0, j = 0; i < ckey_len; i += 1, j += 2)
8149 {
8150 const u8 *ptr = (const u8 *) bitcoin_wallet->ckey_buf;
8151
8152 sprintf (ckey_buf + j, "%02x", ptr[i]);
8153 }
8154
8155 for (uint i = 0, j = 0; i < public_key_len; i += 1, j += 2)
8156 {
8157 const u8 *ptr = (const u8 *) bitcoin_wallet->public_key_buf;
8158
8159 sprintf (public_key_buf + j, "%02x", ptr[i]);
8160 }
8161
8162 snprintf (out_buf, len-1, "%s%d$%s$%d$%s$%d$%d$%s$%d$%s",
8163 SIGNATURE_BITCOIN_WALLET,
8164 cry_master_len * 2,
8165 cry_master_buf,
8166 salt.salt_len,
8167 (unsigned char *) salt.salt_buf,
8168 salt.salt_iter + 1,
8169 ckey_len * 2,
8170 ckey_buf,
8171 public_key_len * 2,
8172 public_key_buf
8173 );
8174
8175 free (cry_master_buf);
8176 free (ckey_buf);
8177 free (public_key_buf);
8178 }
8179 else if (hash_mode == 11400)
8180 {
8181 uint digest_idx = salt.digests_offset + digest_pos;
8182
8183 hashinfo_t **hashinfo_ptr = data.hash_info;
8184 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8185
8186 snprintf (out_buf, len-1, "%s", hash_buf);
8187 }
8188 else if (hash_mode == 11600)
8189 {
8190 seven_zip_t *seven_zips = (seven_zip_t *) data.esalts_buf;
8191
8192 seven_zip_t *seven_zip = &seven_zips[salt_pos];
8193
8194 const uint data_len = seven_zip->data_len;
8195
8196 char *data_buf = (char *) mymalloc ((data_len * 2) + 1);
8197
8198 for (uint i = 0, j = 0; i < data_len; i += 1, j += 2)
8199 {
8200 const u8 *ptr = (const u8 *) seven_zip->data_buf;
8201
8202 sprintf (data_buf + j, "%02x", ptr[i]);
8203 }
8204
8205 snprintf (out_buf, len-1, "%s%u$%u$%u$%s$%u$%08x%08x%08x%08x$%u$%u$%u$%s",
8206 SIGNATURE_SEVEN_ZIP,
8207 0,
8208 salt.salt_sign[0],
8209 0,
8210 (char *) seven_zip->salt_buf,
8211 seven_zip->iv_len,
8212 seven_zip->iv_buf[0],
8213 seven_zip->iv_buf[1],
8214 seven_zip->iv_buf[2],
8215 seven_zip->iv_buf[3],
8216 seven_zip->crc,
8217 seven_zip->data_len,
8218 seven_zip->unpack_size,
8219 data_buf);
8220
8221 free (data_buf);
8222 }
8223 else if (hash_mode == 11700)
8224 {
8225 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8226 digest_buf[0],
8227 digest_buf[1],
8228 digest_buf[2],
8229 digest_buf[3],
8230 digest_buf[4],
8231 digest_buf[5],
8232 digest_buf[6],
8233 digest_buf[7]);
8234 }
8235 else if (hash_mode == 11800)
8236 {
8237 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8238 digest_buf[ 0],
8239 digest_buf[ 1],
8240 digest_buf[ 2],
8241 digest_buf[ 3],
8242 digest_buf[ 4],
8243 digest_buf[ 5],
8244 digest_buf[ 6],
8245 digest_buf[ 7],
8246 digest_buf[ 8],
8247 digest_buf[ 9],
8248 digest_buf[10],
8249 digest_buf[11],
8250 digest_buf[12],
8251 digest_buf[13],
8252 digest_buf[14],
8253 digest_buf[15]);
8254 }
8255 else if (hash_mode == 11900)
8256 {
8257 uint digest_idx = salt.digests_offset + digest_pos;
8258
8259 hashinfo_t **hashinfo_ptr = data.hash_info;
8260 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8261
8262 snprintf (out_buf, len-1, "%s", hash_buf);
8263 }
8264 else if (hash_mode == 12000)
8265 {
8266 uint digest_idx = salt.digests_offset + digest_pos;
8267
8268 hashinfo_t **hashinfo_ptr = data.hash_info;
8269 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8270
8271 snprintf (out_buf, len-1, "%s", hash_buf);
8272 }
8273 else if (hash_mode == 12100)
8274 {
8275 uint digest_idx = salt.digests_offset + digest_pos;
8276
8277 hashinfo_t **hashinfo_ptr = data.hash_info;
8278 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8279
8280 snprintf (out_buf, len-1, "%s", hash_buf);
8281 }
8282 else if (hash_mode == 12200)
8283 {
8284 uint *ptr_digest = digest_buf;
8285 uint *ptr_salt = salt.salt_buf;
8286
8287 snprintf (out_buf, len-1, "%s0$1$%08x%08x$%08x%08x",
8288 SIGNATURE_ECRYPTFS,
8289 ptr_salt[0],
8290 ptr_salt[1],
8291 ptr_digest[0],
8292 ptr_digest[1]);
8293 }
8294 else if (hash_mode == 12300)
8295 {
8296 uint *ptr_digest = digest_buf;
8297 uint *ptr_salt = salt.salt_buf;
8298
8299 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",
8300 ptr_digest[ 0], ptr_digest[ 1],
8301 ptr_digest[ 2], ptr_digest[ 3],
8302 ptr_digest[ 4], ptr_digest[ 5],
8303 ptr_digest[ 6], ptr_digest[ 7],
8304 ptr_digest[ 8], ptr_digest[ 9],
8305 ptr_digest[10], ptr_digest[11],
8306 ptr_digest[12], ptr_digest[13],
8307 ptr_digest[14], ptr_digest[15],
8308 ptr_salt[0],
8309 ptr_salt[1],
8310 ptr_salt[2],
8311 ptr_salt[3]);
8312 }
8313 else if (hash_mode == 12400)
8314 {
8315 // encode iteration count
8316
8317 char salt_iter[5] = { 0 };
8318
8319 salt_iter[0] = int_to_itoa64 ((salt.salt_iter ) & 0x3f);
8320 salt_iter[1] = int_to_itoa64 ((salt.salt_iter >> 6) & 0x3f);
8321 salt_iter[2] = int_to_itoa64 ((salt.salt_iter >> 12) & 0x3f);
8322 salt_iter[3] = int_to_itoa64 ((salt.salt_iter >> 18) & 0x3f);
8323 salt_iter[4] = 0;
8324
8325 // encode salt
8326
8327 ptr_salt[0] = int_to_itoa64 ((salt.salt_buf[0] ) & 0x3f);
8328 ptr_salt[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f);
8329 ptr_salt[2] = int_to_itoa64 ((salt.salt_buf[0] >> 12) & 0x3f);
8330 ptr_salt[3] = int_to_itoa64 ((salt.salt_buf[0] >> 18) & 0x3f);
8331 ptr_salt[4] = 0;
8332
8333 // encode digest
8334
8335 memset (tmp_buf, 0, sizeof (tmp_buf));
8336
8337 digest_buf[0] = byte_swap_32 (digest_buf[0]);
8338 digest_buf[1] = byte_swap_32 (digest_buf[1]);
8339
8340 memcpy (tmp_buf, digest_buf, 8);
8341
8342 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 8, (u8 *) ptr_plain);
8343
8344 ptr_plain[11] = 0;
8345
8346 // fill the resulting buffer
8347
8348 snprintf (out_buf, len - 1, "_%s%s%s", salt_iter, ptr_salt, ptr_plain);
8349 }
8350 else if (hash_mode == 12500)
8351 {
8352 snprintf (out_buf, len - 1, "%s*0*%08x%08x*%08x%08x%08x%08x",
8353 SIGNATURE_RAR3,
8354 byte_swap_32 (salt.salt_buf[0]),
8355 byte_swap_32 (salt.salt_buf[1]),
8356 salt.salt_buf[2],
8357 salt.salt_buf[3],
8358 salt.salt_buf[4],
8359 salt.salt_buf[5]);
8360 }
8361 else if (hash_mode == 12600)
8362 {
8363 snprintf (out_buf, len - 1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8364 digest_buf[0] + salt.salt_buf_pc[0],
8365 digest_buf[1] + salt.salt_buf_pc[1],
8366 digest_buf[2] + salt.salt_buf_pc[2],
8367 digest_buf[3] + salt.salt_buf_pc[3],
8368 digest_buf[4] + salt.salt_buf_pc[4],
8369 digest_buf[5] + salt.salt_buf_pc[5],
8370 digest_buf[6] + salt.salt_buf_pc[6],
8371 digest_buf[7] + salt.salt_buf_pc[7]);
8372 }
8373 else if (hash_mode == 12700)
8374 {
8375 uint digest_idx = salt.digests_offset + digest_pos;
8376
8377 hashinfo_t **hashinfo_ptr = data.hash_info;
8378 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8379
8380 snprintf (out_buf, len-1, "%s", hash_buf);
8381 }
8382 else if (hash_mode == 12800)
8383 {
8384 const u8 *ptr = (const u8 *) salt.salt_buf;
8385
8386 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",
8387 SIGNATURE_MS_DRSR,
8388 ptr[0],
8389 ptr[1],
8390 ptr[2],
8391 ptr[3],
8392 ptr[4],
8393 ptr[5],
8394 ptr[6],
8395 ptr[7],
8396 ptr[8],
8397 ptr[9],
8398 salt.salt_iter + 1,
8399 byte_swap_32 (digest_buf[0]),
8400 byte_swap_32 (digest_buf[1]),
8401 byte_swap_32 (digest_buf[2]),
8402 byte_swap_32 (digest_buf[3]),
8403 byte_swap_32 (digest_buf[4]),
8404 byte_swap_32 (digest_buf[5]),
8405 byte_swap_32 (digest_buf[6]),
8406 byte_swap_32 (digest_buf[7])
8407 );
8408 }
8409 else if (hash_mode == 12900)
8410 {
8411 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",
8412 salt.salt_buf[ 4],
8413 salt.salt_buf[ 5],
8414 salt.salt_buf[ 6],
8415 salt.salt_buf[ 7],
8416 salt.salt_buf[ 8],
8417 salt.salt_buf[ 9],
8418 salt.salt_buf[10],
8419 salt.salt_buf[11],
8420 byte_swap_32 (digest_buf[0]),
8421 byte_swap_32 (digest_buf[1]),
8422 byte_swap_32 (digest_buf[2]),
8423 byte_swap_32 (digest_buf[3]),
8424 byte_swap_32 (digest_buf[4]),
8425 byte_swap_32 (digest_buf[5]),
8426 byte_swap_32 (digest_buf[6]),
8427 byte_swap_32 (digest_buf[7]),
8428 salt.salt_buf[ 0],
8429 salt.salt_buf[ 1],
8430 salt.salt_buf[ 2],
8431 salt.salt_buf[ 3]
8432 );
8433 }
8434 else if (hash_mode == 13000)
8435 {
8436 rar5_t *rar5s = (rar5_t *) data.esalts_buf;
8437
8438 rar5_t *rar5 = &rar5s[salt_pos];
8439
8440 snprintf (out_buf, len-1, "$rar5$16$%08x%08x%08x%08x$%u$%08x%08x%08x%08x$8$%08x%08x",
8441 salt.salt_buf[0],
8442 salt.salt_buf[1],
8443 salt.salt_buf[2],
8444 salt.salt_buf[3],
8445 salt.salt_sign[0],
8446 rar5->iv[0],
8447 rar5->iv[1],
8448 rar5->iv[2],
8449 rar5->iv[3],
8450 byte_swap_32 (digest_buf[0]),
8451 byte_swap_32 (digest_buf[1])
8452 );
8453 }
8454 else if (hash_mode == 13100)
8455 {
8456 krb5tgs_t *krb5tgss = (krb5tgs_t *) data.esalts_buf;
8457
8458 krb5tgs_t *krb5tgs = &krb5tgss[salt_pos];
8459
8460 u8 *ptr_checksum = (u8 *) krb5tgs->checksum;
8461 u8 *ptr_edata2 = (u8 *) krb5tgs->edata2;
8462
8463 char data[2560 * 4 * 2] = { 0 };
8464
8465 char *ptr_data = data;
8466
8467 for (uint i = 0; i < 16; i++, ptr_data += 2)
8468 sprintf (ptr_data, "%02x", ptr_checksum[i]);
8469
8470 /* skip '$' */
8471 ptr_data++;
8472
8473 for (uint i = 0; i < krb5tgs->edata2_len; i++, ptr_data += 2)
8474 sprintf (ptr_data, "%02x", ptr_edata2[i]);
8475
8476 snprintf (out_buf, len-1, "%s$%s$%s$%s",
8477 SIGNATURE_KRB5TGS,
8478 (char *) krb5tgs->account_info,
8479 data,
8480 data + 33);
8481 }
8482 else if (hash_mode == 13200)
8483 {
8484 snprintf (out_buf, len-1, "%s*%d*%08x%08x%08x%08x*%08x%08x%08x%08x%08x%08x",
8485 SIGNATURE_AXCRYPT,
8486 salt.salt_iter,
8487 salt.salt_buf[0],
8488 salt.salt_buf[1],
8489 salt.salt_buf[2],
8490 salt.salt_buf[3],
8491 salt.salt_buf[4],
8492 salt.salt_buf[5],
8493 salt.salt_buf[6],
8494 salt.salt_buf[7],
8495 salt.salt_buf[8],
8496 salt.salt_buf[9]);
8497 }
8498 else if (hash_mode == 13300)
8499 {
8500 snprintf (out_buf, len-1, "%s$%08x%08x%08x%08x",
8501 SIGNATURE_AXCRYPT_SHA1,
8502 digest_buf[0],
8503 digest_buf[1],
8504 digest_buf[2],
8505 digest_buf[3]);
8506 }
8507 else if (hash_mode == 13400)
8508 {
8509 keepass_t *keepasss = (keepass_t *) data.esalts_buf;
8510
8511 keepass_t *keepass = &keepasss[salt_pos];
8512
8513 u32 version = (u32) keepass->version;
8514 u32 rounds = salt.salt_iter;
8515 u32 algorithm = (u32) keepass->algorithm;
8516 u32 keyfile_len = (u32) keepass->keyfile_len;
8517
8518 u32 *ptr_final_random_seed = (u32 *) keepass->final_random_seed ;
8519 u32 *ptr_transf_random_seed = (u32 *) keepass->transf_random_seed ;
8520 u32 *ptr_enc_iv = (u32 *) keepass->enc_iv ;
8521 u32 *ptr_contents_hash = (u32 *) keepass->contents_hash ;
8522 u32 *ptr_keyfile = (u32 *) keepass->keyfile ;
8523
8524 /* specific to version 1 */
8525 u32 contents_len;
8526 u32 *ptr_contents;
8527
8528 /* specific to version 2 */
8529 u32 expected_bytes_len;
8530 u32 *ptr_expected_bytes;
8531
8532 u32 final_random_seed_len;
8533 u32 transf_random_seed_len;
8534 u32 enc_iv_len;
8535 u32 contents_hash_len;
8536
8537 transf_random_seed_len = 8;
8538 enc_iv_len = 4;
8539 contents_hash_len = 8;
8540 final_random_seed_len = 8;
8541
8542 if (version == 1)
8543 final_random_seed_len = 4;
8544
8545 snprintf (out_buf, len-1, "%s*%d*%d*%d",
8546 SIGNATURE_KEEPASS,
8547 version,
8548 rounds,
8549 algorithm);
8550
8551 char *ptr_data = out_buf;
8552
8553 ptr_data += strlen(out_buf);
8554
8555 *ptr_data = '*';
8556 ptr_data++;
8557
8558 for (uint i = 0; i < final_random_seed_len; i++, ptr_data += 8)
8559 sprintf (ptr_data, "%08x", ptr_final_random_seed[i]);
8560
8561 *ptr_data = '*';
8562 ptr_data++;
8563
8564 for (uint i = 0; i < transf_random_seed_len; i++, ptr_data += 8)
8565 sprintf (ptr_data, "%08x", ptr_transf_random_seed[i]);
8566
8567 *ptr_data = '*';
8568 ptr_data++;
8569
8570 for (uint i = 0; i < enc_iv_len; i++, ptr_data += 8)
8571 sprintf (ptr_data, "%08x", ptr_enc_iv[i]);
8572
8573 *ptr_data = '*';
8574 ptr_data++;
8575
8576 if (version == 1)
8577 {
8578 contents_len = (u32) keepass->contents_len;
8579 ptr_contents = (u32 *) keepass->contents;
8580
8581 for (uint i = 0; i < contents_hash_len; i++, ptr_data += 8)
8582 sprintf (ptr_data, "%08x", ptr_contents_hash[i]);
8583
8584 *ptr_data = '*';
8585 ptr_data++;
8586
8587 /* inline flag */
8588 *ptr_data = '1';
8589 ptr_data++;
8590
8591 *ptr_data = '*';
8592 ptr_data++;
8593
8594 char ptr_contents_len[10] = { 0 };
8595
8596 sprintf ((char*) ptr_contents_len, "%d", contents_len);
8597
8598 sprintf (ptr_data, "%d", contents_len);
8599
8600 ptr_data += strlen(ptr_contents_len);
8601
8602 *ptr_data = '*';
8603 ptr_data++;
8604
8605 for (uint i = 0; i < contents_len / 4; i++, ptr_data += 8)
8606 sprintf (ptr_data, "%08x", ptr_contents[i]);
8607 }
8608 else if (version == 2)
8609 {
8610 expected_bytes_len = 8;
8611 ptr_expected_bytes = (u32 *) keepass->expected_bytes ;
8612
8613 for (uint i = 0; i < expected_bytes_len; i++, ptr_data += 8)
8614 sprintf (ptr_data, "%08x", ptr_expected_bytes[i]);
8615
8616 *ptr_data = '*';
8617 ptr_data++;
8618
8619 for (uint i = 0; i < contents_hash_len; i++, ptr_data += 8)
8620 sprintf (ptr_data, "%08x", ptr_contents_hash[i]);
8621 }
8622 if (keyfile_len)
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 sprintf (ptr_data, "%d", keyfile_len);
8635
8636 ptr_data += 2;
8637
8638 *ptr_data = '*';
8639 ptr_data++;
8640
8641 for (uint i = 0; i < 8; i++, ptr_data += 8)
8642 sprintf (ptr_data, "%08x", ptr_keyfile[i]);
8643 }
8644 }
8645 else if (hash_mode == 13500)
8646 {
8647 pstoken_t *pstokens = (pstoken_t *) data.esalts_buf;
8648
8649 pstoken_t *pstoken = &pstokens[salt_pos];
8650
8651 const u32 salt_len = (pstoken->salt_len > 512) ? 512 : pstoken->salt_len;
8652
8653 char pstoken_tmp[1024 + 1] = { 0 };
8654
8655 for (uint i = 0, j = 0; i < salt_len; i += 1, j += 2)
8656 {
8657 const u8 *ptr = (const u8 *) pstoken->salt_buf;
8658
8659 sprintf (pstoken_tmp + j, "%02x", ptr[i]);
8660 }
8661
8662 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x:%s",
8663 digest_buf[0],
8664 digest_buf[1],
8665 digest_buf[2],
8666 digest_buf[3],
8667 digest_buf[4],
8668 pstoken_tmp);
8669 }
8670 else if (hash_mode == 13600)
8671 {
8672 zip2_t *zip2s = (zip2_t *) data.esalts_buf;
8673
8674 zip2_t *zip2 = &zip2s[salt_pos];
8675
8676 const u32 salt_len = zip2->salt_len;
8677
8678 char salt_tmp[32 + 1] = { 0 };
8679
8680 for (uint i = 0, j = 0; i < salt_len; i += 1, j += 2)
8681 {
8682 const u8 *ptr = (const u8 *) zip2->salt_buf;
8683
8684 sprintf (salt_tmp + j, "%02x", ptr[i]);
8685 }
8686
8687 const u32 data_len = zip2->data_len;
8688
8689 char data_tmp[8192 + 1] = { 0 };
8690
8691 for (uint i = 0, j = 0; i < data_len; i += 1, j += 2)
8692 {
8693 const u8 *ptr = (const u8 *) zip2->data_buf;
8694
8695 sprintf (data_tmp + j, "%02x", ptr[i]);
8696 }
8697
8698 const u32 auth_len = zip2->auth_len;
8699
8700 char auth_tmp[20 + 1] = { 0 };
8701
8702 for (uint i = 0, j = 0; i < auth_len; i += 1, j += 2)
8703 {
8704 const u8 *ptr = (const u8 *) zip2->auth_buf;
8705
8706 sprintf (auth_tmp + j, "%02x", ptr[i]);
8707 }
8708
8709 snprintf (out_buf, 255, "%s*%u*%u*%u*%s*%x*%u*%s*%s*%s",
8710 SIGNATURE_ZIP2_START,
8711 zip2->type,
8712 zip2->mode,
8713 zip2->magic,
8714 salt_tmp,
8715 zip2->verify_bytes,
8716 zip2->compress_length,
8717 data_tmp,
8718 auth_tmp,
8719 SIGNATURE_ZIP2_STOP);
8720 }
8721 else if ((hash_mode >= 13700) && (hash_mode <= 13799))
8722 {
8723 snprintf (out_buf, len-1, "%s", hashfile);
8724 }
8725 else
8726 {
8727 if (hash_type == HASH_TYPE_MD4)
8728 {
8729 snprintf (out_buf, 255, "%08x%08x%08x%08x",
8730 digest_buf[0],
8731 digest_buf[1],
8732 digest_buf[2],
8733 digest_buf[3]);
8734 }
8735 else if (hash_type == HASH_TYPE_MD5)
8736 {
8737 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
8738 digest_buf[0],
8739 digest_buf[1],
8740 digest_buf[2],
8741 digest_buf[3]);
8742 }
8743 else if (hash_type == HASH_TYPE_SHA1)
8744 {
8745 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
8746 digest_buf[0],
8747 digest_buf[1],
8748 digest_buf[2],
8749 digest_buf[3],
8750 digest_buf[4]);
8751 }
8752 else if (hash_type == HASH_TYPE_SHA256)
8753 {
8754 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8755 digest_buf[0],
8756 digest_buf[1],
8757 digest_buf[2],
8758 digest_buf[3],
8759 digest_buf[4],
8760 digest_buf[5],
8761 digest_buf[6],
8762 digest_buf[7]);
8763 }
8764 else if (hash_type == HASH_TYPE_SHA384)
8765 {
8766 uint *ptr = digest_buf;
8767
8768 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8769 ptr[ 1], ptr[ 0],
8770 ptr[ 3], ptr[ 2],
8771 ptr[ 5], ptr[ 4],
8772 ptr[ 7], ptr[ 6],
8773 ptr[ 9], ptr[ 8],
8774 ptr[11], ptr[10]);
8775 }
8776 else if (hash_type == HASH_TYPE_SHA512)
8777 {
8778 uint *ptr = digest_buf;
8779
8780 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8781 ptr[ 1], ptr[ 0],
8782 ptr[ 3], ptr[ 2],
8783 ptr[ 5], ptr[ 4],
8784 ptr[ 7], ptr[ 6],
8785 ptr[ 9], ptr[ 8],
8786 ptr[11], ptr[10],
8787 ptr[13], ptr[12],
8788 ptr[15], ptr[14]);
8789 }
8790 else if (hash_type == HASH_TYPE_LM)
8791 {
8792 snprintf (out_buf, len-1, "%08x%08x",
8793 digest_buf[0],
8794 digest_buf[1]);
8795 }
8796 else if (hash_type == HASH_TYPE_ORACLEH)
8797 {
8798 snprintf (out_buf, len-1, "%08X%08X",
8799 digest_buf[0],
8800 digest_buf[1]);
8801 }
8802 else if (hash_type == HASH_TYPE_BCRYPT)
8803 {
8804 base64_encode (int_to_bf64, (const u8 *) salt.salt_buf, 16, (u8 *) tmp_buf + 0);
8805 base64_encode (int_to_bf64, (const u8 *) digest_buf, 23, (u8 *) tmp_buf + 22);
8806
8807 tmp_buf[22 + 31] = 0; // base64_encode wants to pad
8808
8809 snprintf (out_buf, len-1, "%s$%s", (char *) salt.salt_sign, tmp_buf);
8810 }
8811 else if (hash_type == HASH_TYPE_KECCAK)
8812 {
8813 uint *ptr = digest_buf;
8814
8815 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",
8816 ptr[ 1], ptr[ 0],
8817 ptr[ 3], ptr[ 2],
8818 ptr[ 5], ptr[ 4],
8819 ptr[ 7], ptr[ 6],
8820 ptr[ 9], ptr[ 8],
8821 ptr[11], ptr[10],
8822 ptr[13], ptr[12],
8823 ptr[15], ptr[14],
8824 ptr[17], ptr[16],
8825 ptr[19], ptr[18],
8826 ptr[21], ptr[20],
8827 ptr[23], ptr[22],
8828 ptr[25], ptr[24],
8829 ptr[27], ptr[26],
8830 ptr[29], ptr[28],
8831 ptr[31], ptr[30],
8832 ptr[33], ptr[32],
8833 ptr[35], ptr[34],
8834 ptr[37], ptr[36],
8835 ptr[39], ptr[38],
8836 ptr[41], ptr[30],
8837 ptr[43], ptr[42],
8838 ptr[45], ptr[44],
8839 ptr[47], ptr[46],
8840 ptr[49], ptr[48]
8841 );
8842
8843 out_buf[salt.keccak_mdlen * 2] = 0;
8844 }
8845 else if (hash_type == HASH_TYPE_RIPEMD160)
8846 {
8847 snprintf (out_buf, 255, "%08x%08x%08x%08x%08x",
8848 digest_buf[0],
8849 digest_buf[1],
8850 digest_buf[2],
8851 digest_buf[3],
8852 digest_buf[4]);
8853 }
8854 else if (hash_type == HASH_TYPE_WHIRLPOOL)
8855 {
8856 digest_buf[ 0] = digest_buf[ 0];
8857 digest_buf[ 1] = digest_buf[ 1];
8858 digest_buf[ 2] = digest_buf[ 2];
8859 digest_buf[ 3] = digest_buf[ 3];
8860 digest_buf[ 4] = digest_buf[ 4];
8861 digest_buf[ 5] = digest_buf[ 5];
8862 digest_buf[ 6] = digest_buf[ 6];
8863 digest_buf[ 7] = digest_buf[ 7];
8864 digest_buf[ 8] = digest_buf[ 8];
8865 digest_buf[ 9] = digest_buf[ 9];
8866 digest_buf[10] = digest_buf[10];
8867 digest_buf[11] = digest_buf[11];
8868 digest_buf[12] = digest_buf[12];
8869 digest_buf[13] = digest_buf[13];
8870 digest_buf[14] = digest_buf[14];
8871 digest_buf[15] = digest_buf[15];
8872
8873 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8874 digest_buf[ 0],
8875 digest_buf[ 1],
8876 digest_buf[ 2],
8877 digest_buf[ 3],
8878 digest_buf[ 4],
8879 digest_buf[ 5],
8880 digest_buf[ 6],
8881 digest_buf[ 7],
8882 digest_buf[ 8],
8883 digest_buf[ 9],
8884 digest_buf[10],
8885 digest_buf[11],
8886 digest_buf[12],
8887 digest_buf[13],
8888 digest_buf[14],
8889 digest_buf[15]);
8890 }
8891 else if (hash_type == HASH_TYPE_GOST)
8892 {
8893 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8894 digest_buf[0],
8895 digest_buf[1],
8896 digest_buf[2],
8897 digest_buf[3],
8898 digest_buf[4],
8899 digest_buf[5],
8900 digest_buf[6],
8901 digest_buf[7]);
8902 }
8903 else if (hash_type == HASH_TYPE_MYSQL)
8904 {
8905 snprintf (out_buf, len-1, "%08x%08x",
8906 digest_buf[0],
8907 digest_buf[1]);
8908 }
8909 else if (hash_type == HASH_TYPE_LOTUS5)
8910 {
8911 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
8912 digest_buf[0],
8913 digest_buf[1],
8914 digest_buf[2],
8915 digest_buf[3]);
8916 }
8917 else if (hash_type == HASH_TYPE_LOTUS6)
8918 {
8919 digest_buf[ 0] = byte_swap_32 (digest_buf[ 0]);
8920 digest_buf[ 1] = byte_swap_32 (digest_buf[ 1]);
8921 digest_buf[ 2] = byte_swap_32 (digest_buf[ 2]);
8922 digest_buf[ 3] = byte_swap_32 (digest_buf[ 3]);
8923
8924 char buf[16] = { 0 };
8925
8926 memcpy (buf + 0, salt.salt_buf, 5);
8927 memcpy (buf + 5, digest_buf, 9);
8928
8929 buf[3] -= -4;
8930
8931 base64_encode (int_to_lotus64, (const u8 *) buf, 14, (u8 *) tmp_buf);
8932
8933 tmp_buf[18] = salt.salt_buf_pc[7];
8934 tmp_buf[19] = 0;
8935
8936 snprintf (out_buf, len-1, "(G%s)", tmp_buf);
8937 }
8938 else if (hash_type == HASH_TYPE_LOTUS8)
8939 {
8940 char buf[52] = { 0 };
8941
8942 // salt
8943
8944 memcpy (buf + 0, salt.salt_buf, 16);
8945
8946 buf[3] -= -4;
8947
8948 // iteration
8949
8950 snprintf (buf + 16, 11, "%010i", salt.salt_iter + 1);
8951
8952 // chars
8953
8954 buf[26] = salt.salt_buf_pc[0];
8955 buf[27] = salt.salt_buf_pc[1];
8956
8957 // digest
8958
8959 memcpy (buf + 28, digest_buf, 8);
8960
8961 base64_encode (int_to_lotus64, (const u8 *) buf, 36, (u8 *) tmp_buf);
8962
8963 tmp_buf[49] = 0;
8964
8965 snprintf (out_buf, len-1, "(H%s)", tmp_buf);
8966 }
8967 else if (hash_type == HASH_TYPE_CRC32)
8968 {
8969 snprintf (out_buf, len-1, "%08x", byte_swap_32 (digest_buf[0]));
8970 }
8971 }
8972
8973 if (salt_type == SALT_TYPE_INTERN)
8974 {
8975 size_t pos = strlen (out_buf);
8976
8977 out_buf[pos] = data.separator;
8978
8979 char *ptr = (char *) salt.salt_buf;
8980
8981 memcpy (out_buf + pos + 1, ptr, salt.salt_len);
8982
8983 out_buf[pos + 1 + salt.salt_len] = 0;
8984 }
8985 }
8986
8987 void to_hccap_t (hccap_t *hccap, uint salt_pos, uint digest_pos)
8988 {
8989 memset (hccap, 0, sizeof (hccap_t));
8990
8991 salt_t *salt = &data.salts_buf[salt_pos];
8992
8993 memcpy (hccap->essid, salt->salt_buf, salt->salt_len);
8994
8995 wpa_t *wpas = (wpa_t *) data.esalts_buf;
8996 wpa_t *wpa = &wpas[salt_pos];
8997
8998 hccap->keyver = wpa->keyver;
8999
9000 hccap->eapol_size = wpa->eapol_size;
9001
9002 if (wpa->keyver != 1)
9003 {
9004 uint eapol_tmp[64] = { 0 };
9005
9006 for (uint i = 0; i < 64; i++)
9007 {
9008 eapol_tmp[i] = byte_swap_32 (wpa->eapol[i]);
9009 }
9010
9011 memcpy (hccap->eapol, eapol_tmp, wpa->eapol_size);
9012 }
9013 else
9014 {
9015 memcpy (hccap->eapol, wpa->eapol, wpa->eapol_size);
9016 }
9017
9018 memcpy (hccap->mac1, wpa->orig_mac1, 6);
9019 memcpy (hccap->mac2, wpa->orig_mac2, 6);
9020 memcpy (hccap->nonce1, wpa->orig_nonce1, 32);
9021 memcpy (hccap->nonce2, wpa->orig_nonce2, 32);
9022
9023 char *digests_buf_ptr = (char *) data.digests_buf;
9024
9025 uint dgst_size = data.dgst_size;
9026
9027 uint *digest_ptr = (uint *) (digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size));
9028
9029 if (wpa->keyver != 1)
9030 {
9031 uint digest_tmp[4] = { 0 };
9032
9033 digest_tmp[0] = byte_swap_32 (digest_ptr[0]);
9034 digest_tmp[1] = byte_swap_32 (digest_ptr[1]);
9035 digest_tmp[2] = byte_swap_32 (digest_ptr[2]);
9036 digest_tmp[3] = byte_swap_32 (digest_ptr[3]);
9037
9038 memcpy (hccap->keymic, digest_tmp, 16);
9039 }
9040 else
9041 {
9042 memcpy (hccap->keymic, digest_ptr, 16);
9043 }
9044 }
9045
9046 void SuspendThreads ()
9047 {
9048 if (data.devices_status == STATUS_RUNNING)
9049 {
9050 hc_timer_set (&data.timer_paused);
9051
9052 data.devices_status = STATUS_PAUSED;
9053
9054 log_info ("Paused");
9055 }
9056 }
9057
9058 void ResumeThreads ()
9059 {
9060 if (data.devices_status == STATUS_PAUSED)
9061 {
9062 double ms_paused;
9063
9064 hc_timer_get (data.timer_paused, ms_paused);
9065
9066 data.ms_paused += ms_paused;
9067
9068 data.devices_status = STATUS_RUNNING;
9069
9070 log_info ("Resumed");
9071 }
9072 }
9073
9074 void bypass ()
9075 {
9076 if (data.devices_status != STATUS_RUNNING) return;
9077
9078 data.devices_status = STATUS_BYPASS;
9079
9080 log_info ("Next dictionary / mask in queue selected, bypassing current one");
9081 }
9082
9083 void stop_at_checkpoint ()
9084 {
9085 if (data.devices_status != STATUS_STOP_AT_CHECKPOINT)
9086 {
9087 if (data.devices_status != STATUS_RUNNING) return;
9088 }
9089
9090 // this feature only makes sense if --restore-disable was not specified
9091
9092 if (data.restore_disable == 1)
9093 {
9094 log_info ("WARNING: this feature is disabled when --restore-disable was specified");
9095
9096 return;
9097 }
9098
9099 // check if monitoring of Restore Point updates should be enabled or disabled
9100
9101 if (data.devices_status != STATUS_STOP_AT_CHECKPOINT)
9102 {
9103 data.devices_status = STATUS_STOP_AT_CHECKPOINT;
9104
9105 // save the current restore point value
9106
9107 data.checkpoint_cur_words = get_lowest_words_done ();
9108
9109 log_info ("Checkpoint enabled: will quit at next Restore Point update");
9110 }
9111 else
9112 {
9113 data.devices_status = STATUS_RUNNING;
9114
9115 // reset the global value for checkpoint checks
9116
9117 data.checkpoint_cur_words = 0;
9118
9119 log_info ("Checkpoint disabled: Restore Point updates will no longer be monitored");
9120 }
9121 }
9122
9123 void myabort ()
9124 {
9125 if (data.devices_status == STATUS_INIT) return;
9126 if (data.devices_status == STATUS_STARTING) return;
9127
9128 data.devices_status = STATUS_ABORTED;
9129 }
9130
9131 void myquit ()
9132 {
9133 if (data.devices_status == STATUS_INIT) return;
9134 if (data.devices_status == STATUS_STARTING) return;
9135
9136 data.devices_status = STATUS_QUIT;
9137 }
9138
9139 void load_kernel (const char *kernel_file, int num_devices, size_t *kernel_lengths, const u8 **kernel_sources)
9140 {
9141 FILE *fp = fopen (kernel_file, "rb");
9142
9143 if (fp != NULL)
9144 {
9145 struct stat st;
9146
9147 memset (&st, 0, sizeof (st));
9148
9149 stat (kernel_file, &st);
9150
9151 u8 *buf = (u8 *) mymalloc (st.st_size + 1);
9152
9153 size_t num_read = fread (buf, sizeof (u8), st.st_size, fp);
9154
9155 if (num_read != (size_t) st.st_size)
9156 {
9157 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
9158
9159 exit (-1);
9160 }
9161
9162 fclose (fp);
9163
9164 buf[st.st_size] = 0;
9165
9166 for (int i = 0; i < num_devices; i++)
9167 {
9168 kernel_lengths[i] = (size_t) st.st_size;
9169
9170 kernel_sources[i] = buf;
9171 }
9172 }
9173 else
9174 {
9175 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
9176
9177 exit (-1);
9178 }
9179
9180 return;
9181 }
9182
9183 void writeProgramBin (char *dst, u8 *binary, size_t binary_size)
9184 {
9185 if (binary_size > 0)
9186 {
9187 FILE *fp = fopen (dst, "wb");
9188
9189 lock_file (fp);
9190 fwrite (binary, sizeof (u8), binary_size, fp);
9191
9192 fflush (fp);
9193 fclose (fp);
9194 }
9195 }
9196
9197 /**
9198 * restore
9199 */
9200
9201 restore_data_t *init_restore (int argc, char **argv)
9202 {
9203 restore_data_t *rd = (restore_data_t *) mymalloc (sizeof (restore_data_t));
9204
9205 if (data.restore_disable == 0)
9206 {
9207 FILE *fp = fopen (data.eff_restore_file, "rb");
9208
9209 if (fp)
9210 {
9211 size_t nread = fread (rd, sizeof (restore_data_t), 1, fp);
9212
9213 if (nread != 1)
9214 {
9215 log_error ("ERROR: cannot read %s", data.eff_restore_file);
9216
9217 exit (-1);
9218 }
9219
9220 fclose (fp);
9221
9222 if (rd->pid)
9223 {
9224 char *pidbin = (char *) mymalloc (HCBUFSIZ);
9225
9226 int pidbin_len = -1;
9227
9228 #ifdef _POSIX
9229 snprintf (pidbin, HCBUFSIZ - 1, "/proc/%d/cmdline", rd->pid);
9230
9231 FILE *fd = fopen (pidbin, "rb");
9232
9233 if (fd)
9234 {
9235 pidbin_len = fread (pidbin, 1, HCBUFSIZ, fd);
9236
9237 pidbin[pidbin_len] = 0;
9238
9239 fclose (fd);
9240
9241 char *argv0_r = strrchr (argv[0], '/');
9242
9243 char *pidbin_r = strrchr (pidbin, '/');
9244
9245 if (argv0_r == NULL) argv0_r = argv[0];
9246
9247 if (pidbin_r == NULL) pidbin_r = pidbin;
9248
9249 if (strcmp (argv0_r, pidbin_r) == 0)
9250 {
9251 log_error ("ERROR: already an instance %s running on pid %d", pidbin, rd->pid);
9252
9253 exit (-1);
9254 }
9255 }
9256
9257 #elif _WIN
9258 HANDLE hProcess = OpenProcess (PROCESS_ALL_ACCESS, FALSE, rd->pid);
9259
9260 char *pidbin2 = (char *) mymalloc (HCBUFSIZ);
9261
9262 int pidbin2_len = -1;
9263
9264 pidbin_len = GetModuleFileName (NULL, pidbin, HCBUFSIZ);
9265 pidbin2_len = GetModuleFileNameEx (hProcess, NULL, pidbin2, HCBUFSIZ);
9266
9267 pidbin[pidbin_len] = 0;
9268 pidbin2[pidbin2_len] = 0;
9269
9270 if (pidbin2_len)
9271 {
9272 if (strcmp (pidbin, pidbin2) == 0)
9273 {
9274 log_error ("ERROR: already an instance %s running on pid %d", pidbin2, rd->pid);
9275
9276 exit (-1);
9277 }
9278 }
9279
9280 myfree (pidbin2);
9281
9282 #endif
9283
9284 myfree (pidbin);
9285 }
9286
9287 if (rd->version_bin < RESTORE_MIN)
9288 {
9289 log_error ("ERROR: cannot use outdated %s. Please remove it.", data.eff_restore_file);
9290
9291 exit (-1);
9292 }
9293 }
9294 }
9295
9296 memset (rd, 0, sizeof (restore_data_t));
9297
9298 rd->version_bin = VERSION_BIN;
9299
9300 #ifdef _POSIX
9301 rd->pid = getpid ();
9302 #elif _WIN
9303 rd->pid = GetCurrentProcessId ();
9304 #endif
9305
9306 if (getcwd (rd->cwd, 255) == NULL)
9307 {
9308 myfree (rd);
9309
9310 return (NULL);
9311 }
9312
9313 rd->argc = argc;
9314 rd->argv = argv;
9315
9316 return (rd);
9317 }
9318
9319 void read_restore (const char *eff_restore_file, restore_data_t *rd)
9320 {
9321 FILE *fp = fopen (eff_restore_file, "rb");
9322
9323 if (fp == NULL)
9324 {
9325 log_error ("ERROR: restore file '%s': %s", eff_restore_file, strerror (errno));
9326
9327 exit (-1);
9328 }
9329
9330 if (fread (rd, sizeof (restore_data_t), 1, fp) != 1)
9331 {
9332 log_error ("ERROR: cannot read %s", eff_restore_file);
9333
9334 exit (-1);
9335 }
9336
9337 rd->argv = (char **) mycalloc (rd->argc, sizeof (char *));
9338
9339 char *buf = (char *) mymalloc (HCBUFSIZ);
9340
9341 for (uint i = 0; i < rd->argc; i++)
9342 {
9343 if (fgets (buf, HCBUFSIZ - 1, fp) == NULL)
9344 {
9345 log_error ("ERROR: cannot read %s", eff_restore_file);
9346
9347 exit (-1);
9348 }
9349
9350 size_t len = strlen (buf);
9351
9352 if (len) buf[len - 1] = 0;
9353
9354 rd->argv[i] = mystrdup (buf);
9355 }
9356
9357 myfree (buf);
9358
9359 fclose (fp);
9360
9361 log_info ("INFO: Changing current working directory to the path found within the .restore file: '%s'", rd->cwd);
9362
9363 if (chdir (rd->cwd))
9364 {
9365 log_error ("ERROR: The directory '%s' does not exist. It is needed to restore (--restore) the session.\n"
9366 " You could either create this directory (or link it) or update the .restore file using e.g. the analyze_hc_restore.pl tool:\n"
9367 " https://github.com/philsmd/analyze_hc_restore\n"
9368 " The directory must be relative to (or contain) all files/folders mentioned within the command line.", rd->cwd);
9369
9370 exit (-1);
9371 }
9372 }
9373
9374 u64 get_lowest_words_done ()
9375 {
9376 u64 words_cur = -1;
9377
9378 for (uint device_id = 0; device_id < data.devices_cnt; device_id++)
9379 {
9380 hc_device_param_t *device_param = &data.devices_param[device_id];
9381
9382 if (device_param->skipped) continue;
9383
9384 const u64 words_done = device_param->words_done;
9385
9386 if (words_done < words_cur) words_cur = words_done;
9387 }
9388
9389 // It's possible that a device's workload isn't finished right after a restore-case.
9390 // In that case, this function would return 0 and overwrite the real restore point
9391 // There's also data.words_cur which is set to rd->words_cur but it changes while
9392 // the attack is running therefore we should stick to rd->words_cur.
9393 // Note that -s influences rd->words_cur we should keep a close look on that.
9394
9395 if (words_cur < data.rd->words_cur) words_cur = data.rd->words_cur;
9396
9397 return words_cur;
9398 }
9399
9400 void write_restore (const char *new_restore_file, restore_data_t *rd)
9401 {
9402 u64 words_cur = get_lowest_words_done ();
9403
9404 rd->words_cur = words_cur;
9405
9406 FILE *fp = fopen (new_restore_file, "wb");
9407
9408 if (fp == NULL)
9409 {
9410 log_error ("ERROR: %s: %s", new_restore_file, strerror (errno));
9411
9412 exit (-1);
9413 }
9414
9415 if (setvbuf (fp, NULL, _IONBF, 0))
9416 {
9417 log_error ("ERROR: setvbuf file '%s': %s", new_restore_file, strerror (errno));
9418
9419 exit (-1);
9420 }
9421
9422 fwrite (rd, sizeof (restore_data_t), 1, fp);
9423
9424 for (uint i = 0; i < rd->argc; i++)
9425 {
9426 fprintf (fp, "%s", rd->argv[i]);
9427 fputc ('\n', fp);
9428 }
9429
9430 fflush (fp);
9431
9432 fsync (fileno (fp));
9433
9434 fclose (fp);
9435 }
9436
9437 void cycle_restore ()
9438 {
9439 const char *eff_restore_file = data.eff_restore_file;
9440 const char *new_restore_file = data.new_restore_file;
9441
9442 restore_data_t *rd = data.rd;
9443
9444 write_restore (new_restore_file, rd);
9445
9446 struct stat st;
9447
9448 memset (&st, 0, sizeof(st));
9449
9450 if (stat (eff_restore_file, &st) == 0)
9451 {
9452 if (unlink (eff_restore_file))
9453 {
9454 log_info ("WARN: unlink file '%s': %s", eff_restore_file, strerror (errno));
9455 }
9456 }
9457
9458 if (rename (new_restore_file, eff_restore_file))
9459 {
9460 log_info ("WARN: rename file '%s' to '%s': %s", new_restore_file, eff_restore_file, strerror (errno));
9461 }
9462 }
9463
9464 void check_checkpoint ()
9465 {
9466 // if (data.restore_disable == 1) break; (this is already implied by previous checks)
9467
9468 u64 words_cur = get_lowest_words_done ();
9469
9470 if (words_cur != data.checkpoint_cur_words)
9471 {
9472 myabort ();
9473 }
9474 }
9475
9476 /**
9477 * tuning db
9478 */
9479
9480 void tuning_db_destroy (tuning_db_t *tuning_db)
9481 {
9482 int i;
9483
9484 for (i = 0; i < tuning_db->alias_cnt; i++)
9485 {
9486 tuning_db_alias_t *alias = &tuning_db->alias_buf[i];
9487
9488 myfree (alias->device_name);
9489 myfree (alias->alias_name);
9490 }
9491
9492 for (i = 0; i < tuning_db->entry_cnt; i++)
9493 {
9494 tuning_db_entry_t *entry = &tuning_db->entry_buf[i];
9495
9496 myfree (entry->device_name);
9497 }
9498
9499 myfree (tuning_db->alias_buf);
9500 myfree (tuning_db->entry_buf);
9501
9502 myfree (tuning_db);
9503 }
9504
9505 tuning_db_t *tuning_db_alloc (FILE *fp)
9506 {
9507 tuning_db_t *tuning_db = (tuning_db_t *) mymalloc (sizeof (tuning_db_t));
9508
9509 int num_lines = count_lines (fp);
9510
9511 // a bit over-allocated
9512
9513 tuning_db->alias_buf = (tuning_db_alias_t *) mycalloc (num_lines + 1, sizeof (tuning_db_alias_t));
9514 tuning_db->alias_cnt = 0;
9515
9516 tuning_db->entry_buf = (tuning_db_entry_t *) mycalloc (num_lines + 1, sizeof (tuning_db_entry_t));
9517 tuning_db->entry_cnt = 0;
9518
9519 return tuning_db;
9520 }
9521
9522 tuning_db_t *tuning_db_init (const char *tuning_db_file)
9523 {
9524 FILE *fp = fopen (tuning_db_file, "rb");
9525
9526 if (fp == NULL)
9527 {
9528 log_error ("%s: %s", tuning_db_file, strerror (errno));
9529
9530 exit (-1);
9531 }
9532
9533 tuning_db_t *tuning_db = tuning_db_alloc (fp);
9534
9535 rewind (fp);
9536
9537 int line_num = 0;
9538
9539 char *buf = (char *) mymalloc (HCBUFSIZ);
9540
9541 while (!feof (fp))
9542 {
9543 char *line_buf = fgets (buf, HCBUFSIZ - 1, fp);
9544
9545 if (line_buf == NULL) break;
9546
9547 line_num++;
9548
9549 const int line_len = in_superchop (line_buf);
9550
9551 if (line_len == 0) continue;
9552
9553 if (line_buf[0] == '#') continue;
9554
9555 // start processing
9556
9557 char *token_ptr[7] = { NULL };
9558
9559 int token_cnt = 0;
9560
9561 char *next = strtok (line_buf, "\t ");
9562
9563 token_ptr[token_cnt] = next;
9564
9565 token_cnt++;
9566
9567 while ((next = strtok (NULL, "\t ")) != NULL)
9568 {
9569 token_ptr[token_cnt] = next;
9570
9571 token_cnt++;
9572 }
9573
9574 if (token_cnt == 2)
9575 {
9576 char *device_name = token_ptr[0];
9577 char *alias_name = token_ptr[1];
9578
9579 tuning_db_alias_t *alias = &tuning_db->alias_buf[tuning_db->alias_cnt];
9580
9581 alias->device_name = mystrdup (device_name);
9582 alias->alias_name = mystrdup (alias_name);
9583
9584 tuning_db->alias_cnt++;
9585 }
9586 else if (token_cnt == 6)
9587 {
9588 if ((token_ptr[1][0] != '0') &&
9589 (token_ptr[1][0] != '1') &&
9590 (token_ptr[1][0] != '3') &&
9591 (token_ptr[1][0] != '*'))
9592 {
9593 log_info ("WARNING: Tuning-db: Invalid attack_mode '%c' in Line '%u'", token_ptr[1][0], line_num);
9594
9595 continue;
9596 }
9597
9598 if ((token_ptr[3][0] != '1') &&
9599 (token_ptr[3][0] != '2') &&
9600 (token_ptr[3][0] != '4') &&
9601 (token_ptr[3][0] != '8') &&
9602 (token_ptr[3][0] != 'N'))
9603 {
9604 log_info ("WARNING: Tuning-db: Invalid vector_width '%c' in Line '%u'", token_ptr[3][0], line_num);
9605
9606 continue;
9607 }
9608
9609 char *device_name = token_ptr[0];
9610
9611 int attack_mode = -1;
9612 int hash_type = -1;
9613 int vector_width = -1;
9614 int kernel_accel = -1;
9615 int kernel_loops = -1;
9616
9617 if (token_ptr[1][0] != '*') attack_mode = atoi (token_ptr[1]);
9618 if (token_ptr[2][0] != '*') hash_type = atoi (token_ptr[2]);
9619 if (token_ptr[3][0] != 'N') vector_width = atoi (token_ptr[3]);
9620
9621 if (token_ptr[4][0] != 'A')
9622 {
9623 kernel_accel = atoi (token_ptr[4]);
9624
9625 if ((kernel_accel < 1) || (kernel_accel > 1024))
9626 {
9627 log_info ("WARNING: Tuning-db: Invalid kernel_accel '%d' in Line '%u'", kernel_accel, line_num);
9628
9629 continue;
9630 }
9631 }
9632 else
9633 {
9634 kernel_accel = 0;
9635 }
9636
9637 if (token_ptr[5][0] != 'A')
9638 {
9639 kernel_loops = atoi (token_ptr[5]);
9640
9641 if ((kernel_loops < 1) || (kernel_loops > 1024))
9642 {
9643 log_info ("WARNING: Tuning-db: Invalid kernel_loops '%d' in Line '%u'", kernel_loops, line_num);
9644
9645 continue;
9646 }
9647 }
9648 else
9649 {
9650 kernel_loops = 0;
9651 }
9652
9653 tuning_db_entry_t *entry = &tuning_db->entry_buf[tuning_db->entry_cnt];
9654
9655 entry->device_name = mystrdup (device_name);
9656 entry->attack_mode = attack_mode;
9657 entry->hash_type = hash_type;
9658 entry->vector_width = vector_width;
9659 entry->kernel_accel = kernel_accel;
9660 entry->kernel_loops = kernel_loops;
9661
9662 tuning_db->entry_cnt++;
9663 }
9664 else
9665 {
9666 log_info ("WARNING: Tuning-db: Invalid number of token in Line '%u'", line_num);
9667
9668 continue;
9669 }
9670 }
9671
9672 myfree (buf);
9673
9674 fclose (fp);
9675
9676 // todo: print loaded 'cnt' message
9677
9678 // sort the database
9679
9680 qsort (tuning_db->alias_buf, tuning_db->alias_cnt, sizeof (tuning_db_alias_t), sort_by_tuning_db_alias);
9681 qsort (tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry);
9682
9683 return tuning_db;
9684 }
9685
9686 tuning_db_entry_t *tuning_db_search (tuning_db_t *tuning_db, hc_device_param_t *device_param, int attack_mode, int hash_type)
9687 {
9688 static tuning_db_entry_t s;
9689
9690 // first we need to convert all spaces in the device_name to underscore
9691
9692 char *device_name_nospace = strdup (device_param->device_name);
9693
9694 int device_name_length = strlen (device_name_nospace);
9695
9696 int i;
9697
9698 for (i = 0; i < device_name_length; i++)
9699 {
9700 if (device_name_nospace[i] == ' ') device_name_nospace[i] = '_';
9701 }
9702
9703 // find out if there's an alias configured
9704
9705 tuning_db_alias_t a;
9706
9707 a.device_name = device_name_nospace;
9708
9709 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);
9710
9711 char *alias_name = (alias == NULL) ? NULL : alias->alias_name;
9712
9713 // attack-mode 6 and 7 are attack-mode 1 basically
9714
9715 if (attack_mode == 6) attack_mode = 1;
9716 if (attack_mode == 7) attack_mode = 1;
9717
9718 // bsearch is not ideal but fast enough
9719
9720 s.device_name = device_name_nospace;
9721 s.attack_mode = attack_mode;
9722 s.hash_type = hash_type;
9723
9724 tuning_db_entry_t *entry = NULL;
9725
9726 // this will produce all 2^3 combinations required
9727
9728 for (i = 0; i < 8; i++)
9729 {
9730 s.device_name = (i & 1) ? "*" : device_name_nospace;
9731 s.attack_mode = (i & 2) ? -1 : attack_mode;
9732 s.hash_type = (i & 4) ? -1 : hash_type;
9733
9734 entry = bsearch (&s, tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry);
9735
9736 if (entry != NULL) break;
9737
9738 // in non-wildcard mode do some additional checks:
9739
9740 if ((i & 1) == 0)
9741 {
9742 // in case we have an alias-name
9743
9744 if (alias_name != NULL)
9745 {
9746 s.device_name = alias_name;
9747
9748 entry = bsearch (&s, tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry);
9749
9750 if (entry != NULL) break;
9751 }
9752
9753 // or by device type
9754
9755 if (device_param->device_type & CL_DEVICE_TYPE_CPU)
9756 {
9757 s.device_name = "DEVICE_TYPE_CPU";
9758 }
9759 else if (device_param->device_type & CL_DEVICE_TYPE_GPU)
9760 {
9761 s.device_name = "DEVICE_TYPE_GPU";
9762 }
9763 else if (device_param->device_type & CL_DEVICE_TYPE_ACCELERATOR)
9764 {
9765 s.device_name = "DEVICE_TYPE_ACCELERATOR";
9766 }
9767
9768 entry = bsearch (&s, tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry);
9769
9770 if (entry != NULL) break;
9771 }
9772 }
9773
9774 // free converted device_name
9775
9776 myfree (device_name_nospace);
9777
9778 return entry;
9779 }
9780
9781 /**
9782 * parser
9783 */
9784
9785 uint parse_and_store_salt (char *out, char *in, uint salt_len)
9786 {
9787 u8 tmp[256] = { 0 };
9788
9789 if (salt_len > sizeof (tmp))
9790 {
9791 return UINT_MAX;
9792 }
9793
9794 memcpy (tmp, in, salt_len);
9795
9796 if (data.opts_type & OPTS_TYPE_ST_HEX)
9797 {
9798 if ((salt_len % 2) == 0)
9799 {
9800 u32 new_salt_len = salt_len / 2;
9801
9802 for (uint i = 0, j = 0; i < new_salt_len; i += 1, j += 2)
9803 {
9804 u8 p0 = tmp[j + 0];
9805 u8 p1 = tmp[j + 1];
9806
9807 tmp[i] = hex_convert (p1) << 0;
9808 tmp[i] |= hex_convert (p0) << 4;
9809 }
9810
9811 salt_len = new_salt_len;
9812 }
9813 else
9814 {
9815 return UINT_MAX;
9816 }
9817 }
9818 else if (data.opts_type & OPTS_TYPE_ST_BASE64)
9819 {
9820 salt_len = base64_decode (base64_to_int, (const u8 *) in, salt_len, (u8 *) tmp);
9821 }
9822
9823 memset (tmp + salt_len, 0, sizeof (tmp) - salt_len);
9824
9825 if (data.opts_type & OPTS_TYPE_ST_UNICODE)
9826 {
9827 if (salt_len < 20)
9828 {
9829 u32 *tmp_uint = (u32 *) tmp;
9830
9831 tmp_uint[9] = ((tmp_uint[4] >> 8) & 0x00FF0000) | ((tmp_uint[4] >> 16) & 0x000000FF);
9832 tmp_uint[8] = ((tmp_uint[4] << 8) & 0x00FF0000) | ((tmp_uint[4] >> 0) & 0x000000FF);
9833 tmp_uint[7] = ((tmp_uint[3] >> 8) & 0x00FF0000) | ((tmp_uint[3] >> 16) & 0x000000FF);
9834 tmp_uint[6] = ((tmp_uint[3] << 8) & 0x00FF0000) | ((tmp_uint[3] >> 0) & 0x000000FF);
9835 tmp_uint[5] = ((tmp_uint[2] >> 8) & 0x00FF0000) | ((tmp_uint[2] >> 16) & 0x000000FF);
9836 tmp_uint[4] = ((tmp_uint[2] << 8) & 0x00FF0000) | ((tmp_uint[2] >> 0) & 0x000000FF);
9837 tmp_uint[3] = ((tmp_uint[1] >> 8) & 0x00FF0000) | ((tmp_uint[1] >> 16) & 0x000000FF);
9838 tmp_uint[2] = ((tmp_uint[1] << 8) & 0x00FF0000) | ((tmp_uint[1] >> 0) & 0x000000FF);
9839 tmp_uint[1] = ((tmp_uint[0] >> 8) & 0x00FF0000) | ((tmp_uint[0] >> 16) & 0x000000FF);
9840 tmp_uint[0] = ((tmp_uint[0] << 8) & 0x00FF0000) | ((tmp_uint[0] >> 0) & 0x000000FF);
9841
9842 salt_len = salt_len * 2;
9843 }
9844 else
9845 {
9846 return UINT_MAX;
9847 }
9848 }
9849
9850 if (data.opts_type & OPTS_TYPE_ST_LOWER)
9851 {
9852 lowercase (tmp, salt_len);
9853 }
9854
9855 if (data.opts_type & OPTS_TYPE_ST_UPPER)
9856 {
9857 uppercase (tmp, salt_len);
9858 }
9859
9860 u32 len = salt_len;
9861
9862 if (data.opts_type & OPTS_TYPE_ST_ADD80)
9863 {
9864 tmp[len++] = 0x80;
9865 }
9866
9867 if (data.opts_type & OPTS_TYPE_ST_ADD01)
9868 {
9869 tmp[len++] = 0x01;
9870 }
9871
9872 if (data.opts_type & OPTS_TYPE_ST_GENERATE_LE)
9873 {
9874 u32 *tmp_uint = (uint *) tmp;
9875
9876 u32 max = len / 4;
9877
9878 if (len % 4) max++;
9879
9880 for (u32 i = 0; i < max; i++)
9881 {
9882 tmp_uint[i] = byte_swap_32 (tmp_uint[i]);
9883 }
9884
9885 // Important: we may need to increase the length of memcpy since
9886 // we don't want to "loose" some swapped bytes (could happen if
9887 // they do not perfectly fit in the 4-byte blocks)
9888 // Memcpy does always copy the bytes in the BE order, but since
9889 // we swapped them, some important bytes could be in positions
9890 // we normally skip with the original len
9891
9892 if (len % 4) len += 4 - (len % 4);
9893 }
9894
9895 memcpy (out, tmp, len);
9896
9897 return (salt_len);
9898 }
9899
9900 int bcrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9901 {
9902 if ((input_len < DISPLAY_LEN_MIN_3200) || (input_len > DISPLAY_LEN_MAX_3200)) return (PARSER_GLOBAL_LENGTH);
9903
9904 if ((memcmp (SIGNATURE_BCRYPT1, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT2, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT3, input_buf, 4))) return (PARSER_SIGNATURE_UNMATCHED);
9905
9906 u32 *digest = (u32 *) hash_buf->digest;
9907
9908 salt_t *salt = hash_buf->salt;
9909
9910 memcpy ((char *) salt->salt_sign, input_buf, 6);
9911
9912 char *iter_pos = input_buf + 4;
9913
9914 salt->salt_iter = 1 << atoi (iter_pos);
9915
9916 char *salt_pos = strchr (iter_pos, '$');
9917
9918 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9919
9920 salt_pos++;
9921
9922 uint salt_len = 16;
9923
9924 salt->salt_len = salt_len;
9925
9926 u8 tmp_buf[100] = { 0 };
9927
9928 base64_decode (bf64_to_int, (const u8 *) salt_pos, 22, tmp_buf);
9929
9930 char *salt_buf_ptr = (char *) salt->salt_buf;
9931
9932 memcpy (salt_buf_ptr, tmp_buf, 16);
9933
9934 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
9935 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
9936 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
9937 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
9938
9939 char *hash_pos = salt_pos + 22;
9940
9941 memset (tmp_buf, 0, sizeof (tmp_buf));
9942
9943 base64_decode (bf64_to_int, (const u8 *) hash_pos, 31, tmp_buf);
9944
9945 memcpy (digest, tmp_buf, 24);
9946
9947 digest[0] = byte_swap_32 (digest[0]);
9948 digest[1] = byte_swap_32 (digest[1]);
9949 digest[2] = byte_swap_32 (digest[2]);
9950 digest[3] = byte_swap_32 (digest[3]);
9951 digest[4] = byte_swap_32 (digest[4]);
9952 digest[5] = byte_swap_32 (digest[5]);
9953
9954 digest[5] &= ~0xff; // its just 23 not 24 !
9955
9956 return (PARSER_OK);
9957 }
9958
9959 int cisco4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9960 {
9961 if ((input_len < DISPLAY_LEN_MIN_5700) || (input_len > DISPLAY_LEN_MAX_5700)) return (PARSER_GLOBAL_LENGTH);
9962
9963 u32 *digest = (u32 *) hash_buf->digest;
9964
9965 u8 tmp_buf[100] = { 0 };
9966
9967 base64_decode (itoa64_to_int, (const u8 *) input_buf, 43, tmp_buf);
9968
9969 memcpy (digest, tmp_buf, 32);
9970
9971 digest[0] = byte_swap_32 (digest[0]);
9972 digest[1] = byte_swap_32 (digest[1]);
9973 digest[2] = byte_swap_32 (digest[2]);
9974 digest[3] = byte_swap_32 (digest[3]);
9975 digest[4] = byte_swap_32 (digest[4]);
9976 digest[5] = byte_swap_32 (digest[5]);
9977 digest[6] = byte_swap_32 (digest[6]);
9978 digest[7] = byte_swap_32 (digest[7]);
9979
9980 digest[0] -= SHA256M_A;
9981 digest[1] -= SHA256M_B;
9982 digest[2] -= SHA256M_C;
9983 digest[3] -= SHA256M_D;
9984 digest[4] -= SHA256M_E;
9985 digest[5] -= SHA256M_F;
9986 digest[6] -= SHA256M_G;
9987 digest[7] -= SHA256M_H;
9988
9989 return (PARSER_OK);
9990 }
9991
9992 int lm_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9993 {
9994 if ((input_len < DISPLAY_LEN_MIN_3000) || (input_len > DISPLAY_LEN_MAX_3000)) return (PARSER_GLOBAL_LENGTH);
9995
9996 u32 *digest = (u32 *) hash_buf->digest;
9997
9998 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
9999 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10000
10001 digest[0] = byte_swap_32 (digest[0]);
10002 digest[1] = byte_swap_32 (digest[1]);
10003
10004 uint tt;
10005
10006 IP (digest[0], digest[1], tt);
10007
10008 digest[0] = digest[0];
10009 digest[1] = digest[1];
10010 digest[2] = 0;
10011 digest[3] = 0;
10012
10013 return (PARSER_OK);
10014 }
10015
10016 int arubaos_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10017 {
10018 if ((input_len < DISPLAY_LEN_MIN_125) || (input_len > DISPLAY_LEN_MAX_125)) return (PARSER_GLOBAL_LENGTH);
10019
10020 if ((input_buf[8] != '0') || (input_buf[9] != '1')) return (PARSER_SIGNATURE_UNMATCHED);
10021
10022 u32 *digest = (u32 *) hash_buf->digest;
10023
10024 salt_t *salt = hash_buf->salt;
10025
10026 char *hash_pos = input_buf + 10;
10027
10028 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
10029 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
10030 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
10031 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
10032 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
10033
10034 digest[0] -= SHA1M_A;
10035 digest[1] -= SHA1M_B;
10036 digest[2] -= SHA1M_C;
10037 digest[3] -= SHA1M_D;
10038 digest[4] -= SHA1M_E;
10039
10040 uint salt_len = 10;
10041
10042 char *salt_buf_ptr = (char *) salt->salt_buf;
10043
10044 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
10045
10046 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10047
10048 salt->salt_len = salt_len;
10049
10050 return (PARSER_OK);
10051 }
10052
10053 int osx1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10054 {
10055 if ((input_len < DISPLAY_LEN_MIN_122) || (input_len > DISPLAY_LEN_MAX_122)) return (PARSER_GLOBAL_LENGTH);
10056
10057 u32 *digest = (u32 *) hash_buf->digest;
10058
10059 salt_t *salt = hash_buf->salt;
10060
10061 char *hash_pos = input_buf + 8;
10062
10063 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
10064 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
10065 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
10066 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
10067 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
10068
10069 digest[0] -= SHA1M_A;
10070 digest[1] -= SHA1M_B;
10071 digest[2] -= SHA1M_C;
10072 digest[3] -= SHA1M_D;
10073 digest[4] -= SHA1M_E;
10074
10075 uint salt_len = 8;
10076
10077 char *salt_buf_ptr = (char *) salt->salt_buf;
10078
10079 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
10080
10081 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10082
10083 salt->salt_len = salt_len;
10084
10085 return (PARSER_OK);
10086 }
10087
10088 int osx512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10089 {
10090 if ((input_len < DISPLAY_LEN_MIN_1722) || (input_len > DISPLAY_LEN_MAX_1722)) return (PARSER_GLOBAL_LENGTH);
10091
10092 u64 *digest = (u64 *) hash_buf->digest;
10093
10094 salt_t *salt = hash_buf->salt;
10095
10096 char *hash_pos = input_buf + 8;
10097
10098 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
10099 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
10100 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
10101 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
10102 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
10103 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
10104 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
10105 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
10106
10107 digest[0] -= SHA512M_A;
10108 digest[1] -= SHA512M_B;
10109 digest[2] -= SHA512M_C;
10110 digest[3] -= SHA512M_D;
10111 digest[4] -= SHA512M_E;
10112 digest[5] -= SHA512M_F;
10113 digest[6] -= SHA512M_G;
10114 digest[7] -= SHA512M_H;
10115
10116 uint salt_len = 8;
10117
10118 char *salt_buf_ptr = (char *) salt->salt_buf;
10119
10120 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
10121
10122 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10123
10124 salt->salt_len = salt_len;
10125
10126 return (PARSER_OK);
10127 }
10128
10129 int osc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10130 {
10131 if (data.opts_type & OPTS_TYPE_ST_HEX)
10132 {
10133 if ((input_len < DISPLAY_LEN_MIN_21H) || (input_len > DISPLAY_LEN_MAX_21H)) return (PARSER_GLOBAL_LENGTH);
10134 }
10135 else
10136 {
10137 if ((input_len < DISPLAY_LEN_MIN_21) || (input_len > DISPLAY_LEN_MAX_21)) return (PARSER_GLOBAL_LENGTH);
10138 }
10139
10140 u32 *digest = (u32 *) hash_buf->digest;
10141
10142 salt_t *salt = hash_buf->salt;
10143
10144 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10145 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10146 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10147 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10148
10149 digest[0] = byte_swap_32 (digest[0]);
10150 digest[1] = byte_swap_32 (digest[1]);
10151 digest[2] = byte_swap_32 (digest[2]);
10152 digest[3] = byte_swap_32 (digest[3]);
10153
10154 digest[0] -= MD5M_A;
10155 digest[1] -= MD5M_B;
10156 digest[2] -= MD5M_C;
10157 digest[3] -= MD5M_D;
10158
10159 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10160
10161 uint salt_len = input_len - 32 - 1;
10162
10163 char *salt_buf = input_buf + 32 + 1;
10164
10165 char *salt_buf_ptr = (char *) salt->salt_buf;
10166
10167 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10168
10169 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10170
10171 salt->salt_len = salt_len;
10172
10173 return (PARSER_OK);
10174 }
10175
10176 int netscreen_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10177 {
10178 if (data.opts_type & OPTS_TYPE_ST_HEX)
10179 {
10180 if ((input_len < DISPLAY_LEN_MIN_22H) || (input_len > DISPLAY_LEN_MAX_22H)) return (PARSER_GLOBAL_LENGTH);
10181 }
10182 else
10183 {
10184 if ((input_len < DISPLAY_LEN_MIN_22) || (input_len > DISPLAY_LEN_MAX_22)) return (PARSER_GLOBAL_LENGTH);
10185 }
10186
10187 // unscramble
10188
10189 char clean_input_buf[32] = { 0 };
10190
10191 char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' };
10192 int pos[6] = { 0, 6, 12, 17, 23, 29 };
10193
10194 for (int i = 0, j = 0, k = 0; i < 30; i++)
10195 {
10196 if (i == pos[j])
10197 {
10198 if (sig[j] != input_buf[i]) return (PARSER_SIGNATURE_UNMATCHED);
10199
10200 j++;
10201 }
10202 else
10203 {
10204 clean_input_buf[k] = input_buf[i];
10205
10206 k++;
10207 }
10208 }
10209
10210 // base64 decode
10211
10212 u32 *digest = (u32 *) hash_buf->digest;
10213
10214 salt_t *salt = hash_buf->salt;
10215
10216 u32 a, b, c, d, e, f;
10217
10218 a = base64_to_int (clean_input_buf[ 0] & 0x7f);
10219 b = base64_to_int (clean_input_buf[ 1] & 0x7f);
10220 c = base64_to_int (clean_input_buf[ 2] & 0x7f);
10221 d = base64_to_int (clean_input_buf[ 3] & 0x7f);
10222 e = base64_to_int (clean_input_buf[ 4] & 0x7f);
10223 f = base64_to_int (clean_input_buf[ 5] & 0x7f);
10224
10225 digest[0] = (((a << 12) | (b << 6) | (c)) << 16)
10226 | (((d << 12) | (e << 6) | (f)) << 0);
10227
10228 a = base64_to_int (clean_input_buf[ 6] & 0x7f);
10229 b = base64_to_int (clean_input_buf[ 7] & 0x7f);
10230 c = base64_to_int (clean_input_buf[ 8] & 0x7f);
10231 d = base64_to_int (clean_input_buf[ 9] & 0x7f);
10232 e = base64_to_int (clean_input_buf[10] & 0x7f);
10233 f = base64_to_int (clean_input_buf[11] & 0x7f);
10234
10235 digest[1] = (((a << 12) | (b << 6) | (c)) << 16)
10236 | (((d << 12) | (e << 6) | (f)) << 0);
10237
10238 a = base64_to_int (clean_input_buf[12] & 0x7f);
10239 b = base64_to_int (clean_input_buf[13] & 0x7f);
10240 c = base64_to_int (clean_input_buf[14] & 0x7f);
10241 d = base64_to_int (clean_input_buf[15] & 0x7f);
10242 e = base64_to_int (clean_input_buf[16] & 0x7f);
10243 f = base64_to_int (clean_input_buf[17] & 0x7f);
10244
10245 digest[2] = (((a << 12) | (b << 6) | (c)) << 16)
10246 | (((d << 12) | (e << 6) | (f)) << 0);
10247
10248 a = base64_to_int (clean_input_buf[18] & 0x7f);
10249 b = base64_to_int (clean_input_buf[19] & 0x7f);
10250 c = base64_to_int (clean_input_buf[20] & 0x7f);
10251 d = base64_to_int (clean_input_buf[21] & 0x7f);
10252 e = base64_to_int (clean_input_buf[22] & 0x7f);
10253 f = base64_to_int (clean_input_buf[23] & 0x7f);
10254
10255 digest[3] = (((a << 12) | (b << 6) | (c)) << 16)
10256 | (((d << 12) | (e << 6) | (f)) << 0);
10257
10258 digest[0] = byte_swap_32 (digest[0]);
10259 digest[1] = byte_swap_32 (digest[1]);
10260 digest[2] = byte_swap_32 (digest[2]);
10261 digest[3] = byte_swap_32 (digest[3]);
10262
10263 digest[0] -= MD5M_A;
10264 digest[1] -= MD5M_B;
10265 digest[2] -= MD5M_C;
10266 digest[3] -= MD5M_D;
10267
10268 if (input_buf[30] != ':') return (PARSER_SEPARATOR_UNMATCHED);
10269
10270 uint salt_len = input_len - 30 - 1;
10271
10272 char *salt_buf = input_buf + 30 + 1;
10273
10274 char *salt_buf_ptr = (char *) salt->salt_buf;
10275
10276 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10277
10278 // max. salt length: 55 (max for MD5) - 22 (":Administration Tools:") - 1 (0x80) = 32
10279 // 32 - 4 bytes (to fit w0lr for all attack modes) = 28
10280
10281 if (salt_len > 28) return (PARSER_SALT_LENGTH);
10282
10283 salt->salt_len = salt_len;
10284
10285 memcpy (salt_buf_ptr + salt_len, ":Administration Tools:", 22);
10286
10287 salt->salt_len += 22;
10288
10289 return (PARSER_OK);
10290 }
10291
10292 int smf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10293 {
10294 if (data.opts_type & OPTS_TYPE_ST_HEX)
10295 {
10296 if ((input_len < DISPLAY_LEN_MIN_121H) || (input_len > DISPLAY_LEN_MAX_121H)) return (PARSER_GLOBAL_LENGTH);
10297 }
10298 else
10299 {
10300 if ((input_len < DISPLAY_LEN_MIN_121) || (input_len > DISPLAY_LEN_MAX_121)) return (PARSER_GLOBAL_LENGTH);
10301 }
10302
10303 u32 *digest = (u32 *) hash_buf->digest;
10304
10305 salt_t *salt = hash_buf->salt;
10306
10307 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10308 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10309 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10310 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10311 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
10312
10313 digest[0] -= SHA1M_A;
10314 digest[1] -= SHA1M_B;
10315 digest[2] -= SHA1M_C;
10316 digest[3] -= SHA1M_D;
10317 digest[4] -= SHA1M_E;
10318
10319 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10320
10321 uint salt_len = input_len - 40 - 1;
10322
10323 char *salt_buf = input_buf + 40 + 1;
10324
10325 char *salt_buf_ptr = (char *) salt->salt_buf;
10326
10327 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10328
10329 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10330
10331 salt->salt_len = salt_len;
10332
10333 return (PARSER_OK);
10334 }
10335
10336 int dcc2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10337 {
10338 if (data.opts_type & OPTS_TYPE_ST_HEX)
10339 {
10340 if ((input_len < DISPLAY_LEN_MIN_2100H) || (input_len > DISPLAY_LEN_MAX_2100H)) return (PARSER_GLOBAL_LENGTH);
10341 }
10342 else
10343 {
10344 if ((input_len < DISPLAY_LEN_MIN_2100) || (input_len > DISPLAY_LEN_MAX_2100)) return (PARSER_GLOBAL_LENGTH);
10345 }
10346
10347 if (memcmp (SIGNATURE_DCC2, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
10348
10349 char *iter_pos = input_buf + 6;
10350
10351 salt_t *salt = hash_buf->salt;
10352
10353 uint iter = atoi (iter_pos);
10354
10355 if (iter < 1)
10356 {
10357 iter = ROUNDS_DCC2;
10358 }
10359
10360 salt->salt_iter = iter - 1;
10361
10362 char *salt_pos = strchr (iter_pos, '#');
10363
10364 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10365
10366 salt_pos++;
10367
10368 char *digest_pos = strchr (salt_pos, '#');
10369
10370 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10371
10372 digest_pos++;
10373
10374 uint salt_len = digest_pos - salt_pos - 1;
10375
10376 u32 *digest = (u32 *) hash_buf->digest;
10377
10378 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
10379 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
10380 digest[2] = hex_to_u32 ((const u8 *) &digest_pos[16]);
10381 digest[3] = hex_to_u32 ((const u8 *) &digest_pos[24]);
10382
10383 char *salt_buf_ptr = (char *) salt->salt_buf;
10384
10385 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
10386
10387 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10388
10389 salt->salt_len = salt_len;
10390
10391 return (PARSER_OK);
10392 }
10393
10394 int wpa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10395 {
10396 u32 *digest = (u32 *) hash_buf->digest;
10397
10398 salt_t *salt = hash_buf->salt;
10399
10400 wpa_t *wpa = (wpa_t *) hash_buf->esalt;
10401
10402 hccap_t in;
10403
10404 memcpy (&in, input_buf, input_len);
10405
10406 if (in.eapol_size < 1 || in.eapol_size > 255) return (PARSER_HCCAP_EAPOL_SIZE);
10407
10408 memcpy (digest, in.keymic, 16);
10409
10410 /*
10411 http://www.one-net.eu/jsw/j_sec/m_ptype.html
10412 The phrase "Pairwise key expansion"
10413 Access Point Address (referred to as Authenticator Address AA)
10414 Supplicant Address (referred to as Supplicant Address SA)
10415 Access Point Nonce (referred to as Authenticator Anonce)
10416 Wireless Device Nonce (referred to as Supplicant Nonce Snonce)
10417 */
10418
10419 uint salt_len = strlen (in.essid);
10420
10421 if (salt_len > 36)
10422 {
10423 log_info ("WARNING: the length of the ESSID is too long. The hccap file may be invalid or corrupted");
10424
10425 return (PARSER_SALT_LENGTH);
10426 }
10427
10428 memcpy (salt->salt_buf, in.essid, salt_len);
10429
10430 salt->salt_len = salt_len;
10431
10432 salt->salt_iter = ROUNDS_WPA2 - 1;
10433
10434 unsigned char *pke_ptr = (unsigned char *) wpa->pke;
10435
10436 memcpy (pke_ptr, "Pairwise key expansion", 23);
10437
10438 if (memcmp (in.mac1, in.mac2, 6) < 0)
10439 {
10440 memcpy (pke_ptr + 23, in.mac1, 6);
10441 memcpy (pke_ptr + 29, in.mac2, 6);
10442 }
10443 else
10444 {
10445 memcpy (pke_ptr + 23, in.mac2, 6);
10446 memcpy (pke_ptr + 29, in.mac1, 6);
10447 }
10448
10449 if (memcmp (in.nonce1, in.nonce2, 32) < 0)
10450 {
10451 memcpy (pke_ptr + 35, in.nonce1, 32);
10452 memcpy (pke_ptr + 67, in.nonce2, 32);
10453 }
10454 else
10455 {
10456 memcpy (pke_ptr + 35, in.nonce2, 32);
10457 memcpy (pke_ptr + 67, in.nonce1, 32);
10458 }
10459
10460 for (int i = 0; i < 25; i++)
10461 {
10462 wpa->pke[i] = byte_swap_32 (wpa->pke[i]);
10463 }
10464
10465 memcpy (wpa->orig_mac1, in.mac1, 6);
10466 memcpy (wpa->orig_mac2, in.mac2, 6);
10467 memcpy (wpa->orig_nonce1, in.nonce1, 32);
10468 memcpy (wpa->orig_nonce2, in.nonce2, 32);
10469
10470 wpa->keyver = in.keyver;
10471
10472 if (wpa->keyver > 255)
10473 {
10474 log_info ("ATTENTION!");
10475 log_info (" The WPA/WPA2 key version in your .hccap file is invalid!");
10476 log_info (" This could be due to a recent aircrack-ng bug.");
10477 log_info (" The key version was automatically reset to a reasonable value.");
10478 log_info ("");
10479
10480 wpa->keyver &= 0xff;
10481 }
10482
10483 wpa->eapol_size = in.eapol_size;
10484
10485 unsigned char *eapol_ptr = (unsigned char *) wpa->eapol;
10486
10487 memcpy (eapol_ptr, in.eapol, wpa->eapol_size);
10488
10489 memset (eapol_ptr + wpa->eapol_size, 0, 256 - wpa->eapol_size);
10490
10491 eapol_ptr[wpa->eapol_size] = (unsigned char) 0x80;
10492
10493 if (wpa->keyver == 1)
10494 {
10495 // nothing to do
10496 }
10497 else
10498 {
10499 digest[0] = byte_swap_32 (digest[0]);
10500 digest[1] = byte_swap_32 (digest[1]);
10501 digest[2] = byte_swap_32 (digest[2]);
10502 digest[3] = byte_swap_32 (digest[3]);
10503
10504 for (int i = 0; i < 64; i++)
10505 {
10506 wpa->eapol[i] = byte_swap_32 (wpa->eapol[i]);
10507 }
10508 }
10509
10510 uint32_t *p0 = (uint32_t *) in.essid;
10511 uint32_t c0 = 0;
10512 uint32_t c1 = 0;
10513
10514 for (uint i = 0; i < sizeof (in.essid) / sizeof (uint32_t); i++) c0 ^= *p0++;
10515 for (uint i = 0; i < sizeof (wpa->pke) / sizeof (wpa->pke[0]); i++) c1 ^= wpa->pke[i];
10516
10517 salt->salt_buf[10] = c0;
10518 salt->salt_buf[11] = c1;
10519
10520 return (PARSER_OK);
10521 }
10522
10523 int psafe2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10524 {
10525 u32 *digest = (u32 *) hash_buf->digest;
10526
10527 salt_t *salt = hash_buf->salt;
10528
10529 if (input_len == 0)
10530 {
10531 log_error ("Password Safe v2 container not specified");
10532
10533 exit (-1);
10534 }
10535
10536 FILE *fp = fopen (input_buf, "rb");
10537
10538 if (fp == NULL)
10539 {
10540 log_error ("%s: %s", input_buf, strerror (errno));
10541
10542 exit (-1);
10543 }
10544
10545 psafe2_hdr buf;
10546
10547 memset (&buf, 0, sizeof (psafe2_hdr));
10548
10549 int n = fread (&buf, sizeof (psafe2_hdr), 1, fp);
10550
10551 fclose (fp);
10552
10553 if (n != 1) return (PARSER_PSAFE2_FILE_SIZE);
10554
10555 salt->salt_buf[0] = buf.random[0];
10556 salt->salt_buf[1] = buf.random[1];
10557
10558 salt->salt_len = 8;
10559 salt->salt_iter = 1000;
10560
10561 digest[0] = byte_swap_32 (buf.hash[0]);
10562 digest[1] = byte_swap_32 (buf.hash[1]);
10563 digest[2] = byte_swap_32 (buf.hash[2]);
10564 digest[3] = byte_swap_32 (buf.hash[3]);
10565 digest[4] = byte_swap_32 (buf.hash[4]);
10566
10567 return (PARSER_OK);
10568 }
10569
10570 int psafe3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10571 {
10572 u32 *digest = (u32 *) hash_buf->digest;
10573
10574 salt_t *salt = hash_buf->salt;
10575
10576 if (input_len == 0)
10577 {
10578 log_error (".psafe3 not specified");
10579
10580 exit (-1);
10581 }
10582
10583 FILE *fp = fopen (input_buf, "rb");
10584
10585 if (fp == NULL)
10586 {
10587 log_error ("%s: %s", input_buf, strerror (errno));
10588
10589 exit (-1);
10590 }
10591
10592 psafe3_t in;
10593
10594 int n = fread (&in, sizeof (psafe3_t), 1, fp);
10595
10596 fclose (fp);
10597
10598 data.hashfile = input_buf; // we will need this in case it gets cracked
10599
10600 if (memcmp (SIGNATURE_PSAFE3, in.signature, 4)) return (PARSER_SIGNATURE_UNMATCHED);
10601
10602 if (n != 1) return (PARSER_PSAFE3_FILE_SIZE);
10603
10604 salt->salt_iter = in.iterations + 1;
10605
10606 salt->salt_buf[0] = in.salt_buf[0];
10607 salt->salt_buf[1] = in.salt_buf[1];
10608 salt->salt_buf[2] = in.salt_buf[2];
10609 salt->salt_buf[3] = in.salt_buf[3];
10610 salt->salt_buf[4] = in.salt_buf[4];
10611 salt->salt_buf[5] = in.salt_buf[5];
10612 salt->salt_buf[6] = in.salt_buf[6];
10613 salt->salt_buf[7] = in.salt_buf[7];
10614
10615 salt->salt_len = 32;
10616
10617 digest[0] = in.hash_buf[0];
10618 digest[1] = in.hash_buf[1];
10619 digest[2] = in.hash_buf[2];
10620 digest[3] = in.hash_buf[3];
10621 digest[4] = in.hash_buf[4];
10622 digest[5] = in.hash_buf[5];
10623 digest[6] = in.hash_buf[6];
10624 digest[7] = in.hash_buf[7];
10625
10626 digest[0] = byte_swap_32 (digest[0]);
10627 digest[1] = byte_swap_32 (digest[1]);
10628 digest[2] = byte_swap_32 (digest[2]);
10629 digest[3] = byte_swap_32 (digest[3]);
10630 digest[4] = byte_swap_32 (digest[4]);
10631 digest[5] = byte_swap_32 (digest[5]);
10632 digest[6] = byte_swap_32 (digest[6]);
10633 digest[7] = byte_swap_32 (digest[7]);
10634
10635 return (PARSER_OK);
10636 }
10637
10638 int phpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10639 {
10640 if ((input_len < DISPLAY_LEN_MIN_400) || (input_len > DISPLAY_LEN_MAX_400)) return (PARSER_GLOBAL_LENGTH);
10641
10642 if ((memcmp (SIGNATURE_PHPASS1, input_buf, 3)) && (memcmp (SIGNATURE_PHPASS2, input_buf, 3))) return (PARSER_SIGNATURE_UNMATCHED);
10643
10644 u32 *digest = (u32 *) hash_buf->digest;
10645
10646 salt_t *salt = hash_buf->salt;
10647
10648 char *iter_pos = input_buf + 3;
10649
10650 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
10651
10652 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
10653
10654 memcpy ((char *) salt->salt_sign, input_buf, 4);
10655
10656 salt->salt_iter = salt_iter;
10657
10658 char *salt_pos = iter_pos + 1;
10659
10660 uint salt_len = 8;
10661
10662 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10663
10664 salt->salt_len = salt_len;
10665
10666 char *hash_pos = salt_pos + salt_len;
10667
10668 phpass_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10669
10670 return (PARSER_OK);
10671 }
10672
10673 int md5crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10674 {
10675 if (input_len < DISPLAY_LEN_MIN_500) return (PARSER_GLOBAL_LENGTH);
10676
10677 if (memcmp (SIGNATURE_MD5CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
10678
10679 u32 *digest = (u32 *) hash_buf->digest;
10680
10681 salt_t *salt = hash_buf->salt;
10682
10683 char *salt_pos = input_buf + 3;
10684
10685 uint iterations_len = 0;
10686
10687 if (memcmp (salt_pos, "rounds=", 7) == 0)
10688 {
10689 salt_pos += 7;
10690
10691 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10692
10693 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10694 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10695
10696 salt_pos[0] = 0x0;
10697
10698 salt->salt_iter = atoi (salt_pos - iterations_len);
10699
10700 salt_pos += 1;
10701
10702 iterations_len += 8;
10703 }
10704 else
10705 {
10706 salt->salt_iter = ROUNDS_MD5CRYPT;
10707 }
10708
10709 if (input_len > (DISPLAY_LEN_MAX_500 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
10710
10711 char *hash_pos = strchr (salt_pos, '$');
10712
10713 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10714
10715 uint salt_len = hash_pos - salt_pos;
10716
10717 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10718
10719 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10720
10721 salt->salt_len = salt_len;
10722
10723 hash_pos++;
10724
10725 uint hash_len = input_len - 3 - iterations_len - salt_len - 1;
10726
10727 if (hash_len != 22) return (PARSER_HASH_LENGTH);
10728
10729 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10730
10731 return (PARSER_OK);
10732 }
10733
10734 int md5apr1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10735 {
10736 if (memcmp (SIGNATURE_MD5APR1, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
10737
10738 u32 *digest = (u32 *) hash_buf->digest;
10739
10740 salt_t *salt = hash_buf->salt;
10741
10742 char *salt_pos = input_buf + 6;
10743
10744 uint iterations_len = 0;
10745
10746 if (memcmp (salt_pos, "rounds=", 7) == 0)
10747 {
10748 salt_pos += 7;
10749
10750 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10751
10752 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10753 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10754
10755 salt_pos[0] = 0x0;
10756
10757 salt->salt_iter = atoi (salt_pos - iterations_len);
10758
10759 salt_pos += 1;
10760
10761 iterations_len += 8;
10762 }
10763 else
10764 {
10765 salt->salt_iter = ROUNDS_MD5CRYPT;
10766 }
10767
10768 if ((input_len < DISPLAY_LEN_MIN_1600) || (input_len > DISPLAY_LEN_MAX_1600 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
10769
10770 char *hash_pos = strchr (salt_pos, '$');
10771
10772 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10773
10774 uint salt_len = hash_pos - salt_pos;
10775
10776 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10777
10778 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10779
10780 salt->salt_len = salt_len;
10781
10782 hash_pos++;
10783
10784 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10785
10786 return (PARSER_OK);
10787 }
10788
10789 int episerver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10790 {
10791 if ((input_len < DISPLAY_LEN_MIN_141) || (input_len > DISPLAY_LEN_MAX_141)) return (PARSER_GLOBAL_LENGTH);
10792
10793 if (memcmp (SIGNATURE_EPISERVER, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
10794
10795 u32 *digest = (u32 *) hash_buf->digest;
10796
10797 salt_t *salt = hash_buf->salt;
10798
10799 char *salt_pos = input_buf + 14;
10800
10801 char *hash_pos = strchr (salt_pos, '*');
10802
10803 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10804
10805 hash_pos++;
10806
10807 uint salt_len = hash_pos - salt_pos - 1;
10808
10809 char *salt_buf_ptr = (char *) salt->salt_buf;
10810
10811 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
10812
10813 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10814
10815 salt->salt_len = salt_len;
10816
10817 u8 tmp_buf[100] = { 0 };
10818
10819 base64_decode (base64_to_int, (const u8 *) hash_pos, 27, tmp_buf);
10820
10821 memcpy (digest, tmp_buf, 20);
10822
10823 digest[0] = byte_swap_32 (digest[0]);
10824 digest[1] = byte_swap_32 (digest[1]);
10825 digest[2] = byte_swap_32 (digest[2]);
10826 digest[3] = byte_swap_32 (digest[3]);
10827 digest[4] = byte_swap_32 (digest[4]);
10828
10829 digest[0] -= SHA1M_A;
10830 digest[1] -= SHA1M_B;
10831 digest[2] -= SHA1M_C;
10832 digest[3] -= SHA1M_D;
10833 digest[4] -= SHA1M_E;
10834
10835 return (PARSER_OK);
10836 }
10837
10838 int descrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10839 {
10840 if ((input_len < DISPLAY_LEN_MIN_1500) || (input_len > DISPLAY_LEN_MAX_1500)) return (PARSER_GLOBAL_LENGTH);
10841
10842 unsigned char c12 = itoa64_to_int (input_buf[12]);
10843
10844 if (c12 & 3) return (PARSER_HASH_VALUE);
10845
10846 u32 *digest = (u32 *) hash_buf->digest;
10847
10848 salt_t *salt = hash_buf->salt;
10849
10850 // for ascii_digest
10851 salt->salt_sign[0] = input_buf[0];
10852 salt->salt_sign[1] = input_buf[1];
10853
10854 salt->salt_buf[0] = itoa64_to_int (input_buf[0])
10855 | itoa64_to_int (input_buf[1]) << 6;
10856
10857 salt->salt_len = 2;
10858
10859 u8 tmp_buf[100] = { 0 };
10860
10861 base64_decode (itoa64_to_int, (const u8 *) input_buf + 2, 11, tmp_buf);
10862
10863 memcpy (digest, tmp_buf, 8);
10864
10865 uint tt;
10866
10867 IP (digest[0], digest[1], tt);
10868
10869 digest[2] = 0;
10870 digest[3] = 0;
10871
10872 return (PARSER_OK);
10873 }
10874
10875 int md4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10876 {
10877 if ((input_len < DISPLAY_LEN_MIN_900) || (input_len > DISPLAY_LEN_MAX_900)) return (PARSER_GLOBAL_LENGTH);
10878
10879 u32 *digest = (u32 *) hash_buf->digest;
10880
10881 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10882 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10883 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10884 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10885
10886 digest[0] = byte_swap_32 (digest[0]);
10887 digest[1] = byte_swap_32 (digest[1]);
10888 digest[2] = byte_swap_32 (digest[2]);
10889 digest[3] = byte_swap_32 (digest[3]);
10890
10891 digest[0] -= MD4M_A;
10892 digest[1] -= MD4M_B;
10893 digest[2] -= MD4M_C;
10894 digest[3] -= MD4M_D;
10895
10896 return (PARSER_OK);
10897 }
10898
10899 int md4s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10900 {
10901 if (data.opts_type & OPTS_TYPE_ST_HEX)
10902 {
10903 if ((input_len < DISPLAY_LEN_MIN_910H) || (input_len > DISPLAY_LEN_MAX_910H)) return (PARSER_GLOBAL_LENGTH);
10904 }
10905 else
10906 {
10907 if ((input_len < DISPLAY_LEN_MIN_910) || (input_len > DISPLAY_LEN_MAX_910)) return (PARSER_GLOBAL_LENGTH);
10908 }
10909
10910 u32 *digest = (u32 *) hash_buf->digest;
10911
10912 salt_t *salt = hash_buf->salt;
10913
10914 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10915 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10916 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10917 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10918
10919 digest[0] = byte_swap_32 (digest[0]);
10920 digest[1] = byte_swap_32 (digest[1]);
10921 digest[2] = byte_swap_32 (digest[2]);
10922 digest[3] = byte_swap_32 (digest[3]);
10923
10924 digest[0] -= MD4M_A;
10925 digest[1] -= MD4M_B;
10926 digest[2] -= MD4M_C;
10927 digest[3] -= MD4M_D;
10928
10929 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10930
10931 uint salt_len = input_len - 32 - 1;
10932
10933 char *salt_buf = input_buf + 32 + 1;
10934
10935 char *salt_buf_ptr = (char *) salt->salt_buf;
10936
10937 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10938
10939 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10940
10941 salt->salt_len = salt_len;
10942
10943 return (PARSER_OK);
10944 }
10945
10946 int md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10947 {
10948 if ((input_len < DISPLAY_LEN_MIN_0) || (input_len > DISPLAY_LEN_MAX_0)) return (PARSER_GLOBAL_LENGTH);
10949
10950 u32 *digest = (u32 *) hash_buf->digest;
10951
10952 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10953 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10954 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10955 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10956
10957 digest[0] = byte_swap_32 (digest[0]);
10958 digest[1] = byte_swap_32 (digest[1]);
10959 digest[2] = byte_swap_32 (digest[2]);
10960 digest[3] = byte_swap_32 (digest[3]);
10961
10962 digest[0] -= MD5M_A;
10963 digest[1] -= MD5M_B;
10964 digest[2] -= MD5M_C;
10965 digest[3] -= MD5M_D;
10966
10967 return (PARSER_OK);
10968 }
10969
10970 int md5half_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10971 {
10972 if ((input_len < DISPLAY_LEN_MIN_5100) || (input_len > DISPLAY_LEN_MAX_5100)) return (PARSER_GLOBAL_LENGTH);
10973
10974 u32 *digest = (u32 *) hash_buf->digest;
10975
10976 digest[0] = hex_to_u32 ((const u8 *) &input_buf[0]);
10977 digest[1] = hex_to_u32 ((const u8 *) &input_buf[8]);
10978 digest[2] = 0;
10979 digest[3] = 0;
10980
10981 digest[0] = byte_swap_32 (digest[0]);
10982 digest[1] = byte_swap_32 (digest[1]);
10983
10984 return (PARSER_OK);
10985 }
10986
10987 int md5s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10988 {
10989 if (data.opts_type & OPTS_TYPE_ST_HEX)
10990 {
10991 if ((input_len < DISPLAY_LEN_MIN_10H) || (input_len > DISPLAY_LEN_MAX_10H)) return (PARSER_GLOBAL_LENGTH);
10992 }
10993 else
10994 {
10995 if ((input_len < DISPLAY_LEN_MIN_10) || (input_len > DISPLAY_LEN_MAX_10)) return (PARSER_GLOBAL_LENGTH);
10996 }
10997
10998 u32 *digest = (u32 *) hash_buf->digest;
10999
11000 salt_t *salt = hash_buf->salt;
11001
11002 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11003 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11004 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11005 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11006
11007 digest[0] = byte_swap_32 (digest[0]);
11008 digest[1] = byte_swap_32 (digest[1]);
11009 digest[2] = byte_swap_32 (digest[2]);
11010 digest[3] = byte_swap_32 (digest[3]);
11011
11012 digest[0] -= MD5M_A;
11013 digest[1] -= MD5M_B;
11014 digest[2] -= MD5M_C;
11015 digest[3] -= MD5M_D;
11016
11017 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11018
11019 uint salt_len = input_len - 32 - 1;
11020
11021 char *salt_buf = input_buf + 32 + 1;
11022
11023 char *salt_buf_ptr = (char *) salt->salt_buf;
11024
11025 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11026
11027 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11028
11029 salt->salt_len = salt_len;
11030
11031 return (PARSER_OK);
11032 }
11033
11034 int md5pix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11035 {
11036 if ((input_len < DISPLAY_LEN_MIN_2400) || (input_len > DISPLAY_LEN_MAX_2400)) return (PARSER_GLOBAL_LENGTH);
11037
11038 u32 *digest = (u32 *) hash_buf->digest;
11039
11040 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
11041 | itoa64_to_int (input_buf[ 1]) << 6
11042 | itoa64_to_int (input_buf[ 2]) << 12
11043 | itoa64_to_int (input_buf[ 3]) << 18;
11044 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
11045 | itoa64_to_int (input_buf[ 5]) << 6
11046 | itoa64_to_int (input_buf[ 6]) << 12
11047 | itoa64_to_int (input_buf[ 7]) << 18;
11048 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
11049 | itoa64_to_int (input_buf[ 9]) << 6
11050 | itoa64_to_int (input_buf[10]) << 12
11051 | itoa64_to_int (input_buf[11]) << 18;
11052 digest[3] = itoa64_to_int (input_buf[12]) << 0
11053 | itoa64_to_int (input_buf[13]) << 6
11054 | itoa64_to_int (input_buf[14]) << 12
11055 | itoa64_to_int (input_buf[15]) << 18;
11056
11057 digest[0] -= MD5M_A;
11058 digest[1] -= MD5M_B;
11059 digest[2] -= MD5M_C;
11060 digest[3] -= MD5M_D;
11061
11062 digest[0] &= 0x00ffffff;
11063 digest[1] &= 0x00ffffff;
11064 digest[2] &= 0x00ffffff;
11065 digest[3] &= 0x00ffffff;
11066
11067 return (PARSER_OK);
11068 }
11069
11070 int md5asa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11071 {
11072 if (data.opts_type & OPTS_TYPE_ST_HEX)
11073 {
11074 if ((input_len < DISPLAY_LEN_MIN_2410H) || (input_len > DISPLAY_LEN_MAX_2410H)) return (PARSER_GLOBAL_LENGTH);
11075 }
11076 else
11077 {
11078 if ((input_len < DISPLAY_LEN_MIN_2410) || (input_len > DISPLAY_LEN_MAX_2410)) return (PARSER_GLOBAL_LENGTH);
11079 }
11080
11081 u32 *digest = (u32 *) hash_buf->digest;
11082
11083 salt_t *salt = hash_buf->salt;
11084
11085 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
11086 | itoa64_to_int (input_buf[ 1]) << 6
11087 | itoa64_to_int (input_buf[ 2]) << 12
11088 | itoa64_to_int (input_buf[ 3]) << 18;
11089 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
11090 | itoa64_to_int (input_buf[ 5]) << 6
11091 | itoa64_to_int (input_buf[ 6]) << 12
11092 | itoa64_to_int (input_buf[ 7]) << 18;
11093 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
11094 | itoa64_to_int (input_buf[ 9]) << 6
11095 | itoa64_to_int (input_buf[10]) << 12
11096 | itoa64_to_int (input_buf[11]) << 18;
11097 digest[3] = itoa64_to_int (input_buf[12]) << 0
11098 | itoa64_to_int (input_buf[13]) << 6
11099 | itoa64_to_int (input_buf[14]) << 12
11100 | itoa64_to_int (input_buf[15]) << 18;
11101
11102 digest[0] -= MD5M_A;
11103 digest[1] -= MD5M_B;
11104 digest[2] -= MD5M_C;
11105 digest[3] -= MD5M_D;
11106
11107 digest[0] &= 0x00ffffff;
11108 digest[1] &= 0x00ffffff;
11109 digest[2] &= 0x00ffffff;
11110 digest[3] &= 0x00ffffff;
11111
11112 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11113
11114 uint salt_len = input_len - 16 - 1;
11115
11116 char *salt_buf = input_buf + 16 + 1;
11117
11118 char *salt_buf_ptr = (char *) salt->salt_buf;
11119
11120 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11121
11122 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11123
11124 salt->salt_len = salt_len;
11125
11126 return (PARSER_OK);
11127 }
11128
11129 void transform_netntlmv1_key (const u8 *nthash, u8 *key)
11130 {
11131 key[0] = (nthash[0] >> 0);
11132 key[1] = (nthash[0] << 7) | (nthash[1] >> 1);
11133 key[2] = (nthash[1] << 6) | (nthash[2] >> 2);
11134 key[3] = (nthash[2] << 5) | (nthash[3] >> 3);
11135 key[4] = (nthash[3] << 4) | (nthash[4] >> 4);
11136 key[5] = (nthash[4] << 3) | (nthash[5] >> 5);
11137 key[6] = (nthash[5] << 2) | (nthash[6] >> 6);
11138 key[7] = (nthash[6] << 1);
11139
11140 key[0] |= 0x01;
11141 key[1] |= 0x01;
11142 key[2] |= 0x01;
11143 key[3] |= 0x01;
11144 key[4] |= 0x01;
11145 key[5] |= 0x01;
11146 key[6] |= 0x01;
11147 key[7] |= 0x01;
11148 }
11149
11150 int netntlmv1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11151 {
11152 if ((input_len < DISPLAY_LEN_MIN_5500) || (input_len > DISPLAY_LEN_MAX_5500)) return (PARSER_GLOBAL_LENGTH);
11153
11154 u32 *digest = (u32 *) hash_buf->digest;
11155
11156 salt_t *salt = hash_buf->salt;
11157
11158 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
11159
11160 /**
11161 * parse line
11162 */
11163
11164 char *user_pos = input_buf;
11165
11166 char *unused_pos = strchr (user_pos, ':');
11167
11168 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11169
11170 uint user_len = unused_pos - user_pos;
11171
11172 if (user_len > 60) return (PARSER_SALT_LENGTH);
11173
11174 unused_pos++;
11175
11176 char *domain_pos = strchr (unused_pos, ':');
11177
11178 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11179
11180 uint unused_len = domain_pos - unused_pos;
11181
11182 if (unused_len != 0) return (PARSER_SALT_LENGTH);
11183
11184 domain_pos++;
11185
11186 char *srvchall_pos = strchr (domain_pos, ':');
11187
11188 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11189
11190 uint domain_len = srvchall_pos - domain_pos;
11191
11192 if (domain_len > 45) return (PARSER_SALT_LENGTH);
11193
11194 srvchall_pos++;
11195
11196 char *hash_pos = strchr (srvchall_pos, ':');
11197
11198 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11199
11200 uint srvchall_len = hash_pos - srvchall_pos;
11201
11202 // if (srvchall_len != 0) return (PARSER_SALT_LENGTH);
11203
11204 hash_pos++;
11205
11206 char *clichall_pos = strchr (hash_pos, ':');
11207
11208 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11209
11210 uint hash_len = clichall_pos - hash_pos;
11211
11212 if (hash_len != 48) return (PARSER_HASH_LENGTH);
11213
11214 clichall_pos++;
11215
11216 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
11217
11218 if (clichall_len != 16) return (PARSER_SALT_LENGTH);
11219
11220 /**
11221 * store some data for later use
11222 */
11223
11224 netntlm->user_len = user_len * 2;
11225 netntlm->domain_len = domain_len * 2;
11226 netntlm->srvchall_len = srvchall_len / 2;
11227 netntlm->clichall_len = clichall_len / 2;
11228
11229 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
11230 char *chall_ptr = (char *) netntlm->chall_buf;
11231
11232 /**
11233 * handle username and domainname
11234 */
11235
11236 for (uint i = 0; i < user_len; i++)
11237 {
11238 *userdomain_ptr++ = user_pos[i];
11239 *userdomain_ptr++ = 0;
11240 }
11241
11242 for (uint i = 0; i < domain_len; i++)
11243 {
11244 *userdomain_ptr++ = domain_pos[i];
11245 *userdomain_ptr++ = 0;
11246 }
11247
11248 /**
11249 * handle server challenge encoding
11250 */
11251
11252 for (uint i = 0; i < srvchall_len; i += 2)
11253 {
11254 const char p0 = srvchall_pos[i + 0];
11255 const char p1 = srvchall_pos[i + 1];
11256
11257 *chall_ptr++ = hex_convert (p1) << 0
11258 | hex_convert (p0) << 4;
11259 }
11260
11261 /**
11262 * handle client challenge encoding
11263 */
11264
11265 for (uint i = 0; i < clichall_len; i += 2)
11266 {
11267 const char p0 = clichall_pos[i + 0];
11268 const char p1 = clichall_pos[i + 1];
11269
11270 *chall_ptr++ = hex_convert (p1) << 0
11271 | hex_convert (p0) << 4;
11272 }
11273
11274 /**
11275 * store data
11276 */
11277
11278 char *salt_buf_ptr = (char *) salt->salt_buf;
11279
11280 uint salt_len = parse_and_store_salt (salt_buf_ptr, clichall_pos, clichall_len);
11281
11282 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11283
11284 salt->salt_len = salt_len;
11285
11286 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11287 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11288 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11289 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11290
11291 digest[0] = byte_swap_32 (digest[0]);
11292 digest[1] = byte_swap_32 (digest[1]);
11293 digest[2] = byte_swap_32 (digest[2]);
11294 digest[3] = byte_swap_32 (digest[3]);
11295
11296 /* special case, last 8 byte do not need to be checked since they are brute-forced next */
11297
11298 uint digest_tmp[2] = { 0 };
11299
11300 digest_tmp[0] = hex_to_u32 ((const u8 *) &hash_pos[32]);
11301 digest_tmp[1] = hex_to_u32 ((const u8 *) &hash_pos[40]);
11302
11303 digest_tmp[0] = byte_swap_32 (digest_tmp[0]);
11304 digest_tmp[1] = byte_swap_32 (digest_tmp[1]);
11305
11306 /* special case 2: ESS */
11307
11308 if (srvchall_len == 48)
11309 {
11310 if ((netntlm->chall_buf[2] == 0) && (netntlm->chall_buf[3] == 0) && (netntlm->chall_buf[4] == 0) && (netntlm->chall_buf[5] == 0))
11311 {
11312 uint w[16] = { 0 };
11313
11314 w[ 0] = netntlm->chall_buf[6];
11315 w[ 1] = netntlm->chall_buf[7];
11316 w[ 2] = netntlm->chall_buf[0];
11317 w[ 3] = netntlm->chall_buf[1];
11318 w[ 4] = 0x80;
11319 w[14] = 16 * 8;
11320
11321 uint dgst[4] = { 0 };
11322
11323 dgst[0] = MAGIC_A;
11324 dgst[1] = MAGIC_B;
11325 dgst[2] = MAGIC_C;
11326 dgst[3] = MAGIC_D;
11327
11328 md5_64 (w, dgst);
11329
11330 salt->salt_buf[0] = dgst[0];
11331 salt->salt_buf[1] = dgst[1];
11332 }
11333 }
11334
11335 /* precompute netntlmv1 exploit start */
11336
11337 for (uint i = 0; i < 0x10000; i++)
11338 {
11339 uint key_md4[2] = { i, 0 };
11340 uint key_des[2] = { 0, 0 };
11341
11342 transform_netntlmv1_key ((u8 *) key_md4, (u8 *) key_des);
11343
11344 uint Kc[16] = { 0 };
11345 uint Kd[16] = { 0 };
11346
11347 _des_keysetup (key_des, Kc, Kd, c_skb);
11348
11349 uint data3[2] = { salt->salt_buf[0], salt->salt_buf[1] };
11350
11351 _des_encrypt (data3, Kc, Kd, c_SPtrans);
11352
11353 if (data3[0] != digest_tmp[0]) continue;
11354 if (data3[1] != digest_tmp[1]) continue;
11355
11356 salt->salt_buf[2] = i;
11357
11358 salt->salt_len = 24;
11359
11360 break;
11361 }
11362
11363 salt->salt_buf_pc[0] = digest_tmp[0];
11364 salt->salt_buf_pc[1] = digest_tmp[1];
11365
11366 /* precompute netntlmv1 exploit stop */
11367
11368 u32 tt;
11369
11370 IP (digest[0], digest[1], tt);
11371 IP (digest[2], digest[3], tt);
11372
11373 digest[0] = rotr32 (digest[0], 29);
11374 digest[1] = rotr32 (digest[1], 29);
11375 digest[2] = rotr32 (digest[2], 29);
11376 digest[3] = rotr32 (digest[3], 29);
11377
11378 IP (salt->salt_buf[0], salt->salt_buf[1], tt);
11379
11380 salt->salt_buf[0] = rotl32 (salt->salt_buf[0], 3);
11381 salt->salt_buf[1] = rotl32 (salt->salt_buf[1], 3);
11382
11383 return (PARSER_OK);
11384 }
11385
11386 int netntlmv2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11387 {
11388 if ((input_len < DISPLAY_LEN_MIN_5600) || (input_len > DISPLAY_LEN_MAX_5600)) return (PARSER_GLOBAL_LENGTH);
11389
11390 u32 *digest = (u32 *) hash_buf->digest;
11391
11392 salt_t *salt = hash_buf->salt;
11393
11394 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
11395
11396 /**
11397 * parse line
11398 */
11399
11400 char *user_pos = input_buf;
11401
11402 char *unused_pos = strchr (user_pos, ':');
11403
11404 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11405
11406 uint user_len = unused_pos - user_pos;
11407
11408 if (user_len > 60) return (PARSER_SALT_LENGTH);
11409
11410 unused_pos++;
11411
11412 char *domain_pos = strchr (unused_pos, ':');
11413
11414 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11415
11416 uint unused_len = domain_pos - unused_pos;
11417
11418 if (unused_len != 0) return (PARSER_SALT_LENGTH);
11419
11420 domain_pos++;
11421
11422 char *srvchall_pos = strchr (domain_pos, ':');
11423
11424 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11425
11426 uint domain_len = srvchall_pos - domain_pos;
11427
11428 if (domain_len > 45) return (PARSER_SALT_LENGTH);
11429
11430 srvchall_pos++;
11431
11432 char *hash_pos = strchr (srvchall_pos, ':');
11433
11434 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11435
11436 uint srvchall_len = hash_pos - srvchall_pos;
11437
11438 if (srvchall_len != 16) return (PARSER_SALT_LENGTH);
11439
11440 hash_pos++;
11441
11442 char *clichall_pos = strchr (hash_pos, ':');
11443
11444 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11445
11446 uint hash_len = clichall_pos - hash_pos;
11447
11448 if (hash_len != 32) return (PARSER_HASH_LENGTH);
11449
11450 clichall_pos++;
11451
11452 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
11453
11454 if (clichall_len > 1024) return (PARSER_SALT_LENGTH);
11455
11456 if (clichall_len % 2) return (PARSER_SALT_VALUE);
11457
11458 /**
11459 * store some data for later use
11460 */
11461
11462 netntlm->user_len = user_len * 2;
11463 netntlm->domain_len = domain_len * 2;
11464 netntlm->srvchall_len = srvchall_len / 2;
11465 netntlm->clichall_len = clichall_len / 2;
11466
11467 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
11468 char *chall_ptr = (char *) netntlm->chall_buf;
11469
11470 /**
11471 * handle username and domainname
11472 */
11473
11474 for (uint i = 0; i < user_len; i++)
11475 {
11476 *userdomain_ptr++ = toupper (user_pos[i]);
11477 *userdomain_ptr++ = 0;
11478 }
11479
11480 for (uint i = 0; i < domain_len; i++)
11481 {
11482 *userdomain_ptr++ = domain_pos[i];
11483 *userdomain_ptr++ = 0;
11484 }
11485
11486 *userdomain_ptr++ = 0x80;
11487
11488 /**
11489 * handle server challenge encoding
11490 */
11491
11492 for (uint i = 0; i < srvchall_len; i += 2)
11493 {
11494 const char p0 = srvchall_pos[i + 0];
11495 const char p1 = srvchall_pos[i + 1];
11496
11497 *chall_ptr++ = hex_convert (p1) << 0
11498 | hex_convert (p0) << 4;
11499 }
11500
11501 /**
11502 * handle client challenge encoding
11503 */
11504
11505 for (uint i = 0; i < clichall_len; i += 2)
11506 {
11507 const char p0 = clichall_pos[i + 0];
11508 const char p1 = clichall_pos[i + 1];
11509
11510 *chall_ptr++ = hex_convert (p1) << 0
11511 | hex_convert (p0) << 4;
11512 }
11513
11514 *chall_ptr++ = 0x80;
11515
11516 /**
11517 * handle hash itself
11518 */
11519
11520 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11521 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11522 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11523 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11524
11525 digest[0] = byte_swap_32 (digest[0]);
11526 digest[1] = byte_swap_32 (digest[1]);
11527 digest[2] = byte_swap_32 (digest[2]);
11528 digest[3] = byte_swap_32 (digest[3]);
11529
11530 /**
11531 * reuse challange data as salt_buf, its the buffer that is most likely unique
11532 */
11533
11534 salt->salt_buf[0] = 0;
11535 salt->salt_buf[1] = 0;
11536 salt->salt_buf[2] = 0;
11537 salt->salt_buf[3] = 0;
11538 salt->salt_buf[4] = 0;
11539 salt->salt_buf[5] = 0;
11540 salt->salt_buf[6] = 0;
11541 salt->salt_buf[7] = 0;
11542
11543 uint *uptr;
11544
11545 uptr = (uint *) netntlm->userdomain_buf;
11546
11547 for (uint i = 0; i < 16; i += 16)
11548 {
11549 md5_64 (uptr, salt->salt_buf);
11550 }
11551
11552 uptr = (uint *) netntlm->chall_buf;
11553
11554 for (uint i = 0; i < 256; i += 16)
11555 {
11556 md5_64 (uptr, salt->salt_buf);
11557 }
11558
11559 salt->salt_len = 16;
11560
11561 return (PARSER_OK);
11562 }
11563
11564 int joomla_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11565 {
11566 if (data.opts_type & OPTS_TYPE_ST_HEX)
11567 {
11568 if ((input_len < DISPLAY_LEN_MIN_11H) || (input_len > DISPLAY_LEN_MAX_11H)) return (PARSER_GLOBAL_LENGTH);
11569 }
11570 else
11571 {
11572 if ((input_len < DISPLAY_LEN_MIN_11) || (input_len > DISPLAY_LEN_MAX_11)) return (PARSER_GLOBAL_LENGTH);
11573 }
11574
11575 u32 *digest = (u32 *) hash_buf->digest;
11576
11577 salt_t *salt = hash_buf->salt;
11578
11579 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11580 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11581 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11582 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11583
11584 digest[0] = byte_swap_32 (digest[0]);
11585 digest[1] = byte_swap_32 (digest[1]);
11586 digest[2] = byte_swap_32 (digest[2]);
11587 digest[3] = byte_swap_32 (digest[3]);
11588
11589 digest[0] -= MD5M_A;
11590 digest[1] -= MD5M_B;
11591 digest[2] -= MD5M_C;
11592 digest[3] -= MD5M_D;
11593
11594 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11595
11596 uint salt_len = input_len - 32 - 1;
11597
11598 char *salt_buf = input_buf + 32 + 1;
11599
11600 char *salt_buf_ptr = (char *) salt->salt_buf;
11601
11602 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11603
11604 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11605
11606 salt->salt_len = salt_len;
11607
11608 return (PARSER_OK);
11609 }
11610
11611 int postgresql_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11612 {
11613 if (data.opts_type & OPTS_TYPE_ST_HEX)
11614 {
11615 if ((input_len < DISPLAY_LEN_MIN_12H) || (input_len > DISPLAY_LEN_MAX_12H)) return (PARSER_GLOBAL_LENGTH);
11616 }
11617 else
11618 {
11619 if ((input_len < DISPLAY_LEN_MIN_12) || (input_len > DISPLAY_LEN_MAX_12)) return (PARSER_GLOBAL_LENGTH);
11620 }
11621
11622 u32 *digest = (u32 *) hash_buf->digest;
11623
11624 salt_t *salt = hash_buf->salt;
11625
11626 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11627 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11628 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11629 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11630
11631 digest[0] = byte_swap_32 (digest[0]);
11632 digest[1] = byte_swap_32 (digest[1]);
11633 digest[2] = byte_swap_32 (digest[2]);
11634 digest[3] = byte_swap_32 (digest[3]);
11635
11636 digest[0] -= MD5M_A;
11637 digest[1] -= MD5M_B;
11638 digest[2] -= MD5M_C;
11639 digest[3] -= MD5M_D;
11640
11641 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11642
11643 uint salt_len = input_len - 32 - 1;
11644
11645 char *salt_buf = input_buf + 32 + 1;
11646
11647 char *salt_buf_ptr = (char *) salt->salt_buf;
11648
11649 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11650
11651 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11652
11653 salt->salt_len = salt_len;
11654
11655 return (PARSER_OK);
11656 }
11657
11658 int md5md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11659 {
11660 if ((input_len < DISPLAY_LEN_MIN_2600) || (input_len > DISPLAY_LEN_MAX_2600)) return (PARSER_GLOBAL_LENGTH);
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 /**
11682 * This is a virtual salt. While the algorithm is basically not salted
11683 * we can exploit the salt buffer to set the 0x80 and the w[14] value.
11684 * This way we can save a special md5md5 kernel and reuse the one from vbull.
11685 */
11686
11687 char *salt_buf_ptr = (char *) salt->salt_buf;
11688
11689 uint salt_len = parse_and_store_salt (salt_buf_ptr, (char *) "", 0);
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 vb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11699 {
11700 if (data.opts_type & OPTS_TYPE_ST_HEX)
11701 {
11702 if ((input_len < DISPLAY_LEN_MIN_2611H) || (input_len > DISPLAY_LEN_MAX_2611H)) return (PARSER_GLOBAL_LENGTH);
11703 }
11704 else
11705 {
11706 if ((input_len < DISPLAY_LEN_MIN_2611) || (input_len > DISPLAY_LEN_MAX_2611)) return (PARSER_GLOBAL_LENGTH);
11707 }
11708
11709 u32 *digest = (u32 *) hash_buf->digest;
11710
11711 salt_t *salt = hash_buf->salt;
11712
11713 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11714 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11715 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11716 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11717
11718 digest[0] = byte_swap_32 (digest[0]);
11719 digest[1] = byte_swap_32 (digest[1]);
11720 digest[2] = byte_swap_32 (digest[2]);
11721 digest[3] = byte_swap_32 (digest[3]);
11722
11723 digest[0] -= MD5M_A;
11724 digest[1] -= MD5M_B;
11725 digest[2] -= MD5M_C;
11726 digest[3] -= MD5M_D;
11727
11728 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11729
11730 uint salt_len = input_len - 32 - 1;
11731
11732 char *salt_buf = input_buf + 32 + 1;
11733
11734 char *salt_buf_ptr = (char *) salt->salt_buf;
11735
11736 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11737
11738 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11739
11740 salt->salt_len = salt_len;
11741
11742 return (PARSER_OK);
11743 }
11744
11745 int vb30_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11746 {
11747 if (data.opts_type & OPTS_TYPE_ST_HEX)
11748 {
11749 if ((input_len < DISPLAY_LEN_MIN_2711H) || (input_len > DISPLAY_LEN_MAX_2711H)) return (PARSER_GLOBAL_LENGTH);
11750 }
11751 else
11752 {
11753 if ((input_len < DISPLAY_LEN_MIN_2711) || (input_len > DISPLAY_LEN_MAX_2711)) return (PARSER_GLOBAL_LENGTH);
11754 }
11755
11756 u32 *digest = (u32 *) hash_buf->digest;
11757
11758 salt_t *salt = hash_buf->salt;
11759
11760 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11761 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11762 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11763 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11764
11765 digest[0] = byte_swap_32 (digest[0]);
11766 digest[1] = byte_swap_32 (digest[1]);
11767 digest[2] = byte_swap_32 (digest[2]);
11768 digest[3] = byte_swap_32 (digest[3]);
11769
11770 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11771
11772 uint salt_len = input_len - 32 - 1;
11773
11774 char *salt_buf = input_buf + 32 + 1;
11775
11776 char *salt_buf_ptr = (char *) salt->salt_buf;
11777
11778 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11779
11780 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11781
11782 salt->salt_len = salt_len;
11783
11784 return (PARSER_OK);
11785 }
11786
11787 int dcc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11788 {
11789 if (data.opts_type & OPTS_TYPE_ST_HEX)
11790 {
11791 if ((input_len < DISPLAY_LEN_MIN_1100H) || (input_len > DISPLAY_LEN_MAX_1100H)) return (PARSER_GLOBAL_LENGTH);
11792 }
11793 else
11794 {
11795 if ((input_len < DISPLAY_LEN_MIN_1100) || (input_len > DISPLAY_LEN_MAX_1100)) return (PARSER_GLOBAL_LENGTH);
11796 }
11797
11798 u32 *digest = (u32 *) hash_buf->digest;
11799
11800 salt_t *salt = hash_buf->salt;
11801
11802 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11803 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11804 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11805 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11806
11807 digest[0] = byte_swap_32 (digest[0]);
11808 digest[1] = byte_swap_32 (digest[1]);
11809 digest[2] = byte_swap_32 (digest[2]);
11810 digest[3] = byte_swap_32 (digest[3]);
11811
11812 digest[0] -= MD4M_A;
11813 digest[1] -= MD4M_B;
11814 digest[2] -= MD4M_C;
11815 digest[3] -= MD4M_D;
11816
11817 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11818
11819 uint salt_len = input_len - 32 - 1;
11820
11821 char *salt_buf = input_buf + 32 + 1;
11822
11823 char *salt_buf_ptr = (char *) salt->salt_buf;
11824
11825 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11826
11827 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11828
11829 salt->salt_len = salt_len;
11830
11831 return (PARSER_OK);
11832 }
11833
11834 int ipb2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11835 {
11836 if (data.opts_type & OPTS_TYPE_ST_HEX)
11837 {
11838 if ((input_len < DISPLAY_LEN_MIN_2811H) || (input_len > DISPLAY_LEN_MAX_2811H)) return (PARSER_GLOBAL_LENGTH);
11839 }
11840 else
11841 {
11842 if ((input_len < DISPLAY_LEN_MIN_2811) || (input_len > DISPLAY_LEN_MAX_2811)) return (PARSER_GLOBAL_LENGTH);
11843 }
11844
11845 u32 *digest = (u32 *) hash_buf->digest;
11846
11847 salt_t *salt = hash_buf->salt;
11848
11849 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11850 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11851 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11852 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11853
11854 digest[0] = byte_swap_32 (digest[0]);
11855 digest[1] = byte_swap_32 (digest[1]);
11856 digest[2] = byte_swap_32 (digest[2]);
11857 digest[3] = byte_swap_32 (digest[3]);
11858
11859 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11860
11861 uint salt_len = input_len - 32 - 1;
11862
11863 char *salt_buf = input_buf + 32 + 1;
11864
11865 uint salt_pc_block[16] = { 0 };
11866
11867 char *salt_pc_block_ptr = (char *) salt_pc_block;
11868
11869 salt_len = parse_and_store_salt (salt_pc_block_ptr, salt_buf, salt_len);
11870
11871 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11872
11873 salt_pc_block_ptr[salt_len] = (unsigned char) 0x80;
11874
11875 salt_pc_block[14] = salt_len * 8;
11876
11877 uint salt_pc_digest[4] = { MAGIC_A, MAGIC_B, MAGIC_C, MAGIC_D };
11878
11879 md5_64 (salt_pc_block, salt_pc_digest);
11880
11881 salt_pc_digest[0] = byte_swap_32 (salt_pc_digest[0]);
11882 salt_pc_digest[1] = byte_swap_32 (salt_pc_digest[1]);
11883 salt_pc_digest[2] = byte_swap_32 (salt_pc_digest[2]);
11884 salt_pc_digest[3] = byte_swap_32 (salt_pc_digest[3]);
11885
11886 u8 *salt_buf_ptr = (u8 *) salt->salt_buf;
11887
11888 memcpy (salt_buf_ptr, salt_buf, salt_len);
11889
11890 u8 *salt_buf_pc_ptr = (u8 *) salt->salt_buf_pc;
11891
11892 bin_to_hex_lower (salt_pc_digest[0], salt_buf_pc_ptr + 0);
11893 bin_to_hex_lower (salt_pc_digest[1], salt_buf_pc_ptr + 8);
11894 bin_to_hex_lower (salt_pc_digest[2], salt_buf_pc_ptr + 16);
11895 bin_to_hex_lower (salt_pc_digest[3], salt_buf_pc_ptr + 24);
11896
11897 salt->salt_len = 32; // changed, was salt_len before -- was a bug? 32 should be correct
11898
11899 return (PARSER_OK);
11900 }
11901
11902 int sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11903 {
11904 if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH);
11905
11906 u32 *digest = (u32 *) hash_buf->digest;
11907
11908 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11909 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11910 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11911 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11912 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11913
11914 digest[0] -= SHA1M_A;
11915 digest[1] -= SHA1M_B;
11916 digest[2] -= SHA1M_C;
11917 digest[3] -= SHA1M_D;
11918 digest[4] -= SHA1M_E;
11919
11920 return (PARSER_OK);
11921 }
11922
11923 int sha1linkedin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11924 {
11925 if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH);
11926
11927 u32 *digest = (u32 *) hash_buf->digest;
11928
11929 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11930 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11931 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11932 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11933 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11934
11935 return (PARSER_OK);
11936 }
11937
11938 int sha1axcrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11939 {
11940 if ((input_len < DISPLAY_LEN_MIN_13300) || (input_len > DISPLAY_LEN_MAX_13300)) return (PARSER_GLOBAL_LENGTH);
11941
11942 if (memcmp (SIGNATURE_AXCRYPT_SHA1, input_buf, 13)) return (PARSER_SIGNATURE_UNMATCHED);
11943
11944 u32 *digest = (u32 *) hash_buf->digest;
11945
11946 input_buf +=14;
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] = 0x00000000;
11953
11954 return (PARSER_OK);
11955 }
11956
11957 int sha1s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11958 {
11959 if (data.opts_type & OPTS_TYPE_ST_HEX)
11960 {
11961 if ((input_len < DISPLAY_LEN_MIN_110H) || (input_len > DISPLAY_LEN_MAX_110H)) return (PARSER_GLOBAL_LENGTH);
11962 }
11963 else
11964 {
11965 if ((input_len < DISPLAY_LEN_MIN_110) || (input_len > DISPLAY_LEN_MAX_110)) return (PARSER_GLOBAL_LENGTH);
11966 }
11967
11968 u32 *digest = (u32 *) hash_buf->digest;
11969
11970 salt_t *salt = hash_buf->salt;
11971
11972 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11973 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11974 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11975 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11976 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11977
11978 digest[0] -= SHA1M_A;
11979 digest[1] -= SHA1M_B;
11980 digest[2] -= SHA1M_C;
11981 digest[3] -= SHA1M_D;
11982 digest[4] -= SHA1M_E;
11983
11984 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11985
11986 uint salt_len = input_len - 40 - 1;
11987
11988 char *salt_buf = input_buf + 40 + 1;
11989
11990 char *salt_buf_ptr = (char *) salt->salt_buf;
11991
11992 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11993
11994 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11995
11996 salt->salt_len = salt_len;
11997
11998 return (PARSER_OK);
11999 }
12000
12001 int pstoken_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12002 {
12003 if ((input_len < DISPLAY_LEN_MIN_13500) || (input_len > DISPLAY_LEN_MAX_13500)) return (PARSER_GLOBAL_LENGTH);
12004
12005 u32 *digest = (u32 *) hash_buf->digest;
12006
12007 salt_t *salt = hash_buf->salt;
12008
12009 pstoken_t *pstoken = (pstoken_t *) hash_buf->esalt;
12010
12011 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12012 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12013 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12014 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12015 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12016
12017 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12018
12019 uint salt_len = input_len - 40 - 1;
12020
12021 char *salt_buf = input_buf + 40 + 1;
12022
12023 if (salt_len == UINT_MAX || salt_len % 2 != 0) return (PARSER_SALT_LENGTH);
12024
12025 u8 *pstoken_ptr = (u8 *) pstoken->salt_buf;
12026
12027 for (uint i = 0, j = 0; i < salt_len; i += 2, j += 1)
12028 {
12029 pstoken_ptr[j] = hex_to_u8 ((const u8 *) &salt_buf[i]);
12030 }
12031
12032 pstoken->salt_len = salt_len / 2;
12033
12034 /* some fake salt for the sorting mechanisms */
12035
12036 salt->salt_buf[0] = pstoken->salt_buf[0];
12037 salt->salt_buf[1] = pstoken->salt_buf[1];
12038 salt->salt_buf[2] = pstoken->salt_buf[2];
12039 salt->salt_buf[3] = pstoken->salt_buf[3];
12040 salt->salt_buf[4] = pstoken->salt_buf[4];
12041 salt->salt_buf[5] = pstoken->salt_buf[5];
12042 salt->salt_buf[6] = pstoken->salt_buf[6];
12043 salt->salt_buf[7] = pstoken->salt_buf[7];
12044
12045 salt->salt_len = 32;
12046
12047 /* we need to check if we can precompute some of the data --
12048 this is possible since the scheme is badly designed */
12049
12050 pstoken->pc_digest[0] = SHA1M_A;
12051 pstoken->pc_digest[1] = SHA1M_B;
12052 pstoken->pc_digest[2] = SHA1M_C;
12053 pstoken->pc_digest[3] = SHA1M_D;
12054 pstoken->pc_digest[4] = SHA1M_E;
12055
12056 pstoken->pc_offset = 0;
12057
12058 for (int i = 0; i < (int) pstoken->salt_len - 64; i += 64)
12059 {
12060 uint w[16];
12061
12062 w[ 0] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 0]);
12063 w[ 1] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 1]);
12064 w[ 2] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 2]);
12065 w[ 3] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 3]);
12066 w[ 4] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 4]);
12067 w[ 5] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 5]);
12068 w[ 6] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 6]);
12069 w[ 7] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 7]);
12070 w[ 8] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 8]);
12071 w[ 9] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 9]);
12072 w[10] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 10]);
12073 w[11] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 11]);
12074 w[12] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 12]);
12075 w[13] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 13]);
12076 w[14] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 14]);
12077 w[15] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 15]);
12078
12079 sha1_64 (w, pstoken->pc_digest);
12080
12081 pstoken->pc_offset += 16;
12082 }
12083
12084 return (PARSER_OK);
12085 }
12086
12087 int sha1b64_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12088 {
12089 if ((input_len < DISPLAY_LEN_MIN_101) || (input_len > DISPLAY_LEN_MAX_101)) return (PARSER_GLOBAL_LENGTH);
12090
12091 if (memcmp (SIGNATURE_SHA1B64, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
12092
12093 u32 *digest = (u32 *) hash_buf->digest;
12094
12095 u8 tmp_buf[100] = { 0 };
12096
12097 base64_decode (base64_to_int, (const u8 *) input_buf + 5, input_len - 5, tmp_buf);
12098
12099 memcpy (digest, tmp_buf, 20);
12100
12101 digest[0] = byte_swap_32 (digest[0]);
12102 digest[1] = byte_swap_32 (digest[1]);
12103 digest[2] = byte_swap_32 (digest[2]);
12104 digest[3] = byte_swap_32 (digest[3]);
12105 digest[4] = byte_swap_32 (digest[4]);
12106
12107 digest[0] -= SHA1M_A;
12108 digest[1] -= SHA1M_B;
12109 digest[2] -= SHA1M_C;
12110 digest[3] -= SHA1M_D;
12111 digest[4] -= SHA1M_E;
12112
12113 return (PARSER_OK);
12114 }
12115
12116 int sha1b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12117 {
12118 if ((input_len < DISPLAY_LEN_MIN_111) || (input_len > DISPLAY_LEN_MAX_111)) return (PARSER_GLOBAL_LENGTH);
12119
12120 if (memcmp (SIGNATURE_SSHA1B64_lower, input_buf, 6) && memcmp (SIGNATURE_SSHA1B64_upper, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
12121
12122 u32 *digest = (u32 *) hash_buf->digest;
12123
12124 salt_t *salt = hash_buf->salt;
12125
12126 u8 tmp_buf[100] = { 0 };
12127
12128 int tmp_len = base64_decode (base64_to_int, (const u8 *) input_buf + 6, input_len - 6, tmp_buf);
12129
12130 if (tmp_len < 20) return (PARSER_HASH_LENGTH);
12131
12132 memcpy (digest, tmp_buf, 20);
12133
12134 int salt_len = tmp_len - 20;
12135
12136 if (salt_len < 0) return (PARSER_SALT_LENGTH);
12137
12138 salt->salt_len = salt_len;
12139
12140 memcpy (salt->salt_buf, tmp_buf + 20, salt->salt_len);
12141
12142 if (data.opts_type & OPTS_TYPE_ST_ADD80)
12143 {
12144 char *ptr = (char *) salt->salt_buf;
12145
12146 ptr[salt->salt_len] = 0x80;
12147 }
12148
12149 digest[0] = byte_swap_32 (digest[0]);
12150 digest[1] = byte_swap_32 (digest[1]);
12151 digest[2] = byte_swap_32 (digest[2]);
12152 digest[3] = byte_swap_32 (digest[3]);
12153 digest[4] = byte_swap_32 (digest[4]);
12154
12155 digest[0] -= SHA1M_A;
12156 digest[1] -= SHA1M_B;
12157 digest[2] -= SHA1M_C;
12158 digest[3] -= SHA1M_D;
12159 digest[4] -= SHA1M_E;
12160
12161 return (PARSER_OK);
12162 }
12163
12164 int mssql2000_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12165 {
12166 if ((input_len < DISPLAY_LEN_MIN_131) || (input_len > DISPLAY_LEN_MAX_131)) return (PARSER_GLOBAL_LENGTH);
12167
12168 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
12169
12170 u32 *digest = (u32 *) hash_buf->digest;
12171
12172 salt_t *salt = hash_buf->salt;
12173
12174 char *salt_buf = input_buf + 6;
12175
12176 uint salt_len = 8;
12177
12178 char *salt_buf_ptr = (char *) salt->salt_buf;
12179
12180 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12181
12182 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12183
12184 salt->salt_len = salt_len;
12185
12186 char *hash_pos = input_buf + 6 + 8 + 40;
12187
12188 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
12189 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
12190 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
12191 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
12192 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
12193
12194 digest[0] -= SHA1M_A;
12195 digest[1] -= SHA1M_B;
12196 digest[2] -= SHA1M_C;
12197 digest[3] -= SHA1M_D;
12198 digest[4] -= SHA1M_E;
12199
12200 return (PARSER_OK);
12201 }
12202
12203 int mssql2005_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12204 {
12205 if ((input_len < DISPLAY_LEN_MIN_132) || (input_len > DISPLAY_LEN_MAX_132)) return (PARSER_GLOBAL_LENGTH);
12206
12207 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
12208
12209 u32 *digest = (u32 *) hash_buf->digest;
12210
12211 salt_t *salt = hash_buf->salt;
12212
12213 char *salt_buf = input_buf + 6;
12214
12215 uint salt_len = 8;
12216
12217 char *salt_buf_ptr = (char *) salt->salt_buf;
12218
12219 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12220
12221 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12222
12223 salt->salt_len = salt_len;
12224
12225 char *hash_pos = input_buf + 6 + 8;
12226
12227 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
12228 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
12229 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
12230 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
12231 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
12232
12233 digest[0] -= SHA1M_A;
12234 digest[1] -= SHA1M_B;
12235 digest[2] -= SHA1M_C;
12236 digest[3] -= SHA1M_D;
12237 digest[4] -= SHA1M_E;
12238
12239 return (PARSER_OK);
12240 }
12241
12242 int mssql2012_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12243 {
12244 if ((input_len < DISPLAY_LEN_MIN_1731) || (input_len > DISPLAY_LEN_MAX_1731)) return (PARSER_GLOBAL_LENGTH);
12245
12246 if (memcmp (SIGNATURE_MSSQL2012, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
12247
12248 u64 *digest = (u64 *) hash_buf->digest;
12249
12250 salt_t *salt = hash_buf->salt;
12251
12252 char *salt_buf = input_buf + 6;
12253
12254 uint salt_len = 8;
12255
12256 char *salt_buf_ptr = (char *) salt->salt_buf;
12257
12258 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12259
12260 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12261
12262 salt->salt_len = salt_len;
12263
12264 char *hash_pos = input_buf + 6 + 8;
12265
12266 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
12267 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
12268 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
12269 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
12270 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
12271 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
12272 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
12273 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
12274
12275 digest[0] -= SHA512M_A;
12276 digest[1] -= SHA512M_B;
12277 digest[2] -= SHA512M_C;
12278 digest[3] -= SHA512M_D;
12279 digest[4] -= SHA512M_E;
12280 digest[5] -= SHA512M_F;
12281 digest[6] -= SHA512M_G;
12282 digest[7] -= SHA512M_H;
12283
12284 return (PARSER_OK);
12285 }
12286
12287 int oracleh_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12288 {
12289 if (data.opts_type & OPTS_TYPE_ST_HEX)
12290 {
12291 if ((input_len < DISPLAY_LEN_MIN_3100H) || (input_len > DISPLAY_LEN_MAX_3100H)) return (PARSER_GLOBAL_LENGTH);
12292 }
12293 else
12294 {
12295 if ((input_len < DISPLAY_LEN_MIN_3100) || (input_len > DISPLAY_LEN_MAX_3100)) return (PARSER_GLOBAL_LENGTH);
12296 }
12297
12298 u32 *digest = (u32 *) hash_buf->digest;
12299
12300 salt_t *salt = hash_buf->salt;
12301
12302 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12303 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12304 digest[2] = 0;
12305 digest[3] = 0;
12306
12307 digest[0] = byte_swap_32 (digest[0]);
12308 digest[1] = byte_swap_32 (digest[1]);
12309
12310 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12311
12312 uint salt_len = input_len - 16 - 1;
12313
12314 char *salt_buf = input_buf + 16 + 1;
12315
12316 char *salt_buf_ptr = (char *) salt->salt_buf;
12317
12318 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12319
12320 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12321
12322 salt->salt_len = salt_len;
12323
12324 return (PARSER_OK);
12325 }
12326
12327 int oracles_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12328 {
12329 if ((input_len < DISPLAY_LEN_MIN_112) || (input_len > DISPLAY_LEN_MAX_112)) return (PARSER_GLOBAL_LENGTH);
12330
12331 u32 *digest = (u32 *) hash_buf->digest;
12332
12333 salt_t *salt = hash_buf->salt;
12334
12335 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12336 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12337 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12338 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12339 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12340
12341 digest[0] -= SHA1M_A;
12342 digest[1] -= SHA1M_B;
12343 digest[2] -= SHA1M_C;
12344 digest[3] -= SHA1M_D;
12345 digest[4] -= SHA1M_E;
12346
12347 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12348
12349 uint salt_len = input_len - 40 - 1;
12350
12351 char *salt_buf = input_buf + 40 + 1;
12352
12353 char *salt_buf_ptr = (char *) salt->salt_buf;
12354
12355 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12356
12357 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12358
12359 salt->salt_len = salt_len;
12360
12361 return (PARSER_OK);
12362 }
12363
12364 int oraclet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12365 {
12366 if ((input_len < DISPLAY_LEN_MIN_12300) || (input_len > DISPLAY_LEN_MAX_12300)) return (PARSER_GLOBAL_LENGTH);
12367
12368 u32 *digest = (u32 *) hash_buf->digest;
12369
12370 salt_t *salt = hash_buf->salt;
12371
12372 char *hash_pos = input_buf;
12373
12374 digest[ 0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
12375 digest[ 1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
12376 digest[ 2] = hex_to_u32 ((const u8 *) &hash_pos[ 16]);
12377 digest[ 3] = hex_to_u32 ((const u8 *) &hash_pos[ 24]);
12378 digest[ 4] = hex_to_u32 ((const u8 *) &hash_pos[ 32]);
12379 digest[ 5] = hex_to_u32 ((const u8 *) &hash_pos[ 40]);
12380 digest[ 6] = hex_to_u32 ((const u8 *) &hash_pos[ 48]);
12381 digest[ 7] = hex_to_u32 ((const u8 *) &hash_pos[ 56]);
12382 digest[ 8] = hex_to_u32 ((const u8 *) &hash_pos[ 64]);
12383 digest[ 9] = hex_to_u32 ((const u8 *) &hash_pos[ 72]);
12384 digest[10] = hex_to_u32 ((const u8 *) &hash_pos[ 80]);
12385 digest[11] = hex_to_u32 ((const u8 *) &hash_pos[ 88]);
12386 digest[12] = hex_to_u32 ((const u8 *) &hash_pos[ 96]);
12387 digest[13] = hex_to_u32 ((const u8 *) &hash_pos[104]);
12388 digest[14] = hex_to_u32 ((const u8 *) &hash_pos[112]);
12389 digest[15] = hex_to_u32 ((const u8 *) &hash_pos[120]);
12390
12391 char *salt_pos = input_buf + 128;
12392
12393 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
12394 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
12395 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
12396 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
12397
12398 salt->salt_iter = ROUNDS_ORACLET - 1;
12399 salt->salt_len = 16;
12400
12401 return (PARSER_OK);
12402 }
12403
12404 int sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12405 {
12406 if ((input_len < DISPLAY_LEN_MIN_1400) || (input_len > DISPLAY_LEN_MAX_1400)) return (PARSER_GLOBAL_LENGTH);
12407
12408 u32 *digest = (u32 *) hash_buf->digest;
12409
12410 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12411 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12412 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12413 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12414 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12415 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
12416 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
12417 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
12418
12419 digest[0] -= SHA256M_A;
12420 digest[1] -= SHA256M_B;
12421 digest[2] -= SHA256M_C;
12422 digest[3] -= SHA256M_D;
12423 digest[4] -= SHA256M_E;
12424 digest[5] -= SHA256M_F;
12425 digest[6] -= SHA256M_G;
12426 digest[7] -= SHA256M_H;
12427
12428 return (PARSER_OK);
12429 }
12430
12431 int sha256s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12432 {
12433 if (data.opts_type & OPTS_TYPE_ST_HEX)
12434 {
12435 if ((input_len < DISPLAY_LEN_MIN_1410H) || (input_len > DISPLAY_LEN_MAX_1410H)) return (PARSER_GLOBAL_LENGTH);
12436 }
12437 else
12438 {
12439 if ((input_len < DISPLAY_LEN_MIN_1410) || (input_len > DISPLAY_LEN_MAX_1410)) return (PARSER_GLOBAL_LENGTH);
12440 }
12441
12442 u32 *digest = (u32 *) hash_buf->digest;
12443
12444 salt_t *salt = hash_buf->salt;
12445
12446 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12447 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12448 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12449 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12450 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12451 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
12452 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
12453 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
12454
12455 digest[0] -= SHA256M_A;
12456 digest[1] -= SHA256M_B;
12457 digest[2] -= SHA256M_C;
12458 digest[3] -= SHA256M_D;
12459 digest[4] -= SHA256M_E;
12460 digest[5] -= SHA256M_F;
12461 digest[6] -= SHA256M_G;
12462 digest[7] -= SHA256M_H;
12463
12464 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12465
12466 uint salt_len = input_len - 64 - 1;
12467
12468 char *salt_buf = input_buf + 64 + 1;
12469
12470 char *salt_buf_ptr = (char *) salt->salt_buf;
12471
12472 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12473
12474 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12475
12476 salt->salt_len = salt_len;
12477
12478 return (PARSER_OK);
12479 }
12480
12481 int sha384_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12482 {
12483 if ((input_len < DISPLAY_LEN_MIN_10800) || (input_len > DISPLAY_LEN_MAX_10800)) return (PARSER_GLOBAL_LENGTH);
12484
12485 u64 *digest = (u64 *) hash_buf->digest;
12486
12487 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
12488 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
12489 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
12490 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
12491 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
12492 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
12493 digest[6] = 0;
12494 digest[7] = 0;
12495
12496 digest[0] -= SHA384M_A;
12497 digest[1] -= SHA384M_B;
12498 digest[2] -= SHA384M_C;
12499 digest[3] -= SHA384M_D;
12500 digest[4] -= SHA384M_E;
12501 digest[5] -= SHA384M_F;
12502 digest[6] -= 0;
12503 digest[7] -= 0;
12504
12505 return (PARSER_OK);
12506 }
12507
12508 int sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12509 {
12510 if ((input_len < DISPLAY_LEN_MIN_1700) || (input_len > DISPLAY_LEN_MAX_1700)) return (PARSER_GLOBAL_LENGTH);
12511
12512 u64 *digest = (u64 *) hash_buf->digest;
12513
12514 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
12515 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
12516 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
12517 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
12518 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
12519 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
12520 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
12521 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
12522
12523 digest[0] -= SHA512M_A;
12524 digest[1] -= SHA512M_B;
12525 digest[2] -= SHA512M_C;
12526 digest[3] -= SHA512M_D;
12527 digest[4] -= SHA512M_E;
12528 digest[5] -= SHA512M_F;
12529 digest[6] -= SHA512M_G;
12530 digest[7] -= SHA512M_H;
12531
12532 return (PARSER_OK);
12533 }
12534
12535 int sha512s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12536 {
12537 if (data.opts_type & OPTS_TYPE_ST_HEX)
12538 {
12539 if ((input_len < DISPLAY_LEN_MIN_1710H) || (input_len > DISPLAY_LEN_MAX_1710H)) return (PARSER_GLOBAL_LENGTH);
12540 }
12541 else
12542 {
12543 if ((input_len < DISPLAY_LEN_MIN_1710) || (input_len > DISPLAY_LEN_MAX_1710)) return (PARSER_GLOBAL_LENGTH);
12544 }
12545
12546 u64 *digest = (u64 *) hash_buf->digest;
12547
12548 salt_t *salt = hash_buf->salt;
12549
12550 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
12551 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
12552 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
12553 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
12554 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
12555 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
12556 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
12557 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
12558
12559 digest[0] -= SHA512M_A;
12560 digest[1] -= SHA512M_B;
12561 digest[2] -= SHA512M_C;
12562 digest[3] -= SHA512M_D;
12563 digest[4] -= SHA512M_E;
12564 digest[5] -= SHA512M_F;
12565 digest[6] -= SHA512M_G;
12566 digest[7] -= SHA512M_H;
12567
12568 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12569
12570 uint salt_len = input_len - 128 - 1;
12571
12572 char *salt_buf = input_buf + 128 + 1;
12573
12574 char *salt_buf_ptr = (char *) salt->salt_buf;
12575
12576 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12577
12578 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12579
12580 salt->salt_len = salt_len;
12581
12582 return (PARSER_OK);
12583 }
12584
12585 int sha512crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12586 {
12587 if (memcmp (SIGNATURE_SHA512CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
12588
12589 u64 *digest = (u64 *) hash_buf->digest;
12590
12591 salt_t *salt = hash_buf->salt;
12592
12593 char *salt_pos = input_buf + 3;
12594
12595 uint iterations_len = 0;
12596
12597 if (memcmp (salt_pos, "rounds=", 7) == 0)
12598 {
12599 salt_pos += 7;
12600
12601 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
12602
12603 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
12604 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
12605
12606 salt_pos[0] = 0x0;
12607
12608 salt->salt_iter = atoi (salt_pos - iterations_len);
12609
12610 salt_pos += 1;
12611
12612 iterations_len += 8;
12613 }
12614 else
12615 {
12616 salt->salt_iter = ROUNDS_SHA512CRYPT;
12617 }
12618
12619 if ((input_len < DISPLAY_LEN_MIN_1800) || (input_len > DISPLAY_LEN_MAX_1800 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
12620
12621 char *hash_pos = strchr (salt_pos, '$');
12622
12623 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12624
12625 uint salt_len = hash_pos - salt_pos;
12626
12627 if (salt_len > 16) return (PARSER_SALT_LENGTH);
12628
12629 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12630
12631 salt->salt_len = salt_len;
12632
12633 hash_pos++;
12634
12635 sha512crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12636
12637 return (PARSER_OK);
12638 }
12639
12640 int keccak_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12641 {
12642 if ((input_len < DISPLAY_LEN_MIN_5000) || (input_len > DISPLAY_LEN_MAX_5000)) return (PARSER_GLOBAL_LENGTH);
12643
12644 if (input_len % 16) return (PARSER_GLOBAL_LENGTH);
12645
12646 u64 *digest = (u64 *) hash_buf->digest;
12647
12648 salt_t *salt = hash_buf->salt;
12649
12650 uint keccak_mdlen = input_len / 2;
12651
12652 for (uint i = 0; i < keccak_mdlen / 8; i++)
12653 {
12654 digest[i] = hex_to_u64 ((const u8 *) &input_buf[i * 16]);
12655
12656 digest[i] = byte_swap_64 (digest[i]);
12657 }
12658
12659 salt->keccak_mdlen = keccak_mdlen;
12660
12661 return (PARSER_OK);
12662 }
12663
12664 int ikepsk_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12665 {
12666 if ((input_len < DISPLAY_LEN_MIN_5300) || (input_len > DISPLAY_LEN_MAX_5300)) return (PARSER_GLOBAL_LENGTH);
12667
12668 u32 *digest = (u32 *) hash_buf->digest;
12669
12670 salt_t *salt = hash_buf->salt;
12671
12672 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
12673
12674 /**
12675 * Parse that strange long line
12676 */
12677
12678 char *in_off[9];
12679
12680 size_t in_len[9] = { 0 };
12681
12682 in_off[0] = strtok (input_buf, ":");
12683
12684 if (in_off[0] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12685
12686 in_len[0] = strlen (in_off[0]);
12687
12688 size_t i;
12689
12690 for (i = 1; i < 9; i++)
12691 {
12692 in_off[i] = strtok (NULL, ":");
12693
12694 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12695
12696 in_len[i] = strlen (in_off[i]);
12697 }
12698
12699 char *ptr = (char *) ikepsk->msg_buf;
12700
12701 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[0] + i);
12702 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[1] + i);
12703 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[2] + i);
12704 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[3] + i);
12705 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[4] + i);
12706 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[5] + i);
12707
12708 *ptr = 0x80;
12709
12710 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
12711
12712 ptr = (char *) ikepsk->nr_buf;
12713
12714 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[6] + i);
12715 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[7] + i);
12716
12717 *ptr = 0x80;
12718
12719 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
12720
12721 /**
12722 * Store to database
12723 */
12724
12725 ptr = in_off[8];
12726
12727 digest[0] = hex_to_u32 ((const u8 *) &ptr[ 0]);
12728 digest[1] = hex_to_u32 ((const u8 *) &ptr[ 8]);
12729 digest[2] = hex_to_u32 ((const u8 *) &ptr[16]);
12730 digest[3] = hex_to_u32 ((const u8 *) &ptr[24]);
12731
12732 digest[0] = byte_swap_32 (digest[0]);
12733 digest[1] = byte_swap_32 (digest[1]);
12734 digest[2] = byte_swap_32 (digest[2]);
12735 digest[3] = byte_swap_32 (digest[3]);
12736
12737 salt->salt_len = 32;
12738
12739 salt->salt_buf[0] = ikepsk->nr_buf[0];
12740 salt->salt_buf[1] = ikepsk->nr_buf[1];
12741 salt->salt_buf[2] = ikepsk->nr_buf[2];
12742 salt->salt_buf[3] = ikepsk->nr_buf[3];
12743 salt->salt_buf[4] = ikepsk->nr_buf[4];
12744 salt->salt_buf[5] = ikepsk->nr_buf[5];
12745 salt->salt_buf[6] = ikepsk->nr_buf[6];
12746 salt->salt_buf[7] = ikepsk->nr_buf[7];
12747
12748 return (PARSER_OK);
12749 }
12750
12751 int ikepsk_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12752 {
12753 if ((input_len < DISPLAY_LEN_MIN_5400) || (input_len > DISPLAY_LEN_MAX_5400)) return (PARSER_GLOBAL_LENGTH);
12754
12755 u32 *digest = (u32 *) hash_buf->digest;
12756
12757 salt_t *salt = hash_buf->salt;
12758
12759 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
12760
12761 /**
12762 * Parse that strange long line
12763 */
12764
12765 char *in_off[9];
12766
12767 size_t in_len[9] = { 0 };
12768
12769 in_off[0] = strtok (input_buf, ":");
12770
12771 if (in_off[0] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12772
12773 in_len[0] = strlen (in_off[0]);
12774
12775 size_t i;
12776
12777 for (i = 1; i < 9; i++)
12778 {
12779 in_off[i] = strtok (NULL, ":");
12780
12781 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12782
12783 in_len[i] = strlen (in_off[i]);
12784 }
12785
12786 char *ptr = (char *) ikepsk->msg_buf;
12787
12788 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[0] + i);
12789 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[1] + i);
12790 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[2] + i);
12791 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[3] + i);
12792 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[4] + i);
12793 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[5] + i);
12794
12795 *ptr = 0x80;
12796
12797 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
12798
12799 ptr = (char *) ikepsk->nr_buf;
12800
12801 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[6] + i);
12802 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[7] + i);
12803
12804 *ptr = 0x80;
12805
12806 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
12807
12808 /**
12809 * Store to database
12810 */
12811
12812 ptr = in_off[8];
12813
12814 digest[0] = hex_to_u32 ((const u8 *) &ptr[ 0]);
12815 digest[1] = hex_to_u32 ((const u8 *) &ptr[ 8]);
12816 digest[2] = hex_to_u32 ((const u8 *) &ptr[16]);
12817 digest[3] = hex_to_u32 ((const u8 *) &ptr[24]);
12818 digest[4] = hex_to_u32 ((const u8 *) &ptr[32]);
12819
12820 salt->salt_len = 32;
12821
12822 salt->salt_buf[0] = ikepsk->nr_buf[0];
12823 salt->salt_buf[1] = ikepsk->nr_buf[1];
12824 salt->salt_buf[2] = ikepsk->nr_buf[2];
12825 salt->salt_buf[3] = ikepsk->nr_buf[3];
12826 salt->salt_buf[4] = ikepsk->nr_buf[4];
12827 salt->salt_buf[5] = ikepsk->nr_buf[5];
12828 salt->salt_buf[6] = ikepsk->nr_buf[6];
12829 salt->salt_buf[7] = ikepsk->nr_buf[7];
12830
12831 return (PARSER_OK);
12832 }
12833
12834 int ripemd160_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12835 {
12836 if ((input_len < DISPLAY_LEN_MIN_6000) || (input_len > DISPLAY_LEN_MAX_6000)) return (PARSER_GLOBAL_LENGTH);
12837
12838 u32 *digest = (u32 *) hash_buf->digest;
12839
12840 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12841 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12842 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12843 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12844 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12845
12846 digest[0] = byte_swap_32 (digest[0]);
12847 digest[1] = byte_swap_32 (digest[1]);
12848 digest[2] = byte_swap_32 (digest[2]);
12849 digest[3] = byte_swap_32 (digest[3]);
12850 digest[4] = byte_swap_32 (digest[4]);
12851
12852 return (PARSER_OK);
12853 }
12854
12855 int whirlpool_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12856 {
12857 if ((input_len < DISPLAY_LEN_MIN_6100) || (input_len > DISPLAY_LEN_MAX_6100)) return (PARSER_GLOBAL_LENGTH);
12858
12859 u32 *digest = (u32 *) hash_buf->digest;
12860
12861 digest[ 0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12862 digest[ 1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12863 digest[ 2] = hex_to_u32 ((const u8 *) &input_buf[ 16]);
12864 digest[ 3] = hex_to_u32 ((const u8 *) &input_buf[ 24]);
12865 digest[ 4] = hex_to_u32 ((const u8 *) &input_buf[ 32]);
12866 digest[ 5] = hex_to_u32 ((const u8 *) &input_buf[ 40]);
12867 digest[ 6] = hex_to_u32 ((const u8 *) &input_buf[ 48]);
12868 digest[ 7] = hex_to_u32 ((const u8 *) &input_buf[ 56]);
12869 digest[ 8] = hex_to_u32 ((const u8 *) &input_buf[ 64]);
12870 digest[ 9] = hex_to_u32 ((const u8 *) &input_buf[ 72]);
12871 digest[10] = hex_to_u32 ((const u8 *) &input_buf[ 80]);
12872 digest[11] = hex_to_u32 ((const u8 *) &input_buf[ 88]);
12873 digest[12] = hex_to_u32 ((const u8 *) &input_buf[ 96]);
12874 digest[13] = hex_to_u32 ((const u8 *) &input_buf[104]);
12875 digest[14] = hex_to_u32 ((const u8 *) &input_buf[112]);
12876 digest[15] = hex_to_u32 ((const u8 *) &input_buf[120]);
12877
12878 return (PARSER_OK);
12879 }
12880
12881 int androidpin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12882 {
12883 if ((input_len < DISPLAY_LEN_MIN_5800) || (input_len > DISPLAY_LEN_MAX_5800)) return (PARSER_GLOBAL_LENGTH);
12884
12885 u32 *digest = (u32 *) hash_buf->digest;
12886
12887 salt_t *salt = hash_buf->salt;
12888
12889 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12890 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12891 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12892 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12893 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12894
12895 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12896
12897 uint salt_len = input_len - 40 - 1;
12898
12899 char *salt_buf = input_buf + 40 + 1;
12900
12901 char *salt_buf_ptr = (char *) salt->salt_buf;
12902
12903 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12904
12905 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12906
12907 salt->salt_len = salt_len;
12908
12909 salt->salt_iter = ROUNDS_ANDROIDPIN - 1;
12910
12911 return (PARSER_OK);
12912 }
12913
12914 int truecrypt_parse_hash_1k (char *input_buf, uint input_len, hash_t *hash_buf)
12915 {
12916 u32 *digest = (u32 *) hash_buf->digest;
12917
12918 salt_t *salt = hash_buf->salt;
12919
12920 tc_t *tc = (tc_t *) hash_buf->esalt;
12921
12922 if (input_len == 0)
12923 {
12924 log_error ("TrueCrypt container not specified");
12925
12926 exit (-1);
12927 }
12928
12929 FILE *fp = fopen (input_buf, "rb");
12930
12931 if (fp == NULL)
12932 {
12933 log_error ("%s: %s", input_buf, strerror (errno));
12934
12935 exit (-1);
12936 }
12937
12938 char buf[512] = { 0 };
12939
12940 int n = fread (buf, 1, sizeof (buf), fp);
12941
12942 fclose (fp);
12943
12944 if (n != 512) return (PARSER_TC_FILE_SIZE);
12945
12946 memcpy (tc->salt_buf, buf, 64);
12947
12948 memcpy (tc->data_buf, buf + 64, 512 - 64);
12949
12950 salt->salt_buf[0] = tc->salt_buf[0];
12951
12952 salt->salt_len = 4;
12953
12954 salt->salt_iter = ROUNDS_TRUECRYPT_1K - 1;
12955
12956 tc->signature = 0x45555254; // "TRUE"
12957
12958 digest[0] = tc->data_buf[0];
12959
12960 return (PARSER_OK);
12961 }
12962
12963 int truecrypt_parse_hash_2k (char *input_buf, uint input_len, hash_t *hash_buf)
12964 {
12965 u32 *digest = (u32 *) hash_buf->digest;
12966
12967 salt_t *salt = hash_buf->salt;
12968
12969 tc_t *tc = (tc_t *) hash_buf->esalt;
12970
12971 if (input_len == 0)
12972 {
12973 log_error ("TrueCrypt container not specified");
12974
12975 exit (-1);
12976 }
12977
12978 FILE *fp = fopen (input_buf, "rb");
12979
12980 if (fp == NULL)
12981 {
12982 log_error ("%s: %s", input_buf, strerror (errno));
12983
12984 exit (-1);
12985 }
12986
12987 char buf[512] = { 0 };
12988
12989 int n = fread (buf, 1, sizeof (buf), fp);
12990
12991 fclose (fp);
12992
12993 if (n != 512) return (PARSER_TC_FILE_SIZE);
12994
12995 memcpy (tc->salt_buf, buf, 64);
12996
12997 memcpy (tc->data_buf, buf + 64, 512 - 64);
12998
12999 salt->salt_buf[0] = tc->salt_buf[0];
13000
13001 salt->salt_len = 4;
13002
13003 salt->salt_iter = ROUNDS_TRUECRYPT_2K - 1;
13004
13005 tc->signature = 0x45555254; // "TRUE"
13006
13007 digest[0] = tc->data_buf[0];
13008
13009 return (PARSER_OK);
13010 }
13011
13012 int veracrypt_parse_hash_200000 (char *input_buf, uint input_len, hash_t *hash_buf)
13013 {
13014 u32 *digest = (u32 *) hash_buf->digest;
13015
13016 salt_t *salt = hash_buf->salt;
13017
13018 tc_t *tc = (tc_t *) hash_buf->esalt;
13019
13020 if (input_len == 0)
13021 {
13022 log_error ("VeraCrypt container not specified");
13023
13024 exit (-1);
13025 }
13026
13027 FILE *fp = fopen (input_buf, "rb");
13028
13029 if (fp == NULL)
13030 {
13031 log_error ("%s: %s", input_buf, strerror (errno));
13032
13033 exit (-1);
13034 }
13035
13036 char buf[512] = { 0 };
13037
13038 int n = fread (buf, 1, sizeof (buf), fp);
13039
13040 fclose (fp);
13041
13042 if (n != 512) return (PARSER_VC_FILE_SIZE);
13043
13044 memcpy (tc->salt_buf, buf, 64);
13045
13046 memcpy (tc->data_buf, buf + 64, 512 - 64);
13047
13048 salt->salt_buf[0] = tc->salt_buf[0];
13049
13050 salt->salt_len = 4;
13051
13052 salt->salt_iter = ROUNDS_VERACRYPT_200000 - 1;
13053
13054 tc->signature = 0x41524556; // "VERA"
13055
13056 digest[0] = tc->data_buf[0];
13057
13058 return (PARSER_OK);
13059 }
13060
13061 int veracrypt_parse_hash_500000 (char *input_buf, uint input_len, hash_t *hash_buf)
13062 {
13063 u32 *digest = (u32 *) hash_buf->digest;
13064
13065 salt_t *salt = hash_buf->salt;
13066
13067 tc_t *tc = (tc_t *) hash_buf->esalt;
13068
13069 if (input_len == 0)
13070 {
13071 log_error ("VeraCrypt container not specified");
13072
13073 exit (-1);
13074 }
13075
13076 FILE *fp = fopen (input_buf, "rb");
13077
13078 if (fp == NULL)
13079 {
13080 log_error ("%s: %s", input_buf, strerror (errno));
13081
13082 exit (-1);
13083 }
13084
13085 char buf[512] = { 0 };
13086
13087 int n = fread (buf, 1, sizeof (buf), fp);
13088
13089 fclose (fp);
13090
13091 if (n != 512) return (PARSER_VC_FILE_SIZE);
13092
13093 memcpy (tc->salt_buf, buf, 64);
13094
13095 memcpy (tc->data_buf, buf + 64, 512 - 64);
13096
13097 salt->salt_buf[0] = tc->salt_buf[0];
13098
13099 salt->salt_len = 4;
13100
13101 salt->salt_iter = ROUNDS_VERACRYPT_500000 - 1;
13102
13103 tc->signature = 0x41524556; // "VERA"
13104
13105 digest[0] = tc->data_buf[0];
13106
13107 return (PARSER_OK);
13108 }
13109
13110 int veracrypt_parse_hash_327661 (char *input_buf, uint input_len, hash_t *hash_buf)
13111 {
13112 u32 *digest = (u32 *) hash_buf->digest;
13113
13114 salt_t *salt = hash_buf->salt;
13115
13116 tc_t *tc = (tc_t *) hash_buf->esalt;
13117
13118 if (input_len == 0)
13119 {
13120 log_error ("VeraCrypt container not specified");
13121
13122 exit (-1);
13123 }
13124
13125 FILE *fp = fopen (input_buf, "rb");
13126
13127 if (fp == NULL)
13128 {
13129 log_error ("%s: %s", input_buf, strerror (errno));
13130
13131 exit (-1);
13132 }
13133
13134 char buf[512] = { 0 };
13135
13136 int n = fread (buf, 1, sizeof (buf), fp);
13137
13138 fclose (fp);
13139
13140 if (n != 512) return (PARSER_VC_FILE_SIZE);
13141
13142 memcpy (tc->salt_buf, buf, 64);
13143
13144 memcpy (tc->data_buf, buf + 64, 512 - 64);
13145
13146 salt->salt_buf[0] = tc->salt_buf[0];
13147
13148 salt->salt_len = 4;
13149
13150 salt->salt_iter = ROUNDS_VERACRYPT_327661 - 1;
13151
13152 tc->signature = 0x41524556; // "VERA"
13153
13154 digest[0] = tc->data_buf[0];
13155
13156 return (PARSER_OK);
13157 }
13158
13159 int veracrypt_parse_hash_655331 (char *input_buf, uint input_len, hash_t *hash_buf)
13160 {
13161 u32 *digest = (u32 *) hash_buf->digest;
13162
13163 salt_t *salt = hash_buf->salt;
13164
13165 tc_t *tc = (tc_t *) hash_buf->esalt;
13166
13167 if (input_len == 0)
13168 {
13169 log_error ("VeraCrypt container not specified");
13170
13171 exit (-1);
13172 }
13173
13174 FILE *fp = fopen (input_buf, "rb");
13175
13176 if (fp == NULL)
13177 {
13178 log_error ("%s: %s", input_buf, strerror (errno));
13179
13180 exit (-1);
13181 }
13182
13183 char buf[512] = { 0 };
13184
13185 int n = fread (buf, 1, sizeof (buf), fp);
13186
13187 fclose (fp);
13188
13189 if (n != 512) return (PARSER_VC_FILE_SIZE);
13190
13191 memcpy (tc->salt_buf, buf, 64);
13192
13193 memcpy (tc->data_buf, buf + 64, 512 - 64);
13194
13195 salt->salt_buf[0] = tc->salt_buf[0];
13196
13197 salt->salt_len = 4;
13198
13199 salt->salt_iter = ROUNDS_VERACRYPT_655331 - 1;
13200
13201 tc->signature = 0x41524556; // "VERA"
13202
13203 digest[0] = tc->data_buf[0];
13204
13205 return (PARSER_OK);
13206 }
13207
13208 int md5aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13209 {
13210 if ((input_len < DISPLAY_LEN_MIN_6300) || (input_len > DISPLAY_LEN_MAX_6300)) return (PARSER_GLOBAL_LENGTH);
13211
13212 if (memcmp (SIGNATURE_MD5AIX, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
13213
13214 u32 *digest = (u32 *) hash_buf->digest;
13215
13216 salt_t *salt = hash_buf->salt;
13217
13218 char *salt_pos = input_buf + 6;
13219
13220 char *hash_pos = strchr (salt_pos, '$');
13221
13222 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13223
13224 uint salt_len = hash_pos - salt_pos;
13225
13226 if (salt_len < 8) return (PARSER_SALT_LENGTH);
13227
13228 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13229
13230 salt->salt_len = salt_len;
13231
13232 salt->salt_iter = 1000;
13233
13234 hash_pos++;
13235
13236 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13237
13238 return (PARSER_OK);
13239 }
13240
13241 int sha1aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13242 {
13243 if ((input_len < DISPLAY_LEN_MIN_6700) || (input_len > DISPLAY_LEN_MAX_6700)) return (PARSER_GLOBAL_LENGTH);
13244
13245 if (memcmp (SIGNATURE_SHA1AIX, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
13246
13247 u32 *digest = (u32 *) hash_buf->digest;
13248
13249 salt_t *salt = hash_buf->salt;
13250
13251 char *iter_pos = input_buf + 7;
13252
13253 char *salt_pos = strchr (iter_pos, '$');
13254
13255 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13256
13257 salt_pos++;
13258
13259 char *hash_pos = strchr (salt_pos, '$');
13260
13261 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13262
13263 uint salt_len = hash_pos - salt_pos;
13264
13265 if (salt_len < 16) return (PARSER_SALT_LENGTH);
13266
13267 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13268
13269 salt->salt_len = salt_len;
13270
13271 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
13272
13273 salt->salt_sign[0] = atoi (salt_iter);
13274
13275 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
13276
13277 hash_pos++;
13278
13279 sha1aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13280
13281 digest[0] = byte_swap_32 (digest[0]);
13282 digest[1] = byte_swap_32 (digest[1]);
13283 digest[2] = byte_swap_32 (digest[2]);
13284 digest[3] = byte_swap_32 (digest[3]);
13285 digest[4] = byte_swap_32 (digest[4]);
13286
13287 return (PARSER_OK);
13288 }
13289
13290 int sha256aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13291 {
13292 if ((input_len < DISPLAY_LEN_MIN_6400) || (input_len > DISPLAY_LEN_MAX_6400)) return (PARSER_GLOBAL_LENGTH);
13293
13294 if (memcmp (SIGNATURE_SHA256AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
13295
13296 u32 *digest = (u32 *) hash_buf->digest;
13297
13298 salt_t *salt = hash_buf->salt;
13299
13300 char *iter_pos = input_buf + 9;
13301
13302 char *salt_pos = strchr (iter_pos, '$');
13303
13304 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13305
13306 salt_pos++;
13307
13308 char *hash_pos = strchr (salt_pos, '$');
13309
13310 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13311
13312 uint salt_len = hash_pos - salt_pos;
13313
13314 if (salt_len < 16) return (PARSER_SALT_LENGTH);
13315
13316 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13317
13318 salt->salt_len = salt_len;
13319
13320 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
13321
13322 salt->salt_sign[0] = atoi (salt_iter);
13323
13324 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
13325
13326 hash_pos++;
13327
13328 sha256aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13329
13330 digest[0] = byte_swap_32 (digest[0]);
13331 digest[1] = byte_swap_32 (digest[1]);
13332 digest[2] = byte_swap_32 (digest[2]);
13333 digest[3] = byte_swap_32 (digest[3]);
13334 digest[4] = byte_swap_32 (digest[4]);
13335 digest[5] = byte_swap_32 (digest[5]);
13336 digest[6] = byte_swap_32 (digest[6]);
13337 digest[7] = byte_swap_32 (digest[7]);
13338
13339 return (PARSER_OK);
13340 }
13341
13342 int sha512aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13343 {
13344 if ((input_len < DISPLAY_LEN_MIN_6500) || (input_len > DISPLAY_LEN_MAX_6500)) return (PARSER_GLOBAL_LENGTH);
13345
13346 if (memcmp (SIGNATURE_SHA512AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
13347
13348 u64 *digest = (u64 *) hash_buf->digest;
13349
13350 salt_t *salt = hash_buf->salt;
13351
13352 char *iter_pos = input_buf + 9;
13353
13354 char *salt_pos = strchr (iter_pos, '$');
13355
13356 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13357
13358 salt_pos++;
13359
13360 char *hash_pos = strchr (salt_pos, '$');
13361
13362 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13363
13364 uint salt_len = hash_pos - salt_pos;
13365
13366 if (salt_len < 16) return (PARSER_SALT_LENGTH);
13367
13368 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13369
13370 salt->salt_len = salt_len;
13371
13372 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
13373
13374 salt->salt_sign[0] = atoi (salt_iter);
13375
13376 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
13377
13378 hash_pos++;
13379
13380 sha512aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13381
13382 digest[0] = byte_swap_64 (digest[0]);
13383 digest[1] = byte_swap_64 (digest[1]);
13384 digest[2] = byte_swap_64 (digest[2]);
13385 digest[3] = byte_swap_64 (digest[3]);
13386 digest[4] = byte_swap_64 (digest[4]);
13387 digest[5] = byte_swap_64 (digest[5]);
13388 digest[6] = byte_swap_64 (digest[6]);
13389 digest[7] = byte_swap_64 (digest[7]);
13390
13391 return (PARSER_OK);
13392 }
13393
13394 int agilekey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13395 {
13396 if ((input_len < DISPLAY_LEN_MIN_6600) || (input_len > DISPLAY_LEN_MAX_6600)) return (PARSER_GLOBAL_LENGTH);
13397
13398 u32 *digest = (u32 *) hash_buf->digest;
13399
13400 salt_t *salt = hash_buf->salt;
13401
13402 agilekey_t *agilekey = (agilekey_t *) hash_buf->esalt;
13403
13404 /**
13405 * parse line
13406 */
13407
13408 char *iterations_pos = input_buf;
13409
13410 char *saltbuf_pos = strchr (iterations_pos, ':');
13411
13412 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13413
13414 uint iterations_len = saltbuf_pos - iterations_pos;
13415
13416 if (iterations_len > 6) return (PARSER_SALT_LENGTH);
13417
13418 saltbuf_pos++;
13419
13420 char *cipherbuf_pos = strchr (saltbuf_pos, ':');
13421
13422 if (cipherbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13423
13424 uint saltbuf_len = cipherbuf_pos - saltbuf_pos;
13425
13426 if (saltbuf_len != 16) return (PARSER_SALT_LENGTH);
13427
13428 uint cipherbuf_len = input_len - iterations_len - 1 - saltbuf_len - 1;
13429
13430 if (cipherbuf_len != 2080) return (PARSER_HASH_LENGTH);
13431
13432 cipherbuf_pos++;
13433
13434 /**
13435 * pbkdf2 iterations
13436 */
13437
13438 salt->salt_iter = atoi (iterations_pos) - 1;
13439
13440 /**
13441 * handle salt encoding
13442 */
13443
13444 char *saltbuf_ptr = (char *) salt->salt_buf;
13445
13446 for (uint i = 0; i < saltbuf_len; i += 2)
13447 {
13448 const char p0 = saltbuf_pos[i + 0];
13449 const char p1 = saltbuf_pos[i + 1];
13450
13451 *saltbuf_ptr++ = hex_convert (p1) << 0
13452 | hex_convert (p0) << 4;
13453 }
13454
13455 salt->salt_len = saltbuf_len / 2;
13456
13457 /**
13458 * handle cipher encoding
13459 */
13460
13461 uint *tmp = (uint *) mymalloc (32);
13462
13463 char *cipherbuf_ptr = (char *) tmp;
13464
13465 for (uint i = 2016; i < cipherbuf_len; i += 2)
13466 {
13467 const char p0 = cipherbuf_pos[i + 0];
13468 const char p1 = cipherbuf_pos[i + 1];
13469
13470 *cipherbuf_ptr++ = hex_convert (p1) << 0
13471 | hex_convert (p0) << 4;
13472 }
13473
13474 // iv is stored at salt_buf 4 (length 16)
13475 // data is stored at salt_buf 8 (length 16)
13476
13477 salt->salt_buf[ 4] = byte_swap_32 (tmp[0]);
13478 salt->salt_buf[ 5] = byte_swap_32 (tmp[1]);
13479 salt->salt_buf[ 6] = byte_swap_32 (tmp[2]);
13480 salt->salt_buf[ 7] = byte_swap_32 (tmp[3]);
13481
13482 salt->salt_buf[ 8] = byte_swap_32 (tmp[4]);
13483 salt->salt_buf[ 9] = byte_swap_32 (tmp[5]);
13484 salt->salt_buf[10] = byte_swap_32 (tmp[6]);
13485 salt->salt_buf[11] = byte_swap_32 (tmp[7]);
13486
13487 free (tmp);
13488
13489 for (uint i = 0, j = 0; i < 1040; i += 1, j += 2)
13490 {
13491 const char p0 = cipherbuf_pos[j + 0];
13492 const char p1 = cipherbuf_pos[j + 1];
13493
13494 agilekey->cipher[i] = hex_convert (p1) << 0
13495 | hex_convert (p0) << 4;
13496 }
13497
13498 /**
13499 * digest buf
13500 */
13501
13502 digest[0] = 0x10101010;
13503 digest[1] = 0x10101010;
13504 digest[2] = 0x10101010;
13505 digest[3] = 0x10101010;
13506
13507 return (PARSER_OK);
13508 }
13509
13510 int lastpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13511 {
13512 if ((input_len < DISPLAY_LEN_MIN_6800) || (input_len > DISPLAY_LEN_MAX_6800)) return (PARSER_GLOBAL_LENGTH);
13513
13514 u32 *digest = (u32 *) hash_buf->digest;
13515
13516 salt_t *salt = hash_buf->salt;
13517
13518 char *hashbuf_pos = input_buf;
13519
13520 char *iterations_pos = strchr (hashbuf_pos, ':');
13521
13522 if (iterations_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13523
13524 uint hash_len = iterations_pos - hashbuf_pos;
13525
13526 if ((hash_len != 32) && (hash_len != 64)) return (PARSER_HASH_LENGTH);
13527
13528 iterations_pos++;
13529
13530 char *saltbuf_pos = strchr (iterations_pos, ':');
13531
13532 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13533
13534 uint iterations_len = saltbuf_pos - iterations_pos;
13535
13536 saltbuf_pos++;
13537
13538 uint salt_len = input_len - hash_len - 1 - iterations_len - 1;
13539
13540 if (salt_len > 32) return (PARSER_SALT_LENGTH);
13541
13542 char *salt_buf_ptr = (char *) salt->salt_buf;
13543
13544 salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, salt_len);
13545
13546 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13547
13548 salt->salt_len = salt_len;
13549
13550 salt->salt_iter = atoi (iterations_pos) - 1;
13551
13552 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
13553 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
13554 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
13555 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
13556
13557 return (PARSER_OK);
13558 }
13559
13560 int gost_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13561 {
13562 if ((input_len < DISPLAY_LEN_MIN_6900) || (input_len > DISPLAY_LEN_MAX_6900)) return (PARSER_GLOBAL_LENGTH);
13563
13564 u32 *digest = (u32 *) hash_buf->digest;
13565
13566 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13567 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13568 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13569 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13570 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
13571 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
13572 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
13573 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
13574
13575 digest[0] = byte_swap_32 (digest[0]);
13576 digest[1] = byte_swap_32 (digest[1]);
13577 digest[2] = byte_swap_32 (digest[2]);
13578 digest[3] = byte_swap_32 (digest[3]);
13579 digest[4] = byte_swap_32 (digest[4]);
13580 digest[5] = byte_swap_32 (digest[5]);
13581 digest[6] = byte_swap_32 (digest[6]);
13582 digest[7] = byte_swap_32 (digest[7]);
13583
13584 return (PARSER_OK);
13585 }
13586
13587 int sha256crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13588 {
13589 if (memcmp (SIGNATURE_SHA256CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
13590
13591 u32 *digest = (u32 *) hash_buf->digest;
13592
13593 salt_t *salt = hash_buf->salt;
13594
13595 char *salt_pos = input_buf + 3;
13596
13597 uint iterations_len = 0;
13598
13599 if (memcmp (salt_pos, "rounds=", 7) == 0)
13600 {
13601 salt_pos += 7;
13602
13603 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
13604
13605 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
13606 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
13607
13608 salt_pos[0] = 0x0;
13609
13610 salt->salt_iter = atoi (salt_pos - iterations_len);
13611
13612 salt_pos += 1;
13613
13614 iterations_len += 8;
13615 }
13616 else
13617 {
13618 salt->salt_iter = ROUNDS_SHA256CRYPT;
13619 }
13620
13621 if ((input_len < DISPLAY_LEN_MIN_7400) || (input_len > DISPLAY_LEN_MAX_7400 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
13622
13623 char *hash_pos = strchr (salt_pos, '$');
13624
13625 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13626
13627 uint salt_len = hash_pos - salt_pos;
13628
13629 if (salt_len > 16) return (PARSER_SALT_LENGTH);
13630
13631 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13632
13633 salt->salt_len = salt_len;
13634
13635 hash_pos++;
13636
13637 sha256crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13638
13639 return (PARSER_OK);
13640 }
13641
13642 int sha512osx_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13643 {
13644 uint max_len = DISPLAY_LEN_MAX_7100 + (2 * 128);
13645
13646 if ((input_len < DISPLAY_LEN_MIN_7100) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
13647
13648 if (memcmp (SIGNATURE_SHA512OSX, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
13649
13650 u64 *digest = (u64 *) hash_buf->digest;
13651
13652 salt_t *salt = hash_buf->salt;
13653
13654 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
13655
13656 char *iter_pos = input_buf + 4;
13657
13658 char *salt_pos = strchr (iter_pos, '$');
13659
13660 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13661
13662 salt_pos++;
13663
13664 char *hash_pos = strchr (salt_pos, '$');
13665
13666 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13667
13668 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
13669
13670 hash_pos++;
13671
13672 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
13673 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
13674 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
13675 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
13676 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
13677 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
13678 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
13679 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
13680
13681 uint salt_len = hash_pos - salt_pos - 1;
13682
13683 if ((salt_len % 2) != 0) return (PARSER_SALT_LENGTH);
13684
13685 salt->salt_len = salt_len / 2;
13686
13687 pbkdf2_sha512->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
13688 pbkdf2_sha512->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
13689 pbkdf2_sha512->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
13690 pbkdf2_sha512->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
13691 pbkdf2_sha512->salt_buf[4] = hex_to_u32 ((const u8 *) &salt_pos[32]);
13692 pbkdf2_sha512->salt_buf[5] = hex_to_u32 ((const u8 *) &salt_pos[40]);
13693 pbkdf2_sha512->salt_buf[6] = hex_to_u32 ((const u8 *) &salt_pos[48]);
13694 pbkdf2_sha512->salt_buf[7] = hex_to_u32 ((const u8 *) &salt_pos[56]);
13695
13696 pbkdf2_sha512->salt_buf[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]);
13697 pbkdf2_sha512->salt_buf[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]);
13698 pbkdf2_sha512->salt_buf[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]);
13699 pbkdf2_sha512->salt_buf[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]);
13700 pbkdf2_sha512->salt_buf[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]);
13701 pbkdf2_sha512->salt_buf[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]);
13702 pbkdf2_sha512->salt_buf[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]);
13703 pbkdf2_sha512->salt_buf[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]);
13704 pbkdf2_sha512->salt_buf[8] = 0x01000000;
13705 pbkdf2_sha512->salt_buf[9] = 0x80;
13706
13707 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
13708
13709 salt->salt_iter = atoi (iter_pos) - 1;
13710
13711 return (PARSER_OK);
13712 }
13713
13714 int episerver4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13715 {
13716 if ((input_len < DISPLAY_LEN_MIN_1441) || (input_len > DISPLAY_LEN_MAX_1441)) return (PARSER_GLOBAL_LENGTH);
13717
13718 if (memcmp (SIGNATURE_EPISERVER4, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
13719
13720 u32 *digest = (u32 *) hash_buf->digest;
13721
13722 salt_t *salt = hash_buf->salt;
13723
13724 char *salt_pos = input_buf + 14;
13725
13726 char *hash_pos = strchr (salt_pos, '*');
13727
13728 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13729
13730 hash_pos++;
13731
13732 uint salt_len = hash_pos - salt_pos - 1;
13733
13734 char *salt_buf_ptr = (char *) salt->salt_buf;
13735
13736 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13737
13738 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13739
13740 salt->salt_len = salt_len;
13741
13742 u8 tmp_buf[100] = { 0 };
13743
13744 base64_decode (base64_to_int, (const u8 *) hash_pos, 43, tmp_buf);
13745
13746 memcpy (digest, tmp_buf, 32);
13747
13748 digest[0] = byte_swap_32 (digest[0]);
13749 digest[1] = byte_swap_32 (digest[1]);
13750 digest[2] = byte_swap_32 (digest[2]);
13751 digest[3] = byte_swap_32 (digest[3]);
13752 digest[4] = byte_swap_32 (digest[4]);
13753 digest[5] = byte_swap_32 (digest[5]);
13754 digest[6] = byte_swap_32 (digest[6]);
13755 digest[7] = byte_swap_32 (digest[7]);
13756
13757 digest[0] -= SHA256M_A;
13758 digest[1] -= SHA256M_B;
13759 digest[2] -= SHA256M_C;
13760 digest[3] -= SHA256M_D;
13761 digest[4] -= SHA256M_E;
13762 digest[5] -= SHA256M_F;
13763 digest[6] -= SHA256M_G;
13764 digest[7] -= SHA256M_H;
13765
13766 return (PARSER_OK);
13767 }
13768
13769 int sha512grub_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13770 {
13771 uint max_len = DISPLAY_LEN_MAX_7200 + (8 * 128);
13772
13773 if ((input_len < DISPLAY_LEN_MIN_7200) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
13774
13775 if (memcmp (SIGNATURE_SHA512GRUB, input_buf, 19)) return (PARSER_SIGNATURE_UNMATCHED);
13776
13777 u64 *digest = (u64 *) hash_buf->digest;
13778
13779 salt_t *salt = hash_buf->salt;
13780
13781 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
13782
13783 char *iter_pos = input_buf + 19;
13784
13785 char *salt_pos = strchr (iter_pos, '.');
13786
13787 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13788
13789 salt_pos++;
13790
13791 char *hash_pos = strchr (salt_pos, '.');
13792
13793 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13794
13795 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
13796
13797 hash_pos++;
13798
13799 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
13800 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
13801 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
13802 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
13803 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
13804 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
13805 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
13806 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
13807
13808 uint salt_len = hash_pos - salt_pos - 1;
13809
13810 salt_len /= 2;
13811
13812 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
13813
13814 uint i;
13815
13816 for (i = 0; i < salt_len; i++)
13817 {
13818 salt_buf_ptr[i] = hex_to_u8 ((const u8 *) &salt_pos[i * 2]);
13819 }
13820
13821 salt_buf_ptr[salt_len + 3] = 0x01;
13822 salt_buf_ptr[salt_len + 4] = 0x80;
13823
13824 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
13825
13826 salt->salt_len = salt_len;
13827
13828 salt->salt_iter = atoi (iter_pos) - 1;
13829
13830 return (PARSER_OK);
13831 }
13832
13833 int sha512b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13834 {
13835 if ((input_len < DISPLAY_LEN_MIN_1711) || (input_len > DISPLAY_LEN_MAX_1711)) return (PARSER_GLOBAL_LENGTH);
13836
13837 if (memcmp (SIGNATURE_SHA512B64S, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
13838
13839 u64 *digest = (u64 *) hash_buf->digest;
13840
13841 salt_t *salt = hash_buf->salt;
13842
13843 u8 tmp_buf[120] = { 0 };
13844
13845 int tmp_len = base64_decode (base64_to_int, (const u8 *) input_buf + 9, input_len - 9, tmp_buf);
13846
13847 if (tmp_len < 64) return (PARSER_HASH_LENGTH);
13848
13849 memcpy (digest, tmp_buf, 64);
13850
13851 digest[0] = byte_swap_64 (digest[0]);
13852 digest[1] = byte_swap_64 (digest[1]);
13853 digest[2] = byte_swap_64 (digest[2]);
13854 digest[3] = byte_swap_64 (digest[3]);
13855 digest[4] = byte_swap_64 (digest[4]);
13856 digest[5] = byte_swap_64 (digest[5]);
13857 digest[6] = byte_swap_64 (digest[6]);
13858 digest[7] = byte_swap_64 (digest[7]);
13859
13860 digest[0] -= SHA512M_A;
13861 digest[1] -= SHA512M_B;
13862 digest[2] -= SHA512M_C;
13863 digest[3] -= SHA512M_D;
13864 digest[4] -= SHA512M_E;
13865 digest[5] -= SHA512M_F;
13866 digest[6] -= SHA512M_G;
13867 digest[7] -= SHA512M_H;
13868
13869 int salt_len = tmp_len - 64;
13870
13871 if (salt_len < 0) return (PARSER_SALT_LENGTH);
13872
13873 salt->salt_len = salt_len;
13874
13875 memcpy (salt->salt_buf, tmp_buf + 64, salt->salt_len);
13876
13877 if (data.opts_type & OPTS_TYPE_ST_ADD80)
13878 {
13879 char *ptr = (char *) salt->salt_buf;
13880
13881 ptr[salt->salt_len] = 0x80;
13882 }
13883
13884 return (PARSER_OK);
13885 }
13886
13887 int hmacmd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13888 {
13889 if (data.opts_type & OPTS_TYPE_ST_HEX)
13890 {
13891 if ((input_len < DISPLAY_LEN_MIN_50H) || (input_len > DISPLAY_LEN_MAX_50H)) return (PARSER_GLOBAL_LENGTH);
13892 }
13893 else
13894 {
13895 if ((input_len < DISPLAY_LEN_MIN_50) || (input_len > DISPLAY_LEN_MAX_50)) return (PARSER_GLOBAL_LENGTH);
13896 }
13897
13898 u32 *digest = (u32 *) hash_buf->digest;
13899
13900 salt_t *salt = hash_buf->salt;
13901
13902 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13903 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13904 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13905 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13906
13907 digest[0] = byte_swap_32 (digest[0]);
13908 digest[1] = byte_swap_32 (digest[1]);
13909 digest[2] = byte_swap_32 (digest[2]);
13910 digest[3] = byte_swap_32 (digest[3]);
13911
13912 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13913
13914 uint salt_len = input_len - 32 - 1;
13915
13916 char *salt_buf = input_buf + 32 + 1;
13917
13918 char *salt_buf_ptr = (char *) salt->salt_buf;
13919
13920 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13921
13922 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13923
13924 salt->salt_len = salt_len;
13925
13926 return (PARSER_OK);
13927 }
13928
13929 int hmacsha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13930 {
13931 if (data.opts_type & OPTS_TYPE_ST_HEX)
13932 {
13933 if ((input_len < DISPLAY_LEN_MIN_150H) || (input_len > DISPLAY_LEN_MAX_150H)) return (PARSER_GLOBAL_LENGTH);
13934 }
13935 else
13936 {
13937 if ((input_len < DISPLAY_LEN_MIN_150) || (input_len > DISPLAY_LEN_MAX_150)) return (PARSER_GLOBAL_LENGTH);
13938 }
13939
13940 u32 *digest = (u32 *) hash_buf->digest;
13941
13942 salt_t *salt = hash_buf->salt;
13943
13944 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13945 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13946 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13947 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13948 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
13949
13950 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13951
13952 uint salt_len = input_len - 40 - 1;
13953
13954 char *salt_buf = input_buf + 40 + 1;
13955
13956 char *salt_buf_ptr = (char *) salt->salt_buf;
13957
13958 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13959
13960 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13961
13962 salt->salt_len = salt_len;
13963
13964 return (PARSER_OK);
13965 }
13966
13967 int hmacsha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13968 {
13969 if (data.opts_type & OPTS_TYPE_ST_HEX)
13970 {
13971 if ((input_len < DISPLAY_LEN_MIN_1450H) || (input_len > DISPLAY_LEN_MAX_1450H)) return (PARSER_GLOBAL_LENGTH);
13972 }
13973 else
13974 {
13975 if ((input_len < DISPLAY_LEN_MIN_1450) || (input_len > DISPLAY_LEN_MAX_1450)) return (PARSER_GLOBAL_LENGTH);
13976 }
13977
13978 u32 *digest = (u32 *) hash_buf->digest;
13979
13980 salt_t *salt = hash_buf->salt;
13981
13982 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13983 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13984 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13985 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13986 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
13987 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
13988 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
13989 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
13990
13991 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13992
13993 uint salt_len = input_len - 64 - 1;
13994
13995 char *salt_buf = input_buf + 64 + 1;
13996
13997 char *salt_buf_ptr = (char *) salt->salt_buf;
13998
13999 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14000
14001 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14002
14003 salt->salt_len = salt_len;
14004
14005 return (PARSER_OK);
14006 }
14007
14008 int hmacsha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14009 {
14010 if (data.opts_type & OPTS_TYPE_ST_HEX)
14011 {
14012 if ((input_len < DISPLAY_LEN_MIN_1750H) || (input_len > DISPLAY_LEN_MAX_1750H)) return (PARSER_GLOBAL_LENGTH);
14013 }
14014 else
14015 {
14016 if ((input_len < DISPLAY_LEN_MIN_1750) || (input_len > DISPLAY_LEN_MAX_1750)) return (PARSER_GLOBAL_LENGTH);
14017 }
14018
14019 u64 *digest = (u64 *) hash_buf->digest;
14020
14021 salt_t *salt = hash_buf->salt;
14022
14023 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
14024 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
14025 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
14026 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
14027 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
14028 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
14029 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
14030 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
14031
14032 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14033
14034 uint salt_len = input_len - 128 - 1;
14035
14036 char *salt_buf = input_buf + 128 + 1;
14037
14038 char *salt_buf_ptr = (char *) salt->salt_buf;
14039
14040 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14041
14042 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14043
14044 salt->salt_len = salt_len;
14045
14046 return (PARSER_OK);
14047 }
14048
14049 int krb5pa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14050 {
14051 if ((input_len < DISPLAY_LEN_MIN_7500) || (input_len > DISPLAY_LEN_MAX_7500)) return (PARSER_GLOBAL_LENGTH);
14052
14053 if (memcmp (SIGNATURE_KRB5PA, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
14054
14055 u32 *digest = (u32 *) hash_buf->digest;
14056
14057 salt_t *salt = hash_buf->salt;
14058
14059 krb5pa_t *krb5pa = (krb5pa_t *) hash_buf->esalt;
14060
14061 /**
14062 * parse line
14063 */
14064
14065 char *user_pos = input_buf + 10 + 1;
14066
14067 char *realm_pos = strchr (user_pos, '$');
14068
14069 if (realm_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14070
14071 uint user_len = realm_pos - user_pos;
14072
14073 if (user_len >= 64) return (PARSER_SALT_LENGTH);
14074
14075 realm_pos++;
14076
14077 char *salt_pos = strchr (realm_pos, '$');
14078
14079 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14080
14081 uint realm_len = salt_pos - realm_pos;
14082
14083 if (realm_len >= 64) return (PARSER_SALT_LENGTH);
14084
14085 salt_pos++;
14086
14087 char *data_pos = strchr (salt_pos, '$');
14088
14089 if (data_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14090
14091 uint salt_len = data_pos - salt_pos;
14092
14093 if (salt_len >= 128) return (PARSER_SALT_LENGTH);
14094
14095 data_pos++;
14096
14097 uint data_len = input_len - 10 - 1 - user_len - 1 - realm_len - 1 - salt_len - 1;
14098
14099 if (data_len != ((36 + 16) * 2)) return (PARSER_SALT_LENGTH);
14100
14101 /**
14102 * copy data
14103 */
14104
14105 memcpy (krb5pa->user, user_pos, user_len);
14106 memcpy (krb5pa->realm, realm_pos, realm_len);
14107 memcpy (krb5pa->salt, salt_pos, salt_len);
14108
14109 char *timestamp_ptr = (char *) krb5pa->timestamp;
14110
14111 for (uint i = 0; i < (36 * 2); i += 2)
14112 {
14113 const char p0 = data_pos[i + 0];
14114 const char p1 = data_pos[i + 1];
14115
14116 *timestamp_ptr++ = hex_convert (p1) << 0
14117 | hex_convert (p0) << 4;
14118 }
14119
14120 char *checksum_ptr = (char *) krb5pa->checksum;
14121
14122 for (uint i = (36 * 2); i < ((36 + 16) * 2); i += 2)
14123 {
14124 const char p0 = data_pos[i + 0];
14125 const char p1 = data_pos[i + 1];
14126
14127 *checksum_ptr++ = hex_convert (p1) << 0
14128 | hex_convert (p0) << 4;
14129 }
14130
14131 /**
14132 * copy some data to generic buffers to make sorting happy
14133 */
14134
14135 salt->salt_buf[0] = krb5pa->timestamp[0];
14136 salt->salt_buf[1] = krb5pa->timestamp[1];
14137 salt->salt_buf[2] = krb5pa->timestamp[2];
14138 salt->salt_buf[3] = krb5pa->timestamp[3];
14139 salt->salt_buf[4] = krb5pa->timestamp[4];
14140 salt->salt_buf[5] = krb5pa->timestamp[5];
14141 salt->salt_buf[6] = krb5pa->timestamp[6];
14142 salt->salt_buf[7] = krb5pa->timestamp[7];
14143 salt->salt_buf[8] = krb5pa->timestamp[8];
14144
14145 salt->salt_len = 36;
14146
14147 digest[0] = krb5pa->checksum[0];
14148 digest[1] = krb5pa->checksum[1];
14149 digest[2] = krb5pa->checksum[2];
14150 digest[3] = krb5pa->checksum[3];
14151
14152 return (PARSER_OK);
14153 }
14154
14155 int sapb_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14156 {
14157 if ((input_len < DISPLAY_LEN_MIN_7700) || (input_len > DISPLAY_LEN_MAX_7700)) return (PARSER_GLOBAL_LENGTH);
14158
14159 u32 *digest = (u32 *) hash_buf->digest;
14160
14161 salt_t *salt = hash_buf->salt;
14162
14163 /**
14164 * parse line
14165 */
14166
14167 char *salt_pos = input_buf;
14168
14169 char *hash_pos = strchr (salt_pos, '$');
14170
14171 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14172
14173 uint salt_len = hash_pos - salt_pos;
14174
14175 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
14176
14177 hash_pos++;
14178
14179 uint hash_len = input_len - 1 - salt_len;
14180
14181 if (hash_len != 16) return (PARSER_HASH_LENGTH);
14182
14183 /**
14184 * valid some data
14185 */
14186
14187 uint user_len = 0;
14188
14189 for (uint i = 0; i < salt_len; i++)
14190 {
14191 if (salt_pos[i] == ' ') continue;
14192
14193 user_len++;
14194 }
14195
14196 // SAP user names cannot be longer than 12 characters
14197 if (user_len > 12) return (PARSER_SALT_LENGTH);
14198
14199 // SAP user name cannot start with ! or ?
14200 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
14201
14202 /**
14203 * copy data
14204 */
14205
14206 char *salt_buf_ptr = (char *) salt->salt_buf;
14207
14208 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
14209
14210 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14211
14212 salt->salt_len = salt_len;
14213
14214 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[0]);
14215 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[8]);
14216 digest[2] = 0;
14217 digest[3] = 0;
14218
14219 digest[0] = byte_swap_32 (digest[0]);
14220 digest[1] = byte_swap_32 (digest[1]);
14221
14222 return (PARSER_OK);
14223 }
14224
14225 int sapg_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14226 {
14227 if ((input_len < DISPLAY_LEN_MIN_7800) || (input_len > DISPLAY_LEN_MAX_7800)) return (PARSER_GLOBAL_LENGTH);
14228
14229 u32 *digest = (u32 *) hash_buf->digest;
14230
14231 salt_t *salt = hash_buf->salt;
14232
14233 /**
14234 * parse line
14235 */
14236
14237 char *salt_pos = input_buf;
14238
14239 char *hash_pos = strchr (salt_pos, '$');
14240
14241 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14242
14243 uint salt_len = hash_pos - salt_pos;
14244
14245 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
14246
14247 hash_pos++;
14248
14249 uint hash_len = input_len - 1 - salt_len;
14250
14251 if (hash_len != 40) return (PARSER_HASH_LENGTH);
14252
14253 /**
14254 * valid some data
14255 */
14256
14257 uint user_len = 0;
14258
14259 for (uint i = 0; i < salt_len; i++)
14260 {
14261 if (salt_pos[i] == ' ') continue;
14262
14263 user_len++;
14264 }
14265
14266 // SAP user names cannot be longer than 12 characters
14267 // this is kinda buggy. if the username is in utf the length can be up to length 12*3
14268 // so far nobody complained so we stay with this because it helps in optimization
14269 // final string can have a max size of 32 (password) + (10 * 5) = lengthMagicArray + 12 (max salt) + 1 (the 0x80)
14270
14271 if (user_len > 12) return (PARSER_SALT_LENGTH);
14272
14273 // SAP user name cannot start with ! or ?
14274 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
14275
14276 /**
14277 * copy data
14278 */
14279
14280 char *salt_buf_ptr = (char *) salt->salt_buf;
14281
14282 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
14283
14284 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14285
14286 salt->salt_len = salt_len;
14287
14288 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
14289 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
14290 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
14291 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
14292 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
14293
14294 return (PARSER_OK);
14295 }
14296
14297 int drupal7_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14298 {
14299 if ((input_len < DISPLAY_LEN_MIN_7900) || (input_len > DISPLAY_LEN_MAX_7900)) return (PARSER_GLOBAL_LENGTH);
14300
14301 if (memcmp (SIGNATURE_DRUPAL7, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14302
14303 u64 *digest = (u64 *) hash_buf->digest;
14304
14305 salt_t *salt = hash_buf->salt;
14306
14307 char *iter_pos = input_buf + 3;
14308
14309 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
14310
14311 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
14312
14313 memcpy ((char *) salt->salt_sign, input_buf, 4);
14314
14315 salt->salt_iter = salt_iter;
14316
14317 char *salt_pos = iter_pos + 1;
14318
14319 uint salt_len = 8;
14320
14321 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
14322
14323 salt->salt_len = salt_len;
14324
14325 char *hash_pos = salt_pos + salt_len;
14326
14327 drupal7_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
14328
14329 // ugly hack start
14330
14331 char *tmp = (char *) salt->salt_buf_pc;
14332
14333 tmp[0] = hash_pos[42];
14334
14335 // ugly hack end
14336
14337 digest[ 0] = byte_swap_64 (digest[ 0]);
14338 digest[ 1] = byte_swap_64 (digest[ 1]);
14339 digest[ 2] = byte_swap_64 (digest[ 2]);
14340 digest[ 3] = byte_swap_64 (digest[ 3]);
14341 digest[ 4] = 0;
14342 digest[ 5] = 0;
14343 digest[ 6] = 0;
14344 digest[ 7] = 0;
14345
14346 return (PARSER_OK);
14347 }
14348
14349 int sybasease_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14350 {
14351 if ((input_len < DISPLAY_LEN_MIN_8000) || (input_len > DISPLAY_LEN_MAX_8000)) return (PARSER_GLOBAL_LENGTH);
14352
14353 if (memcmp (SIGNATURE_SYBASEASE, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14354
14355 u32 *digest = (u32 *) hash_buf->digest;
14356
14357 salt_t *salt = hash_buf->salt;
14358
14359 char *salt_buf = input_buf + 6;
14360
14361 uint salt_len = 16;
14362
14363 char *salt_buf_ptr = (char *) salt->salt_buf;
14364
14365 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14366
14367 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14368
14369 salt->salt_len = salt_len;
14370
14371 char *hash_pos = input_buf + 6 + 16;
14372
14373 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
14374 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
14375 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
14376 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
14377 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
14378 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
14379 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
14380 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
14381
14382 return (PARSER_OK);
14383 }
14384
14385 int mysql323_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14386 {
14387 if ((input_len < DISPLAY_LEN_MIN_200) || (input_len > DISPLAY_LEN_MAX_200)) return (PARSER_GLOBAL_LENGTH);
14388
14389 u32 *digest = (u32 *) hash_buf->digest;
14390
14391 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14392 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14393 digest[2] = 0;
14394 digest[3] = 0;
14395
14396 return (PARSER_OK);
14397 }
14398
14399 int rakp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14400 {
14401 if ((input_len < DISPLAY_LEN_MIN_7300) || (input_len > DISPLAY_LEN_MAX_7300)) return (PARSER_GLOBAL_LENGTH);
14402
14403 u32 *digest = (u32 *) hash_buf->digest;
14404
14405 salt_t *salt = hash_buf->salt;
14406
14407 rakp_t *rakp = (rakp_t *) hash_buf->esalt;
14408
14409 char *saltbuf_pos = input_buf;
14410
14411 char *hashbuf_pos = strchr (saltbuf_pos, ':');
14412
14413 if (hashbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14414
14415 uint saltbuf_len = hashbuf_pos - saltbuf_pos;
14416
14417 if (saltbuf_len < 64) return (PARSER_SALT_LENGTH);
14418 if (saltbuf_len > 512) return (PARSER_SALT_LENGTH);
14419
14420 if (saltbuf_len & 1) return (PARSER_SALT_LENGTH); // muss gerade sein wegen hex
14421
14422 hashbuf_pos++;
14423
14424 uint hashbuf_len = input_len - saltbuf_len - 1;
14425
14426 if (hashbuf_len != 40) return (PARSER_HASH_LENGTH);
14427
14428 char *salt_ptr = (char *) saltbuf_pos;
14429 char *rakp_ptr = (char *) rakp->salt_buf;
14430
14431 uint i;
14432 uint j;
14433
14434 for (i = 0, j = 0; i < saltbuf_len; i += 2, j += 1)
14435 {
14436 rakp_ptr[j] = hex_to_u8 ((const u8 *) &salt_ptr[i]);
14437 }
14438
14439 rakp_ptr[j] = 0x80;
14440
14441 rakp->salt_len = j;
14442
14443 for (i = 0; i < 64; i++)
14444 {
14445 rakp->salt_buf[i] = byte_swap_32 (rakp->salt_buf[i]);
14446 }
14447
14448 salt->salt_buf[0] = rakp->salt_buf[0];
14449 salt->salt_buf[1] = rakp->salt_buf[1];
14450 salt->salt_buf[2] = rakp->salt_buf[2];
14451 salt->salt_buf[3] = rakp->salt_buf[3];
14452 salt->salt_buf[4] = rakp->salt_buf[4];
14453 salt->salt_buf[5] = rakp->salt_buf[5];
14454 salt->salt_buf[6] = rakp->salt_buf[6];
14455 salt->salt_buf[7] = rakp->salt_buf[7];
14456
14457 salt->salt_len = 32; // muss min. 32 haben
14458
14459 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
14460 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
14461 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
14462 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
14463 digest[4] = hex_to_u32 ((const u8 *) &hashbuf_pos[32]);
14464
14465 return (PARSER_OK);
14466 }
14467
14468 int netscaler_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14469 {
14470 if ((input_len < DISPLAY_LEN_MIN_8100) || (input_len > DISPLAY_LEN_MAX_8100)) return (PARSER_GLOBAL_LENGTH);
14471
14472 u32 *digest = (u32 *) hash_buf->digest;
14473
14474 salt_t *salt = hash_buf->salt;
14475
14476 if (memcmp (SIGNATURE_NETSCALER, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
14477
14478 char *salt_pos = input_buf + 1;
14479
14480 memcpy (salt->salt_buf, salt_pos, 8);
14481
14482 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
14483 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
14484
14485 salt->salt_len = 8;
14486
14487 char *hash_pos = salt_pos + 8;
14488
14489 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
14490 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
14491 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
14492 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
14493 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
14494
14495 digest[0] -= SHA1M_A;
14496 digest[1] -= SHA1M_B;
14497 digest[2] -= SHA1M_C;
14498 digest[3] -= SHA1M_D;
14499 digest[4] -= SHA1M_E;
14500
14501 return (PARSER_OK);
14502 }
14503
14504 int chap_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14505 {
14506 if ((input_len < DISPLAY_LEN_MIN_4800) || (input_len > DISPLAY_LEN_MAX_4800)) return (PARSER_GLOBAL_LENGTH);
14507
14508 u32 *digest = (u32 *) hash_buf->digest;
14509
14510 salt_t *salt = hash_buf->salt;
14511
14512 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14513 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14514 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14515 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14516
14517 digest[0] = byte_swap_32 (digest[0]);
14518 digest[1] = byte_swap_32 (digest[1]);
14519 digest[2] = byte_swap_32 (digest[2]);
14520 digest[3] = byte_swap_32 (digest[3]);
14521
14522 digest[0] -= MD5M_A;
14523 digest[1] -= MD5M_B;
14524 digest[2] -= MD5M_C;
14525 digest[3] -= MD5M_D;
14526
14527 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14528
14529 char *salt_buf_ptr = input_buf + 32 + 1;
14530
14531 u32 *salt_buf = salt->salt_buf;
14532
14533 salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf_ptr[ 0]);
14534 salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf_ptr[ 8]);
14535 salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf_ptr[16]);
14536 salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf_ptr[24]);
14537
14538 salt_buf[0] = byte_swap_32 (salt_buf[0]);
14539 salt_buf[1] = byte_swap_32 (salt_buf[1]);
14540 salt_buf[2] = byte_swap_32 (salt_buf[2]);
14541 salt_buf[3] = byte_swap_32 (salt_buf[3]);
14542
14543 salt->salt_len = 16 + 1;
14544
14545 if (input_buf[65] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14546
14547 char *idbyte_buf_ptr = input_buf + 32 + 1 + 32 + 1;
14548
14549 salt_buf[4] = hex_to_u8 ((const u8 *) &idbyte_buf_ptr[0]) & 0xff;
14550
14551 return (PARSER_OK);
14552 }
14553
14554 int cloudkey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14555 {
14556 if ((input_len < DISPLAY_LEN_MIN_8200) || (input_len > DISPLAY_LEN_MAX_8200)) return (PARSER_GLOBAL_LENGTH);
14557
14558 u32 *digest = (u32 *) hash_buf->digest;
14559
14560 salt_t *salt = hash_buf->salt;
14561
14562 cloudkey_t *cloudkey = (cloudkey_t *) hash_buf->esalt;
14563
14564 /**
14565 * parse line
14566 */
14567
14568 char *hashbuf_pos = input_buf;
14569
14570 char *saltbuf_pos = strchr (hashbuf_pos, ':');
14571
14572 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14573
14574 const uint hashbuf_len = saltbuf_pos - hashbuf_pos;
14575
14576 if (hashbuf_len != 64) return (PARSER_HASH_LENGTH);
14577
14578 saltbuf_pos++;
14579
14580 char *iteration_pos = strchr (saltbuf_pos, ':');
14581
14582 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14583
14584 const uint saltbuf_len = iteration_pos - saltbuf_pos;
14585
14586 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
14587
14588 iteration_pos++;
14589
14590 char *databuf_pos = strchr (iteration_pos, ':');
14591
14592 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14593
14594 const uint iteration_len = databuf_pos - iteration_pos;
14595
14596 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
14597 if (iteration_len > 8) return (PARSER_SALT_ITERATION);
14598
14599 const uint databuf_len = input_len - hashbuf_len - 1 - saltbuf_len - 1 - iteration_len - 1;
14600
14601 if (databuf_len < 1) return (PARSER_SALT_LENGTH);
14602 if (databuf_len > 2048) return (PARSER_SALT_LENGTH);
14603
14604 databuf_pos++;
14605
14606 // digest
14607
14608 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
14609 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
14610 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
14611 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
14612 digest[4] = hex_to_u32 ((const u8 *) &hashbuf_pos[32]);
14613 digest[5] = hex_to_u32 ((const u8 *) &hashbuf_pos[40]);
14614 digest[6] = hex_to_u32 ((const u8 *) &hashbuf_pos[48]);
14615 digest[7] = hex_to_u32 ((const u8 *) &hashbuf_pos[56]);
14616
14617 // salt
14618
14619 char *saltbuf_ptr = (char *) salt->salt_buf;
14620
14621 for (uint i = 0; i < saltbuf_len; i += 2)
14622 {
14623 const char p0 = saltbuf_pos[i + 0];
14624 const char p1 = saltbuf_pos[i + 1];
14625
14626 *saltbuf_ptr++ = hex_convert (p1) << 0
14627 | hex_convert (p0) << 4;
14628 }
14629
14630 salt->salt_buf[4] = 0x01000000;
14631 salt->salt_buf[5] = 0x80;
14632
14633 salt->salt_len = saltbuf_len / 2;
14634
14635 // iteration
14636
14637 salt->salt_iter = atoi (iteration_pos) - 1;
14638
14639 // data
14640
14641 char *databuf_ptr = (char *) cloudkey->data_buf;
14642
14643 for (uint i = 0; i < databuf_len; i += 2)
14644 {
14645 const char p0 = databuf_pos[i + 0];
14646 const char p1 = databuf_pos[i + 1];
14647
14648 *databuf_ptr++ = hex_convert (p1) << 0
14649 | hex_convert (p0) << 4;
14650 }
14651
14652 *databuf_ptr++ = 0x80;
14653
14654 for (uint i = 0; i < 512; i++)
14655 {
14656 cloudkey->data_buf[i] = byte_swap_32 (cloudkey->data_buf[i]);
14657 }
14658
14659 cloudkey->data_len = databuf_len / 2;
14660
14661 return (PARSER_OK);
14662 }
14663
14664 int nsec3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14665 {
14666 if ((input_len < DISPLAY_LEN_MIN_8300) || (input_len > DISPLAY_LEN_MAX_8300)) return (PARSER_GLOBAL_LENGTH);
14667
14668 u32 *digest = (u32 *) hash_buf->digest;
14669
14670 salt_t *salt = hash_buf->salt;
14671
14672 /**
14673 * parse line
14674 */
14675
14676 char *hashbuf_pos = input_buf;
14677
14678 char *domainbuf_pos = strchr (hashbuf_pos, ':');
14679
14680 if (domainbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14681
14682 const uint hashbuf_len = domainbuf_pos - hashbuf_pos;
14683
14684 if (hashbuf_len != 32) return (PARSER_HASH_LENGTH);
14685
14686 domainbuf_pos++;
14687
14688 if (domainbuf_pos[0] != '.') return (PARSER_SALT_VALUE);
14689
14690 char *saltbuf_pos = strchr (domainbuf_pos, ':');
14691
14692 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14693
14694 const uint domainbuf_len = saltbuf_pos - domainbuf_pos;
14695
14696 if (domainbuf_len >= 32) return (PARSER_SALT_LENGTH);
14697
14698 saltbuf_pos++;
14699
14700 char *iteration_pos = strchr (saltbuf_pos, ':');
14701
14702 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14703
14704 const uint saltbuf_len = iteration_pos - saltbuf_pos;
14705
14706 if (saltbuf_len >= 28) return (PARSER_SALT_LENGTH); // 28 = 32 - 4; 4 = length
14707
14708 if ((domainbuf_len + saltbuf_len) >= 48) return (PARSER_SALT_LENGTH);
14709
14710 iteration_pos++;
14711
14712 const uint iteration_len = input_len - hashbuf_len - 1 - domainbuf_len - 1 - saltbuf_len - 1;
14713
14714 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
14715 if (iteration_len > 5) return (PARSER_SALT_ITERATION);
14716
14717 // ok, the plan for this algorithm is the following:
14718 // we have 2 salts here, the domain-name and a random salt
14719 // while both are used in the initial transformation,
14720 // only the random salt is used in the following iterations
14721 // so we create two buffer, one that includes domain-name (stored into salt_buf_pc[])
14722 // and one that includes only the real salt (stored into salt_buf[]).
14723 // the domain-name length is put into array position 7 of salt_buf_pc[] since there is not salt_pc_len
14724
14725 u8 tmp_buf[100] = { 0 };
14726
14727 base32_decode (itoa32_to_int, (const u8 *) hashbuf_pos, 32, tmp_buf);
14728
14729 memcpy (digest, tmp_buf, 20);
14730
14731 digest[0] = byte_swap_32 (digest[0]);
14732 digest[1] = byte_swap_32 (digest[1]);
14733 digest[2] = byte_swap_32 (digest[2]);
14734 digest[3] = byte_swap_32 (digest[3]);
14735 digest[4] = byte_swap_32 (digest[4]);
14736
14737 // domain
14738
14739 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
14740
14741 memcpy (salt_buf_pc_ptr, domainbuf_pos, domainbuf_len);
14742
14743 char *len_ptr = NULL;
14744
14745 for (uint i = 0; i < domainbuf_len; i++)
14746 {
14747 if (salt_buf_pc_ptr[i] == '.')
14748 {
14749 len_ptr = &salt_buf_pc_ptr[i];
14750
14751 *len_ptr = 0;
14752 }
14753 else
14754 {
14755 *len_ptr += 1;
14756 }
14757 }
14758
14759 salt->salt_buf_pc[7] = domainbuf_len;
14760
14761 // "real" salt
14762
14763 char *salt_buf_ptr = (char *) salt->salt_buf;
14764
14765 const uint salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, saltbuf_len);
14766
14767 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14768
14769 salt->salt_len = salt_len;
14770
14771 // iteration
14772
14773 salt->salt_iter = atoi (iteration_pos);
14774
14775 return (PARSER_OK);
14776 }
14777
14778 int wbb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14779 {
14780 if ((input_len < DISPLAY_LEN_MIN_8400) || (input_len > DISPLAY_LEN_MAX_8400)) return (PARSER_GLOBAL_LENGTH);
14781
14782 u32 *digest = (u32 *) hash_buf->digest;
14783
14784 salt_t *salt = hash_buf->salt;
14785
14786 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14787 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14788 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14789 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14790 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
14791
14792 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14793
14794 uint salt_len = input_len - 40 - 1;
14795
14796 char *salt_buf = input_buf + 40 + 1;
14797
14798 char *salt_buf_ptr = (char *) salt->salt_buf;
14799
14800 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14801
14802 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14803
14804 salt->salt_len = salt_len;
14805
14806 return (PARSER_OK);
14807 }
14808
14809 int racf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14810 {
14811 const u8 ascii_to_ebcdic[] =
14812 {
14813 0x00, 0x01, 0x02, 0x03, 0x37, 0x2d, 0x2e, 0x2f, 0x16, 0x05, 0x25, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
14814 0x10, 0x11, 0x12, 0x13, 0x3c, 0x3d, 0x32, 0x26, 0x18, 0x19, 0x3f, 0x27, 0x1c, 0x1d, 0x1e, 0x1f,
14815 0x40, 0x4f, 0x7f, 0x7b, 0x5b, 0x6c, 0x50, 0x7d, 0x4d, 0x5d, 0x5c, 0x4e, 0x6b, 0x60, 0x4b, 0x61,
14816 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0x7a, 0x5e, 0x4c, 0x7e, 0x6e, 0x6f,
14817 0x7c, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6,
14818 0xd7, 0xd8, 0xd9, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0x4a, 0xe0, 0x5a, 0x5f, 0x6d,
14819 0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
14820 0x97, 0x98, 0x99, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xc0, 0x6a, 0xd0, 0xa1, 0x07,
14821 0x20, 0x21, 0x22, 0x23, 0x24, 0x15, 0x06, 0x17, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x09, 0x0a, 0x1b,
14822 0x30, 0x31, 0x1a, 0x33, 0x34, 0x35, 0x36, 0x08, 0x38, 0x39, 0x3a, 0x3b, 0x04, 0x14, 0x3e, 0xe1,
14823 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
14824 0x58, 0x59, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75,
14825 0x76, 0x77, 0x78, 0x80, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e,
14826 0x9f, 0xa0, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
14827 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xda, 0xdb,
14828 0xdc, 0xdd, 0xde, 0xdf, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
14829 };
14830
14831 if ((input_len < DISPLAY_LEN_MIN_8500) || (input_len > DISPLAY_LEN_MAX_8500)) return (PARSER_GLOBAL_LENGTH);
14832
14833 if (memcmp (SIGNATURE_RACF, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14834
14835 u32 *digest = (u32 *) hash_buf->digest;
14836
14837 salt_t *salt = hash_buf->salt;
14838
14839 char *salt_pos = input_buf + 6 + 1;
14840
14841 char *digest_pos = strchr (salt_pos, '*');
14842
14843 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14844
14845 uint salt_len = digest_pos - salt_pos;
14846
14847 if (salt_len > 8) return (PARSER_SALT_LENGTH);
14848
14849 uint hash_len = input_len - 1 - salt_len - 1 - 6;
14850
14851 if (hash_len != 16) return (PARSER_HASH_LENGTH);
14852
14853 digest_pos++;
14854
14855 char *salt_buf_ptr = (char *) salt->salt_buf;
14856 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
14857
14858 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
14859
14860 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14861
14862 salt->salt_len = salt_len;
14863
14864 for (uint i = 0; i < salt_len; i++)
14865 {
14866 salt_buf_pc_ptr[i] = ascii_to_ebcdic[(int) salt_buf_ptr[i]];
14867 }
14868 for (uint i = salt_len; i < 8; i++)
14869 {
14870 salt_buf_pc_ptr[i] = 0x40;
14871 }
14872
14873 uint tt;
14874
14875 IP (salt->salt_buf_pc[0], salt->salt_buf_pc[1], tt);
14876
14877 salt->salt_buf_pc[0] = rotl32 (salt->salt_buf_pc[0], 3u);
14878 salt->salt_buf_pc[1] = rotl32 (salt->salt_buf_pc[1], 3u);
14879
14880 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
14881 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
14882
14883 digest[0] = byte_swap_32 (digest[0]);
14884 digest[1] = byte_swap_32 (digest[1]);
14885
14886 IP (digest[0], digest[1], tt);
14887
14888 digest[0] = rotr32 (digest[0], 29);
14889 digest[1] = rotr32 (digest[1], 29);
14890 digest[2] = 0;
14891 digest[3] = 0;
14892
14893 return (PARSER_OK);
14894 }
14895
14896 int lotus5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14897 {
14898 if ((input_len < DISPLAY_LEN_MIN_8600) || (input_len > DISPLAY_LEN_MAX_8600)) return (PARSER_GLOBAL_LENGTH);
14899
14900 u32 *digest = (u32 *) hash_buf->digest;
14901
14902 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14903 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14904 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14905 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14906
14907 digest[0] = byte_swap_32 (digest[0]);
14908 digest[1] = byte_swap_32 (digest[1]);
14909 digest[2] = byte_swap_32 (digest[2]);
14910 digest[3] = byte_swap_32 (digest[3]);
14911
14912 return (PARSER_OK);
14913 }
14914
14915 int lotus6_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14916 {
14917 if ((input_len < DISPLAY_LEN_MIN_8700) || (input_len > DISPLAY_LEN_MAX_8700)) return (PARSER_GLOBAL_LENGTH);
14918
14919 if ((input_buf[0] != '(') || (input_buf[1] != 'G') || (input_buf[21] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
14920
14921 u32 *digest = (u32 *) hash_buf->digest;
14922
14923 salt_t *salt = hash_buf->salt;
14924
14925 u8 tmp_buf[120] = { 0 };
14926
14927 base64_decode (lotus64_to_int, (const u8 *) input_buf + 2, input_len - 3, tmp_buf);
14928
14929 tmp_buf[3] += -4; // dont ask!
14930
14931 memcpy (salt->salt_buf, tmp_buf, 5);
14932
14933 salt->salt_len = 5;
14934
14935 memcpy (digest, tmp_buf + 5, 9);
14936
14937 // yes, only 9 byte are needed to crack, but 10 to display
14938
14939 salt->salt_buf_pc[7] = input_buf[20];
14940
14941 return (PARSER_OK);
14942 }
14943
14944 int lotus8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14945 {
14946 if ((input_len < DISPLAY_LEN_MIN_9100) || (input_len > DISPLAY_LEN_MAX_9100)) return (PARSER_GLOBAL_LENGTH);
14947
14948 if ((input_buf[0] != '(') || (input_buf[1] != 'H') || (input_buf[DISPLAY_LEN_MAX_9100 - 1] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
14949
14950 u32 *digest = (u32 *) hash_buf->digest;
14951
14952 salt_t *salt = hash_buf->salt;
14953
14954 u8 tmp_buf[120] = { 0 };
14955
14956 base64_decode (lotus64_to_int, (const u8 *) input_buf + 2, input_len - 3, tmp_buf);
14957
14958 tmp_buf[3] += -4; // dont ask!
14959
14960 // salt
14961
14962 memcpy (salt->salt_buf, tmp_buf, 16);
14963
14964 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)
14965
14966 // iteration
14967
14968 char tmp_iter_buf[11] = { 0 };
14969
14970 memcpy (tmp_iter_buf, tmp_buf + 16, 10);
14971
14972 tmp_iter_buf[10] = 0;
14973
14974 salt->salt_iter = atoi (tmp_iter_buf);
14975
14976 if (salt->salt_iter < 1) // well, the limit hopefully is much higher
14977 {
14978 return (PARSER_SALT_ITERATION);
14979 }
14980
14981 salt->salt_iter--; // first round in init
14982
14983 // 2 additional bytes for display only
14984
14985 salt->salt_buf_pc[0] = tmp_buf[26];
14986 salt->salt_buf_pc[1] = tmp_buf[27];
14987
14988 // digest
14989
14990 memcpy (digest, tmp_buf + 28, 8);
14991
14992 digest[0] = byte_swap_32 (digest[0]);
14993 digest[1] = byte_swap_32 (digest[1]);
14994 digest[2] = 0;
14995 digest[3] = 0;
14996
14997 return (PARSER_OK);
14998 }
14999
15000 int hmailserver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15001 {
15002 if ((input_len < DISPLAY_LEN_MIN_1421) || (input_len > DISPLAY_LEN_MAX_1421)) return (PARSER_GLOBAL_LENGTH);
15003
15004 u32 *digest = (u32 *) hash_buf->digest;
15005
15006 salt_t *salt = hash_buf->salt;
15007
15008 char *salt_buf_pos = input_buf;
15009
15010 char *hash_buf_pos = salt_buf_pos + 6;
15011
15012 digest[0] = hex_to_u32 ((const u8 *) &hash_buf_pos[ 0]);
15013 digest[1] = hex_to_u32 ((const u8 *) &hash_buf_pos[ 8]);
15014 digest[2] = hex_to_u32 ((const u8 *) &hash_buf_pos[16]);
15015 digest[3] = hex_to_u32 ((const u8 *) &hash_buf_pos[24]);
15016 digest[4] = hex_to_u32 ((const u8 *) &hash_buf_pos[32]);
15017 digest[5] = hex_to_u32 ((const u8 *) &hash_buf_pos[40]);
15018 digest[6] = hex_to_u32 ((const u8 *) &hash_buf_pos[48]);
15019 digest[7] = hex_to_u32 ((const u8 *) &hash_buf_pos[56]);
15020
15021 digest[0] -= SHA256M_A;
15022 digest[1] -= SHA256M_B;
15023 digest[2] -= SHA256M_C;
15024 digest[3] -= SHA256M_D;
15025 digest[4] -= SHA256M_E;
15026 digest[5] -= SHA256M_F;
15027 digest[6] -= SHA256M_G;
15028 digest[7] -= SHA256M_H;
15029
15030 char *salt_buf_ptr = (char *) salt->salt_buf;
15031
15032 const uint salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf_pos, 6);
15033
15034 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
15035
15036 salt->salt_len = salt_len;
15037
15038 return (PARSER_OK);
15039 }
15040
15041 int phps_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15042 {
15043 if ((input_len < DISPLAY_LEN_MIN_2612) || (input_len > DISPLAY_LEN_MAX_2612)) return (PARSER_GLOBAL_LENGTH);
15044
15045 u32 *digest = (u32 *) hash_buf->digest;
15046
15047 if (memcmp (SIGNATURE_PHPS, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
15048
15049 salt_t *salt = hash_buf->salt;
15050
15051 char *salt_buf = input_buf + 6;
15052
15053 char *digest_buf = strchr (salt_buf, '$');
15054
15055 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15056
15057 uint salt_len = digest_buf - salt_buf;
15058
15059 digest_buf++; // skip the '$' symbol
15060
15061 char *salt_buf_ptr = (char *) salt->salt_buf;
15062
15063 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
15064
15065 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
15066
15067 salt->salt_len = salt_len;
15068
15069 digest[0] = hex_to_u32 ((const u8 *) &digest_buf[ 0]);
15070 digest[1] = hex_to_u32 ((const u8 *) &digest_buf[ 8]);
15071 digest[2] = hex_to_u32 ((const u8 *) &digest_buf[16]);
15072 digest[3] = hex_to_u32 ((const u8 *) &digest_buf[24]);
15073
15074 digest[0] = byte_swap_32 (digest[0]);
15075 digest[1] = byte_swap_32 (digest[1]);
15076 digest[2] = byte_swap_32 (digest[2]);
15077 digest[3] = byte_swap_32 (digest[3]);
15078
15079 digest[0] -= MD5M_A;
15080 digest[1] -= MD5M_B;
15081 digest[2] -= MD5M_C;
15082 digest[3] -= MD5M_D;
15083
15084 return (PARSER_OK);
15085 }
15086
15087 int mediawiki_b_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15088 {
15089 if ((input_len < DISPLAY_LEN_MIN_3711) || (input_len > DISPLAY_LEN_MAX_3711)) return (PARSER_GLOBAL_LENGTH);
15090
15091 if (memcmp (SIGNATURE_MEDIAWIKI_B, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
15092
15093 u32 *digest = (u32 *) hash_buf->digest;
15094
15095 salt_t *salt = hash_buf->salt;
15096
15097 char *salt_buf = input_buf + 3;
15098
15099 char *digest_buf = strchr (salt_buf, '$');
15100
15101 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15102
15103 uint salt_len = digest_buf - salt_buf;
15104
15105 digest_buf++; // skip the '$' symbol
15106
15107 char *salt_buf_ptr = (char *) salt->salt_buf;
15108
15109 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
15110
15111 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
15112
15113 salt_buf_ptr[salt_len] = 0x2d;
15114
15115 salt->salt_len = salt_len + 1;
15116
15117 digest[0] = hex_to_u32 ((const u8 *) &digest_buf[ 0]);
15118 digest[1] = hex_to_u32 ((const u8 *) &digest_buf[ 8]);
15119 digest[2] = hex_to_u32 ((const u8 *) &digest_buf[16]);
15120 digest[3] = hex_to_u32 ((const u8 *) &digest_buf[24]);
15121
15122 digest[0] = byte_swap_32 (digest[0]);
15123 digest[1] = byte_swap_32 (digest[1]);
15124 digest[2] = byte_swap_32 (digest[2]);
15125 digest[3] = byte_swap_32 (digest[3]);
15126
15127 digest[0] -= MD5M_A;
15128 digest[1] -= MD5M_B;
15129 digest[2] -= MD5M_C;
15130 digest[3] -= MD5M_D;
15131
15132 return (PARSER_OK);
15133 }
15134
15135 int peoplesoft_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15136 {
15137 if ((input_len < DISPLAY_LEN_MIN_133) || (input_len > DISPLAY_LEN_MAX_133)) return (PARSER_GLOBAL_LENGTH);
15138
15139 u32 *digest = (u32 *) hash_buf->digest;
15140
15141 salt_t *salt = hash_buf->salt;
15142
15143 u8 tmp_buf[100] = { 0 };
15144
15145 base64_decode (base64_to_int, (const u8 *) input_buf, input_len, tmp_buf);
15146
15147 memcpy (digest, tmp_buf, 20);
15148
15149 digest[0] = byte_swap_32 (digest[0]);
15150 digest[1] = byte_swap_32 (digest[1]);
15151 digest[2] = byte_swap_32 (digest[2]);
15152 digest[3] = byte_swap_32 (digest[3]);
15153 digest[4] = byte_swap_32 (digest[4]);
15154
15155 digest[0] -= SHA1M_A;
15156 digest[1] -= SHA1M_B;
15157 digest[2] -= SHA1M_C;
15158 digest[3] -= SHA1M_D;
15159 digest[4] -= SHA1M_E;
15160
15161 salt->salt_buf[0] = 0x80;
15162
15163 salt->salt_len = 0;
15164
15165 return (PARSER_OK);
15166 }
15167
15168 int skype_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15169 {
15170 if ((input_len < DISPLAY_LEN_MIN_23) || (input_len > DISPLAY_LEN_MAX_23)) return (PARSER_GLOBAL_LENGTH);
15171
15172 u32 *digest = (u32 *) hash_buf->digest;
15173
15174 salt_t *salt = hash_buf->salt;
15175
15176 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
15177 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
15178 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
15179 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
15180
15181 digest[0] = byte_swap_32 (digest[0]);
15182 digest[1] = byte_swap_32 (digest[1]);
15183 digest[2] = byte_swap_32 (digest[2]);
15184 digest[3] = byte_swap_32 (digest[3]);
15185
15186 digest[0] -= MD5M_A;
15187 digest[1] -= MD5M_B;
15188 digest[2] -= MD5M_C;
15189 digest[3] -= MD5M_D;
15190
15191 if (input_buf[32] != ':') return (PARSER_SEPARATOR_UNMATCHED);
15192
15193 uint salt_len = input_len - 32 - 1;
15194
15195 char *salt_buf = input_buf + 32 + 1;
15196
15197 char *salt_buf_ptr = (char *) salt->salt_buf;
15198
15199 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
15200
15201 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
15202
15203 /*
15204 * add static "salt" part
15205 */
15206
15207 memcpy (salt_buf_ptr + salt_len, "\nskyper\n", 8);
15208
15209 salt_len += 8;
15210
15211 salt->salt_len = salt_len;
15212
15213 return (PARSER_OK);
15214 }
15215
15216 int androidfde_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15217 {
15218 if ((input_len < DISPLAY_LEN_MIN_8800) || (input_len > DISPLAY_LEN_MAX_8800)) return (PARSER_GLOBAL_LENGTH);
15219
15220 if (memcmp (SIGNATURE_ANDROIDFDE, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
15221
15222 u32 *digest = (u32 *) hash_buf->digest;
15223
15224 salt_t *salt = hash_buf->salt;
15225
15226 androidfde_t *androidfde = (androidfde_t *) hash_buf->esalt;
15227
15228 /**
15229 * parse line
15230 */
15231
15232 char *saltlen_pos = input_buf + 1 + 3 + 1;
15233
15234 char *saltbuf_pos = strchr (saltlen_pos, '$');
15235
15236 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15237
15238 uint saltlen_len = saltbuf_pos - saltlen_pos;
15239
15240 if (saltlen_len != 2) return (PARSER_SALT_LENGTH);
15241
15242 saltbuf_pos++;
15243
15244 char *keylen_pos = strchr (saltbuf_pos, '$');
15245
15246 if (keylen_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15247
15248 uint saltbuf_len = keylen_pos - saltbuf_pos;
15249
15250 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
15251
15252 keylen_pos++;
15253
15254 char *keybuf_pos = strchr (keylen_pos, '$');
15255
15256 if (keybuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15257
15258 uint keylen_len = keybuf_pos - keylen_pos;
15259
15260 if (keylen_len != 2) return (PARSER_SALT_LENGTH);
15261
15262 keybuf_pos++;
15263
15264 char *databuf_pos = strchr (keybuf_pos, '$');
15265
15266 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15267
15268 uint keybuf_len = databuf_pos - keybuf_pos;
15269
15270 if (keybuf_len != 32) return (PARSER_SALT_LENGTH);
15271
15272 databuf_pos++;
15273
15274 uint data_len = input_len - 1 - 3 - 1 - saltlen_len - 1 - saltbuf_len - 1 - keylen_len - 1 - keybuf_len - 1;
15275
15276 if (data_len != 3072) return (PARSER_SALT_LENGTH);
15277
15278 /**
15279 * copy data
15280 */
15281
15282 digest[0] = hex_to_u32 ((const u8 *) &keybuf_pos[ 0]);
15283 digest[1] = hex_to_u32 ((const u8 *) &keybuf_pos[ 8]);
15284 digest[2] = hex_to_u32 ((const u8 *) &keybuf_pos[16]);
15285 digest[3] = hex_to_u32 ((const u8 *) &keybuf_pos[24]);
15286
15287 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &saltbuf_pos[ 0]);
15288 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &saltbuf_pos[ 8]);
15289 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &saltbuf_pos[16]);
15290 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &saltbuf_pos[24]);
15291
15292 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15293 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15294 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15295 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15296
15297 salt->salt_len = 16;
15298 salt->salt_iter = ROUNDS_ANDROIDFDE - 1;
15299
15300 for (uint i = 0, j = 0; i < 3072; i += 8, j += 1)
15301 {
15302 androidfde->data[j] = hex_to_u32 ((const u8 *) &databuf_pos[i]);
15303 }
15304
15305 return (PARSER_OK);
15306 }
15307
15308 int scrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15309 {
15310 if ((input_len < DISPLAY_LEN_MIN_8900) || (input_len > DISPLAY_LEN_MAX_8900)) return (PARSER_GLOBAL_LENGTH);
15311
15312 if (memcmp (SIGNATURE_SCRYPT, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
15313
15314 u32 *digest = (u32 *) hash_buf->digest;
15315
15316 salt_t *salt = hash_buf->salt;
15317
15318 /**
15319 * parse line
15320 */
15321
15322 // first is the N salt parameter
15323
15324 char *N_pos = input_buf + 6;
15325
15326 if (N_pos[0] != ':') return (PARSER_SEPARATOR_UNMATCHED);
15327
15328 N_pos++;
15329
15330 salt->scrypt_N = atoi (N_pos);
15331
15332 // r
15333
15334 char *r_pos = strchr (N_pos, ':');
15335
15336 if (r_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15337
15338 r_pos++;
15339
15340 salt->scrypt_r = atoi (r_pos);
15341
15342 // p
15343
15344 char *p_pos = strchr (r_pos, ':');
15345
15346 if (p_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15347
15348 p_pos++;
15349
15350 salt->scrypt_p = atoi (p_pos);
15351
15352 // salt
15353
15354 char *saltbuf_pos = strchr (p_pos, ':');
15355
15356 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15357
15358 saltbuf_pos++;
15359
15360 char *hash_pos = strchr (saltbuf_pos, ':');
15361
15362 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15363
15364 hash_pos++;
15365
15366 // base64 decode
15367
15368 int salt_len_base64 = hash_pos - saltbuf_pos;
15369
15370 if (salt_len_base64 > 45) return (PARSER_SALT_LENGTH);
15371
15372 u8 tmp_buf[33] = { 0 };
15373
15374 int tmp_len = base64_decode (base64_to_int, (const u8 *) saltbuf_pos, salt_len_base64, tmp_buf);
15375
15376 char *salt_buf_ptr = (char *) salt->salt_buf;
15377
15378 memcpy (salt_buf_ptr, tmp_buf, tmp_len);
15379
15380 salt->salt_len = tmp_len;
15381 salt->salt_iter = 1;
15382
15383 // digest - base64 decode
15384
15385 memset (tmp_buf, 0, sizeof (tmp_buf));
15386
15387 tmp_len = input_len - (hash_pos - input_buf);
15388
15389 if (tmp_len != 44) return (PARSER_GLOBAL_LENGTH);
15390
15391 base64_decode (base64_to_int, (const u8 *) hash_pos, tmp_len, tmp_buf);
15392
15393 memcpy (digest, tmp_buf, 32);
15394
15395 return (PARSER_OK);
15396 }
15397
15398 int juniper_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15399 {
15400 if ((input_len < DISPLAY_LEN_MIN_501) || (input_len > DISPLAY_LEN_MAX_501)) return (PARSER_GLOBAL_LENGTH);
15401
15402 u32 *digest = (u32 *) hash_buf->digest;
15403
15404 salt_t *salt = hash_buf->salt;
15405
15406 /**
15407 * parse line
15408 */
15409
15410 char decrypted[76] = { 0 }; // iv + hash
15411
15412 juniper_decrypt_hash (input_buf, decrypted);
15413
15414 char *md5crypt_hash = decrypted + 12;
15415
15416 if (memcmp (md5crypt_hash, "$1$danastre$", 12)) return (PARSER_SALT_VALUE);
15417
15418 salt->salt_iter = ROUNDS_MD5CRYPT;
15419
15420 char *salt_pos = md5crypt_hash + 3;
15421
15422 char *hash_pos = strchr (salt_pos, '$'); // or simply salt_pos + 8
15423
15424 salt->salt_len = hash_pos - salt_pos; // should be 8
15425
15426 memcpy ((char *) salt->salt_buf, salt_pos, salt->salt_len);
15427
15428 hash_pos++;
15429
15430 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
15431
15432 return (PARSER_OK);
15433 }
15434
15435 int cisco8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15436 {
15437 if ((input_len < DISPLAY_LEN_MIN_9200) || (input_len > DISPLAY_LEN_MAX_9200)) return (PARSER_GLOBAL_LENGTH);
15438
15439 if (memcmp (SIGNATURE_CISCO8, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
15440
15441 u32 *digest = (u32 *) hash_buf->digest;
15442
15443 salt_t *salt = hash_buf->salt;
15444
15445 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
15446
15447 /**
15448 * parse line
15449 */
15450
15451 // first is *raw* salt
15452
15453 char *salt_pos = input_buf + 3;
15454
15455 char *hash_pos = strchr (salt_pos, '$');
15456
15457 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15458
15459 uint salt_len = hash_pos - salt_pos;
15460
15461 if (salt_len != 14) return (PARSER_SALT_LENGTH);
15462
15463 hash_pos++;
15464
15465 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
15466
15467 memcpy (salt_buf_ptr, salt_pos, 14);
15468
15469 salt_buf_ptr[17] = 0x01;
15470 salt_buf_ptr[18] = 0x80;
15471
15472 // add some stuff to normal salt to make sorted happy
15473
15474 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
15475 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
15476 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
15477 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
15478
15479 salt->salt_len = salt_len;
15480 salt->salt_iter = ROUNDS_CISCO8 - 1;
15481
15482 // base64 decode hash
15483
15484 u8 tmp_buf[100] = { 0 };
15485
15486 uint hash_len = input_len - 3 - salt_len - 1;
15487
15488 int tmp_len = base64_decode (itoa64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
15489
15490 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
15491
15492 memcpy (digest, tmp_buf, 32);
15493
15494 digest[0] = byte_swap_32 (digest[0]);
15495 digest[1] = byte_swap_32 (digest[1]);
15496 digest[2] = byte_swap_32 (digest[2]);
15497 digest[3] = byte_swap_32 (digest[3]);
15498 digest[4] = byte_swap_32 (digest[4]);
15499 digest[5] = byte_swap_32 (digest[5]);
15500 digest[6] = byte_swap_32 (digest[6]);
15501 digest[7] = byte_swap_32 (digest[7]);
15502
15503 return (PARSER_OK);
15504 }
15505
15506 int cisco9_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15507 {
15508 if ((input_len < DISPLAY_LEN_MIN_9300) || (input_len > DISPLAY_LEN_MAX_9300)) return (PARSER_GLOBAL_LENGTH);
15509
15510 if (memcmp (SIGNATURE_CISCO9, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
15511
15512 u32 *digest = (u32 *) hash_buf->digest;
15513
15514 salt_t *salt = hash_buf->salt;
15515
15516 /**
15517 * parse line
15518 */
15519
15520 // first is *raw* salt
15521
15522 char *salt_pos = input_buf + 3;
15523
15524 char *hash_pos = strchr (salt_pos, '$');
15525
15526 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15527
15528 uint salt_len = hash_pos - salt_pos;
15529
15530 if (salt_len != 14) return (PARSER_SALT_LENGTH);
15531
15532 salt->salt_len = salt_len;
15533 hash_pos++;
15534
15535 char *salt_buf_ptr = (char *) salt->salt_buf;
15536
15537 memcpy (salt_buf_ptr, salt_pos, salt_len);
15538 salt_buf_ptr[salt_len] = 0;
15539
15540 // base64 decode hash
15541
15542 u8 tmp_buf[100] = { 0 };
15543
15544 uint hash_len = input_len - 3 - salt_len - 1;
15545
15546 int tmp_len = base64_decode (itoa64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
15547
15548 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
15549
15550 memcpy (digest, tmp_buf, 32);
15551
15552 // fixed:
15553 salt->scrypt_N = 16384;
15554 salt->scrypt_r = 1;
15555 salt->scrypt_p = 1;
15556 salt->salt_iter = 1;
15557
15558 return (PARSER_OK);
15559 }
15560
15561 int office2007_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15562 {
15563 if ((input_len < DISPLAY_LEN_MIN_9400) || (input_len > DISPLAY_LEN_MAX_9400)) return (PARSER_GLOBAL_LENGTH);
15564
15565 if (memcmp (SIGNATURE_OFFICE2007, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
15566
15567 u32 *digest = (u32 *) hash_buf->digest;
15568
15569 salt_t *salt = hash_buf->salt;
15570
15571 office2007_t *office2007 = (office2007_t *) hash_buf->esalt;
15572
15573 /**
15574 * parse line
15575 */
15576
15577 char *version_pos = input_buf + 8 + 1;
15578
15579 char *verifierHashSize_pos = strchr (version_pos, '*');
15580
15581 if (verifierHashSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15582
15583 u32 version_len = verifierHashSize_pos - version_pos;
15584
15585 if (version_len != 4) return (PARSER_SALT_LENGTH);
15586
15587 verifierHashSize_pos++;
15588
15589 char *keySize_pos = strchr (verifierHashSize_pos, '*');
15590
15591 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15592
15593 u32 verifierHashSize_len = keySize_pos - verifierHashSize_pos;
15594
15595 if (verifierHashSize_len != 2) return (PARSER_SALT_LENGTH);
15596
15597 keySize_pos++;
15598
15599 char *saltSize_pos = strchr (keySize_pos, '*');
15600
15601 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15602
15603 u32 keySize_len = saltSize_pos - keySize_pos;
15604
15605 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
15606
15607 saltSize_pos++;
15608
15609 char *osalt_pos = strchr (saltSize_pos, '*');
15610
15611 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15612
15613 u32 saltSize_len = osalt_pos - saltSize_pos;
15614
15615 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
15616
15617 osalt_pos++;
15618
15619 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15620
15621 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15622
15623 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15624
15625 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15626
15627 encryptedVerifier_pos++;
15628
15629 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15630
15631 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15632
15633 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15634
15635 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15636
15637 encryptedVerifierHash_pos++;
15638
15639 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;
15640
15641 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
15642
15643 const uint version = atoi (version_pos);
15644
15645 if (version != 2007) return (PARSER_SALT_VALUE);
15646
15647 const uint verifierHashSize = atoi (verifierHashSize_pos);
15648
15649 if (verifierHashSize != 20) return (PARSER_SALT_VALUE);
15650
15651 const uint keySize = atoi (keySize_pos);
15652
15653 if ((keySize != 128) && (keySize != 256)) return (PARSER_SALT_VALUE);
15654
15655 office2007->keySize = keySize;
15656
15657 const uint saltSize = atoi (saltSize_pos);
15658
15659 if (saltSize != 16) return (PARSER_SALT_VALUE);
15660
15661 /**
15662 * salt
15663 */
15664
15665 salt->salt_len = 16;
15666 salt->salt_iter = ROUNDS_OFFICE2007;
15667
15668 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15669 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15670 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15671 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15672
15673 /**
15674 * esalt
15675 */
15676
15677 office2007->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15678 office2007->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15679 office2007->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15680 office2007->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15681
15682 office2007->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15683 office2007->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15684 office2007->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15685 office2007->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15686 office2007->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15687
15688 /**
15689 * digest
15690 */
15691
15692 digest[0] = office2007->encryptedVerifierHash[0];
15693 digest[1] = office2007->encryptedVerifierHash[1];
15694 digest[2] = office2007->encryptedVerifierHash[2];
15695 digest[3] = office2007->encryptedVerifierHash[3];
15696
15697 return (PARSER_OK);
15698 }
15699
15700 int office2010_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15701 {
15702 if ((input_len < DISPLAY_LEN_MIN_9500) || (input_len > DISPLAY_LEN_MAX_9500)) return (PARSER_GLOBAL_LENGTH);
15703
15704 if (memcmp (SIGNATURE_OFFICE2010, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
15705
15706 u32 *digest = (u32 *) hash_buf->digest;
15707
15708 salt_t *salt = hash_buf->salt;
15709
15710 office2010_t *office2010 = (office2010_t *) hash_buf->esalt;
15711
15712 /**
15713 * parse line
15714 */
15715
15716 char *version_pos = input_buf + 8 + 1;
15717
15718 char *spinCount_pos = strchr (version_pos, '*');
15719
15720 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15721
15722 u32 version_len = spinCount_pos - version_pos;
15723
15724 if (version_len != 4) return (PARSER_SALT_LENGTH);
15725
15726 spinCount_pos++;
15727
15728 char *keySize_pos = strchr (spinCount_pos, '*');
15729
15730 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15731
15732 u32 spinCount_len = keySize_pos - spinCount_pos;
15733
15734 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
15735
15736 keySize_pos++;
15737
15738 char *saltSize_pos = strchr (keySize_pos, '*');
15739
15740 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15741
15742 u32 keySize_len = saltSize_pos - keySize_pos;
15743
15744 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
15745
15746 saltSize_pos++;
15747
15748 char *osalt_pos = strchr (saltSize_pos, '*');
15749
15750 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15751
15752 u32 saltSize_len = osalt_pos - saltSize_pos;
15753
15754 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
15755
15756 osalt_pos++;
15757
15758 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15759
15760 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15761
15762 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15763
15764 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15765
15766 encryptedVerifier_pos++;
15767
15768 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15769
15770 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15771
15772 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15773
15774 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15775
15776 encryptedVerifierHash_pos++;
15777
15778 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;
15779
15780 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
15781
15782 const uint version = atoi (version_pos);
15783
15784 if (version != 2010) return (PARSER_SALT_VALUE);
15785
15786 const uint spinCount = atoi (spinCount_pos);
15787
15788 if (spinCount != 100000) return (PARSER_SALT_VALUE);
15789
15790 const uint keySize = atoi (keySize_pos);
15791
15792 if (keySize != 128) return (PARSER_SALT_VALUE);
15793
15794 const uint saltSize = atoi (saltSize_pos);
15795
15796 if (saltSize != 16) return (PARSER_SALT_VALUE);
15797
15798 /**
15799 * salt
15800 */
15801
15802 salt->salt_len = 16;
15803 salt->salt_iter = spinCount;
15804
15805 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15806 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15807 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15808 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15809
15810 /**
15811 * esalt
15812 */
15813
15814 office2010->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15815 office2010->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15816 office2010->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15817 office2010->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15818
15819 office2010->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15820 office2010->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15821 office2010->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15822 office2010->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15823 office2010->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15824 office2010->encryptedVerifierHash[5] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[40]);
15825 office2010->encryptedVerifierHash[6] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[48]);
15826 office2010->encryptedVerifierHash[7] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[56]);
15827
15828 /**
15829 * digest
15830 */
15831
15832 digest[0] = office2010->encryptedVerifierHash[0];
15833 digest[1] = office2010->encryptedVerifierHash[1];
15834 digest[2] = office2010->encryptedVerifierHash[2];
15835 digest[3] = office2010->encryptedVerifierHash[3];
15836
15837 return (PARSER_OK);
15838 }
15839
15840 int office2013_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15841 {
15842 if ((input_len < DISPLAY_LEN_MIN_9600) || (input_len > DISPLAY_LEN_MAX_9600)) return (PARSER_GLOBAL_LENGTH);
15843
15844 if (memcmp (SIGNATURE_OFFICE2013, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
15845
15846 u32 *digest = (u32 *) hash_buf->digest;
15847
15848 salt_t *salt = hash_buf->salt;
15849
15850 office2013_t *office2013 = (office2013_t *) hash_buf->esalt;
15851
15852 /**
15853 * parse line
15854 */
15855
15856 char *version_pos = input_buf + 8 + 1;
15857
15858 char *spinCount_pos = strchr (version_pos, '*');
15859
15860 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15861
15862 u32 version_len = spinCount_pos - version_pos;
15863
15864 if (version_len != 4) return (PARSER_SALT_LENGTH);
15865
15866 spinCount_pos++;
15867
15868 char *keySize_pos = strchr (spinCount_pos, '*');
15869
15870 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15871
15872 u32 spinCount_len = keySize_pos - spinCount_pos;
15873
15874 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
15875
15876 keySize_pos++;
15877
15878 char *saltSize_pos = strchr (keySize_pos, '*');
15879
15880 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15881
15882 u32 keySize_len = saltSize_pos - keySize_pos;
15883
15884 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
15885
15886 saltSize_pos++;
15887
15888 char *osalt_pos = strchr (saltSize_pos, '*');
15889
15890 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15891
15892 u32 saltSize_len = osalt_pos - saltSize_pos;
15893
15894 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
15895
15896 osalt_pos++;
15897
15898 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15899
15900 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15901
15902 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15903
15904 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15905
15906 encryptedVerifier_pos++;
15907
15908 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15909
15910 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15911
15912 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15913
15914 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15915
15916 encryptedVerifierHash_pos++;
15917
15918 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;
15919
15920 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
15921
15922 const uint version = atoi (version_pos);
15923
15924 if (version != 2013) return (PARSER_SALT_VALUE);
15925
15926 const uint spinCount = atoi (spinCount_pos);
15927
15928 if (spinCount != 100000) return (PARSER_SALT_VALUE);
15929
15930 const uint keySize = atoi (keySize_pos);
15931
15932 if (keySize != 256) return (PARSER_SALT_VALUE);
15933
15934 const uint saltSize = atoi (saltSize_pos);
15935
15936 if (saltSize != 16) return (PARSER_SALT_VALUE);
15937
15938 /**
15939 * salt
15940 */
15941
15942 salt->salt_len = 16;
15943 salt->salt_iter = spinCount;
15944
15945 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15946 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15947 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15948 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15949
15950 /**
15951 * esalt
15952 */
15953
15954 office2013->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15955 office2013->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15956 office2013->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15957 office2013->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15958
15959 office2013->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15960 office2013->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15961 office2013->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15962 office2013->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15963 office2013->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15964 office2013->encryptedVerifierHash[5] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[40]);
15965 office2013->encryptedVerifierHash[6] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[48]);
15966 office2013->encryptedVerifierHash[7] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[56]);
15967
15968 /**
15969 * digest
15970 */
15971
15972 digest[0] = office2013->encryptedVerifierHash[0];
15973 digest[1] = office2013->encryptedVerifierHash[1];
15974 digest[2] = office2013->encryptedVerifierHash[2];
15975 digest[3] = office2013->encryptedVerifierHash[3];
15976
15977 return (PARSER_OK);
15978 }
15979
15980 int oldoffice01_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15981 {
15982 if ((input_len < DISPLAY_LEN_MIN_9700) || (input_len > DISPLAY_LEN_MAX_9700)) return (PARSER_GLOBAL_LENGTH);
15983
15984 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15985
15986 u32 *digest = (u32 *) hash_buf->digest;
15987
15988 salt_t *salt = hash_buf->salt;
15989
15990 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
15991
15992 /**
15993 * parse line
15994 */
15995
15996 char *version_pos = input_buf + 11;
15997
15998 char *osalt_pos = strchr (version_pos, '*');
15999
16000 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16001
16002 u32 version_len = osalt_pos - version_pos;
16003
16004 if (version_len != 1) return (PARSER_SALT_LENGTH);
16005
16006 osalt_pos++;
16007
16008 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
16009
16010 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16011
16012 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
16013
16014 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
16015
16016 encryptedVerifier_pos++;
16017
16018 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
16019
16020 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16021
16022 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
16023
16024 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
16025
16026 encryptedVerifierHash_pos++;
16027
16028 u32 encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
16029
16030 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
16031
16032 const uint version = *version_pos - 0x30;
16033
16034 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
16035
16036 /**
16037 * esalt
16038 */
16039
16040 oldoffice01->version = version;
16041
16042 oldoffice01->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
16043 oldoffice01->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
16044 oldoffice01->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
16045 oldoffice01->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
16046
16047 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
16048 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
16049 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
16050 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
16051
16052 oldoffice01->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
16053 oldoffice01->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
16054 oldoffice01->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
16055 oldoffice01->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
16056
16057 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
16058 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
16059 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
16060 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
16061
16062 /**
16063 * salt
16064 */
16065
16066 salt->salt_len = 16;
16067
16068 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
16069 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
16070 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
16071 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
16072
16073 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
16074 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
16075 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
16076 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
16077
16078 // this is a workaround as office produces multiple documents with the same salt
16079
16080 salt->salt_len += 32;
16081
16082 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
16083 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
16084 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
16085 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
16086 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
16087 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
16088 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
16089 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
16090
16091 /**
16092 * digest
16093 */
16094
16095 digest[0] = oldoffice01->encryptedVerifierHash[0];
16096 digest[1] = oldoffice01->encryptedVerifierHash[1];
16097 digest[2] = oldoffice01->encryptedVerifierHash[2];
16098 digest[3] = oldoffice01->encryptedVerifierHash[3];
16099
16100 return (PARSER_OK);
16101 }
16102
16103 int oldoffice01cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16104 {
16105 return oldoffice01_parse_hash (input_buf, input_len, hash_buf);
16106 }
16107
16108 int oldoffice01cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16109 {
16110 if ((input_len < DISPLAY_LEN_MIN_9720) || (input_len > DISPLAY_LEN_MAX_9720)) return (PARSER_GLOBAL_LENGTH);
16111
16112 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
16113
16114 u32 *digest = (u32 *) hash_buf->digest;
16115
16116 salt_t *salt = hash_buf->salt;
16117
16118 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
16119
16120 /**
16121 * parse line
16122 */
16123
16124 char *version_pos = input_buf + 11;
16125
16126 char *osalt_pos = strchr (version_pos, '*');
16127
16128 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16129
16130 u32 version_len = osalt_pos - version_pos;
16131
16132 if (version_len != 1) return (PARSER_SALT_LENGTH);
16133
16134 osalt_pos++;
16135
16136 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
16137
16138 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16139
16140 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
16141
16142 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
16143
16144 encryptedVerifier_pos++;
16145
16146 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
16147
16148 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16149
16150 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
16151
16152 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
16153
16154 encryptedVerifierHash_pos++;
16155
16156 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
16157
16158 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16159
16160 u32 encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
16161
16162 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
16163
16164 rc4key_pos++;
16165
16166 u32 rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
16167
16168 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
16169
16170 const uint version = *version_pos - 0x30;
16171
16172 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
16173
16174 /**
16175 * esalt
16176 */
16177
16178 oldoffice01->version = version;
16179
16180 oldoffice01->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
16181 oldoffice01->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
16182 oldoffice01->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
16183 oldoffice01->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
16184
16185 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
16186 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
16187 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
16188 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
16189
16190 oldoffice01->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
16191 oldoffice01->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
16192 oldoffice01->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
16193 oldoffice01->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
16194
16195 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
16196 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
16197 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
16198 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
16199
16200 oldoffice01->rc4key[1] = 0;
16201 oldoffice01->rc4key[0] = 0;
16202
16203 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
16204 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
16205 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
16206 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
16207 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
16208 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
16209 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
16210 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
16211 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
16212 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
16213
16214 oldoffice01->rc4key[0] = byte_swap_32 (oldoffice01->rc4key[0]);
16215 oldoffice01->rc4key[1] = byte_swap_32 (oldoffice01->rc4key[1]);
16216
16217 /**
16218 * salt
16219 */
16220
16221 salt->salt_len = 16;
16222
16223 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
16224 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
16225 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
16226 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
16227
16228 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
16229 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
16230 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
16231 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
16232
16233 // this is a workaround as office produces multiple documents with the same salt
16234
16235 salt->salt_len += 32;
16236
16237 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
16238 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
16239 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
16240 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
16241 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
16242 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
16243 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
16244 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
16245
16246 /**
16247 * digest
16248 */
16249
16250 digest[0] = oldoffice01->rc4key[0];
16251 digest[1] = oldoffice01->rc4key[1];
16252 digest[2] = 0;
16253 digest[3] = 0;
16254
16255 return (PARSER_OK);
16256 }
16257
16258 int oldoffice34_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16259 {
16260 if ((input_len < DISPLAY_LEN_MIN_9800) || (input_len > DISPLAY_LEN_MAX_9800)) return (PARSER_GLOBAL_LENGTH);
16261
16262 if ((memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE4, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
16263
16264 u32 *digest = (u32 *) hash_buf->digest;
16265
16266 salt_t *salt = hash_buf->salt;
16267
16268 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
16269
16270 /**
16271 * parse line
16272 */
16273
16274 char *version_pos = input_buf + 11;
16275
16276 char *osalt_pos = strchr (version_pos, '*');
16277
16278 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16279
16280 u32 version_len = osalt_pos - version_pos;
16281
16282 if (version_len != 1) return (PARSER_SALT_LENGTH);
16283
16284 osalt_pos++;
16285
16286 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
16287
16288 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16289
16290 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
16291
16292 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
16293
16294 encryptedVerifier_pos++;
16295
16296 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
16297
16298 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16299
16300 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
16301
16302 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
16303
16304 encryptedVerifierHash_pos++;
16305
16306 u32 encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
16307
16308 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
16309
16310 const uint version = *version_pos - 0x30;
16311
16312 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
16313
16314 /**
16315 * esalt
16316 */
16317
16318 oldoffice34->version = version;
16319
16320 oldoffice34->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
16321 oldoffice34->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
16322 oldoffice34->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
16323 oldoffice34->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
16324
16325 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
16326 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
16327 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
16328 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
16329
16330 oldoffice34->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
16331 oldoffice34->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
16332 oldoffice34->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
16333 oldoffice34->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
16334 oldoffice34->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
16335
16336 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
16337 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
16338 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
16339 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
16340 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
16341
16342 /**
16343 * salt
16344 */
16345
16346 salt->salt_len = 16;
16347
16348 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
16349 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
16350 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
16351 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
16352
16353 // this is a workaround as office produces multiple documents with the same salt
16354
16355 salt->salt_len += 32;
16356
16357 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
16358 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
16359 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
16360 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
16361 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
16362 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
16363 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
16364 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
16365
16366 /**
16367 * digest
16368 */
16369
16370 digest[0] = oldoffice34->encryptedVerifierHash[0];
16371 digest[1] = oldoffice34->encryptedVerifierHash[1];
16372 digest[2] = oldoffice34->encryptedVerifierHash[2];
16373 digest[3] = oldoffice34->encryptedVerifierHash[3];
16374
16375 return (PARSER_OK);
16376 }
16377
16378 int oldoffice34cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16379 {
16380 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
16381
16382 return oldoffice34_parse_hash (input_buf, input_len, hash_buf);
16383 }
16384
16385 int oldoffice34cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16386 {
16387 if ((input_len < DISPLAY_LEN_MIN_9820) || (input_len > DISPLAY_LEN_MAX_9820)) return (PARSER_GLOBAL_LENGTH);
16388
16389 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
16390
16391 u32 *digest = (u32 *) hash_buf->digest;
16392
16393 salt_t *salt = hash_buf->salt;
16394
16395 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
16396
16397 /**
16398 * parse line
16399 */
16400
16401 char *version_pos = input_buf + 11;
16402
16403 char *osalt_pos = strchr (version_pos, '*');
16404
16405 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16406
16407 u32 version_len = osalt_pos - version_pos;
16408
16409 if (version_len != 1) return (PARSER_SALT_LENGTH);
16410
16411 osalt_pos++;
16412
16413 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
16414
16415 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16416
16417 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
16418
16419 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
16420
16421 encryptedVerifier_pos++;
16422
16423 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
16424
16425 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16426
16427 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
16428
16429 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
16430
16431 encryptedVerifierHash_pos++;
16432
16433 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
16434
16435 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16436
16437 u32 encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
16438
16439 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
16440
16441 rc4key_pos++;
16442
16443 u32 rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
16444
16445 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
16446
16447 const uint version = *version_pos - 0x30;
16448
16449 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
16450
16451 /**
16452 * esalt
16453 */
16454
16455 oldoffice34->version = version;
16456
16457 oldoffice34->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
16458 oldoffice34->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
16459 oldoffice34->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
16460 oldoffice34->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
16461
16462 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
16463 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
16464 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
16465 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
16466
16467 oldoffice34->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
16468 oldoffice34->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
16469 oldoffice34->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
16470 oldoffice34->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
16471 oldoffice34->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
16472
16473 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
16474 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
16475 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
16476 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
16477 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
16478
16479 oldoffice34->rc4key[1] = 0;
16480 oldoffice34->rc4key[0] = 0;
16481
16482 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
16483 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
16484 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
16485 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
16486 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
16487 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
16488 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
16489 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
16490 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
16491 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
16492
16493 oldoffice34->rc4key[0] = byte_swap_32 (oldoffice34->rc4key[0]);
16494 oldoffice34->rc4key[1] = byte_swap_32 (oldoffice34->rc4key[1]);
16495
16496 /**
16497 * salt
16498 */
16499
16500 salt->salt_len = 16;
16501
16502 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
16503 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
16504 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
16505 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
16506
16507 // this is a workaround as office produces multiple documents with the same salt
16508
16509 salt->salt_len += 32;
16510
16511 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
16512 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
16513 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
16514 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
16515 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
16516 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
16517 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
16518 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
16519
16520 /**
16521 * digest
16522 */
16523
16524 digest[0] = oldoffice34->rc4key[0];
16525 digest[1] = oldoffice34->rc4key[1];
16526 digest[2] = 0;
16527 digest[3] = 0;
16528
16529 return (PARSER_OK);
16530 }
16531
16532 int radmin2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16533 {
16534 if ((input_len < DISPLAY_LEN_MIN_9900) || (input_len > DISPLAY_LEN_MAX_9900)) return (PARSER_GLOBAL_LENGTH);
16535
16536 u32 *digest = (u32 *) hash_buf->digest;
16537
16538 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
16539 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
16540 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
16541 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
16542
16543 digest[0] = byte_swap_32 (digest[0]);
16544 digest[1] = byte_swap_32 (digest[1]);
16545 digest[2] = byte_swap_32 (digest[2]);
16546 digest[3] = byte_swap_32 (digest[3]);
16547
16548 return (PARSER_OK);
16549 }
16550
16551 int djangosha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16552 {
16553 if ((input_len < DISPLAY_LEN_MIN_124) || (input_len > DISPLAY_LEN_MAX_124)) return (PARSER_GLOBAL_LENGTH);
16554
16555 if ((memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5)) && (memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16556
16557 u32 *digest = (u32 *) hash_buf->digest;
16558
16559 salt_t *salt = hash_buf->salt;
16560
16561 char *signature_pos = input_buf;
16562
16563 char *salt_pos = strchr (signature_pos, '$');
16564
16565 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16566
16567 u32 signature_len = salt_pos - signature_pos;
16568
16569 if (signature_len != 4) return (PARSER_SIGNATURE_UNMATCHED);
16570
16571 salt_pos++;
16572
16573 char *hash_pos = strchr (salt_pos, '$');
16574
16575 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16576
16577 u32 salt_len = hash_pos - salt_pos;
16578
16579 if (salt_len > 32) return (PARSER_SALT_LENGTH);
16580
16581 hash_pos++;
16582
16583 u32 hash_len = input_len - signature_len - 1 - salt_len - 1;
16584
16585 if (hash_len != 40) return (PARSER_SALT_LENGTH);
16586
16587 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
16588 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
16589 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
16590 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
16591 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
16592
16593 digest[0] -= SHA1M_A;
16594 digest[1] -= SHA1M_B;
16595 digest[2] -= SHA1M_C;
16596 digest[3] -= SHA1M_D;
16597 digest[4] -= SHA1M_E;
16598
16599 char *salt_buf_ptr = (char *) salt->salt_buf;
16600
16601 memcpy (salt_buf_ptr, salt_pos, salt_len);
16602
16603 salt->salt_len = salt_len;
16604
16605 return (PARSER_OK);
16606 }
16607
16608 int djangopbkdf2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16609 {
16610 if ((input_len < DISPLAY_LEN_MIN_10000) || (input_len > DISPLAY_LEN_MAX_10000)) return (PARSER_GLOBAL_LENGTH);
16611
16612 if (memcmp (SIGNATURE_DJANGOPBKDF2, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
16613
16614 u32 *digest = (u32 *) hash_buf->digest;
16615
16616 salt_t *salt = hash_buf->salt;
16617
16618 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
16619
16620 /**
16621 * parse line
16622 */
16623
16624 char *iter_pos = input_buf + 14;
16625
16626 const int iter = atoi (iter_pos);
16627
16628 if (iter < 1) return (PARSER_SALT_ITERATION);
16629
16630 salt->salt_iter = iter - 1;
16631
16632 char *salt_pos = strchr (iter_pos, '$');
16633
16634 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16635
16636 salt_pos++;
16637
16638 char *hash_pos = strchr (salt_pos, '$');
16639
16640 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16641
16642 const uint salt_len = hash_pos - salt_pos;
16643
16644 hash_pos++;
16645
16646 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
16647
16648 memcpy (salt_buf_ptr, salt_pos, salt_len);
16649
16650 salt->salt_len = salt_len;
16651
16652 salt_buf_ptr[salt_len + 3] = 0x01;
16653 salt_buf_ptr[salt_len + 4] = 0x80;
16654
16655 // add some stuff to normal salt to make sorted happy
16656
16657 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
16658 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
16659 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
16660 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
16661 salt->salt_buf[4] = salt->salt_iter;
16662
16663 // base64 decode hash
16664
16665 u8 tmp_buf[100] = { 0 };
16666
16667 uint hash_len = input_len - (hash_pos - input_buf);
16668
16669 if (hash_len != 44) return (PARSER_HASH_LENGTH);
16670
16671 base64_decode (base64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
16672
16673 memcpy (digest, tmp_buf, 32);
16674
16675 digest[0] = byte_swap_32 (digest[0]);
16676 digest[1] = byte_swap_32 (digest[1]);
16677 digest[2] = byte_swap_32 (digest[2]);
16678 digest[3] = byte_swap_32 (digest[3]);
16679 digest[4] = byte_swap_32 (digest[4]);
16680 digest[5] = byte_swap_32 (digest[5]);
16681 digest[6] = byte_swap_32 (digest[6]);
16682 digest[7] = byte_swap_32 (digest[7]);
16683
16684 return (PARSER_OK);
16685 }
16686
16687 int siphash_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16688 {
16689 if ((input_len < DISPLAY_LEN_MIN_10100) || (input_len > DISPLAY_LEN_MAX_10100)) return (PARSER_GLOBAL_LENGTH);
16690
16691 u32 *digest = (u32 *) hash_buf->digest;
16692
16693 salt_t *salt = hash_buf->salt;
16694
16695 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
16696 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
16697 digest[2] = 0;
16698 digest[3] = 0;
16699
16700 digest[0] = byte_swap_32 (digest[0]);
16701 digest[1] = byte_swap_32 (digest[1]);
16702
16703 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16704 if (input_buf[18] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16705 if (input_buf[20] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16706
16707 char iter_c = input_buf[17];
16708 char iter_d = input_buf[19];
16709
16710 // atm only defaults, let's see if there's more request
16711 if (iter_c != '2') return (PARSER_SALT_ITERATION);
16712 if (iter_d != '4') return (PARSER_SALT_ITERATION);
16713
16714 char *salt_buf = input_buf + 16 + 1 + 1 + 1 + 1 + 1;
16715
16716 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
16717 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
16718 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
16719 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf[24]);
16720
16721 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
16722 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
16723 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
16724 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
16725
16726 salt->salt_len = 16;
16727
16728 return (PARSER_OK);
16729 }
16730
16731 int crammd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16732 {
16733 if ((input_len < DISPLAY_LEN_MIN_10200) || (input_len > DISPLAY_LEN_MAX_10200)) return (PARSER_GLOBAL_LENGTH);
16734
16735 if (memcmp (SIGNATURE_CRAM_MD5, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
16736
16737 u32 *digest = (u32 *) hash_buf->digest;
16738
16739 cram_md5_t *cram_md5 = (cram_md5_t *) hash_buf->esalt;
16740
16741 salt_t *salt = hash_buf->salt;
16742
16743 char *salt_pos = input_buf + 10;
16744
16745 char *hash_pos = strchr (salt_pos, '$');
16746
16747 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16748
16749 uint salt_len = hash_pos - salt_pos;
16750
16751 hash_pos++;
16752
16753 uint hash_len = input_len - 10 - salt_len - 1;
16754
16755 // base64 decode salt
16756
16757 if (salt_len > 133) return (PARSER_SALT_LENGTH);
16758
16759 u8 tmp_buf[100] = { 0 };
16760
16761 salt_len = base64_decode (base64_to_int, (const u8 *) salt_pos, salt_len, tmp_buf);
16762
16763 if (salt_len > 55) return (PARSER_SALT_LENGTH);
16764
16765 tmp_buf[salt_len] = 0x80;
16766
16767 memcpy (&salt->salt_buf, tmp_buf, salt_len + 1);
16768
16769 salt->salt_len = salt_len;
16770
16771 // base64 decode hash
16772
16773 if (hash_len > 133) return (PARSER_HASH_LENGTH);
16774
16775 memset (tmp_buf, 0, sizeof (tmp_buf));
16776
16777 hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
16778
16779 if (hash_len < 32 + 1) return (PARSER_SALT_LENGTH);
16780
16781 uint user_len = hash_len - 32;
16782
16783 const u8 *tmp_hash = tmp_buf + user_len;
16784
16785 user_len--; // skip the trailing space
16786
16787 digest[0] = hex_to_u32 (&tmp_hash[ 0]);
16788 digest[1] = hex_to_u32 (&tmp_hash[ 8]);
16789 digest[2] = hex_to_u32 (&tmp_hash[16]);
16790 digest[3] = hex_to_u32 (&tmp_hash[24]);
16791
16792 digest[0] = byte_swap_32 (digest[0]);
16793 digest[1] = byte_swap_32 (digest[1]);
16794 digest[2] = byte_swap_32 (digest[2]);
16795 digest[3] = byte_swap_32 (digest[3]);
16796
16797 // store username for host only (output hash if cracked)
16798
16799 memset (cram_md5->user, 0, sizeof (cram_md5->user));
16800 memcpy (cram_md5->user, tmp_buf, user_len);
16801
16802 return (PARSER_OK);
16803 }
16804
16805 int saph_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16806 {
16807 if ((input_len < DISPLAY_LEN_MIN_10300) || (input_len > DISPLAY_LEN_MAX_10300)) return (PARSER_GLOBAL_LENGTH);
16808
16809 if (memcmp (SIGNATURE_SAPH_SHA1, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
16810
16811 u32 *digest = (u32 *) hash_buf->digest;
16812
16813 salt_t *salt = hash_buf->salt;
16814
16815 char *iter_pos = input_buf + 10;
16816
16817 u32 iter = atoi (iter_pos);
16818
16819 if (iter < 1)
16820 {
16821 return (PARSER_SALT_ITERATION);
16822 }
16823
16824 iter--; // first iteration is special
16825
16826 salt->salt_iter = iter;
16827
16828 char *base64_pos = strchr (iter_pos, '}');
16829
16830 if (base64_pos == NULL)
16831 {
16832 return (PARSER_SIGNATURE_UNMATCHED);
16833 }
16834
16835 base64_pos++;
16836
16837 // base64 decode salt
16838
16839 u32 base64_len = input_len - (base64_pos - input_buf);
16840
16841 u8 tmp_buf[100] = { 0 };
16842
16843 u32 decoded_len = base64_decode (base64_to_int, (const u8 *) base64_pos, base64_len, tmp_buf);
16844
16845 if (decoded_len < 24)
16846 {
16847 return (PARSER_SALT_LENGTH);
16848 }
16849
16850 // copy the salt
16851
16852 uint salt_len = decoded_len - 20;
16853
16854 if (salt_len < 4) return (PARSER_SALT_LENGTH);
16855 if (salt_len > 16) return (PARSER_SALT_LENGTH);
16856
16857 memcpy (&salt->salt_buf, tmp_buf + 20, salt_len);
16858
16859 salt->salt_len = salt_len;
16860
16861 // set digest
16862
16863 u32 *digest_ptr = (u32*) tmp_buf;
16864
16865 digest[0] = byte_swap_32 (digest_ptr[0]);
16866 digest[1] = byte_swap_32 (digest_ptr[1]);
16867 digest[2] = byte_swap_32 (digest_ptr[2]);
16868 digest[3] = byte_swap_32 (digest_ptr[3]);
16869 digest[4] = byte_swap_32 (digest_ptr[4]);
16870
16871 return (PARSER_OK);
16872 }
16873
16874 int redmine_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16875 {
16876 if ((input_len < DISPLAY_LEN_MIN_7600) || (input_len > DISPLAY_LEN_MAX_7600)) return (PARSER_GLOBAL_LENGTH);
16877
16878 u32 *digest = (u32 *) hash_buf->digest;
16879
16880 salt_t *salt = hash_buf->salt;
16881
16882 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
16883 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
16884 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
16885 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
16886 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
16887
16888 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16889
16890 uint salt_len = input_len - 40 - 1;
16891
16892 char *salt_buf = input_buf + 40 + 1;
16893
16894 char *salt_buf_ptr = (char *) salt->salt_buf;
16895
16896 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
16897
16898 if (salt_len != 32) return (PARSER_SALT_LENGTH);
16899
16900 salt->salt_len = salt_len;
16901
16902 return (PARSER_OK);
16903 }
16904
16905 int pdf11_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16906 {
16907 if ((input_len < DISPLAY_LEN_MIN_10400) || (input_len > DISPLAY_LEN_MAX_10400)) return (PARSER_GLOBAL_LENGTH);
16908
16909 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16910
16911 u32 *digest = (u32 *) hash_buf->digest;
16912
16913 salt_t *salt = hash_buf->salt;
16914
16915 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16916
16917 /**
16918 * parse line
16919 */
16920
16921 char *V_pos = input_buf + 5;
16922
16923 char *R_pos = strchr (V_pos, '*');
16924
16925 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16926
16927 u32 V_len = R_pos - V_pos;
16928
16929 R_pos++;
16930
16931 char *bits_pos = strchr (R_pos, '*');
16932
16933 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16934
16935 u32 R_len = bits_pos - R_pos;
16936
16937 bits_pos++;
16938
16939 char *P_pos = strchr (bits_pos, '*');
16940
16941 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16942
16943 u32 bits_len = P_pos - bits_pos;
16944
16945 P_pos++;
16946
16947 char *enc_md_pos = strchr (P_pos, '*');
16948
16949 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16950
16951 u32 P_len = enc_md_pos - P_pos;
16952
16953 enc_md_pos++;
16954
16955 char *id_len_pos = strchr (enc_md_pos, '*');
16956
16957 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16958
16959 u32 enc_md_len = id_len_pos - enc_md_pos;
16960
16961 id_len_pos++;
16962
16963 char *id_buf_pos = strchr (id_len_pos, '*');
16964
16965 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16966
16967 u32 id_len_len = id_buf_pos - id_len_pos;
16968
16969 id_buf_pos++;
16970
16971 char *u_len_pos = strchr (id_buf_pos, '*');
16972
16973 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16974
16975 u32 id_buf_len = u_len_pos - id_buf_pos;
16976
16977 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
16978
16979 u_len_pos++;
16980
16981 char *u_buf_pos = strchr (u_len_pos, '*');
16982
16983 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16984
16985 u32 u_len_len = u_buf_pos - u_len_pos;
16986
16987 u_buf_pos++;
16988
16989 char *o_len_pos = strchr (u_buf_pos, '*');
16990
16991 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16992
16993 u32 u_buf_len = o_len_pos - u_buf_pos;
16994
16995 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16996
16997 o_len_pos++;
16998
16999 char *o_buf_pos = strchr (o_len_pos, '*');
17000
17001 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17002
17003 u32 o_len_len = o_buf_pos - o_len_pos;
17004
17005 o_buf_pos++;
17006
17007 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;
17008
17009 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
17010
17011 // validate data
17012
17013 const int V = atoi (V_pos);
17014 const int R = atoi (R_pos);
17015 const int P = atoi (P_pos);
17016
17017 if (V != 1) return (PARSER_SALT_VALUE);
17018 if (R != 2) return (PARSER_SALT_VALUE);
17019
17020 const int enc_md = atoi (enc_md_pos);
17021
17022 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
17023
17024 const int id_len = atoi (id_len_pos);
17025 const int u_len = atoi (u_len_pos);
17026 const int o_len = atoi (o_len_pos);
17027
17028 if (id_len != 16) return (PARSER_SALT_VALUE);
17029 if (u_len != 32) return (PARSER_SALT_VALUE);
17030 if (o_len != 32) return (PARSER_SALT_VALUE);
17031
17032 const int bits = atoi (bits_pos);
17033
17034 if (bits != 40) return (PARSER_SALT_VALUE);
17035
17036 // copy data to esalt
17037
17038 pdf->V = V;
17039 pdf->R = R;
17040 pdf->P = P;
17041
17042 pdf->enc_md = enc_md;
17043
17044 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
17045 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
17046 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
17047 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
17048 pdf->id_len = id_len;
17049
17050 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
17051 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
17052 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
17053 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
17054 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
17055 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
17056 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
17057 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
17058 pdf->u_len = u_len;
17059
17060 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
17061 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
17062 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
17063 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
17064 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
17065 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
17066 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
17067 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
17068 pdf->o_len = o_len;
17069
17070 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
17071 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
17072 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
17073 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
17074
17075 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
17076 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
17077 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
17078 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
17079 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
17080 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
17081 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
17082 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
17083
17084 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
17085 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
17086 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
17087 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
17088 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
17089 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
17090 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
17091 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
17092
17093 // we use ID for salt, maybe needs to change, we will see...
17094
17095 salt->salt_buf[0] = pdf->id_buf[0];
17096 salt->salt_buf[1] = pdf->id_buf[1];
17097 salt->salt_buf[2] = pdf->id_buf[2];
17098 salt->salt_buf[3] = pdf->id_buf[3];
17099 salt->salt_len = pdf->id_len;
17100
17101 digest[0] = pdf->u_buf[0];
17102 digest[1] = pdf->u_buf[1];
17103 digest[2] = pdf->u_buf[2];
17104 digest[3] = pdf->u_buf[3];
17105
17106 return (PARSER_OK);
17107 }
17108
17109 int pdf11cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17110 {
17111 return pdf11_parse_hash (input_buf, input_len, hash_buf);
17112 }
17113
17114 int pdf11cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17115 {
17116 if ((input_len < DISPLAY_LEN_MIN_10420) || (input_len > DISPLAY_LEN_MAX_10420)) return (PARSER_GLOBAL_LENGTH);
17117
17118 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
17119
17120 u32 *digest = (u32 *) hash_buf->digest;
17121
17122 salt_t *salt = hash_buf->salt;
17123
17124 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
17125
17126 /**
17127 * parse line
17128 */
17129
17130 char *V_pos = input_buf + 5;
17131
17132 char *R_pos = strchr (V_pos, '*');
17133
17134 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17135
17136 u32 V_len = R_pos - V_pos;
17137
17138 R_pos++;
17139
17140 char *bits_pos = strchr (R_pos, '*');
17141
17142 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17143
17144 u32 R_len = bits_pos - R_pos;
17145
17146 bits_pos++;
17147
17148 char *P_pos = strchr (bits_pos, '*');
17149
17150 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17151
17152 u32 bits_len = P_pos - bits_pos;
17153
17154 P_pos++;
17155
17156 char *enc_md_pos = strchr (P_pos, '*');
17157
17158 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17159
17160 u32 P_len = enc_md_pos - P_pos;
17161
17162 enc_md_pos++;
17163
17164 char *id_len_pos = strchr (enc_md_pos, '*');
17165
17166 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17167
17168 u32 enc_md_len = id_len_pos - enc_md_pos;
17169
17170 id_len_pos++;
17171
17172 char *id_buf_pos = strchr (id_len_pos, '*');
17173
17174 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17175
17176 u32 id_len_len = id_buf_pos - id_len_pos;
17177
17178 id_buf_pos++;
17179
17180 char *u_len_pos = strchr (id_buf_pos, '*');
17181
17182 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17183
17184 u32 id_buf_len = u_len_pos - id_buf_pos;
17185
17186 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
17187
17188 u_len_pos++;
17189
17190 char *u_buf_pos = strchr (u_len_pos, '*');
17191
17192 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17193
17194 u32 u_len_len = u_buf_pos - u_len_pos;
17195
17196 u_buf_pos++;
17197
17198 char *o_len_pos = strchr (u_buf_pos, '*');
17199
17200 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17201
17202 u32 u_buf_len = o_len_pos - u_buf_pos;
17203
17204 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
17205
17206 o_len_pos++;
17207
17208 char *o_buf_pos = strchr (o_len_pos, '*');
17209
17210 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17211
17212 u32 o_len_len = o_buf_pos - o_len_pos;
17213
17214 o_buf_pos++;
17215
17216 char *rc4key_pos = strchr (o_buf_pos, ':');
17217
17218 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17219
17220 u32 o_buf_len = rc4key_pos - o_buf_pos;
17221
17222 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
17223
17224 rc4key_pos++;
17225
17226 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;
17227
17228 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
17229
17230 // validate data
17231
17232 const int V = atoi (V_pos);
17233 const int R = atoi (R_pos);
17234 const int P = atoi (P_pos);
17235
17236 if (V != 1) return (PARSER_SALT_VALUE);
17237 if (R != 2) return (PARSER_SALT_VALUE);
17238
17239 const int enc_md = atoi (enc_md_pos);
17240
17241 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
17242
17243 const int id_len = atoi (id_len_pos);
17244 const int u_len = atoi (u_len_pos);
17245 const int o_len = atoi (o_len_pos);
17246
17247 if (id_len != 16) return (PARSER_SALT_VALUE);
17248 if (u_len != 32) return (PARSER_SALT_VALUE);
17249 if (o_len != 32) return (PARSER_SALT_VALUE);
17250
17251 const int bits = atoi (bits_pos);
17252
17253 if (bits != 40) return (PARSER_SALT_VALUE);
17254
17255 // copy data to esalt
17256
17257 pdf->V = V;
17258 pdf->R = R;
17259 pdf->P = P;
17260
17261 pdf->enc_md = enc_md;
17262
17263 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
17264 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
17265 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
17266 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
17267 pdf->id_len = id_len;
17268
17269 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
17270 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
17271 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
17272 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
17273 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
17274 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
17275 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
17276 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
17277 pdf->u_len = u_len;
17278
17279 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
17280 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
17281 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
17282 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
17283 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
17284 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
17285 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
17286 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
17287 pdf->o_len = o_len;
17288
17289 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
17290 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
17291 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
17292 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
17293
17294 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
17295 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
17296 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
17297 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
17298 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
17299 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
17300 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
17301 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
17302
17303 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
17304 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
17305 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
17306 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
17307 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
17308 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
17309 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
17310 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
17311
17312 pdf->rc4key[1] = 0;
17313 pdf->rc4key[0] = 0;
17314
17315 pdf->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
17316 pdf->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
17317 pdf->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
17318 pdf->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
17319 pdf->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
17320 pdf->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
17321 pdf->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
17322 pdf->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
17323 pdf->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
17324 pdf->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
17325
17326 pdf->rc4key[0] = byte_swap_32 (pdf->rc4key[0]);
17327 pdf->rc4key[1] = byte_swap_32 (pdf->rc4key[1]);
17328
17329 // we use ID for salt, maybe needs to change, we will see...
17330
17331 salt->salt_buf[0] = pdf->id_buf[0];
17332 salt->salt_buf[1] = pdf->id_buf[1];
17333 salt->salt_buf[2] = pdf->id_buf[2];
17334 salt->salt_buf[3] = pdf->id_buf[3];
17335 salt->salt_buf[4] = pdf->u_buf[0];
17336 salt->salt_buf[5] = pdf->u_buf[1];
17337 salt->salt_buf[6] = pdf->o_buf[0];
17338 salt->salt_buf[7] = pdf->o_buf[1];
17339 salt->salt_len = pdf->id_len + 16;
17340
17341 digest[0] = pdf->rc4key[0];
17342 digest[1] = pdf->rc4key[1];
17343 digest[2] = 0;
17344 digest[3] = 0;
17345
17346 return (PARSER_OK);
17347 }
17348
17349 int pdf14_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17350 {
17351 if ((input_len < DISPLAY_LEN_MIN_10500) || (input_len > DISPLAY_LEN_MAX_10500)) return (PARSER_GLOBAL_LENGTH);
17352
17353 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
17354
17355 u32 *digest = (u32 *) hash_buf->digest;
17356
17357 salt_t *salt = hash_buf->salt;
17358
17359 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
17360
17361 /**
17362 * parse line
17363 */
17364
17365 char *V_pos = input_buf + 5;
17366
17367 char *R_pos = strchr (V_pos, '*');
17368
17369 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17370
17371 u32 V_len = R_pos - V_pos;
17372
17373 R_pos++;
17374
17375 char *bits_pos = strchr (R_pos, '*');
17376
17377 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17378
17379 u32 R_len = bits_pos - R_pos;
17380
17381 bits_pos++;
17382
17383 char *P_pos = strchr (bits_pos, '*');
17384
17385 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17386
17387 u32 bits_len = P_pos - bits_pos;
17388
17389 P_pos++;
17390
17391 char *enc_md_pos = strchr (P_pos, '*');
17392
17393 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17394
17395 u32 P_len = enc_md_pos - P_pos;
17396
17397 enc_md_pos++;
17398
17399 char *id_len_pos = strchr (enc_md_pos, '*');
17400
17401 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17402
17403 u32 enc_md_len = id_len_pos - enc_md_pos;
17404
17405 id_len_pos++;
17406
17407 char *id_buf_pos = strchr (id_len_pos, '*');
17408
17409 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17410
17411 u32 id_len_len = id_buf_pos - id_len_pos;
17412
17413 id_buf_pos++;
17414
17415 char *u_len_pos = strchr (id_buf_pos, '*');
17416
17417 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17418
17419 u32 id_buf_len = u_len_pos - id_buf_pos;
17420
17421 if ((id_buf_len != 32) && (id_buf_len != 64)) return (PARSER_SALT_LENGTH);
17422
17423 u_len_pos++;
17424
17425 char *u_buf_pos = strchr (u_len_pos, '*');
17426
17427 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17428
17429 u32 u_len_len = u_buf_pos - u_len_pos;
17430
17431 u_buf_pos++;
17432
17433 char *o_len_pos = strchr (u_buf_pos, '*');
17434
17435 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17436
17437 u32 u_buf_len = o_len_pos - u_buf_pos;
17438
17439 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
17440
17441 o_len_pos++;
17442
17443 char *o_buf_pos = strchr (o_len_pos, '*');
17444
17445 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17446
17447 u32 o_len_len = o_buf_pos - o_len_pos;
17448
17449 o_buf_pos++;
17450
17451 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;
17452
17453 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
17454
17455 // validate data
17456
17457 const int V = atoi (V_pos);
17458 const int R = atoi (R_pos);
17459 const int P = atoi (P_pos);
17460
17461 int vr_ok = 0;
17462
17463 if ((V == 2) && (R == 3)) vr_ok = 1;
17464 if ((V == 4) && (R == 4)) vr_ok = 1;
17465
17466 if (vr_ok == 0) return (PARSER_SALT_VALUE);
17467
17468 const int id_len = atoi (id_len_pos);
17469 const int u_len = atoi (u_len_pos);
17470 const int o_len = atoi (o_len_pos);
17471
17472 if ((id_len != 16) && (id_len != 32)) return (PARSER_SALT_VALUE);
17473
17474 if (u_len != 32) return (PARSER_SALT_VALUE);
17475 if (o_len != 32) return (PARSER_SALT_VALUE);
17476
17477 const int bits = atoi (bits_pos);
17478
17479 if (bits != 128) return (PARSER_SALT_VALUE);
17480
17481 int enc_md = 1;
17482
17483 if (R >= 4)
17484 {
17485 enc_md = atoi (enc_md_pos);
17486 }
17487
17488 // copy data to esalt
17489
17490 pdf->V = V;
17491 pdf->R = R;
17492 pdf->P = P;
17493
17494 pdf->enc_md = enc_md;
17495
17496 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
17497 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
17498 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
17499 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
17500
17501 if (id_len == 32)
17502 {
17503 pdf->id_buf[4] = hex_to_u32 ((const u8 *) &id_buf_pos[32]);
17504 pdf->id_buf[5] = hex_to_u32 ((const u8 *) &id_buf_pos[40]);
17505 pdf->id_buf[6] = hex_to_u32 ((const u8 *) &id_buf_pos[48]);
17506 pdf->id_buf[7] = hex_to_u32 ((const u8 *) &id_buf_pos[56]);
17507 }
17508
17509 pdf->id_len = id_len;
17510
17511 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
17512 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
17513 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
17514 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
17515 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
17516 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
17517 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
17518 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
17519 pdf->u_len = u_len;
17520
17521 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
17522 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
17523 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
17524 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
17525 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
17526 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
17527 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
17528 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
17529 pdf->o_len = o_len;
17530
17531 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
17532 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
17533 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
17534 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
17535
17536 if (id_len == 32)
17537 {
17538 pdf->id_buf[4] = byte_swap_32 (pdf->id_buf[4]);
17539 pdf->id_buf[5] = byte_swap_32 (pdf->id_buf[5]);
17540 pdf->id_buf[6] = byte_swap_32 (pdf->id_buf[6]);
17541 pdf->id_buf[7] = byte_swap_32 (pdf->id_buf[7]);
17542 }
17543
17544 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
17545 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
17546 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
17547 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
17548 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
17549 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
17550 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
17551 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
17552
17553 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
17554 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
17555 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
17556 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
17557 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
17558 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
17559 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
17560 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
17561
17562 // precompute rc4 data for later use
17563
17564 uint padding[8] =
17565 {
17566 0x5e4ebf28,
17567 0x418a754e,
17568 0x564e0064,
17569 0x0801faff,
17570 0xb6002e2e,
17571 0x803e68d0,
17572 0xfea90c2f,
17573 0x7a695364
17574 };
17575
17576 // md5
17577
17578 uint salt_pc_block[32] = { 0 };
17579
17580 char *salt_pc_ptr = (char *) salt_pc_block;
17581
17582 memcpy (salt_pc_ptr, padding, 32);
17583 memcpy (salt_pc_ptr + 32, pdf->id_buf, pdf->id_len);
17584
17585 uint salt_pc_digest[4] = { 0 };
17586
17587 md5_complete_no_limit (salt_pc_digest, salt_pc_block, 32 + pdf->id_len);
17588
17589 pdf->rc4data[0] = salt_pc_digest[0];
17590 pdf->rc4data[1] = salt_pc_digest[1];
17591
17592 // we use ID for salt, maybe needs to change, we will see...
17593
17594 salt->salt_buf[0] = pdf->id_buf[0];
17595 salt->salt_buf[1] = pdf->id_buf[1];
17596 salt->salt_buf[2] = pdf->id_buf[2];
17597 salt->salt_buf[3] = pdf->id_buf[3];
17598 salt->salt_buf[4] = pdf->u_buf[0];
17599 salt->salt_buf[5] = pdf->u_buf[1];
17600 salt->salt_buf[6] = pdf->o_buf[0];
17601 salt->salt_buf[7] = pdf->o_buf[1];
17602 salt->salt_len = pdf->id_len + 16;
17603
17604 salt->salt_iter = ROUNDS_PDF14;
17605
17606 digest[0] = pdf->u_buf[0];
17607 digest[1] = pdf->u_buf[1];
17608 digest[2] = 0;
17609 digest[3] = 0;
17610
17611 return (PARSER_OK);
17612 }
17613
17614 int pdf17l3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17615 {
17616 int ret = pdf17l8_parse_hash (input_buf, input_len, hash_buf);
17617
17618 if (ret != PARSER_OK)
17619 {
17620 return ret;
17621 }
17622
17623 u32 *digest = (u32 *) hash_buf->digest;
17624
17625 salt_t *salt = hash_buf->salt;
17626
17627 digest[0] -= SHA256M_A;
17628 digest[1] -= SHA256M_B;
17629 digest[2] -= SHA256M_C;
17630 digest[3] -= SHA256M_D;
17631 digest[4] -= SHA256M_E;
17632 digest[5] -= SHA256M_F;
17633 digest[6] -= SHA256M_G;
17634 digest[7] -= SHA256M_H;
17635
17636 salt->salt_buf[2] = 0x80;
17637
17638 return (PARSER_OK);
17639 }
17640
17641 int pdf17l8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17642 {
17643 if ((input_len < DISPLAY_LEN_MIN_10600) || (input_len > DISPLAY_LEN_MAX_10600)) return (PARSER_GLOBAL_LENGTH);
17644
17645 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
17646
17647 u32 *digest = (u32 *) hash_buf->digest;
17648
17649 salt_t *salt = hash_buf->salt;
17650
17651 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
17652
17653 /**
17654 * parse line
17655 */
17656
17657 char *V_pos = input_buf + 5;
17658
17659 char *R_pos = strchr (V_pos, '*');
17660
17661 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17662
17663 u32 V_len = R_pos - V_pos;
17664
17665 R_pos++;
17666
17667 char *bits_pos = strchr (R_pos, '*');
17668
17669 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17670
17671 u32 R_len = bits_pos - R_pos;
17672
17673 bits_pos++;
17674
17675 char *P_pos = strchr (bits_pos, '*');
17676
17677 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17678
17679 u32 bits_len = P_pos - bits_pos;
17680
17681 P_pos++;
17682
17683 char *enc_md_pos = strchr (P_pos, '*');
17684
17685 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17686
17687 u32 P_len = enc_md_pos - P_pos;
17688
17689 enc_md_pos++;
17690
17691 char *id_len_pos = strchr (enc_md_pos, '*');
17692
17693 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17694
17695 u32 enc_md_len = id_len_pos - enc_md_pos;
17696
17697 id_len_pos++;
17698
17699 char *id_buf_pos = strchr (id_len_pos, '*');
17700
17701 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17702
17703 u32 id_len_len = id_buf_pos - id_len_pos;
17704
17705 id_buf_pos++;
17706
17707 char *u_len_pos = strchr (id_buf_pos, '*');
17708
17709 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17710
17711 u32 id_buf_len = u_len_pos - id_buf_pos;
17712
17713 u_len_pos++;
17714
17715 char *u_buf_pos = strchr (u_len_pos, '*');
17716
17717 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17718
17719 u32 u_len_len = u_buf_pos - u_len_pos;
17720
17721 u_buf_pos++;
17722
17723 char *o_len_pos = strchr (u_buf_pos, '*');
17724
17725 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17726
17727 u32 u_buf_len = o_len_pos - u_buf_pos;
17728
17729 o_len_pos++;
17730
17731 char *o_buf_pos = strchr (o_len_pos, '*');
17732
17733 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17734
17735 u32 o_len_len = o_buf_pos - o_len_pos;
17736
17737 o_buf_pos++;
17738
17739 char *last = strchr (o_buf_pos, '*');
17740
17741 if (last == NULL) last = input_buf + input_len;
17742
17743 u32 o_buf_len = last - o_buf_pos;
17744
17745 // validate data
17746
17747 const int V = atoi (V_pos);
17748 const int R = atoi (R_pos);
17749
17750 int vr_ok = 0;
17751
17752 if ((V == 5) && (R == 5)) vr_ok = 1;
17753 if ((V == 5) && (R == 6)) vr_ok = 1;
17754
17755 if (vr_ok == 0) return (PARSER_SALT_VALUE);
17756
17757 const int bits = atoi (bits_pos);
17758
17759 if (bits != 256) return (PARSER_SALT_VALUE);
17760
17761 int enc_md = atoi (enc_md_pos);
17762
17763 if (enc_md != 1) return (PARSER_SALT_VALUE);
17764
17765 const uint id_len = atoi (id_len_pos);
17766 const uint u_len = atoi (u_len_pos);
17767 const uint o_len = atoi (o_len_pos);
17768
17769 if (V_len > 6) return (PARSER_SALT_LENGTH);
17770 if (R_len > 6) return (PARSER_SALT_LENGTH);
17771 if (P_len > 6) return (PARSER_SALT_LENGTH);
17772 if (id_len_len > 6) return (PARSER_SALT_LENGTH);
17773 if (u_len_len > 6) return (PARSER_SALT_LENGTH);
17774 if (o_len_len > 6) return (PARSER_SALT_LENGTH);
17775 if (bits_len > 6) return (PARSER_SALT_LENGTH);
17776 if (enc_md_len > 6) return (PARSER_SALT_LENGTH);
17777
17778 if ((id_len * 2) != id_buf_len) return (PARSER_SALT_VALUE);
17779 if ((u_len * 2) != u_buf_len) return (PARSER_SALT_VALUE);
17780 if ((o_len * 2) != o_buf_len) return (PARSER_SALT_VALUE);
17781
17782 // copy data to esalt
17783
17784 if (u_len < 40) return (PARSER_SALT_VALUE);
17785
17786 for (int i = 0, j = 0; i < 8 + 2; i += 1, j += 8)
17787 {
17788 pdf->u_buf[i] = hex_to_u32 ((const u8 *) &u_buf_pos[j]);
17789 }
17790
17791 salt->salt_buf[0] = pdf->u_buf[8];
17792 salt->salt_buf[1] = pdf->u_buf[9];
17793
17794 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
17795 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
17796
17797 salt->salt_len = 8;
17798 salt->salt_iter = ROUNDS_PDF17L8;
17799
17800 digest[0] = pdf->u_buf[0];
17801 digest[1] = pdf->u_buf[1];
17802 digest[2] = pdf->u_buf[2];
17803 digest[3] = pdf->u_buf[3];
17804 digest[4] = pdf->u_buf[4];
17805 digest[5] = pdf->u_buf[5];
17806 digest[6] = pdf->u_buf[6];
17807 digest[7] = pdf->u_buf[7];
17808
17809 return (PARSER_OK);
17810 }
17811
17812 int pbkdf2_sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17813 {
17814 if ((input_len < DISPLAY_LEN_MIN_10900) || (input_len > DISPLAY_LEN_MAX_10900)) return (PARSER_GLOBAL_LENGTH);
17815
17816 if (memcmp (SIGNATURE_PBKDF2_SHA256, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
17817
17818 u32 *digest = (u32 *) hash_buf->digest;
17819
17820 salt_t *salt = hash_buf->salt;
17821
17822 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
17823
17824 /**
17825 * parse line
17826 */
17827
17828 // iterations
17829
17830 char *iter_pos = input_buf + 7;
17831
17832 u32 iter = atoi (iter_pos);
17833
17834 if (iter < 1) return (PARSER_SALT_ITERATION);
17835 if (iter > 999999) return (PARSER_SALT_ITERATION);
17836
17837 // first is *raw* salt
17838
17839 char *salt_pos = strchr (iter_pos, ':');
17840
17841 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17842
17843 salt_pos++;
17844
17845 char *hash_pos = strchr (salt_pos, ':');
17846
17847 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17848
17849 u32 salt_len = hash_pos - salt_pos;
17850
17851 if (salt_len > 64) return (PARSER_SALT_LENGTH);
17852
17853 hash_pos++;
17854
17855 u32 hash_b64_len = input_len - (hash_pos - input_buf);
17856
17857 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
17858
17859 // decode salt
17860
17861 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
17862
17863 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
17864
17865 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17866
17867 salt_buf_ptr[salt_len + 3] = 0x01;
17868 salt_buf_ptr[salt_len + 4] = 0x80;
17869
17870 salt->salt_len = salt_len;
17871 salt->salt_iter = iter - 1;
17872
17873 // decode hash
17874
17875 u8 tmp_buf[100] = { 0 };
17876
17877 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
17878
17879 if (hash_len < 16) return (PARSER_HASH_LENGTH);
17880
17881 memcpy (digest, tmp_buf, 16);
17882
17883 digest[0] = byte_swap_32 (digest[0]);
17884 digest[1] = byte_swap_32 (digest[1]);
17885 digest[2] = byte_swap_32 (digest[2]);
17886 digest[3] = byte_swap_32 (digest[3]);
17887
17888 // add some stuff to normal salt to make sorted happy
17889
17890 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
17891 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
17892 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
17893 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
17894 salt->salt_buf[4] = salt->salt_iter;
17895
17896 return (PARSER_OK);
17897 }
17898
17899 int prestashop_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17900 {
17901 if ((input_len < DISPLAY_LEN_MIN_11000) || (input_len > DISPLAY_LEN_MAX_11000)) return (PARSER_GLOBAL_LENGTH);
17902
17903 u32 *digest = (u32 *) hash_buf->digest;
17904
17905 salt_t *salt = hash_buf->salt;
17906
17907 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
17908 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
17909 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
17910 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
17911
17912 digest[0] = byte_swap_32 (digest[0]);
17913 digest[1] = byte_swap_32 (digest[1]);
17914 digest[2] = byte_swap_32 (digest[2]);
17915 digest[3] = byte_swap_32 (digest[3]);
17916
17917 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
17918
17919 uint salt_len = input_len - 32 - 1;
17920
17921 char *salt_buf = input_buf + 32 + 1;
17922
17923 char *salt_buf_ptr = (char *) salt->salt_buf;
17924
17925 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
17926
17927 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17928
17929 salt->salt_len = salt_len;
17930
17931 return (PARSER_OK);
17932 }
17933
17934 int postgresql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17935 {
17936 if ((input_len < DISPLAY_LEN_MIN_11100) || (input_len > DISPLAY_LEN_MAX_11100)) return (PARSER_GLOBAL_LENGTH);
17937
17938 if (memcmp (SIGNATURE_POSTGRESQL_AUTH, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
17939
17940 u32 *digest = (u32 *) hash_buf->digest;
17941
17942 salt_t *salt = hash_buf->salt;
17943
17944 char *user_pos = input_buf + 10;
17945
17946 char *salt_pos = strchr (user_pos, '*');
17947
17948 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17949
17950 salt_pos++;
17951
17952 char *hash_pos = strchr (salt_pos, '*');
17953
17954 hash_pos++;
17955
17956 uint hash_len = input_len - (hash_pos - input_buf);
17957
17958 if (hash_len != 32) return (PARSER_HASH_LENGTH);
17959
17960 uint user_len = salt_pos - user_pos - 1;
17961
17962 uint salt_len = hash_pos - salt_pos - 1;
17963
17964 if (salt_len != 8) return (PARSER_SALT_LENGTH);
17965
17966 /*
17967 * store digest
17968 */
17969
17970 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
17971 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
17972 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
17973 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
17974
17975 digest[0] = byte_swap_32 (digest[0]);
17976 digest[1] = byte_swap_32 (digest[1]);
17977 digest[2] = byte_swap_32 (digest[2]);
17978 digest[3] = byte_swap_32 (digest[3]);
17979
17980 digest[0] -= MD5M_A;
17981 digest[1] -= MD5M_B;
17982 digest[2] -= MD5M_C;
17983 digest[3] -= MD5M_D;
17984
17985 /*
17986 * store salt
17987 */
17988
17989 char *salt_buf_ptr = (char *) salt->salt_buf;
17990
17991 // first 4 bytes are the "challenge"
17992
17993 salt_buf_ptr[0] = hex_to_u8 ((const u8 *) &salt_pos[0]);
17994 salt_buf_ptr[1] = hex_to_u8 ((const u8 *) &salt_pos[2]);
17995 salt_buf_ptr[2] = hex_to_u8 ((const u8 *) &salt_pos[4]);
17996 salt_buf_ptr[3] = hex_to_u8 ((const u8 *) &salt_pos[6]);
17997
17998 // append the user name
17999
18000 user_len = parse_and_store_salt (salt_buf_ptr + 4, user_pos, user_len);
18001
18002 salt->salt_len = 4 + user_len;
18003
18004 return (PARSER_OK);
18005 }
18006
18007 int mysql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18008 {
18009 if ((input_len < DISPLAY_LEN_MIN_11200) || (input_len > DISPLAY_LEN_MAX_11200)) return (PARSER_GLOBAL_LENGTH);
18010
18011 if (memcmp (SIGNATURE_MYSQL_AUTH, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
18012
18013 u32 *digest = (u32 *) hash_buf->digest;
18014
18015 salt_t *salt = hash_buf->salt;
18016
18017 char *salt_pos = input_buf + 9;
18018
18019 char *hash_pos = strchr (salt_pos, '*');
18020
18021 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18022
18023 hash_pos++;
18024
18025 uint hash_len = input_len - (hash_pos - input_buf);
18026
18027 if (hash_len != 40) return (PARSER_HASH_LENGTH);
18028
18029 uint salt_len = hash_pos - salt_pos - 1;
18030
18031 if (salt_len != 40) return (PARSER_SALT_LENGTH);
18032
18033 /*
18034 * store digest
18035 */
18036
18037 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
18038 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
18039 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
18040 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
18041 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
18042
18043 /*
18044 * store salt
18045 */
18046
18047 char *salt_buf_ptr = (char *) salt->salt_buf;
18048
18049 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18050
18051 salt->salt_len = salt_len;
18052
18053 return (PARSER_OK);
18054 }
18055
18056 int bitcoin_wallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18057 {
18058 if ((input_len < DISPLAY_LEN_MIN_11300) || (input_len > DISPLAY_LEN_MAX_11300)) return (PARSER_GLOBAL_LENGTH);
18059
18060 if (memcmp (SIGNATURE_BITCOIN_WALLET, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
18061
18062 u32 *digest = (u32 *) hash_buf->digest;
18063
18064 salt_t *salt = hash_buf->salt;
18065
18066 bitcoin_wallet_t *bitcoin_wallet = (bitcoin_wallet_t *) hash_buf->esalt;
18067
18068 /**
18069 * parse line
18070 */
18071
18072 char *cry_master_len_pos = input_buf + 9;
18073
18074 char *cry_master_buf_pos = strchr (cry_master_len_pos, '$');
18075
18076 if (cry_master_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18077
18078 u32 cry_master_len_len = cry_master_buf_pos - cry_master_len_pos;
18079
18080 cry_master_buf_pos++;
18081
18082 char *cry_salt_len_pos = strchr (cry_master_buf_pos, '$');
18083
18084 if (cry_salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18085
18086 u32 cry_master_buf_len = cry_salt_len_pos - cry_master_buf_pos;
18087
18088 cry_salt_len_pos++;
18089
18090 char *cry_salt_buf_pos = strchr (cry_salt_len_pos, '$');
18091
18092 if (cry_salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18093
18094 u32 cry_salt_len_len = cry_salt_buf_pos - cry_salt_len_pos;
18095
18096 cry_salt_buf_pos++;
18097
18098 char *cry_rounds_pos = strchr (cry_salt_buf_pos, '$');
18099
18100 if (cry_rounds_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18101
18102 u32 cry_salt_buf_len = cry_rounds_pos - cry_salt_buf_pos;
18103
18104 cry_rounds_pos++;
18105
18106 char *ckey_len_pos = strchr (cry_rounds_pos, '$');
18107
18108 if (ckey_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18109
18110 u32 cry_rounds_len = ckey_len_pos - cry_rounds_pos;
18111
18112 ckey_len_pos++;
18113
18114 char *ckey_buf_pos = strchr (ckey_len_pos, '$');
18115
18116 if (ckey_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18117
18118 u32 ckey_len_len = ckey_buf_pos - ckey_len_pos;
18119
18120 ckey_buf_pos++;
18121
18122 char *public_key_len_pos = strchr (ckey_buf_pos, '$');
18123
18124 if (public_key_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18125
18126 u32 ckey_buf_len = public_key_len_pos - ckey_buf_pos;
18127
18128 public_key_len_pos++;
18129
18130 char *public_key_buf_pos = strchr (public_key_len_pos, '$');
18131
18132 if (public_key_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18133
18134 u32 public_key_len_len = public_key_buf_pos - public_key_len_pos;
18135
18136 public_key_buf_pos++;
18137
18138 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;
18139
18140 const uint cry_master_len = atoi (cry_master_len_pos);
18141 const uint cry_salt_len = atoi (cry_salt_len_pos);
18142 const uint ckey_len = atoi (ckey_len_pos);
18143 const uint public_key_len = atoi (public_key_len_pos);
18144
18145 if (cry_master_buf_len != cry_master_len) return (PARSER_SALT_VALUE);
18146 if (cry_salt_buf_len != cry_salt_len) return (PARSER_SALT_VALUE);
18147 if (ckey_buf_len != ckey_len) return (PARSER_SALT_VALUE);
18148 if (public_key_buf_len != public_key_len) return (PARSER_SALT_VALUE);
18149
18150 for (uint i = 0, j = 0; j < cry_master_len; i += 1, j += 8)
18151 {
18152 bitcoin_wallet->cry_master_buf[i] = hex_to_u32 ((const u8 *) &cry_master_buf_pos[j]);
18153
18154 bitcoin_wallet->cry_master_buf[i] = byte_swap_32 (bitcoin_wallet->cry_master_buf[i]);
18155 }
18156
18157 for (uint i = 0, j = 0; j < ckey_len; i += 1, j += 8)
18158 {
18159 bitcoin_wallet->ckey_buf[i] = hex_to_u32 ((const u8 *) &ckey_buf_pos[j]);
18160
18161 bitcoin_wallet->ckey_buf[i] = byte_swap_32 (bitcoin_wallet->ckey_buf[i]);
18162 }
18163
18164 for (uint i = 0, j = 0; j < public_key_len; i += 1, j += 8)
18165 {
18166 bitcoin_wallet->public_key_buf[i] = hex_to_u32 ((const u8 *) &public_key_buf_pos[j]);
18167
18168 bitcoin_wallet->public_key_buf[i] = byte_swap_32 (bitcoin_wallet->public_key_buf[i]);
18169 }
18170
18171 bitcoin_wallet->cry_master_len = cry_master_len / 2;
18172 bitcoin_wallet->ckey_len = ckey_len / 2;
18173 bitcoin_wallet->public_key_len = public_key_len / 2;
18174
18175 /*
18176 * store digest (should be unique enought, hopefully)
18177 */
18178
18179 digest[0] = bitcoin_wallet->cry_master_buf[0];
18180 digest[1] = bitcoin_wallet->cry_master_buf[1];
18181 digest[2] = bitcoin_wallet->cry_master_buf[2];
18182 digest[3] = bitcoin_wallet->cry_master_buf[3];
18183
18184 /*
18185 * store salt
18186 */
18187
18188 if (cry_rounds_len >= 7) return (PARSER_SALT_VALUE);
18189
18190 const uint cry_rounds = atoi (cry_rounds_pos);
18191
18192 salt->salt_iter = cry_rounds - 1;
18193
18194 char *salt_buf_ptr = (char *) salt->salt_buf;
18195
18196 const uint salt_len = parse_and_store_salt (salt_buf_ptr, cry_salt_buf_pos, cry_salt_buf_len);
18197
18198 salt->salt_len = salt_len;
18199
18200 return (PARSER_OK);
18201 }
18202
18203 int sip_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18204 {
18205 if ((input_len < DISPLAY_LEN_MIN_11400) || (input_len > DISPLAY_LEN_MAX_11400)) return (PARSER_GLOBAL_LENGTH);
18206
18207 if (memcmp (SIGNATURE_SIP_AUTH, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
18208
18209 u32 *digest = (u32 *) hash_buf->digest;
18210
18211 salt_t *salt = hash_buf->salt;
18212
18213 sip_t *sip = (sip_t *) hash_buf->esalt;
18214
18215 // work with a temporary copy of input_buf (s.t. we can manipulate it directly)
18216
18217 char *temp_input_buf = (char *) mymalloc (input_len + 1);
18218
18219 memcpy (temp_input_buf, input_buf, input_len);
18220
18221 // URI_server:
18222
18223 char *URI_server_pos = temp_input_buf + 6;
18224
18225 char *URI_client_pos = strchr (URI_server_pos, '*');
18226
18227 if (URI_client_pos == NULL)
18228 {
18229 myfree (temp_input_buf);
18230
18231 return (PARSER_SEPARATOR_UNMATCHED);
18232 }
18233
18234 URI_client_pos[0] = 0;
18235 URI_client_pos++;
18236
18237 uint URI_server_len = strlen (URI_server_pos);
18238
18239 if (URI_server_len > 512)
18240 {
18241 myfree (temp_input_buf);
18242
18243 return (PARSER_SALT_LENGTH);
18244 }
18245
18246 // URI_client:
18247
18248 char *user_pos = strchr (URI_client_pos, '*');
18249
18250 if (user_pos == NULL)
18251 {
18252 myfree (temp_input_buf);
18253
18254 return (PARSER_SEPARATOR_UNMATCHED);
18255 }
18256
18257 user_pos[0] = 0;
18258 user_pos++;
18259
18260 uint URI_client_len = strlen (URI_client_pos);
18261
18262 if (URI_client_len > 512)
18263 {
18264 myfree (temp_input_buf);
18265
18266 return (PARSER_SALT_LENGTH);
18267 }
18268
18269 // user:
18270
18271 char *realm_pos = strchr (user_pos, '*');
18272
18273 if (realm_pos == NULL)
18274 {
18275 myfree (temp_input_buf);
18276
18277 return (PARSER_SEPARATOR_UNMATCHED);
18278 }
18279
18280 realm_pos[0] = 0;
18281 realm_pos++;
18282
18283 uint user_len = strlen (user_pos);
18284
18285 if (user_len > 116)
18286 {
18287 myfree (temp_input_buf);
18288
18289 return (PARSER_SALT_LENGTH);
18290 }
18291
18292 // realm:
18293
18294 char *method_pos = strchr (realm_pos, '*');
18295
18296 if (method_pos == NULL)
18297 {
18298 myfree (temp_input_buf);
18299
18300 return (PARSER_SEPARATOR_UNMATCHED);
18301 }
18302
18303 method_pos[0] = 0;
18304 method_pos++;
18305
18306 uint realm_len = strlen (realm_pos);
18307
18308 if (realm_len > 116)
18309 {
18310 myfree (temp_input_buf);
18311
18312 return (PARSER_SALT_LENGTH);
18313 }
18314
18315 // method:
18316
18317 char *URI_prefix_pos = strchr (method_pos, '*');
18318
18319 if (URI_prefix_pos == NULL)
18320 {
18321 myfree (temp_input_buf);
18322
18323 return (PARSER_SEPARATOR_UNMATCHED);
18324 }
18325
18326 URI_prefix_pos[0] = 0;
18327 URI_prefix_pos++;
18328
18329 uint method_len = strlen (method_pos);
18330
18331 if (method_len > 246)
18332 {
18333 myfree (temp_input_buf);
18334
18335 return (PARSER_SALT_LENGTH);
18336 }
18337
18338 // URI_prefix:
18339
18340 char *URI_resource_pos = strchr (URI_prefix_pos, '*');
18341
18342 if (URI_resource_pos == NULL)
18343 {
18344 myfree (temp_input_buf);
18345
18346 return (PARSER_SEPARATOR_UNMATCHED);
18347 }
18348
18349 URI_resource_pos[0] = 0;
18350 URI_resource_pos++;
18351
18352 uint URI_prefix_len = strlen (URI_prefix_pos);
18353
18354 if (URI_prefix_len > 245)
18355 {
18356 myfree (temp_input_buf);
18357
18358 return (PARSER_SALT_LENGTH);
18359 }
18360
18361 // URI_resource:
18362
18363 char *URI_suffix_pos = strchr (URI_resource_pos, '*');
18364
18365 if (URI_suffix_pos == NULL)
18366 {
18367 myfree (temp_input_buf);
18368
18369 return (PARSER_SEPARATOR_UNMATCHED);
18370 }
18371
18372 URI_suffix_pos[0] = 0;
18373 URI_suffix_pos++;
18374
18375 uint URI_resource_len = strlen (URI_resource_pos);
18376
18377 if (URI_resource_len < 1 || URI_resource_len > 246)
18378 {
18379 myfree (temp_input_buf);
18380
18381 return (PARSER_SALT_LENGTH);
18382 }
18383
18384 // URI_suffix:
18385
18386 char *nonce_pos = strchr (URI_suffix_pos, '*');
18387
18388 if (nonce_pos == NULL)
18389 {
18390 myfree (temp_input_buf);
18391
18392 return (PARSER_SEPARATOR_UNMATCHED);
18393 }
18394
18395 nonce_pos[0] = 0;
18396 nonce_pos++;
18397
18398 uint URI_suffix_len = strlen (URI_suffix_pos);
18399
18400 if (URI_suffix_len > 245)
18401 {
18402 myfree (temp_input_buf);
18403
18404 return (PARSER_SALT_LENGTH);
18405 }
18406
18407 // nonce:
18408
18409 char *nonce_client_pos = strchr (nonce_pos, '*');
18410
18411 if (nonce_client_pos == NULL)
18412 {
18413 myfree (temp_input_buf);
18414
18415 return (PARSER_SEPARATOR_UNMATCHED);
18416 }
18417
18418 nonce_client_pos[0] = 0;
18419 nonce_client_pos++;
18420
18421 uint nonce_len = strlen (nonce_pos);
18422
18423 if (nonce_len < 1 || nonce_len > 50)
18424 {
18425 myfree (temp_input_buf);
18426
18427 return (PARSER_SALT_LENGTH);
18428 }
18429
18430 // nonce_client:
18431
18432 char *nonce_count_pos = strchr (nonce_client_pos, '*');
18433
18434 if (nonce_count_pos == NULL)
18435 {
18436 myfree (temp_input_buf);
18437
18438 return (PARSER_SEPARATOR_UNMATCHED);
18439 }
18440
18441 nonce_count_pos[0] = 0;
18442 nonce_count_pos++;
18443
18444 uint nonce_client_len = strlen (nonce_client_pos);
18445
18446 if (nonce_client_len > 50)
18447 {
18448 myfree (temp_input_buf);
18449
18450 return (PARSER_SALT_LENGTH);
18451 }
18452
18453 // nonce_count:
18454
18455 char *qop_pos = strchr (nonce_count_pos, '*');
18456
18457 if (qop_pos == NULL)
18458 {
18459 myfree (temp_input_buf);
18460
18461 return (PARSER_SEPARATOR_UNMATCHED);
18462 }
18463
18464 qop_pos[0] = 0;
18465 qop_pos++;
18466
18467 uint nonce_count_len = strlen (nonce_count_pos);
18468
18469 if (nonce_count_len > 50)
18470 {
18471 myfree (temp_input_buf);
18472
18473 return (PARSER_SALT_LENGTH);
18474 }
18475
18476 // qop:
18477
18478 char *directive_pos = strchr (qop_pos, '*');
18479
18480 if (directive_pos == NULL)
18481 {
18482 myfree (temp_input_buf);
18483
18484 return (PARSER_SEPARATOR_UNMATCHED);
18485 }
18486
18487 directive_pos[0] = 0;
18488 directive_pos++;
18489
18490 uint qop_len = strlen (qop_pos);
18491
18492 if (qop_len > 50)
18493 {
18494 myfree (temp_input_buf);
18495
18496 return (PARSER_SALT_LENGTH);
18497 }
18498
18499 // directive
18500
18501 char *digest_pos = strchr (directive_pos, '*');
18502
18503 if (digest_pos == NULL)
18504 {
18505 myfree (temp_input_buf);
18506
18507 return (PARSER_SEPARATOR_UNMATCHED);
18508 }
18509
18510 digest_pos[0] = 0;
18511 digest_pos++;
18512
18513 uint directive_len = strlen (directive_pos);
18514
18515 if (directive_len != 3)
18516 {
18517 myfree (temp_input_buf);
18518
18519 return (PARSER_SALT_LENGTH);
18520 }
18521
18522 if (memcmp (directive_pos, "MD5", 3))
18523 {
18524 log_info ("ERROR: only the MD5 directive is currently supported\n");
18525
18526 myfree (temp_input_buf);
18527
18528 return (PARSER_SIP_AUTH_DIRECTIVE);
18529 }
18530
18531 /*
18532 * first (pre-)compute: HA2 = md5 ($method . ":" . $uri)
18533 */
18534
18535 uint md5_len = 0;
18536
18537 uint md5_max_len = 4 * 64;
18538
18539 uint md5_remaining_len = md5_max_len;
18540
18541 uint tmp_md5_buf[64] = { 0 };
18542
18543 char *tmp_md5_ptr = (char *) tmp_md5_buf;
18544
18545 snprintf (tmp_md5_ptr, md5_remaining_len, "%s:", method_pos);
18546
18547 md5_len += method_len + 1;
18548 tmp_md5_ptr += method_len + 1;
18549
18550 if (URI_prefix_len > 0)
18551 {
18552 md5_remaining_len = md5_max_len - md5_len;
18553
18554 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s:", URI_prefix_pos);
18555
18556 md5_len += URI_prefix_len + 1;
18557 tmp_md5_ptr += URI_prefix_len + 1;
18558 }
18559
18560 md5_remaining_len = md5_max_len - md5_len;
18561
18562 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s", URI_resource_pos);
18563
18564 md5_len += URI_resource_len;
18565 tmp_md5_ptr += URI_resource_len;
18566
18567 if (URI_suffix_len > 0)
18568 {
18569 md5_remaining_len = md5_max_len - md5_len;
18570
18571 snprintf (tmp_md5_ptr, md5_remaining_len + 1, ":%s", URI_suffix_pos);
18572
18573 md5_len += 1 + URI_suffix_len;
18574 }
18575
18576 uint tmp_digest[4] = { 0 };
18577
18578 md5_complete_no_limit (tmp_digest, tmp_md5_buf, md5_len);
18579
18580 tmp_digest[0] = byte_swap_32 (tmp_digest[0]);
18581 tmp_digest[1] = byte_swap_32 (tmp_digest[1]);
18582 tmp_digest[2] = byte_swap_32 (tmp_digest[2]);
18583 tmp_digest[3] = byte_swap_32 (tmp_digest[3]);
18584
18585 /*
18586 * esalt
18587 */
18588
18589 char *esalt_buf_ptr = (char *) sip->esalt_buf;
18590
18591 uint esalt_len = 0;
18592
18593 uint max_esalt_len = sizeof (sip->esalt_buf); // 151 = (64 + 64 + 55) - 32, where 32 is the hexadecimal MD5 HA1 hash
18594
18595 // there are 2 possibilities for the esalt:
18596
18597 if ((strcmp (qop_pos, "auth") == 0) || (strcmp (qop_pos, "auth-int") == 0))
18598 {
18599 esalt_len = 1 + nonce_len + 1 + nonce_count_len + 1 + nonce_client_len + 1 + qop_len + 1 + 32;
18600
18601 if (esalt_len > max_esalt_len)
18602 {
18603 myfree (temp_input_buf);
18604
18605 return (PARSER_SALT_LENGTH);
18606 }
18607
18608 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%s:%s:%s:%08x%08x%08x%08x",
18609 nonce_pos,
18610 nonce_count_pos,
18611 nonce_client_pos,
18612 qop_pos,
18613 tmp_digest[0],
18614 tmp_digest[1],
18615 tmp_digest[2],
18616 tmp_digest[3]);
18617 }
18618 else
18619 {
18620 esalt_len = 1 + nonce_len + 1 + 32;
18621
18622 if (esalt_len > max_esalt_len)
18623 {
18624 myfree (temp_input_buf);
18625
18626 return (PARSER_SALT_LENGTH);
18627 }
18628
18629 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%08x%08x%08x%08x",
18630 nonce_pos,
18631 tmp_digest[0],
18632 tmp_digest[1],
18633 tmp_digest[2],
18634 tmp_digest[3]);
18635 }
18636
18637 // add 0x80 to esalt
18638
18639 esalt_buf_ptr[esalt_len] = 0x80;
18640
18641 sip->esalt_len = esalt_len;
18642
18643 /*
18644 * actual salt
18645 */
18646
18647 char *sip_salt_ptr = (char *) sip->salt_buf;
18648
18649 uint salt_len = user_len + 1 + realm_len + 1;
18650
18651 uint max_salt_len = 119;
18652
18653 if (salt_len > max_salt_len)
18654 {
18655 myfree (temp_input_buf);
18656
18657 return (PARSER_SALT_LENGTH);
18658 }
18659
18660 snprintf (sip_salt_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
18661
18662 sip->salt_len = salt_len;
18663
18664 /*
18665 * fake salt (for sorting)
18666 */
18667
18668 char *salt_buf_ptr = (char *) salt->salt_buf;
18669
18670 max_salt_len = 55;
18671
18672 uint fake_salt_len = salt_len;
18673
18674 if (fake_salt_len > max_salt_len)
18675 {
18676 fake_salt_len = max_salt_len;
18677 }
18678
18679 snprintf (salt_buf_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
18680
18681 salt->salt_len = fake_salt_len;
18682
18683 /*
18684 * digest
18685 */
18686
18687 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
18688 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
18689 digest[2] = hex_to_u32 ((const u8 *) &digest_pos[16]);
18690 digest[3] = hex_to_u32 ((const u8 *) &digest_pos[24]);
18691
18692 digest[0] = byte_swap_32 (digest[0]);
18693 digest[1] = byte_swap_32 (digest[1]);
18694 digest[2] = byte_swap_32 (digest[2]);
18695 digest[3] = byte_swap_32 (digest[3]);
18696
18697 myfree (temp_input_buf);
18698
18699 return (PARSER_OK);
18700 }
18701
18702 int crc32_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18703 {
18704 if ((input_len < DISPLAY_LEN_MIN_11500) || (input_len > DISPLAY_LEN_MAX_11500)) return (PARSER_GLOBAL_LENGTH);
18705
18706 if (input_buf[8] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
18707
18708 u32 *digest = (u32 *) hash_buf->digest;
18709
18710 salt_t *salt = hash_buf->salt;
18711
18712 // digest
18713
18714 char *digest_pos = input_buf;
18715
18716 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[0]);
18717 digest[1] = 0;
18718 digest[2] = 0;
18719 digest[3] = 0;
18720
18721 // salt
18722
18723 char *salt_buf = input_buf + 8 + 1;
18724
18725 uint salt_len = 8;
18726
18727 char *salt_buf_ptr = (char *) salt->salt_buf;
18728
18729 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
18730
18731 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18732
18733 salt->salt_len = salt_len;
18734
18735 return (PARSER_OK);
18736 }
18737
18738 int seven_zip_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18739 {
18740 if ((input_len < DISPLAY_LEN_MIN_11600) || (input_len > DISPLAY_LEN_MAX_11600)) return (PARSER_GLOBAL_LENGTH);
18741
18742 if (memcmp (SIGNATURE_SEVEN_ZIP, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
18743
18744 u32 *digest = (u32 *) hash_buf->digest;
18745
18746 salt_t *salt = hash_buf->salt;
18747
18748 seven_zip_t *seven_zip = (seven_zip_t *) hash_buf->esalt;
18749
18750 /**
18751 * parse line
18752 */
18753
18754 char *p_buf_pos = input_buf + 4;
18755
18756 char *NumCyclesPower_pos = strchr (p_buf_pos, '$');
18757
18758 if (NumCyclesPower_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18759
18760 u32 p_buf_len = NumCyclesPower_pos - p_buf_pos;
18761
18762 NumCyclesPower_pos++;
18763
18764 char *salt_len_pos = strchr (NumCyclesPower_pos, '$');
18765
18766 if (salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18767
18768 u32 NumCyclesPower_len = salt_len_pos - NumCyclesPower_pos;
18769
18770 salt_len_pos++;
18771
18772 char *salt_buf_pos = strchr (salt_len_pos, '$');
18773
18774 if (salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18775
18776 u32 salt_len_len = salt_buf_pos - salt_len_pos;
18777
18778 salt_buf_pos++;
18779
18780 char *iv_len_pos = strchr (salt_buf_pos, '$');
18781
18782 if (iv_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18783
18784 u32 salt_buf_len = iv_len_pos - salt_buf_pos;
18785
18786 iv_len_pos++;
18787
18788 char *iv_buf_pos = strchr (iv_len_pos, '$');
18789
18790 if (iv_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18791
18792 u32 iv_len_len = iv_buf_pos - iv_len_pos;
18793
18794 iv_buf_pos++;
18795
18796 char *crc_buf_pos = strchr (iv_buf_pos, '$');
18797
18798 if (crc_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18799
18800 u32 iv_buf_len = crc_buf_pos - iv_buf_pos;
18801
18802 crc_buf_pos++;
18803
18804 char *data_len_pos = strchr (crc_buf_pos, '$');
18805
18806 if (data_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18807
18808 u32 crc_buf_len = data_len_pos - crc_buf_pos;
18809
18810 data_len_pos++;
18811
18812 char *unpack_size_pos = strchr (data_len_pos, '$');
18813
18814 if (unpack_size_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18815
18816 u32 data_len_len = unpack_size_pos - data_len_pos;
18817
18818 unpack_size_pos++;
18819
18820 char *data_buf_pos = strchr (unpack_size_pos, '$');
18821
18822 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18823
18824 u32 unpack_size_len = data_buf_pos - unpack_size_pos;
18825
18826 data_buf_pos++;
18827
18828 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;
18829
18830 const uint iter = atoi (NumCyclesPower_pos);
18831 const uint crc = atoi (crc_buf_pos);
18832 const uint p_buf = atoi (p_buf_pos);
18833 const uint salt_len = atoi (salt_len_pos);
18834 const uint iv_len = atoi (iv_len_pos);
18835 const uint unpack_size = atoi (unpack_size_pos);
18836 const uint data_len = atoi (data_len_pos);
18837
18838 /**
18839 * verify some data
18840 */
18841
18842 if (p_buf != 0) return (PARSER_SALT_VALUE);
18843 if (salt_len != 0) return (PARSER_SALT_VALUE);
18844
18845 if ((data_len * 2) != data_buf_len) return (PARSER_SALT_VALUE);
18846
18847 if (data_len > 384) return (PARSER_SALT_VALUE);
18848
18849 if (unpack_size > data_len) return (PARSER_SALT_VALUE);
18850
18851 /**
18852 * store data
18853 */
18854
18855 seven_zip->iv_buf[0] = hex_to_u32 ((const u8 *) &iv_buf_pos[ 0]);
18856 seven_zip->iv_buf[1] = hex_to_u32 ((const u8 *) &iv_buf_pos[ 8]);
18857 seven_zip->iv_buf[2] = hex_to_u32 ((const u8 *) &iv_buf_pos[16]);
18858 seven_zip->iv_buf[3] = hex_to_u32 ((const u8 *) &iv_buf_pos[24]);
18859
18860 seven_zip->iv_len = iv_len;
18861
18862 memcpy (seven_zip->salt_buf, salt_buf_pos, salt_buf_len); // we just need that for later ascii_digest()
18863
18864 seven_zip->salt_len = 0;
18865
18866 seven_zip->crc = crc;
18867
18868 for (uint i = 0, j = 0; j < data_buf_len; i += 1, j += 8)
18869 {
18870 seven_zip->data_buf[i] = hex_to_u32 ((const u8 *) &data_buf_pos[j]);
18871
18872 seven_zip->data_buf[i] = byte_swap_32 (seven_zip->data_buf[i]);
18873 }
18874
18875 seven_zip->data_len = data_len;
18876
18877 seven_zip->unpack_size = unpack_size;
18878
18879 // real salt
18880
18881 salt->salt_buf[0] = seven_zip->data_buf[0];
18882 salt->salt_buf[1] = seven_zip->data_buf[1];
18883 salt->salt_buf[2] = seven_zip->data_buf[2];
18884 salt->salt_buf[3] = seven_zip->data_buf[3];
18885
18886 salt->salt_len = 16;
18887
18888 salt->salt_sign[0] = iter;
18889
18890 salt->salt_iter = 1 << iter;
18891
18892 /**
18893 * digest
18894 */
18895
18896 digest[0] = crc;
18897 digest[1] = 0;
18898 digest[2] = 0;
18899 digest[3] = 0;
18900
18901 return (PARSER_OK);
18902 }
18903
18904 int gost2012sbog_256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18905 {
18906 if ((input_len < DISPLAY_LEN_MIN_11700) || (input_len > DISPLAY_LEN_MAX_11700)) return (PARSER_GLOBAL_LENGTH);
18907
18908 u32 *digest = (u32 *) hash_buf->digest;
18909
18910 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
18911 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
18912 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
18913 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
18914 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
18915 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
18916 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
18917 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
18918
18919 digest[0] = byte_swap_32 (digest[0]);
18920 digest[1] = byte_swap_32 (digest[1]);
18921 digest[2] = byte_swap_32 (digest[2]);
18922 digest[3] = byte_swap_32 (digest[3]);
18923 digest[4] = byte_swap_32 (digest[4]);
18924 digest[5] = byte_swap_32 (digest[5]);
18925 digest[6] = byte_swap_32 (digest[6]);
18926 digest[7] = byte_swap_32 (digest[7]);
18927
18928 return (PARSER_OK);
18929 }
18930
18931 int gost2012sbog_512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18932 {
18933 if ((input_len < DISPLAY_LEN_MIN_11800) || (input_len > DISPLAY_LEN_MAX_11800)) return (PARSER_GLOBAL_LENGTH);
18934
18935 u32 *digest = (u32 *) hash_buf->digest;
18936
18937 digest[ 0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
18938 digest[ 1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
18939 digest[ 2] = hex_to_u32 ((const u8 *) &input_buf[ 16]);
18940 digest[ 3] = hex_to_u32 ((const u8 *) &input_buf[ 24]);
18941 digest[ 4] = hex_to_u32 ((const u8 *) &input_buf[ 32]);
18942 digest[ 5] = hex_to_u32 ((const u8 *) &input_buf[ 40]);
18943 digest[ 6] = hex_to_u32 ((const u8 *) &input_buf[ 48]);
18944 digest[ 7] = hex_to_u32 ((const u8 *) &input_buf[ 56]);
18945 digest[ 8] = hex_to_u32 ((const u8 *) &input_buf[ 64]);
18946 digest[ 9] = hex_to_u32 ((const u8 *) &input_buf[ 72]);
18947 digest[10] = hex_to_u32 ((const u8 *) &input_buf[ 80]);
18948 digest[11] = hex_to_u32 ((const u8 *) &input_buf[ 88]);
18949 digest[12] = hex_to_u32 ((const u8 *) &input_buf[ 96]);
18950 digest[13] = hex_to_u32 ((const u8 *) &input_buf[104]);
18951 digest[14] = hex_to_u32 ((const u8 *) &input_buf[112]);
18952 digest[15] = hex_to_u32 ((const u8 *) &input_buf[120]);
18953
18954 digest[ 0] = byte_swap_32 (digest[ 0]);
18955 digest[ 1] = byte_swap_32 (digest[ 1]);
18956 digest[ 2] = byte_swap_32 (digest[ 2]);
18957 digest[ 3] = byte_swap_32 (digest[ 3]);
18958 digest[ 4] = byte_swap_32 (digest[ 4]);
18959 digest[ 5] = byte_swap_32 (digest[ 5]);
18960 digest[ 6] = byte_swap_32 (digest[ 6]);
18961 digest[ 7] = byte_swap_32 (digest[ 7]);
18962 digest[ 8] = byte_swap_32 (digest[ 8]);
18963 digest[ 9] = byte_swap_32 (digest[ 9]);
18964 digest[10] = byte_swap_32 (digest[10]);
18965 digest[11] = byte_swap_32 (digest[11]);
18966 digest[12] = byte_swap_32 (digest[12]);
18967 digest[13] = byte_swap_32 (digest[13]);
18968 digest[14] = byte_swap_32 (digest[14]);
18969 digest[15] = byte_swap_32 (digest[15]);
18970
18971 return (PARSER_OK);
18972 }
18973
18974 int pbkdf2_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18975 {
18976 if ((input_len < DISPLAY_LEN_MIN_11900) || (input_len > DISPLAY_LEN_MAX_11900)) return (PARSER_GLOBAL_LENGTH);
18977
18978 if (memcmp (SIGNATURE_PBKDF2_MD5, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
18979
18980 u32 *digest = (u32 *) hash_buf->digest;
18981
18982 salt_t *salt = hash_buf->salt;
18983
18984 pbkdf2_md5_t *pbkdf2_md5 = (pbkdf2_md5_t *) hash_buf->esalt;
18985
18986 /**
18987 * parse line
18988 */
18989
18990 // iterations
18991
18992 char *iter_pos = input_buf + 4;
18993
18994 u32 iter = atoi (iter_pos);
18995
18996 if (iter < 1) return (PARSER_SALT_ITERATION);
18997 if (iter > 999999) return (PARSER_SALT_ITERATION);
18998
18999 // first is *raw* salt
19000
19001 char *salt_pos = strchr (iter_pos, ':');
19002
19003 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19004
19005 salt_pos++;
19006
19007 char *hash_pos = strchr (salt_pos, ':');
19008
19009 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19010
19011 u32 salt_len = hash_pos - salt_pos;
19012
19013 if (salt_len > 64) return (PARSER_SALT_LENGTH);
19014
19015 hash_pos++;
19016
19017 u32 hash_b64_len = input_len - (hash_pos - input_buf);
19018
19019 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
19020
19021 // decode salt
19022
19023 char *salt_buf_ptr = (char *) pbkdf2_md5->salt_buf;
19024
19025 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
19026
19027 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
19028
19029 salt_buf_ptr[salt_len + 3] = 0x01;
19030 salt_buf_ptr[salt_len + 4] = 0x80;
19031
19032 salt->salt_len = salt_len;
19033 salt->salt_iter = iter - 1;
19034
19035 // decode hash
19036
19037 u8 tmp_buf[100] = { 0 };
19038
19039 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
19040
19041 if (hash_len < 16) return (PARSER_HASH_LENGTH);
19042
19043 memcpy (digest, tmp_buf, 16);
19044
19045 // add some stuff to normal salt to make sorted happy
19046
19047 salt->salt_buf[0] = pbkdf2_md5->salt_buf[0];
19048 salt->salt_buf[1] = pbkdf2_md5->salt_buf[1];
19049 salt->salt_buf[2] = pbkdf2_md5->salt_buf[2];
19050 salt->salt_buf[3] = pbkdf2_md5->salt_buf[3];
19051 salt->salt_buf[4] = salt->salt_iter;
19052
19053 return (PARSER_OK);
19054 }
19055
19056 int pbkdf2_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19057 {
19058 if ((input_len < DISPLAY_LEN_MIN_12000) || (input_len > DISPLAY_LEN_MAX_12000)) return (PARSER_GLOBAL_LENGTH);
19059
19060 if (memcmp (SIGNATURE_PBKDF2_SHA1, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
19061
19062 u32 *digest = (u32 *) hash_buf->digest;
19063
19064 salt_t *salt = hash_buf->salt;
19065
19066 pbkdf2_sha1_t *pbkdf2_sha1 = (pbkdf2_sha1_t *) hash_buf->esalt;
19067
19068 /**
19069 * parse line
19070 */
19071
19072 // iterations
19073
19074 char *iter_pos = input_buf + 5;
19075
19076 u32 iter = atoi (iter_pos);
19077
19078 if (iter < 1) return (PARSER_SALT_ITERATION);
19079 if (iter > 999999) return (PARSER_SALT_ITERATION);
19080
19081 // first is *raw* salt
19082
19083 char *salt_pos = strchr (iter_pos, ':');
19084
19085 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19086
19087 salt_pos++;
19088
19089 char *hash_pos = strchr (salt_pos, ':');
19090
19091 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19092
19093 u32 salt_len = hash_pos - salt_pos;
19094
19095 if (salt_len > 64) return (PARSER_SALT_LENGTH);
19096
19097 hash_pos++;
19098
19099 u32 hash_b64_len = input_len - (hash_pos - input_buf);
19100
19101 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
19102
19103 // decode salt
19104
19105 char *salt_buf_ptr = (char *) pbkdf2_sha1->salt_buf;
19106
19107 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
19108
19109 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
19110
19111 salt_buf_ptr[salt_len + 3] = 0x01;
19112 salt_buf_ptr[salt_len + 4] = 0x80;
19113
19114 salt->salt_len = salt_len;
19115 salt->salt_iter = iter - 1;
19116
19117 // decode hash
19118
19119 u8 tmp_buf[100] = { 0 };
19120
19121 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
19122
19123 if (hash_len < 16) return (PARSER_HASH_LENGTH);
19124
19125 memcpy (digest, tmp_buf, 16);
19126
19127 digest[0] = byte_swap_32 (digest[0]);
19128 digest[1] = byte_swap_32 (digest[1]);
19129 digest[2] = byte_swap_32 (digest[2]);
19130 digest[3] = byte_swap_32 (digest[3]);
19131
19132 // add some stuff to normal salt to make sorted happy
19133
19134 salt->salt_buf[0] = pbkdf2_sha1->salt_buf[0];
19135 salt->salt_buf[1] = pbkdf2_sha1->salt_buf[1];
19136 salt->salt_buf[2] = pbkdf2_sha1->salt_buf[2];
19137 salt->salt_buf[3] = pbkdf2_sha1->salt_buf[3];
19138 salt->salt_buf[4] = salt->salt_iter;
19139
19140 return (PARSER_OK);
19141 }
19142
19143 int pbkdf2_sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19144 {
19145 if ((input_len < DISPLAY_LEN_MIN_12100) || (input_len > DISPLAY_LEN_MAX_12100)) return (PARSER_GLOBAL_LENGTH);
19146
19147 if (memcmp (SIGNATURE_PBKDF2_SHA512, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
19148
19149 u64 *digest = (u64 *) hash_buf->digest;
19150
19151 salt_t *salt = hash_buf->salt;
19152
19153 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
19154
19155 /**
19156 * parse line
19157 */
19158
19159 // iterations
19160
19161 char *iter_pos = input_buf + 7;
19162
19163 u32 iter = atoi (iter_pos);
19164
19165 if (iter < 1) return (PARSER_SALT_ITERATION);
19166 if (iter > 999999) return (PARSER_SALT_ITERATION);
19167
19168 // first is *raw* salt
19169
19170 char *salt_pos = strchr (iter_pos, ':');
19171
19172 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19173
19174 salt_pos++;
19175
19176 char *hash_pos = strchr (salt_pos, ':');
19177
19178 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19179
19180 u32 salt_len = hash_pos - salt_pos;
19181
19182 if (salt_len > 64) return (PARSER_SALT_LENGTH);
19183
19184 hash_pos++;
19185
19186 u32 hash_b64_len = input_len - (hash_pos - input_buf);
19187
19188 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
19189
19190 // decode salt
19191
19192 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
19193
19194 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
19195
19196 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
19197
19198 salt_buf_ptr[salt_len + 3] = 0x01;
19199 salt_buf_ptr[salt_len + 4] = 0x80;
19200
19201 salt->salt_len = salt_len;
19202 salt->salt_iter = iter - 1;
19203
19204 // decode hash
19205
19206 u8 tmp_buf[100] = { 0 };
19207
19208 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
19209
19210 if (hash_len < 16) return (PARSER_HASH_LENGTH);
19211
19212 memcpy (digest, tmp_buf, 64);
19213
19214 digest[0] = byte_swap_64 (digest[0]);
19215 digest[1] = byte_swap_64 (digest[1]);
19216 digest[2] = byte_swap_64 (digest[2]);
19217 digest[3] = byte_swap_64 (digest[3]);
19218 digest[4] = byte_swap_64 (digest[4]);
19219 digest[5] = byte_swap_64 (digest[5]);
19220 digest[6] = byte_swap_64 (digest[6]);
19221 digest[7] = byte_swap_64 (digest[7]);
19222
19223 // add some stuff to normal salt to make sorted happy
19224
19225 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
19226 salt->salt_buf[1] = pbkdf2_sha512->salt_buf[1];
19227 salt->salt_buf[2] = pbkdf2_sha512->salt_buf[2];
19228 salt->salt_buf[3] = pbkdf2_sha512->salt_buf[3];
19229 salt->salt_buf[4] = salt->salt_iter;
19230
19231 return (PARSER_OK);
19232 }
19233
19234 int ecryptfs_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19235 {
19236 if ((input_len < DISPLAY_LEN_MIN_12200) || (input_len > DISPLAY_LEN_MAX_12200)) return (PARSER_GLOBAL_LENGTH);
19237
19238 if (memcmp (SIGNATURE_ECRYPTFS, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
19239
19240 uint *digest = (uint *) hash_buf->digest;
19241
19242 salt_t *salt = hash_buf->salt;
19243
19244 /**
19245 * parse line
19246 */
19247
19248 char *salt_pos = input_buf + 10 + 2 + 2; // skip over "0$" and "1$"
19249
19250 char *hash_pos = strchr (salt_pos, '$');
19251
19252 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19253
19254 u32 salt_len = hash_pos - salt_pos;
19255
19256 if (salt_len != 16) return (PARSER_SALT_LENGTH);
19257
19258 hash_pos++;
19259
19260 u32 hash_len = input_len - 10 - 2 - 2 - salt_len - 1;
19261
19262 if (hash_len != 16) return (PARSER_HASH_LENGTH);
19263
19264 // decode hash
19265
19266 digest[ 0] = hex_to_u32 ((const u8 *) &hash_pos[0]);
19267 digest[ 1] = hex_to_u32 ((const u8 *) &hash_pos[8]);
19268 digest[ 2] = 0;
19269 digest[ 3] = 0;
19270 digest[ 4] = 0;
19271 digest[ 5] = 0;
19272 digest[ 6] = 0;
19273 digest[ 7] = 0;
19274 digest[ 8] = 0;
19275 digest[ 9] = 0;
19276 digest[10] = 0;
19277 digest[11] = 0;
19278 digest[12] = 0;
19279 digest[13] = 0;
19280 digest[14] = 0;
19281 digest[15] = 0;
19282
19283 // decode salt
19284
19285 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[0]);
19286 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[8]);
19287
19288 salt->salt_iter = ROUNDS_ECRYPTFS;
19289 salt->salt_len = 8;
19290
19291 return (PARSER_OK);
19292 }
19293
19294 int bsdicrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19295 {
19296 if ((input_len < DISPLAY_LEN_MIN_12400) || (input_len > DISPLAY_LEN_MAX_12400)) return (PARSER_GLOBAL_LENGTH);
19297
19298 if (memcmp (SIGNATURE_BSDICRYPT, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
19299
19300 unsigned char c19 = itoa64_to_int (input_buf[19]);
19301
19302 if (c19 & 3) return (PARSER_HASH_VALUE);
19303
19304 salt_t *salt = hash_buf->salt;
19305
19306 u32 *digest = (u32 *) hash_buf->digest;
19307
19308 // iteration count
19309
19310 salt->salt_iter = itoa64_to_int (input_buf[1])
19311 | itoa64_to_int (input_buf[2]) << 6
19312 | itoa64_to_int (input_buf[3]) << 12
19313 | itoa64_to_int (input_buf[4]) << 18;
19314
19315 // set salt
19316
19317 salt->salt_buf[0] = itoa64_to_int (input_buf[5])
19318 | itoa64_to_int (input_buf[6]) << 6
19319 | itoa64_to_int (input_buf[7]) << 12
19320 | itoa64_to_int (input_buf[8]) << 18;
19321
19322 salt->salt_len = 4;
19323
19324 u8 tmp_buf[100] = { 0 };
19325
19326 base64_decode (itoa64_to_int, (const u8 *) input_buf + 9, 11, tmp_buf);
19327
19328 memcpy (digest, tmp_buf, 8);
19329
19330 uint tt;
19331
19332 IP (digest[0], digest[1], tt);
19333
19334 digest[0] = rotr32 (digest[0], 31);
19335 digest[1] = rotr32 (digest[1], 31);
19336 digest[2] = 0;
19337 digest[3] = 0;
19338
19339 return (PARSER_OK);
19340 }
19341
19342 int rar3hp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19343 {
19344 if ((input_len < DISPLAY_LEN_MIN_12500) || (input_len > DISPLAY_LEN_MAX_12500)) return (PARSER_GLOBAL_LENGTH);
19345
19346 if (memcmp (SIGNATURE_RAR3, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
19347
19348 u32 *digest = (u32 *) hash_buf->digest;
19349
19350 salt_t *salt = hash_buf->salt;
19351
19352 /**
19353 * parse line
19354 */
19355
19356 char *type_pos = input_buf + 6 + 1;
19357
19358 char *salt_pos = strchr (type_pos, '*');
19359
19360 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19361
19362 u32 type_len = salt_pos - type_pos;
19363
19364 if (type_len != 1) return (PARSER_SALT_LENGTH);
19365
19366 salt_pos++;
19367
19368 char *crypted_pos = strchr (salt_pos, '*');
19369
19370 if (crypted_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19371
19372 u32 salt_len = crypted_pos - salt_pos;
19373
19374 if (salt_len != 16) return (PARSER_SALT_LENGTH);
19375
19376 crypted_pos++;
19377
19378 u32 crypted_len = input_len - 6 - 1 - type_len - 1 - salt_len - 1;
19379
19380 if (crypted_len != 32) return (PARSER_SALT_LENGTH);
19381
19382 /**
19383 * copy data
19384 */
19385
19386 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[0]);
19387 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[8]);
19388
19389 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
19390 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
19391
19392 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &crypted_pos[ 0]);
19393 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &crypted_pos[ 8]);
19394 salt->salt_buf[4] = hex_to_u32 ((const u8 *) &crypted_pos[16]);
19395 salt->salt_buf[5] = hex_to_u32 ((const u8 *) &crypted_pos[24]);
19396
19397 salt->salt_len = 24;
19398 salt->salt_iter = ROUNDS_RAR3;
19399
19400 // there's no hash for rar3. the data which is in crypted_pos is some encrypted data and
19401 // if it matches the value \xc4\x3d\x7b\x00\x40\x07\x00 after decrypt we know that we successfully cracked it.
19402
19403 digest[0] = 0xc43d7b00;
19404 digest[1] = 0x40070000;
19405 digest[2] = 0;
19406 digest[3] = 0;
19407
19408 return (PARSER_OK);
19409 }
19410
19411 int rar5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19412 {
19413 if ((input_len < DISPLAY_LEN_MIN_13000) || (input_len > DISPLAY_LEN_MAX_13000)) return (PARSER_GLOBAL_LENGTH);
19414
19415 if (memcmp (SIGNATURE_RAR5, input_buf, 1 + 4 + 1)) return (PARSER_SIGNATURE_UNMATCHED);
19416
19417 u32 *digest = (u32 *) hash_buf->digest;
19418
19419 salt_t *salt = hash_buf->salt;
19420
19421 rar5_t *rar5 = (rar5_t *) hash_buf->esalt;
19422
19423 /**
19424 * parse line
19425 */
19426
19427 char *param0_pos = input_buf + 1 + 4 + 1;
19428
19429 char *param1_pos = strchr (param0_pos, '$');
19430
19431 if (param1_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19432
19433 u32 param0_len = param1_pos - param0_pos;
19434
19435 param1_pos++;
19436
19437 char *param2_pos = strchr (param1_pos, '$');
19438
19439 if (param2_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19440
19441 u32 param1_len = param2_pos - param1_pos;
19442
19443 param2_pos++;
19444
19445 char *param3_pos = strchr (param2_pos, '$');
19446
19447 if (param3_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19448
19449 u32 param2_len = param3_pos - param2_pos;
19450
19451 param3_pos++;
19452
19453 char *param4_pos = strchr (param3_pos, '$');
19454
19455 if (param4_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19456
19457 u32 param3_len = param4_pos - param3_pos;
19458
19459 param4_pos++;
19460
19461 char *param5_pos = strchr (param4_pos, '$');
19462
19463 if (param5_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19464
19465 u32 param4_len = param5_pos - param4_pos;
19466
19467 param5_pos++;
19468
19469 u32 param5_len = input_len - 1 - 4 - 1 - param0_len - 1 - param1_len - 1 - param2_len - 1 - param3_len - 1 - param4_len - 1;
19470
19471 char *salt_buf = param1_pos;
19472 char *iv = param3_pos;
19473 char *pswcheck = param5_pos;
19474
19475 const uint salt_len = atoi (param0_pos);
19476 const uint iterations = atoi (param2_pos);
19477 const uint pswcheck_len = atoi (param4_pos);
19478
19479 /**
19480 * verify some data
19481 */
19482
19483 if (param1_len != 32) return (PARSER_SALT_VALUE);
19484 if (param3_len != 32) return (PARSER_SALT_VALUE);
19485 if (param5_len != 16) return (PARSER_SALT_VALUE);
19486
19487 if (salt_len != 16) return (PARSER_SALT_VALUE);
19488 if (iterations == 0) return (PARSER_SALT_VALUE);
19489 if (pswcheck_len != 8) return (PARSER_SALT_VALUE);
19490
19491 /**
19492 * store data
19493 */
19494
19495 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
19496 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
19497 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
19498 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf[24]);
19499
19500 rar5->iv[0] = hex_to_u32 ((const u8 *) &iv[ 0]);
19501 rar5->iv[1] = hex_to_u32 ((const u8 *) &iv[ 8]);
19502 rar5->iv[2] = hex_to_u32 ((const u8 *) &iv[16]);
19503 rar5->iv[3] = hex_to_u32 ((const u8 *) &iv[24]);
19504
19505 salt->salt_len = 16;
19506
19507 salt->salt_sign[0] = iterations;
19508
19509 salt->salt_iter = ((1 << iterations) + 32) - 1;
19510
19511 /**
19512 * digest buf
19513 */
19514
19515 digest[0] = hex_to_u32 ((const u8 *) &pswcheck[ 0]);
19516 digest[1] = hex_to_u32 ((const u8 *) &pswcheck[ 8]);
19517 digest[2] = 0;
19518 digest[3] = 0;
19519
19520 return (PARSER_OK);
19521 }
19522
19523 int krb5tgs_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19524 {
19525 if ((input_len < DISPLAY_LEN_MIN_13100) || (input_len > DISPLAY_LEN_MAX_13100)) return (PARSER_GLOBAL_LENGTH);
19526
19527 if (memcmp (SIGNATURE_KRB5TGS, input_buf, 11)) return (PARSER_SIGNATURE_UNMATCHED);
19528
19529 u32 *digest = (u32 *) hash_buf->digest;
19530
19531 salt_t *salt = hash_buf->salt;
19532
19533 krb5tgs_t *krb5tgs = (krb5tgs_t *) hash_buf->esalt;
19534
19535 /**
19536 * parse line
19537 */
19538
19539 /* Skip '$' */
19540 char *account_pos = input_buf + 11 + 1;
19541
19542 char *data_pos;
19543
19544 uint data_len;
19545
19546 if (account_pos[0] == '*')
19547 {
19548 account_pos++;
19549
19550 data_pos = strchr (account_pos, '*');
19551
19552 /* Skip '*' */
19553 data_pos++;
19554
19555 if (data_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19556
19557 uint account_len = data_pos - account_pos + 1;
19558
19559 if (account_len >= 512) return (PARSER_SALT_LENGTH);
19560
19561 /* Skip '$' */
19562 data_pos++;
19563
19564 data_len = input_len - 11 - 1 - account_len - 2;
19565
19566 memcpy (krb5tgs->account_info, account_pos - 1, account_len);
19567 }
19568 else
19569 {
19570 /* assume $krb5tgs$23$checksum$edata2 */
19571 data_pos = account_pos;
19572
19573 memcpy (krb5tgs->account_info, "**", 3);
19574
19575 data_len = input_len - 11 - 1 - 1;
19576 }
19577
19578 if (data_len < ((16 + 32) * 2)) return (PARSER_SALT_LENGTH);
19579
19580 char *checksum_ptr = (char *) krb5tgs->checksum;
19581
19582 for (uint i = 0; i < 16 * 2; i += 2)
19583 {
19584 const char p0 = data_pos[i + 0];
19585 const char p1 = data_pos[i + 1];
19586
19587 *checksum_ptr++ = hex_convert (p1) << 0
19588 | hex_convert (p0) << 4;
19589 }
19590
19591 char *edata_ptr = (char *) krb5tgs->edata2;
19592
19593 krb5tgs->edata2_len = (data_len - 32) / 2 ;
19594
19595 /* skip '$' */
19596 for (uint i = 16 * 2 + 1; i < (krb5tgs->edata2_len * 2) + (16 * 2 + 1); i += 2)
19597 {
19598 const char p0 = data_pos[i + 0];
19599 const char p1 = data_pos[i + 1];
19600 *edata_ptr++ = hex_convert (p1) << 0
19601 | hex_convert (p0) << 4;
19602 }
19603
19604 /* this is needed for hmac_md5 */
19605 *edata_ptr++ = 0x80;
19606
19607 salt->salt_buf[0] = krb5tgs->checksum[0];
19608 salt->salt_buf[1] = krb5tgs->checksum[1];
19609 salt->salt_buf[2] = krb5tgs->checksum[2];
19610 salt->salt_buf[3] = krb5tgs->checksum[3];
19611
19612 salt->salt_len = 32;
19613
19614 digest[0] = krb5tgs->checksum[0];
19615 digest[1] = krb5tgs->checksum[1];
19616 digest[2] = krb5tgs->checksum[2];
19617 digest[3] = krb5tgs->checksum[3];
19618
19619 return (PARSER_OK);
19620 }
19621
19622 int axcrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19623 {
19624 if ((input_len < DISPLAY_LEN_MIN_13200) || (input_len > DISPLAY_LEN_MAX_13200)) return (PARSER_GLOBAL_LENGTH);
19625
19626 if (memcmp (SIGNATURE_AXCRYPT, input_buf, 11)) return (PARSER_SIGNATURE_UNMATCHED);
19627
19628 u32 *digest = (u32 *) hash_buf->digest;
19629
19630 salt_t *salt = hash_buf->salt;
19631
19632 /**
19633 * parse line
19634 */
19635
19636 /* Skip '*' */
19637 char *wrapping_rounds_pos = input_buf + 11 + 1;
19638
19639 char *salt_pos;
19640
19641 char *wrapped_key_pos;
19642
19643 char *data_pos;
19644
19645 salt->salt_iter = atoi (wrapping_rounds_pos);
19646
19647 salt_pos = strchr (wrapping_rounds_pos, '*');
19648
19649 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19650
19651 uint wrapping_rounds_len = salt_pos - wrapping_rounds_pos;
19652
19653 /* Skip '*' */
19654 salt_pos++;
19655
19656 data_pos = salt_pos;
19657
19658 wrapped_key_pos = strchr (salt_pos, '*');
19659
19660 if (wrapped_key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19661
19662 uint salt_len = wrapped_key_pos - salt_pos;
19663
19664 if (salt_len != 32) return (PARSER_SALT_LENGTH);
19665
19666 /* Skip '*' */
19667 wrapped_key_pos++;
19668
19669 uint wrapped_key_len = input_len - 11 - 1 - wrapping_rounds_len - 1 - salt_len - 1;
19670
19671 if (wrapped_key_len != 48) return (PARSER_SALT_LENGTH);
19672
19673 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &data_pos[ 0]);
19674 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &data_pos[ 8]);
19675 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &data_pos[16]);
19676 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &data_pos[24]);
19677
19678 data_pos += 33;
19679
19680 salt->salt_buf[4] = hex_to_u32 ((const u8 *) &data_pos[ 0]);
19681 salt->salt_buf[5] = hex_to_u32 ((const u8 *) &data_pos[ 8]);
19682 salt->salt_buf[6] = hex_to_u32 ((const u8 *) &data_pos[16]);
19683 salt->salt_buf[7] = hex_to_u32 ((const u8 *) &data_pos[24]);
19684 salt->salt_buf[8] = hex_to_u32 ((const u8 *) &data_pos[32]);
19685 salt->salt_buf[9] = hex_to_u32 ((const u8 *) &data_pos[40]);
19686
19687 salt->salt_len = 40;
19688
19689 digest[0] = salt->salt_buf[0];
19690 digest[1] = salt->salt_buf[1];
19691 digest[2] = salt->salt_buf[2];
19692 digest[3] = salt->salt_buf[3];
19693
19694 return (PARSER_OK);
19695 }
19696
19697 int keepass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19698 {
19699 if ((input_len < DISPLAY_LEN_MIN_13400) || (input_len > DISPLAY_LEN_MAX_13400)) return (PARSER_GLOBAL_LENGTH);
19700
19701 if (memcmp (SIGNATURE_KEEPASS, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
19702
19703 u32 *digest = (u32 *) hash_buf->digest;
19704
19705 salt_t *salt = hash_buf->salt;
19706
19707 keepass_t *keepass = (keepass_t *) hash_buf->esalt;
19708
19709 /**
19710 * parse line
19711 */
19712
19713 char *version_pos;
19714
19715 char *rounds_pos;
19716
19717 char *algorithm_pos;
19718
19719 char *final_random_seed_pos;
19720 u32 final_random_seed_len;
19721
19722 char *transf_random_seed_pos;
19723 u32 transf_random_seed_len;
19724
19725 char *enc_iv_pos;
19726 u32 enc_iv_len;
19727
19728 /* default is no keyfile provided */
19729 char *keyfile_len_pos;
19730 u32 keyfile_len = 0;
19731 u32 is_keyfile_present = 0;
19732 char *keyfile_inline_pos;
19733 char *keyfile_pos;
19734
19735 /* specific to version 1 */
19736 char *contents_len_pos;
19737 u32 contents_len;
19738 char *contents_pos;
19739
19740 /* specific to version 2 */
19741 char *expected_bytes_pos;
19742 u32 expected_bytes_len;
19743
19744 char *contents_hash_pos;
19745 u32 contents_hash_len;
19746
19747 version_pos = input_buf + 8 + 1 + 1;
19748
19749 keepass->version = atoi (version_pos);
19750
19751 rounds_pos = strchr (version_pos, '*');
19752
19753 if (rounds_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19754
19755 rounds_pos++;
19756
19757 salt->salt_iter = (atoi (rounds_pos));
19758
19759 algorithm_pos = strchr (rounds_pos, '*');
19760
19761 if (algorithm_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19762
19763 algorithm_pos++;
19764
19765 keepass->algorithm = atoi (algorithm_pos);
19766
19767 final_random_seed_pos = strchr (algorithm_pos, '*');
19768
19769 if (final_random_seed_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19770
19771 final_random_seed_pos++;
19772
19773 keepass->final_random_seed[0] = hex_to_u32 ((const u8 *) &final_random_seed_pos[ 0]);
19774 keepass->final_random_seed[1] = hex_to_u32 ((const u8 *) &final_random_seed_pos[ 8]);
19775 keepass->final_random_seed[2] = hex_to_u32 ((const u8 *) &final_random_seed_pos[16]);
19776 keepass->final_random_seed[3] = hex_to_u32 ((const u8 *) &final_random_seed_pos[24]);
19777
19778 if (keepass->version == 2)
19779 {
19780 keepass->final_random_seed[4] = hex_to_u32 ((const u8 *) &final_random_seed_pos[32]);
19781 keepass->final_random_seed[5] = hex_to_u32 ((const u8 *) &final_random_seed_pos[40]);
19782 keepass->final_random_seed[6] = hex_to_u32 ((const u8 *) &final_random_seed_pos[48]);
19783 keepass->final_random_seed[7] = hex_to_u32 ((const u8 *) &final_random_seed_pos[56]);
19784 }
19785
19786 transf_random_seed_pos = strchr (final_random_seed_pos, '*');
19787
19788 if (transf_random_seed_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19789
19790 final_random_seed_len = transf_random_seed_pos - final_random_seed_pos;
19791
19792 if (keepass->version == 1 && final_random_seed_len != 32) return (PARSER_SALT_LENGTH);
19793 if (keepass->version == 2 && final_random_seed_len != 64) return (PARSER_SALT_LENGTH);
19794
19795 transf_random_seed_pos++;
19796
19797 keepass->transf_random_seed[0] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[ 0]);
19798 keepass->transf_random_seed[1] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[ 8]);
19799 keepass->transf_random_seed[2] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[16]);
19800 keepass->transf_random_seed[3] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[24]);
19801 keepass->transf_random_seed[4] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[32]);
19802 keepass->transf_random_seed[5] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[40]);
19803 keepass->transf_random_seed[6] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[48]);
19804 keepass->transf_random_seed[7] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[56]);
19805
19806 enc_iv_pos = strchr (transf_random_seed_pos, '*');
19807
19808 if (enc_iv_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19809
19810 transf_random_seed_len = enc_iv_pos - transf_random_seed_pos;
19811
19812 if (transf_random_seed_len != 64) return (PARSER_SALT_LENGTH);
19813
19814 enc_iv_pos++;
19815
19816 keepass->enc_iv[0] = hex_to_u32 ((const u8 *) &enc_iv_pos[ 0]);
19817 keepass->enc_iv[1] = hex_to_u32 ((const u8 *) &enc_iv_pos[ 8]);
19818 keepass->enc_iv[2] = hex_to_u32 ((const u8 *) &enc_iv_pos[16]);
19819 keepass->enc_iv[3] = hex_to_u32 ((const u8 *) &enc_iv_pos[24]);
19820
19821 if (keepass->version == 1)
19822 {
19823 contents_hash_pos = strchr (enc_iv_pos, '*');
19824
19825 if (contents_hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19826
19827 enc_iv_len = contents_hash_pos - enc_iv_pos;
19828
19829 if (enc_iv_len != 32) return (PARSER_SALT_LENGTH);
19830
19831 contents_hash_pos++;
19832
19833 keepass->contents_hash[0] = hex_to_u32 ((const u8 *) &contents_hash_pos[ 0]);
19834 keepass->contents_hash[1] = hex_to_u32 ((const u8 *) &contents_hash_pos[ 8]);
19835 keepass->contents_hash[2] = hex_to_u32 ((const u8 *) &contents_hash_pos[16]);
19836 keepass->contents_hash[3] = hex_to_u32 ((const u8 *) &contents_hash_pos[24]);
19837 keepass->contents_hash[4] = hex_to_u32 ((const u8 *) &contents_hash_pos[32]);
19838 keepass->contents_hash[5] = hex_to_u32 ((const u8 *) &contents_hash_pos[40]);
19839 keepass->contents_hash[6] = hex_to_u32 ((const u8 *) &contents_hash_pos[48]);
19840 keepass->contents_hash[7] = hex_to_u32 ((const u8 *) &contents_hash_pos[56]);
19841
19842 /* get length of contents following */
19843 char *inline_flag_pos = strchr (contents_hash_pos, '*');
19844
19845 if (inline_flag_pos == NULL) return (PARSER_SALT_LENGTH);
19846
19847 contents_hash_len = inline_flag_pos - contents_hash_pos;
19848
19849 if (contents_hash_len != 64) return (PARSER_SALT_LENGTH);
19850
19851 inline_flag_pos++;
19852
19853 u32 inline_flag = atoi (inline_flag_pos);
19854
19855 if (inline_flag != 1) return (PARSER_SALT_LENGTH);
19856
19857 contents_len_pos = strchr (inline_flag_pos, '*');
19858
19859 if (contents_len_pos == NULL) return (PARSER_SALT_LENGTH);
19860
19861 contents_len_pos++;
19862
19863 contents_len = atoi (contents_len_pos);
19864
19865 if (contents_len > 50000) return (PARSER_SALT_LENGTH);
19866
19867 contents_pos = strchr (contents_len_pos, '*');
19868
19869 if (contents_pos == NULL) return (PARSER_SALT_LENGTH);
19870
19871 contents_pos++;
19872
19873 u32 i;
19874
19875 keepass->contents_len = contents_len;
19876
19877 contents_len = contents_len / 4;
19878
19879 keyfile_inline_pos = strchr (contents_pos, '*');
19880
19881 u32 real_contents_len;
19882
19883 if (keyfile_inline_pos == NULL)
19884 real_contents_len = input_len - (contents_pos - input_buf);
19885 else
19886 {
19887 real_contents_len = keyfile_inline_pos - contents_pos;
19888 keyfile_inline_pos++;
19889 is_keyfile_present = 1;
19890 }
19891
19892 if (real_contents_len != keepass->contents_len * 2) return (PARSER_SALT_LENGTH);
19893
19894 for (i = 0; i < contents_len; i++)
19895 keepass->contents[i] = hex_to_u32 ((const u8 *) &contents_pos[i * 8]);
19896 }
19897 else if (keepass->version == 2)
19898 {
19899 expected_bytes_pos = strchr (enc_iv_pos, '*');
19900
19901 if (expected_bytes_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19902
19903 enc_iv_len = expected_bytes_pos - enc_iv_pos;
19904
19905 if (enc_iv_len != 32) return (PARSER_SALT_LENGTH);
19906
19907 expected_bytes_pos++;
19908
19909 keepass->expected_bytes[0] = hex_to_u32 ((const u8 *) &expected_bytes_pos[ 0]);
19910 keepass->expected_bytes[1] = hex_to_u32 ((const u8 *) &expected_bytes_pos[ 8]);
19911 keepass->expected_bytes[2] = hex_to_u32 ((const u8 *) &expected_bytes_pos[16]);
19912 keepass->expected_bytes[3] = hex_to_u32 ((const u8 *) &expected_bytes_pos[24]);
19913 keepass->expected_bytes[4] = hex_to_u32 ((const u8 *) &expected_bytes_pos[32]);
19914 keepass->expected_bytes[5] = hex_to_u32 ((const u8 *) &expected_bytes_pos[40]);
19915 keepass->expected_bytes[6] = hex_to_u32 ((const u8 *) &expected_bytes_pos[48]);
19916 keepass->expected_bytes[7] = hex_to_u32 ((const u8 *) &expected_bytes_pos[56]);
19917
19918 contents_hash_pos = strchr (expected_bytes_pos, '*');
19919
19920 if (contents_hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19921
19922 expected_bytes_len = contents_hash_pos - expected_bytes_pos;
19923
19924 if (expected_bytes_len != 64) return (PARSER_SALT_LENGTH);
19925
19926 contents_hash_pos++;
19927
19928 keepass->contents_hash[0] = hex_to_u32 ((const u8 *) &contents_hash_pos[ 0]);
19929 keepass->contents_hash[1] = hex_to_u32 ((const u8 *) &contents_hash_pos[ 8]);
19930 keepass->contents_hash[2] = hex_to_u32 ((const u8 *) &contents_hash_pos[16]);
19931 keepass->contents_hash[3] = hex_to_u32 ((const u8 *) &contents_hash_pos[24]);
19932 keepass->contents_hash[4] = hex_to_u32 ((const u8 *) &contents_hash_pos[32]);
19933 keepass->contents_hash[5] = hex_to_u32 ((const u8 *) &contents_hash_pos[40]);
19934 keepass->contents_hash[6] = hex_to_u32 ((const u8 *) &contents_hash_pos[48]);
19935 keepass->contents_hash[7] = hex_to_u32 ((const u8 *) &contents_hash_pos[56]);
19936
19937 keyfile_inline_pos = strchr (contents_hash_pos, '*');
19938
19939 if (keyfile_inline_pos == NULL)
19940 contents_hash_len = input_len - (int) (contents_hash_pos - input_buf);
19941 else
19942 {
19943 contents_hash_len = keyfile_inline_pos - contents_hash_pos;
19944 keyfile_inline_pos++;
19945 is_keyfile_present = 1;
19946 }
19947 if (contents_hash_len != 64) return (PARSER_SALT_LENGTH);
19948 }
19949
19950 if (is_keyfile_present != 0)
19951 {
19952 keyfile_len_pos = strchr (keyfile_inline_pos, '*');
19953
19954 keyfile_len_pos++;
19955
19956 keyfile_len = atoi (keyfile_len_pos);
19957
19958 keepass->keyfile_len = keyfile_len;
19959
19960 if (keyfile_len != 64) return (PARSER_SALT_LENGTH);
19961
19962 keyfile_pos = strchr (keyfile_len_pos, '*');
19963
19964 if (keyfile_pos == NULL) return (PARSER_SALT_LENGTH);
19965
19966 keyfile_pos++;
19967
19968 u32 real_keyfile_len = input_len - (keyfile_pos - input_buf);
19969
19970 if (real_keyfile_len != 64) return (PARSER_SALT_LENGTH);
19971
19972 keepass->keyfile[0] = hex_to_u32 ((const u8 *) &keyfile_pos[ 0]);
19973 keepass->keyfile[1] = hex_to_u32 ((const u8 *) &keyfile_pos[ 8]);
19974 keepass->keyfile[2] = hex_to_u32 ((const u8 *) &keyfile_pos[16]);
19975 keepass->keyfile[3] = hex_to_u32 ((const u8 *) &keyfile_pos[24]);
19976 keepass->keyfile[4] = hex_to_u32 ((const u8 *) &keyfile_pos[32]);
19977 keepass->keyfile[5] = hex_to_u32 ((const u8 *) &keyfile_pos[40]);
19978 keepass->keyfile[6] = hex_to_u32 ((const u8 *) &keyfile_pos[48]);
19979 keepass->keyfile[7] = hex_to_u32 ((const u8 *) &keyfile_pos[56]);
19980 }
19981
19982 digest[0] = keepass->enc_iv[0];
19983 digest[1] = keepass->enc_iv[1];
19984 digest[2] = keepass->enc_iv[2];
19985 digest[3] = keepass->enc_iv[3];
19986
19987 salt->salt_buf[0] = keepass->transf_random_seed[0];
19988 salt->salt_buf[1] = keepass->transf_random_seed[1];
19989 salt->salt_buf[2] = keepass->transf_random_seed[2];
19990 salt->salt_buf[3] = keepass->transf_random_seed[3];
19991 salt->salt_buf[4] = keepass->transf_random_seed[4];
19992 salt->salt_buf[5] = keepass->transf_random_seed[5];
19993 salt->salt_buf[6] = keepass->transf_random_seed[6];
19994 salt->salt_buf[7] = keepass->transf_random_seed[7];
19995
19996 return (PARSER_OK);
19997 }
19998
19999 int cf10_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
20000 {
20001 if ((input_len < DISPLAY_LEN_MIN_12600) || (input_len > DISPLAY_LEN_MAX_12600)) return (PARSER_GLOBAL_LENGTH);
20002
20003 u32 *digest = (u32 *) hash_buf->digest;
20004
20005 salt_t *salt = hash_buf->salt;
20006
20007 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
20008 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
20009 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
20010 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
20011 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
20012 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
20013 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
20014 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
20015
20016 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
20017
20018 uint salt_len = input_len - 64 - 1;
20019
20020 char *salt_buf = input_buf + 64 + 1;
20021
20022 char *salt_buf_ptr = (char *) salt->salt_buf;
20023
20024 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
20025
20026 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
20027
20028 salt->salt_len = salt_len;
20029
20030 /**
20031 * we can precompute the first sha256 transform
20032 */
20033
20034 uint w[16] = { 0 };
20035
20036 w[ 0] = byte_swap_32 (salt->salt_buf[ 0]);
20037 w[ 1] = byte_swap_32 (salt->salt_buf[ 1]);
20038 w[ 2] = byte_swap_32 (salt->salt_buf[ 2]);
20039 w[ 3] = byte_swap_32 (salt->salt_buf[ 3]);
20040 w[ 4] = byte_swap_32 (salt->salt_buf[ 4]);
20041 w[ 5] = byte_swap_32 (salt->salt_buf[ 5]);
20042 w[ 6] = byte_swap_32 (salt->salt_buf[ 6]);
20043 w[ 7] = byte_swap_32 (salt->salt_buf[ 7]);
20044 w[ 8] = byte_swap_32 (salt->salt_buf[ 8]);
20045 w[ 9] = byte_swap_32 (salt->salt_buf[ 9]);
20046 w[10] = byte_swap_32 (salt->salt_buf[10]);
20047 w[11] = byte_swap_32 (salt->salt_buf[11]);
20048 w[12] = byte_swap_32 (salt->salt_buf[12]);
20049 w[13] = byte_swap_32 (salt->salt_buf[13]);
20050 w[14] = byte_swap_32 (salt->salt_buf[14]);
20051 w[15] = byte_swap_32 (salt->salt_buf[15]);
20052
20053 uint pc256[8] = { SHA256M_A, SHA256M_B, SHA256M_C, SHA256M_D, SHA256M_E, SHA256M_F, SHA256M_G, SHA256M_H };
20054
20055 sha256_64 (w, pc256);
20056
20057 salt->salt_buf_pc[0] = pc256[0];
20058 salt->salt_buf_pc[1] = pc256[1];
20059 salt->salt_buf_pc[2] = pc256[2];
20060 salt->salt_buf_pc[3] = pc256[3];
20061 salt->salt_buf_pc[4] = pc256[4];
20062 salt->salt_buf_pc[5] = pc256[5];
20063 salt->salt_buf_pc[6] = pc256[6];
20064 salt->salt_buf_pc[7] = pc256[7];
20065
20066 digest[0] -= pc256[0];
20067 digest[1] -= pc256[1];
20068 digest[2] -= pc256[2];
20069 digest[3] -= pc256[3];
20070 digest[4] -= pc256[4];
20071 digest[5] -= pc256[5];
20072 digest[6] -= pc256[6];
20073 digest[7] -= pc256[7];
20074
20075 return (PARSER_OK);
20076 }
20077
20078 int mywallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
20079 {
20080 if ((input_len < DISPLAY_LEN_MIN_12700) || (input_len > DISPLAY_LEN_MAX_12700)) return (PARSER_GLOBAL_LENGTH);
20081
20082 if (memcmp (SIGNATURE_MYWALLET, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
20083
20084 u32 *digest = (u32 *) hash_buf->digest;
20085
20086 salt_t *salt = hash_buf->salt;
20087
20088 /**
20089 * parse line
20090 */
20091
20092 char *data_len_pos = input_buf + 1 + 10 + 1;
20093
20094 char *data_buf_pos = strchr (data_len_pos, '$');
20095
20096 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20097
20098 u32 data_len_len = data_buf_pos - data_len_pos;
20099
20100 if (data_len_len < 1) return (PARSER_SALT_LENGTH);
20101 if (data_len_len > 5) return (PARSER_SALT_LENGTH);
20102
20103 data_buf_pos++;
20104
20105 u32 data_buf_len = input_len - 1 - 10 - 1 - data_len_len - 1;
20106
20107 if (data_buf_len < 64) return (PARSER_HASH_LENGTH);
20108
20109 if (data_buf_len % 16) return (PARSER_HASH_LENGTH);
20110
20111 u32 data_len = atoi (data_len_pos);
20112
20113 if ((data_len * 2) != data_buf_len) return (PARSER_HASH_LENGTH);
20114
20115 /**
20116 * salt
20117 */
20118
20119 char *salt_pos = data_buf_pos;
20120
20121 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
20122 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
20123 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
20124 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
20125
20126 // this is actually the CT, which is also the hash later (if matched)
20127
20128 salt->salt_buf[4] = hex_to_u32 ((const u8 *) &salt_pos[32]);
20129 salt->salt_buf[5] = hex_to_u32 ((const u8 *) &salt_pos[40]);
20130 salt->salt_buf[6] = hex_to_u32 ((const u8 *) &salt_pos[48]);
20131 salt->salt_buf[7] = hex_to_u32 ((const u8 *) &salt_pos[56]);
20132
20133 salt->salt_len = 32; // note we need to fix this to 16 in kernel
20134
20135 salt->salt_iter = 10 - 1;
20136
20137 /**
20138 * digest buf
20139 */
20140
20141 digest[0] = salt->salt_buf[4];
20142 digest[1] = salt->salt_buf[5];
20143 digest[2] = salt->salt_buf[6];
20144 digest[3] = salt->salt_buf[7];
20145
20146 return (PARSER_OK);
20147 }
20148
20149 int ms_drsr_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
20150 {
20151 if ((input_len < DISPLAY_LEN_MIN_12800) || (input_len > DISPLAY_LEN_MAX_12800)) return (PARSER_GLOBAL_LENGTH);
20152
20153 if (memcmp (SIGNATURE_MS_DRSR, input_buf, 11)) return (PARSER_SIGNATURE_UNMATCHED);
20154
20155 u32 *digest = (u32 *) hash_buf->digest;
20156
20157 salt_t *salt = hash_buf->salt;
20158
20159 /**
20160 * parse line
20161 */
20162
20163 char *salt_pos = input_buf + 11 + 1;
20164
20165 char *iter_pos = strchr (salt_pos, ',');
20166
20167 if (iter_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20168
20169 u32 salt_len = iter_pos - salt_pos;
20170
20171 if (salt_len != 20) return (PARSER_SALT_LENGTH);
20172
20173 iter_pos++;
20174
20175 char *hash_pos = strchr (iter_pos, ',');
20176
20177 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20178
20179 u32 iter_len = hash_pos - iter_pos;
20180
20181 if (iter_len > 5) return (PARSER_SALT_LENGTH);
20182
20183 hash_pos++;
20184
20185 u32 hash_len = input_len - 11 - 1 - salt_len - 1 - iter_len - 1;
20186
20187 if (hash_len != 64) return (PARSER_HASH_LENGTH);
20188
20189 /**
20190 * salt
20191 */
20192
20193 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
20194 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
20195 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]) & 0xffff0000;
20196 salt->salt_buf[3] = 0x00018000;
20197
20198 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
20199 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
20200 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
20201 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
20202
20203 salt->salt_len = salt_len / 2;
20204
20205 salt->salt_iter = atoi (iter_pos) - 1;
20206
20207 /**
20208 * digest buf
20209 */
20210
20211 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
20212 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
20213 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
20214 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
20215 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
20216 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
20217 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
20218 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
20219
20220 return (PARSER_OK);
20221 }
20222
20223 int androidfde_samsung_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
20224 {
20225 if ((input_len < DISPLAY_LEN_MIN_12900) || (input_len > DISPLAY_LEN_MAX_12900)) return (PARSER_GLOBAL_LENGTH);
20226
20227 u32 *digest = (u32 *) hash_buf->digest;
20228
20229 salt_t *salt = hash_buf->salt;
20230
20231 /**
20232 * parse line
20233 */
20234
20235 char *hash_pos = input_buf + 64;
20236 char *salt1_pos = input_buf + 128;
20237 char *salt2_pos = input_buf;
20238
20239 /**
20240 * salt
20241 */
20242
20243 salt->salt_buf[ 0] = hex_to_u32 ((const u8 *) &salt1_pos[ 0]);
20244 salt->salt_buf[ 1] = hex_to_u32 ((const u8 *) &salt1_pos[ 8]);
20245 salt->salt_buf[ 2] = hex_to_u32 ((const u8 *) &salt1_pos[16]);
20246 salt->salt_buf[ 3] = hex_to_u32 ((const u8 *) &salt1_pos[24]);
20247
20248 salt->salt_buf[ 4] = hex_to_u32 ((const u8 *) &salt2_pos[ 0]);
20249 salt->salt_buf[ 5] = hex_to_u32 ((const u8 *) &salt2_pos[ 8]);
20250 salt->salt_buf[ 6] = hex_to_u32 ((const u8 *) &salt2_pos[16]);
20251 salt->salt_buf[ 7] = hex_to_u32 ((const u8 *) &salt2_pos[24]);
20252
20253 salt->salt_buf[ 8] = hex_to_u32 ((const u8 *) &salt2_pos[32]);
20254 salt->salt_buf[ 9] = hex_to_u32 ((const u8 *) &salt2_pos[40]);
20255 salt->salt_buf[10] = hex_to_u32 ((const u8 *) &salt2_pos[48]);
20256 salt->salt_buf[11] = hex_to_u32 ((const u8 *) &salt2_pos[56]);
20257
20258 salt->salt_len = 48;
20259
20260 salt->salt_iter = ROUNDS_ANDROIDFDE_SAMSUNG - 1;
20261
20262 /**
20263 * digest buf
20264 */
20265
20266 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
20267 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
20268 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
20269 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
20270 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
20271 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
20272 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
20273 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
20274
20275 return (PARSER_OK);
20276 }
20277
20278 int zip2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
20279 {
20280 if ((input_len < DISPLAY_LEN_MIN_13600) || (input_len > DISPLAY_LEN_MAX_13600)) return (PARSER_GLOBAL_LENGTH);
20281
20282 if (memcmp (SIGNATURE_ZIP2_START, input_buf , 6)) return (PARSER_SIGNATURE_UNMATCHED);
20283 if (memcmp (SIGNATURE_ZIP2_STOP , input_buf + input_len - 7, 7)) return (PARSER_SIGNATURE_UNMATCHED);
20284
20285 u32 *digest = (u32 *) hash_buf->digest;
20286
20287 salt_t *salt = hash_buf->salt;
20288
20289 zip2_t *zip2 = (zip2_t *) hash_buf->esalt;
20290
20291 /**
20292 * parse line
20293 */
20294
20295 char *param0_pos = input_buf + 6 + 1;
20296
20297 char *param1_pos = strchr (param0_pos, '*');
20298
20299 if (param1_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20300
20301 u32 param0_len = param1_pos - param0_pos;
20302
20303 param1_pos++;
20304
20305 char *param2_pos = strchr (param1_pos, '*');
20306
20307 if (param2_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20308
20309 u32 param1_len = param2_pos - param1_pos;
20310
20311 param2_pos++;
20312
20313 char *param3_pos = strchr (param2_pos, '*');
20314
20315 if (param3_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20316
20317 u32 param2_len = param3_pos - param2_pos;
20318
20319 param3_pos++;
20320
20321 char *param4_pos = strchr (param3_pos, '*');
20322
20323 if (param4_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20324
20325 u32 param3_len = param4_pos - param3_pos;
20326
20327 param4_pos++;
20328
20329 char *param5_pos = strchr (param4_pos, '*');
20330
20331 if (param5_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20332
20333 u32 param4_len = param5_pos - param4_pos;
20334
20335 param5_pos++;
20336
20337 char *param6_pos = strchr (param5_pos, '*');
20338
20339 if (param6_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20340
20341 u32 param5_len = param6_pos - param5_pos;
20342
20343 param6_pos++;
20344
20345 char *param7_pos = strchr (param6_pos, '*');
20346
20347 if (param7_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20348
20349 u32 param6_len = param7_pos - param6_pos;
20350
20351 param7_pos++;
20352
20353 char *param8_pos = strchr (param7_pos, '*');
20354
20355 if (param8_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20356
20357 u32 param7_len = param8_pos - param7_pos;
20358
20359 param8_pos++;
20360
20361 const uint type = atoi (param0_pos);
20362 const uint mode = atoi (param1_pos);
20363 const uint magic = atoi (param2_pos);
20364
20365 char *salt_buf = param3_pos;
20366
20367 uint verify_bytes; sscanf (param4_pos, "%4x*", &verify_bytes);
20368
20369 const uint compress_length = atoi (param5_pos);
20370
20371 char *data_buf = param6_pos;
20372 char *auth = param7_pos;
20373
20374 /**
20375 * verify some data
20376 */
20377
20378 if (param0_len != 1) return (PARSER_SALT_VALUE);
20379
20380 if (param1_len != 1) return (PARSER_SALT_VALUE);
20381
20382 if (param2_len != 1) return (PARSER_SALT_VALUE);
20383
20384 if ((param3_len != 16) && (param3_len != 24) && (param3_len != 32)) return (PARSER_SALT_VALUE);
20385
20386 if (param4_len >= 5) return (PARSER_SALT_VALUE);
20387
20388 if (param5_len >= 5) return (PARSER_SALT_VALUE);
20389
20390 if (param6_len >= 8192) return (PARSER_SALT_VALUE);
20391
20392 if (param6_len & 1) return (PARSER_SALT_VALUE);
20393
20394 if (param7_len != 20) return (PARSER_SALT_VALUE);
20395
20396 if (type != 0) return (PARSER_SALT_VALUE);
20397
20398 if ((mode != 1) && (mode != 2) && (mode != 3)) return (PARSER_SALT_VALUE);
20399
20400 if (magic != 0) return (PARSER_SALT_VALUE);
20401
20402 if (verify_bytes >= 0x10000) return (PARSER_SALT_VALUE);
20403
20404 /**
20405 * store data
20406 */
20407
20408 zip2->type = type;
20409 zip2->mode = mode;
20410 zip2->magic = magic;
20411
20412 if (mode == 1)
20413 {
20414 zip2->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
20415 zip2->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
20416 zip2->salt_buf[2] = 0;
20417 zip2->salt_buf[3] = 0;
20418
20419 zip2->salt_len = 8;
20420 }
20421 else if (mode == 2)
20422 {
20423 zip2->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
20424 zip2->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
20425 zip2->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
20426 zip2->salt_buf[3] = 0;
20427
20428 zip2->salt_len = 12;
20429 }
20430 else if (mode == 3)
20431 {
20432 zip2->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
20433 zip2->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
20434 zip2->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
20435 zip2->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf[24]);
20436
20437 zip2->salt_len = 16;
20438 }
20439
20440 zip2->salt_buf[0] = byte_swap_32 (zip2->salt_buf[0]);
20441 zip2->salt_buf[1] = byte_swap_32 (zip2->salt_buf[1]);
20442 zip2->salt_buf[2] = byte_swap_32 (zip2->salt_buf[2]);
20443 zip2->salt_buf[3] = byte_swap_32 (zip2->salt_buf[3]);
20444
20445 zip2->verify_bytes = verify_bytes;
20446
20447 zip2->compress_length = compress_length;
20448
20449 char *data_buf_ptr = (char *) zip2->data_buf;
20450
20451 for (uint i = 0; i < param6_len; i += 2)
20452 {
20453 const char p0 = data_buf[i + 0];
20454 const char p1 = data_buf[i + 1];
20455
20456 *data_buf_ptr++ = hex_convert (p1) << 0
20457 | hex_convert (p0) << 4;
20458
20459 zip2->data_len++;
20460 }
20461
20462 *data_buf_ptr = 0x80;
20463
20464 char *auth_ptr = (char *) zip2->auth_buf;
20465
20466 for (uint i = 0; i < param7_len; i += 2)
20467 {
20468 const char p0 = auth[i + 0];
20469 const char p1 = auth[i + 1];
20470
20471 *auth_ptr++ = hex_convert (p1) << 0
20472 | hex_convert (p0) << 4;
20473
20474 zip2->auth_len++;
20475 }
20476
20477 /**
20478 * salt buf (fake)
20479 */
20480
20481 salt->salt_buf[0] = zip2->salt_buf[0];
20482 salt->salt_buf[1] = zip2->salt_buf[1];
20483 salt->salt_buf[2] = zip2->salt_buf[2];
20484 salt->salt_buf[3] = zip2->salt_buf[3];
20485 salt->salt_buf[4] = zip2->data_buf[0];
20486 salt->salt_buf[5] = zip2->data_buf[1];
20487 salt->salt_buf[6] = zip2->data_buf[2];
20488 salt->salt_buf[7] = zip2->data_buf[3];
20489
20490 salt->salt_len = 32;
20491
20492 salt->salt_iter = ROUNDS_ZIP2 - 1;
20493
20494 /**
20495 * digest buf (fake)
20496 */
20497
20498 digest[0] = zip2->auth_buf[0];
20499 digest[1] = zip2->auth_buf[1];
20500 digest[2] = zip2->auth_buf[2];
20501 digest[3] = zip2->auth_buf[3];
20502
20503 return (PARSER_OK);
20504 }
20505
20506 /**
20507 * parallel running threads
20508 */
20509
20510 #ifdef WIN
20511
20512 BOOL WINAPI sigHandler_default (DWORD sig)
20513 {
20514 switch (sig)
20515 {
20516 case CTRL_CLOSE_EVENT:
20517
20518 /*
20519 * special case see: https://stackoverflow.com/questions/3640633/c-setconsolectrlhandler-routine-issue/5610042#5610042
20520 * if the user interacts w/ the user-interface (GUI/cmd), we need to do the finalization job within this signal handler
20521 * function otherwise it is too late (e.g. after returning from this function)
20522 */
20523
20524 myabort ();
20525
20526 SetConsoleCtrlHandler (NULL, TRUE);
20527
20528 hc_sleep (10);
20529
20530 return TRUE;
20531
20532 case CTRL_C_EVENT:
20533 case CTRL_LOGOFF_EVENT:
20534 case CTRL_SHUTDOWN_EVENT:
20535
20536 myabort ();
20537
20538 SetConsoleCtrlHandler (NULL, TRUE);
20539
20540 return TRUE;
20541 }
20542
20543 return FALSE;
20544 }
20545
20546 BOOL WINAPI sigHandler_benchmark (DWORD sig)
20547 {
20548 switch (sig)
20549 {
20550 case CTRL_CLOSE_EVENT:
20551
20552 myabort ();
20553
20554 SetConsoleCtrlHandler (NULL, TRUE);
20555
20556 hc_sleep (10);
20557
20558 return TRUE;
20559
20560 case CTRL_C_EVENT:
20561 case CTRL_LOGOFF_EVENT:
20562 case CTRL_SHUTDOWN_EVENT:
20563
20564 myquit ();
20565
20566 SetConsoleCtrlHandler (NULL, TRUE);
20567
20568 return TRUE;
20569 }
20570
20571 return FALSE;
20572 }
20573
20574 void hc_signal (BOOL WINAPI (callback) (DWORD))
20575 {
20576 if (callback == NULL)
20577 {
20578 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, FALSE);
20579 }
20580 else
20581 {
20582 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, TRUE);
20583 }
20584 }
20585
20586 #else
20587
20588 void sigHandler_default (int sig)
20589 {
20590 myabort ();
20591
20592 signal (sig, NULL);
20593 }
20594
20595 void sigHandler_benchmark (int sig)
20596 {
20597 myquit ();
20598
20599 signal (sig, NULL);
20600 }
20601
20602 void hc_signal (void (callback) (int))
20603 {
20604 if (callback == NULL) callback = SIG_DFL;
20605
20606 signal (SIGINT, callback);
20607 signal (SIGTERM, callback);
20608 signal (SIGABRT, callback);
20609 }
20610
20611 #endif
20612
20613 void status_display ();
20614
20615 void *thread_keypress (void *p)
20616 {
20617 int benchmark = *((int *) p);
20618
20619 uint quiet = data.quiet;
20620
20621 tty_break();
20622
20623 while ((data.devices_status != STATUS_EXHAUSTED) && (data.devices_status != STATUS_CRACKED) && (data.devices_status != STATUS_ABORTED) && (data.devices_status != STATUS_QUIT))
20624 {
20625 int ch = tty_getchar();
20626
20627 if (ch == -1) break;
20628
20629 if (ch == 0) continue;
20630
20631 //https://github.com/hashcat/hashcat/issues/302
20632 //#ifdef _POSIX
20633 //if (ch != '\n')
20634 //#endif
20635
20636 hc_thread_mutex_lock (mux_display);
20637
20638 log_info ("");
20639
20640 switch (ch)
20641 {
20642 case 's':
20643 case '\r':
20644 case '\n':
20645
20646 log_info ("");
20647
20648 status_display ();
20649
20650 log_info ("");
20651
20652 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
20653 if (quiet == 0) fflush (stdout);
20654
20655 break;
20656
20657 case 'b':
20658
20659 log_info ("");
20660
20661 bypass ();
20662
20663 log_info ("");
20664
20665 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
20666 if (quiet == 0) fflush (stdout);
20667
20668 break;
20669
20670 case 'p':
20671
20672 log_info ("");
20673
20674 SuspendThreads ();
20675
20676 log_info ("");
20677
20678 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
20679 if (quiet == 0) fflush (stdout);
20680
20681 break;
20682
20683 case 'r':
20684
20685 log_info ("");
20686
20687 ResumeThreads ();
20688
20689 log_info ("");
20690
20691 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
20692 if (quiet == 0) fflush (stdout);
20693
20694 break;
20695
20696 case 'c':
20697
20698 log_info ("");
20699
20700 if (benchmark == 1) break;
20701
20702 stop_at_checkpoint ();
20703
20704 log_info ("");
20705
20706 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
20707 if (quiet == 0) fflush (stdout);
20708
20709 break;
20710
20711 case 'q':
20712
20713 log_info ("");
20714
20715 if (benchmark == 1)
20716 {
20717 myquit ();
20718 }
20719 else
20720 {
20721 myabort ();
20722 }
20723
20724 break;
20725 }
20726
20727 //https://github.com/hashcat/hashcat/issues/302
20728 //#ifdef _POSIX
20729 //if (ch != '\n')
20730 //#endif
20731
20732 hc_thread_mutex_unlock (mux_display);
20733 }
20734
20735 tty_fix();
20736
20737 return (p);
20738 }
20739
20740 /**
20741 * rules common
20742 */
20743
20744 bool class_num (const u8 c)
20745 {
20746 return ((c >= '0') && (c <= '9'));
20747 }
20748
20749 bool class_lower (const u8 c)
20750 {
20751 return ((c >= 'a') && (c <= 'z'));
20752 }
20753
20754 bool class_upper (const u8 c)
20755 {
20756 return ((c >= 'A') && (c <= 'Z'));
20757 }
20758
20759 bool class_alpha (const u8 c)
20760 {
20761 return (class_lower (c) || class_upper (c));
20762 }
20763
20764 int conv_ctoi (const u8 c)
20765 {
20766 if (class_num (c))
20767 {
20768 return c - '0';
20769 }
20770 else if (class_upper (c))
20771 {
20772 return c - 'A' + 10;
20773 }
20774
20775 return -1;
20776 }
20777
20778 int conv_itoc (const u8 c)
20779 {
20780 if (c < 10)
20781 {
20782 return c + '0';
20783 }
20784 else if (c < 37)
20785 {
20786 return c + 'A' - 10;
20787 }
20788
20789 return -1;
20790 }
20791
20792 /**
20793 * device rules
20794 */
20795
20796 #define INCR_POS if (++rule_pos == rule_len) return (-1)
20797 #define SET_NAME(rule,val) (rule)->cmds[rule_cnt] = ((val) & 0xff) << 0
20798 #define SET_P0(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 8
20799 #define SET_P1(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 16
20800 #define MAX_KERNEL_RULES 255
20801 #define GET_NAME(rule) rule_cmd = (((rule)->cmds[rule_cnt] >> 0) & 0xff)
20802 #define GET_P0(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 8) & 0xff)
20803 #define GET_P1(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 16) & 0xff)
20804
20805 #define SET_P0_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 8
20806 #define SET_P1_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 16
20807 #define GET_P0_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 8) & 0xff)
20808 #define GET_P1_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 16) & 0xff)
20809
20810 int cpu_rule_to_kernel_rule (char *rule_buf, uint rule_len, kernel_rule_t *rule)
20811 {
20812 uint rule_pos;
20813 uint rule_cnt;
20814
20815 for (rule_pos = 0, rule_cnt = 0; rule_pos < rule_len && rule_cnt < MAX_KERNEL_RULES; rule_pos++, rule_cnt++)
20816 {
20817 switch (rule_buf[rule_pos])
20818 {
20819 case ' ':
20820 rule_cnt--;
20821 break;
20822
20823 case RULE_OP_MANGLE_NOOP:
20824 SET_NAME (rule, rule_buf[rule_pos]);
20825 break;
20826
20827 case RULE_OP_MANGLE_LREST:
20828 SET_NAME (rule, rule_buf[rule_pos]);
20829 break;
20830
20831 case RULE_OP_MANGLE_UREST:
20832 SET_NAME (rule, rule_buf[rule_pos]);
20833 break;
20834
20835 case RULE_OP_MANGLE_LREST_UFIRST:
20836 SET_NAME (rule, rule_buf[rule_pos]);
20837 break;
20838
20839 case RULE_OP_MANGLE_UREST_LFIRST:
20840 SET_NAME (rule, rule_buf[rule_pos]);
20841 break;
20842
20843 case RULE_OP_MANGLE_TREST:
20844 SET_NAME (rule, rule_buf[rule_pos]);
20845 break;
20846
20847 case RULE_OP_MANGLE_TOGGLE_AT:
20848 SET_NAME (rule, rule_buf[rule_pos]);
20849 SET_P0_CONV (rule, rule_buf[rule_pos]);
20850 break;
20851
20852 case RULE_OP_MANGLE_REVERSE:
20853 SET_NAME (rule, rule_buf[rule_pos]);
20854 break;
20855
20856 case RULE_OP_MANGLE_DUPEWORD:
20857 SET_NAME (rule, rule_buf[rule_pos]);
20858 break;
20859
20860 case RULE_OP_MANGLE_DUPEWORD_TIMES:
20861 SET_NAME (rule, rule_buf[rule_pos]);
20862 SET_P0_CONV (rule, rule_buf[rule_pos]);
20863 break;
20864
20865 case RULE_OP_MANGLE_REFLECT:
20866 SET_NAME (rule, rule_buf[rule_pos]);
20867 break;
20868
20869 case RULE_OP_MANGLE_ROTATE_LEFT:
20870 SET_NAME (rule, rule_buf[rule_pos]);
20871 break;
20872
20873 case RULE_OP_MANGLE_ROTATE_RIGHT:
20874 SET_NAME (rule, rule_buf[rule_pos]);
20875 break;
20876
20877 case RULE_OP_MANGLE_APPEND:
20878 SET_NAME (rule, rule_buf[rule_pos]);
20879 SET_P0 (rule, rule_buf[rule_pos]);
20880 break;
20881
20882 case RULE_OP_MANGLE_PREPEND:
20883 SET_NAME (rule, rule_buf[rule_pos]);
20884 SET_P0 (rule, rule_buf[rule_pos]);
20885 break;
20886
20887 case RULE_OP_MANGLE_DELETE_FIRST:
20888 SET_NAME (rule, rule_buf[rule_pos]);
20889 break;
20890
20891 case RULE_OP_MANGLE_DELETE_LAST:
20892 SET_NAME (rule, rule_buf[rule_pos]);
20893 break;
20894
20895 case RULE_OP_MANGLE_DELETE_AT:
20896 SET_NAME (rule, rule_buf[rule_pos]);
20897 SET_P0_CONV (rule, rule_buf[rule_pos]);
20898 break;
20899
20900 case RULE_OP_MANGLE_EXTRACT:
20901 SET_NAME (rule, rule_buf[rule_pos]);
20902 SET_P0_CONV (rule, rule_buf[rule_pos]);
20903 SET_P1_CONV (rule, rule_buf[rule_pos]);
20904 break;
20905
20906 case RULE_OP_MANGLE_OMIT:
20907 SET_NAME (rule, rule_buf[rule_pos]);
20908 SET_P0_CONV (rule, rule_buf[rule_pos]);
20909 SET_P1_CONV (rule, rule_buf[rule_pos]);
20910 break;
20911
20912 case RULE_OP_MANGLE_INSERT:
20913 SET_NAME (rule, rule_buf[rule_pos]);
20914 SET_P0_CONV (rule, rule_buf[rule_pos]);
20915 SET_P1 (rule, rule_buf[rule_pos]);
20916 break;
20917
20918 case RULE_OP_MANGLE_OVERSTRIKE:
20919 SET_NAME (rule, rule_buf[rule_pos]);
20920 SET_P0_CONV (rule, rule_buf[rule_pos]);
20921 SET_P1 (rule, rule_buf[rule_pos]);
20922 break;
20923
20924 case RULE_OP_MANGLE_TRUNCATE_AT:
20925 SET_NAME (rule, rule_buf[rule_pos]);
20926 SET_P0_CONV (rule, rule_buf[rule_pos]);
20927 break;
20928
20929 case RULE_OP_MANGLE_REPLACE:
20930 SET_NAME (rule, rule_buf[rule_pos]);
20931 SET_P0 (rule, rule_buf[rule_pos]);
20932 SET_P1 (rule, rule_buf[rule_pos]);
20933 break;
20934
20935 case RULE_OP_MANGLE_PURGECHAR:
20936 return (-1);
20937 break;
20938
20939 case RULE_OP_MANGLE_TOGGLECASE_REC:
20940 return (-1);
20941 break;
20942
20943 case RULE_OP_MANGLE_DUPECHAR_FIRST:
20944 SET_NAME (rule, rule_buf[rule_pos]);
20945 SET_P0_CONV (rule, rule_buf[rule_pos]);
20946 break;
20947
20948 case RULE_OP_MANGLE_DUPECHAR_LAST:
20949 SET_NAME (rule, rule_buf[rule_pos]);
20950 SET_P0_CONV (rule, rule_buf[rule_pos]);
20951 break;
20952
20953 case RULE_OP_MANGLE_DUPECHAR_ALL:
20954 SET_NAME (rule, rule_buf[rule_pos]);
20955 break;
20956
20957 case RULE_OP_MANGLE_SWITCH_FIRST:
20958 SET_NAME (rule, rule_buf[rule_pos]);
20959 break;
20960
20961 case RULE_OP_MANGLE_SWITCH_LAST:
20962 SET_NAME (rule, rule_buf[rule_pos]);
20963 break;
20964
20965 case RULE_OP_MANGLE_SWITCH_AT:
20966 SET_NAME (rule, rule_buf[rule_pos]);
20967 SET_P0_CONV (rule, rule_buf[rule_pos]);
20968 SET_P1_CONV (rule, rule_buf[rule_pos]);
20969 break;
20970
20971 case RULE_OP_MANGLE_CHR_SHIFTL:
20972 SET_NAME (rule, rule_buf[rule_pos]);
20973 SET_P0_CONV (rule, rule_buf[rule_pos]);
20974 break;
20975
20976 case RULE_OP_MANGLE_CHR_SHIFTR:
20977 SET_NAME (rule, rule_buf[rule_pos]);
20978 SET_P0_CONV (rule, rule_buf[rule_pos]);
20979 break;
20980
20981 case RULE_OP_MANGLE_CHR_INCR:
20982 SET_NAME (rule, rule_buf[rule_pos]);
20983 SET_P0_CONV (rule, rule_buf[rule_pos]);
20984 break;
20985
20986 case RULE_OP_MANGLE_CHR_DECR:
20987 SET_NAME (rule, rule_buf[rule_pos]);
20988 SET_P0_CONV (rule, rule_buf[rule_pos]);
20989 break;
20990
20991 case RULE_OP_MANGLE_REPLACE_NP1:
20992 SET_NAME (rule, rule_buf[rule_pos]);
20993 SET_P0_CONV (rule, rule_buf[rule_pos]);
20994 break;
20995
20996 case RULE_OP_MANGLE_REPLACE_NM1:
20997 SET_NAME (rule, rule_buf[rule_pos]);
20998 SET_P0_CONV (rule, rule_buf[rule_pos]);
20999 break;
21000
21001 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
21002 SET_NAME (rule, rule_buf[rule_pos]);
21003 SET_P0_CONV (rule, rule_buf[rule_pos]);
21004 break;
21005
21006 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
21007 SET_NAME (rule, rule_buf[rule_pos]);
21008 SET_P0_CONV (rule, rule_buf[rule_pos]);
21009 break;
21010
21011 case RULE_OP_MANGLE_TITLE:
21012 SET_NAME (rule, rule_buf[rule_pos]);
21013 break;
21014
21015 default:
21016 return (-1);
21017 break;
21018 }
21019 }
21020
21021 if (rule_pos < rule_len) return (-1);
21022
21023 return (0);
21024 }
21025
21026 int kernel_rule_to_cpu_rule (char *rule_buf, kernel_rule_t *rule)
21027 {
21028 uint rule_cnt;
21029 uint rule_pos;
21030 uint rule_len = HCBUFSIZ - 1; // maximum possible len
21031
21032 char rule_cmd;
21033
21034 for (rule_cnt = 0, rule_pos = 0; rule_pos < rule_len && rule_cnt < MAX_KERNEL_RULES; rule_pos++, rule_cnt++)
21035 {
21036 GET_NAME (rule);
21037
21038 if (rule_cnt > 0) rule_buf[rule_pos++] = ' ';
21039
21040 switch (rule_cmd)
21041 {
21042 case RULE_OP_MANGLE_NOOP:
21043 rule_buf[rule_pos] = rule_cmd;
21044 break;
21045
21046 case RULE_OP_MANGLE_LREST:
21047 rule_buf[rule_pos] = rule_cmd;
21048 break;
21049
21050 case RULE_OP_MANGLE_UREST:
21051 rule_buf[rule_pos] = rule_cmd;
21052 break;
21053
21054 case RULE_OP_MANGLE_LREST_UFIRST:
21055 rule_buf[rule_pos] = rule_cmd;
21056 break;
21057
21058 case RULE_OP_MANGLE_UREST_LFIRST:
21059 rule_buf[rule_pos] = rule_cmd;
21060 break;
21061
21062 case RULE_OP_MANGLE_TREST:
21063 rule_buf[rule_pos] = rule_cmd;
21064 break;
21065
21066 case RULE_OP_MANGLE_TOGGLE_AT:
21067 rule_buf[rule_pos] = rule_cmd;
21068 GET_P0_CONV (rule);
21069 break;
21070
21071 case RULE_OP_MANGLE_REVERSE:
21072 rule_buf[rule_pos] = rule_cmd;
21073 break;
21074
21075 case RULE_OP_MANGLE_DUPEWORD:
21076 rule_buf[rule_pos] = rule_cmd;
21077 break;
21078
21079 case RULE_OP_MANGLE_DUPEWORD_TIMES:
21080 rule_buf[rule_pos] = rule_cmd;
21081 GET_P0_CONV (rule);
21082 break;
21083
21084 case RULE_OP_MANGLE_REFLECT:
21085 rule_buf[rule_pos] = rule_cmd;
21086 break;
21087
21088 case RULE_OP_MANGLE_ROTATE_LEFT:
21089 rule_buf[rule_pos] = rule_cmd;
21090 break;
21091
21092 case RULE_OP_MANGLE_ROTATE_RIGHT:
21093 rule_buf[rule_pos] = rule_cmd;
21094 break;
21095
21096 case RULE_OP_MANGLE_APPEND:
21097 rule_buf[rule_pos] = rule_cmd;
21098 GET_P0 (rule);
21099 break;
21100
21101 case RULE_OP_MANGLE_PREPEND:
21102 rule_buf[rule_pos] = rule_cmd;
21103 GET_P0 (rule);
21104 break;
21105
21106 case RULE_OP_MANGLE_DELETE_FIRST:
21107 rule_buf[rule_pos] = rule_cmd;
21108 break;
21109
21110 case RULE_OP_MANGLE_DELETE_LAST:
21111 rule_buf[rule_pos] = rule_cmd;
21112 break;
21113
21114 case RULE_OP_MANGLE_DELETE_AT:
21115 rule_buf[rule_pos] = rule_cmd;
21116 GET_P0_CONV (rule);
21117 break;
21118
21119 case RULE_OP_MANGLE_EXTRACT:
21120 rule_buf[rule_pos] = rule_cmd;
21121 GET_P0_CONV (rule);
21122 GET_P1_CONV (rule);
21123 break;
21124
21125 case RULE_OP_MANGLE_OMIT:
21126 rule_buf[rule_pos] = rule_cmd;
21127 GET_P0_CONV (rule);
21128 GET_P1_CONV (rule);
21129 break;
21130
21131 case RULE_OP_MANGLE_INSERT:
21132 rule_buf[rule_pos] = rule_cmd;
21133 GET_P0_CONV (rule);
21134 GET_P1 (rule);
21135 break;
21136
21137 case RULE_OP_MANGLE_OVERSTRIKE:
21138 rule_buf[rule_pos] = rule_cmd;
21139 GET_P0_CONV (rule);
21140 GET_P1 (rule);
21141 break;
21142
21143 case RULE_OP_MANGLE_TRUNCATE_AT:
21144 rule_buf[rule_pos] = rule_cmd;
21145 GET_P0_CONV (rule);
21146 break;
21147
21148 case RULE_OP_MANGLE_REPLACE:
21149 rule_buf[rule_pos] = rule_cmd;
21150 GET_P0 (rule);
21151 GET_P1 (rule);
21152 break;
21153
21154 case RULE_OP_MANGLE_PURGECHAR:
21155 return (-1);
21156 break;
21157
21158 case RULE_OP_MANGLE_TOGGLECASE_REC:
21159 return (-1);
21160 break;
21161
21162 case RULE_OP_MANGLE_DUPECHAR_FIRST:
21163 rule_buf[rule_pos] = rule_cmd;
21164 GET_P0_CONV (rule);
21165 break;
21166
21167 case RULE_OP_MANGLE_DUPECHAR_LAST:
21168 rule_buf[rule_pos] = rule_cmd;
21169 GET_P0_CONV (rule);
21170 break;
21171
21172 case RULE_OP_MANGLE_DUPECHAR_ALL:
21173 rule_buf[rule_pos] = rule_cmd;
21174 break;
21175
21176 case RULE_OP_MANGLE_SWITCH_FIRST:
21177 rule_buf[rule_pos] = rule_cmd;
21178 break;
21179
21180 case RULE_OP_MANGLE_SWITCH_LAST:
21181 rule_buf[rule_pos] = rule_cmd;
21182 break;
21183
21184 case RULE_OP_MANGLE_SWITCH_AT:
21185 rule_buf[rule_pos] = rule_cmd;
21186 GET_P0_CONV (rule);
21187 GET_P1_CONV (rule);
21188 break;
21189
21190 case RULE_OP_MANGLE_CHR_SHIFTL:
21191 rule_buf[rule_pos] = rule_cmd;
21192 GET_P0_CONV (rule);
21193 break;
21194
21195 case RULE_OP_MANGLE_CHR_SHIFTR:
21196 rule_buf[rule_pos] = rule_cmd;
21197 GET_P0_CONV (rule);
21198 break;
21199
21200 case RULE_OP_MANGLE_CHR_INCR:
21201 rule_buf[rule_pos] = rule_cmd;
21202 GET_P0_CONV (rule);
21203 break;
21204
21205 case RULE_OP_MANGLE_CHR_DECR:
21206 rule_buf[rule_pos] = rule_cmd;
21207 GET_P0_CONV (rule);
21208 break;
21209
21210 case RULE_OP_MANGLE_REPLACE_NP1:
21211 rule_buf[rule_pos] = rule_cmd;
21212 GET_P0_CONV (rule);
21213 break;
21214
21215 case RULE_OP_MANGLE_REPLACE_NM1:
21216 rule_buf[rule_pos] = rule_cmd;
21217 GET_P0_CONV (rule);
21218 break;
21219
21220 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
21221 rule_buf[rule_pos] = rule_cmd;
21222 GET_P0_CONV (rule);
21223 break;
21224
21225 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
21226 rule_buf[rule_pos] = rule_cmd;
21227 GET_P0_CONV (rule);
21228 break;
21229
21230 case RULE_OP_MANGLE_TITLE:
21231 rule_buf[rule_pos] = rule_cmd;
21232 break;
21233
21234 case 0:
21235 return rule_pos - 1;
21236 break;
21237
21238 default:
21239 return (-1);
21240 break;
21241 }
21242 }
21243
21244 if (rule_cnt > 0)
21245 {
21246 return rule_pos;
21247 }
21248
21249 return (-1);
21250 }
21251
21252 /**
21253 * CPU rules : this is from hashcat sources, cpu based rules
21254 */
21255
21256 #define NEXT_RULEPOS(rp) if (++(rp) == rule_len) return (RULE_RC_SYNTAX_ERROR)
21257 #define NEXT_RPTOI(r,rp,up) if (((up) = conv_ctoi ((r)[(rp)])) == -1) return (RULE_RC_SYNTAX_ERROR)
21258
21259 #define MANGLE_TOGGLE_AT(a,p) if (class_alpha ((a)[(p)])) (a)[(p)] ^= 0x20
21260 #define MANGLE_LOWER_AT(a,p) if (class_upper ((a)[(p)])) (a)[(p)] ^= 0x20
21261 #define MANGLE_UPPER_AT(a,p) if (class_lower ((a)[(p)])) (a)[(p)] ^= 0x20
21262
21263 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); arr[(r)] = arr[(l)]; arr[(l)] = c; } */
21264 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); (a)[(r)] = (a)[(l)]; (a)[(l)] = c; } */
21265 #define MANGLE_SWITCH(a,l,r) { char c = (a)[(r)]; (a)[(r)] = (a)[(l)]; (a)[(l)] = c; }
21266
21267 int mangle_lrest (char arr[BLOCK_SIZE], int arr_len)
21268 {
21269 int pos;
21270
21271 for (pos = 0; pos < arr_len; pos++) MANGLE_LOWER_AT (arr, pos);
21272
21273 return (arr_len);
21274 }
21275
21276 int mangle_urest (char arr[BLOCK_SIZE], int arr_len)
21277 {
21278 int pos;
21279
21280 for (pos = 0; pos < arr_len; pos++) MANGLE_UPPER_AT (arr, pos);
21281
21282 return (arr_len);
21283 }
21284
21285 int mangle_trest (char arr[BLOCK_SIZE], int arr_len)
21286 {
21287 int pos;
21288
21289 for (pos = 0; pos < arr_len; pos++) MANGLE_TOGGLE_AT (arr, pos);
21290
21291 return (arr_len);
21292 }
21293
21294 int mangle_reverse (char arr[BLOCK_SIZE], int arr_len)
21295 {
21296 int l;
21297 int r;
21298
21299 for (l = 0; l < arr_len; l++)
21300 {
21301 r = arr_len - 1 - l;
21302
21303 if (l >= r) break;
21304
21305 MANGLE_SWITCH (arr, l, r);
21306 }
21307
21308 return (arr_len);
21309 }
21310
21311 int mangle_double (char arr[BLOCK_SIZE], int arr_len)
21312 {
21313 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
21314
21315 memcpy (&arr[arr_len], arr, (size_t) arr_len);
21316
21317 return (arr_len * 2);
21318 }
21319
21320 int mangle_double_times (char arr[BLOCK_SIZE], int arr_len, int times)
21321 {
21322 if (((arr_len * times) + arr_len) >= BLOCK_SIZE) return (arr_len);
21323
21324 int orig_len = arr_len;
21325
21326 int i;
21327
21328 for (i = 0; i < times; i++)
21329 {
21330 memcpy (&arr[arr_len], arr, orig_len);
21331
21332 arr_len += orig_len;
21333 }
21334
21335 return (arr_len);
21336 }
21337
21338 int mangle_reflect (char arr[BLOCK_SIZE], int arr_len)
21339 {
21340 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
21341
21342 mangle_double (arr, arr_len);
21343
21344 mangle_reverse (arr + arr_len, arr_len);
21345
21346 return (arr_len * 2);
21347 }
21348
21349 int mangle_rotate_left (char arr[BLOCK_SIZE], int arr_len)
21350 {
21351 int l;
21352 int r;
21353
21354 for (l = 0, r = arr_len - 1; r > 0; r--)
21355 {
21356 MANGLE_SWITCH (arr, l, r);
21357 }
21358
21359 return (arr_len);
21360 }
21361
21362 int mangle_rotate_right (char arr[BLOCK_SIZE], int arr_len)
21363 {
21364 int l;
21365 int r;
21366
21367 for (l = 0, r = arr_len - 1; l < r; l++)
21368 {
21369 MANGLE_SWITCH (arr, l, r);
21370 }
21371
21372 return (arr_len);
21373 }
21374
21375 int mangle_append (char arr[BLOCK_SIZE], int arr_len, char c)
21376 {
21377 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
21378
21379 arr[arr_len] = c;
21380
21381 return (arr_len + 1);
21382 }
21383
21384 int mangle_prepend (char arr[BLOCK_SIZE], int arr_len, char c)
21385 {
21386 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
21387
21388 int arr_pos;
21389
21390 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
21391 {
21392 arr[arr_pos + 1] = arr[arr_pos];
21393 }
21394
21395 arr[0] = c;
21396
21397 return (arr_len + 1);
21398 }
21399
21400 int mangle_delete_at (char arr[BLOCK_SIZE], int arr_len, int upos)
21401 {
21402 if (upos >= arr_len) return (arr_len);
21403
21404 int arr_pos;
21405
21406 for (arr_pos = upos; arr_pos < arr_len - 1; arr_pos++)
21407 {
21408 arr[arr_pos] = arr[arr_pos + 1];
21409 }
21410
21411 return (arr_len - 1);
21412 }
21413
21414 int mangle_extract (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
21415 {
21416 if (upos >= arr_len) return (arr_len);
21417
21418 if ((upos + ulen) > arr_len) return (arr_len);
21419
21420 int arr_pos;
21421
21422 for (arr_pos = 0; arr_pos < ulen; arr_pos++)
21423 {
21424 arr[arr_pos] = arr[upos + arr_pos];
21425 }
21426
21427 return (ulen);
21428 }
21429
21430 int mangle_omit (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
21431 {
21432 if (upos >= arr_len) return (arr_len);
21433
21434 if ((upos + ulen) >= arr_len) return (arr_len);
21435
21436 int arr_pos;
21437
21438 for (arr_pos = upos; arr_pos < arr_len - ulen; arr_pos++)
21439 {
21440 arr[arr_pos] = arr[arr_pos + ulen];
21441 }
21442
21443 return (arr_len - ulen);
21444 }
21445
21446 int mangle_insert (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
21447 {
21448 if (upos >= arr_len) return (arr_len);
21449
21450 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
21451
21452 int arr_pos;
21453
21454 for (arr_pos = arr_len - 1; arr_pos > upos - 1; arr_pos--)
21455 {
21456 arr[arr_pos + 1] = arr[arr_pos];
21457 }
21458
21459 arr[upos] = c;
21460
21461 return (arr_len + 1);
21462 }
21463
21464 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)
21465 {
21466 if ((arr_len + arr2_cpy) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
21467
21468 if (arr_pos > arr_len) return (RULE_RC_REJECT_ERROR);
21469
21470 if (arr2_pos > arr2_len) return (RULE_RC_REJECT_ERROR);
21471
21472 if ((arr2_pos + arr2_cpy) > arr2_len) return (RULE_RC_REJECT_ERROR);
21473
21474 if (arr2_cpy < 1) return (RULE_RC_SYNTAX_ERROR);
21475
21476 memcpy (arr2, arr2 + arr2_pos, arr2_len - arr2_pos);
21477
21478 memcpy (arr2 + arr2_cpy, arr + arr_pos, arr_len - arr_pos);
21479
21480 memcpy (arr + arr_pos, arr2, arr_len - arr_pos + arr2_cpy);
21481
21482 return (arr_len + arr2_cpy);
21483 }
21484
21485 int mangle_overstrike (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
21486 {
21487 if (upos >= arr_len) return (arr_len);
21488
21489 arr[upos] = c;
21490
21491 return (arr_len);
21492 }
21493
21494 int mangle_truncate_at (char arr[BLOCK_SIZE], int arr_len, int upos)
21495 {
21496 if (upos >= arr_len) return (arr_len);
21497
21498 memset (arr + upos, 0, arr_len - upos);
21499
21500 return (upos);
21501 }
21502
21503 int mangle_replace (char arr[BLOCK_SIZE], int arr_len, char oldc, char newc)
21504 {
21505 int arr_pos;
21506
21507 for (arr_pos = 0; arr_pos < arr_len; arr_pos++)
21508 {
21509 if (arr[arr_pos] != oldc) continue;
21510
21511 arr[arr_pos] = newc;
21512 }
21513
21514 return (arr_len);
21515 }
21516
21517 int mangle_purgechar (char arr[BLOCK_SIZE], int arr_len, char c)
21518 {
21519 int arr_pos;
21520
21521 int ret_len;
21522
21523 for (ret_len = 0, arr_pos = 0; arr_pos < arr_len; arr_pos++)
21524 {
21525 if (arr[arr_pos] == c) continue;
21526
21527 arr[ret_len] = arr[arr_pos];
21528
21529 ret_len++;
21530 }
21531
21532 return (ret_len);
21533 }
21534
21535 int mangle_dupeblock_prepend (char arr[BLOCK_SIZE], int arr_len, int ulen)
21536 {
21537 if (ulen > arr_len) return (arr_len);
21538
21539 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
21540
21541 char cs[100] = { 0 };
21542
21543 memcpy (cs, arr, ulen);
21544
21545 int i;
21546
21547 for (i = 0; i < ulen; i++)
21548 {
21549 char c = cs[i];
21550
21551 arr_len = mangle_insert (arr, arr_len, i, c);
21552 }
21553
21554 return (arr_len);
21555 }
21556
21557 int mangle_dupeblock_append (char arr[BLOCK_SIZE], int arr_len, int ulen)
21558 {
21559 if (ulen > arr_len) return (arr_len);
21560
21561 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
21562
21563 int upos = arr_len - ulen;
21564
21565 int i;
21566
21567 for (i = 0; i < ulen; i++)
21568 {
21569 char c = arr[upos + i];
21570
21571 arr_len = mangle_append (arr, arr_len, c);
21572 }
21573
21574 return (arr_len);
21575 }
21576
21577 int mangle_dupechar_at (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
21578 {
21579 if ( arr_len == 0) return (arr_len);
21580 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
21581
21582 char c = arr[upos];
21583
21584 int i;
21585
21586 for (i = 0; i < ulen; i++)
21587 {
21588 arr_len = mangle_insert (arr, arr_len, upos, c);
21589 }
21590
21591 return (arr_len);
21592 }
21593
21594 int mangle_dupechar (char arr[BLOCK_SIZE], int arr_len)
21595 {
21596 if ( arr_len == 0) return (arr_len);
21597 if ((arr_len + arr_len) >= BLOCK_SIZE) return (arr_len);
21598
21599 int arr_pos;
21600
21601 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
21602 {
21603 int new_pos = arr_pos * 2;
21604
21605 arr[new_pos] = arr[arr_pos];
21606
21607 arr[new_pos + 1] = arr[arr_pos];
21608 }
21609
21610 return (arr_len * 2);
21611 }
21612
21613 int mangle_switch_at_check (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
21614 {
21615 if (upos >= arr_len) return (arr_len);
21616 if (upos2 >= arr_len) return (arr_len);
21617
21618 MANGLE_SWITCH (arr, upos, upos2);
21619
21620 return (arr_len);
21621 }
21622
21623 int mangle_switch_at (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
21624 {
21625 MANGLE_SWITCH (arr, upos, upos2);
21626
21627 return (arr_len);
21628 }
21629
21630 int mangle_chr_shiftl (char arr[BLOCK_SIZE], int arr_len, int upos)
21631 {
21632 if (upos >= arr_len) return (arr_len);
21633
21634 arr[upos] <<= 1;
21635
21636 return (arr_len);
21637 }
21638
21639 int mangle_chr_shiftr (char arr[BLOCK_SIZE], int arr_len, int upos)
21640 {
21641 if (upos >= arr_len) return (arr_len);
21642
21643 arr[upos] >>= 1;
21644
21645 return (arr_len);
21646 }
21647
21648 int mangle_chr_incr (char arr[BLOCK_SIZE], int arr_len, int upos)
21649 {
21650 if (upos >= arr_len) return (arr_len);
21651
21652 arr[upos] += 1;
21653
21654 return (arr_len);
21655 }
21656
21657 int mangle_chr_decr (char arr[BLOCK_SIZE], int arr_len, int upos)
21658 {
21659 if (upos >= arr_len) return (arr_len);
21660
21661 arr[upos] -= 1;
21662
21663 return (arr_len);
21664 }
21665
21666 int mangle_title (char arr[BLOCK_SIZE], int arr_len)
21667 {
21668 int upper_next = 1;
21669
21670 int pos;
21671
21672 for (pos = 0; pos < arr_len; pos++)
21673 {
21674 if (arr[pos] == ' ')
21675 {
21676 upper_next = 1;
21677
21678 continue;
21679 }
21680
21681 if (upper_next)
21682 {
21683 upper_next = 0;
21684
21685 MANGLE_UPPER_AT (arr, pos);
21686 }
21687 else
21688 {
21689 MANGLE_LOWER_AT (arr, pos);
21690 }
21691 }
21692
21693 return (arr_len);
21694 }
21695
21696 int generate_random_rule (char rule_buf[RP_RULE_BUFSIZ], u32 rp_gen_func_min, u32 rp_gen_func_max)
21697 {
21698 u32 rp_gen_num = get_random_num (rp_gen_func_min, rp_gen_func_max);
21699
21700 u32 j;
21701
21702 u32 rule_pos = 0;
21703
21704 for (j = 0; j < rp_gen_num; j++)
21705 {
21706 u32 r = 0;
21707 u32 p1 = 0;
21708 u32 p2 = 0;
21709 u32 p3 = 0;
21710
21711 switch ((char) get_random_num (0, 9))
21712 {
21713 case 0:
21714 r = get_random_num (0, sizeof (grp_op_nop));
21715 rule_buf[rule_pos++] = grp_op_nop[r];
21716 break;
21717
21718 case 1:
21719 r = get_random_num (0, sizeof (grp_op_pos_p0));
21720 rule_buf[rule_pos++] = grp_op_pos_p0[r];
21721 p1 = get_random_num (0, sizeof (grp_pos));
21722 rule_buf[rule_pos++] = grp_pos[p1];
21723 break;
21724
21725 case 2:
21726 r = get_random_num (0, sizeof (grp_op_pos_p1));
21727 rule_buf[rule_pos++] = grp_op_pos_p1[r];
21728 p1 = get_random_num (1, 6);
21729 rule_buf[rule_pos++] = grp_pos[p1];
21730 break;
21731
21732 case 3:
21733 r = get_random_num (0, sizeof (grp_op_chr));
21734 rule_buf[rule_pos++] = grp_op_chr[r];
21735 p1 = get_random_num (0x20, 0x7e);
21736 rule_buf[rule_pos++] = (char) p1;
21737 break;
21738
21739 case 4:
21740 r = get_random_num (0, sizeof (grp_op_chr_chr));
21741 rule_buf[rule_pos++] = grp_op_chr_chr[r];
21742 p1 = get_random_num (0x20, 0x7e);
21743 rule_buf[rule_pos++] = (char) p1;
21744 p2 = get_random_num (0x20, 0x7e);
21745 while (p1 == p2)
21746 p2 = get_random_num (0x20, 0x7e);
21747 rule_buf[rule_pos++] = (char) p2;
21748 break;
21749
21750 case 5:
21751 r = get_random_num (0, sizeof (grp_op_pos_chr));
21752 rule_buf[rule_pos++] = grp_op_pos_chr[r];
21753 p1 = get_random_num (0, sizeof (grp_pos));
21754 rule_buf[rule_pos++] = grp_pos[p1];
21755 p2 = get_random_num (0x20, 0x7e);
21756 rule_buf[rule_pos++] = (char) p2;
21757 break;
21758
21759 case 6:
21760 r = get_random_num (0, sizeof (grp_op_pos_pos0));
21761 rule_buf[rule_pos++] = grp_op_pos_pos0[r];
21762 p1 = get_random_num (0, sizeof (grp_pos));
21763 rule_buf[rule_pos++] = grp_pos[p1];
21764 p2 = get_random_num (0, sizeof (grp_pos));
21765 while (p1 == p2)
21766 p2 = get_random_num (0, sizeof (grp_pos));
21767 rule_buf[rule_pos++] = grp_pos[p2];
21768 break;
21769
21770 case 7:
21771 r = get_random_num (0, sizeof (grp_op_pos_pos1));
21772 rule_buf[rule_pos++] = grp_op_pos_pos1[r];
21773 p1 = get_random_num (0, sizeof (grp_pos));
21774 rule_buf[rule_pos++] = grp_pos[p1];
21775 p2 = get_random_num (1, sizeof (grp_pos));
21776 while (p1 == p2)
21777 p2 = get_random_num (1, sizeof (grp_pos));
21778 rule_buf[rule_pos++] = grp_pos[p2];
21779 break;
21780
21781 case 8:
21782 r = get_random_num (0, sizeof (grp_op_pos1_pos2_pos3));
21783 rule_buf[rule_pos++] = grp_op_pos1_pos2_pos3[r];
21784 p1 = get_random_num (0, sizeof (grp_pos));
21785 rule_buf[rule_pos++] = grp_pos[p1];
21786 p2 = get_random_num (1, sizeof (grp_pos));
21787 rule_buf[rule_pos++] = grp_pos[p1];
21788 p3 = get_random_num (0, sizeof (grp_pos));
21789 rule_buf[rule_pos++] = grp_pos[p3];
21790 break;
21791 }
21792 }
21793
21794 return (rule_pos);
21795 }
21796
21797 int _old_apply_rule (char *rule, int rule_len, char in[BLOCK_SIZE], int in_len, char out[BLOCK_SIZE])
21798 {
21799 char mem[BLOCK_SIZE] = { 0 };
21800
21801 if (in == NULL) return (RULE_RC_REJECT_ERROR);
21802
21803 if (out == NULL) return (RULE_RC_REJECT_ERROR);
21804
21805 if (in_len < 1 || in_len > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
21806
21807 if (rule_len < 1) return (RULE_RC_REJECT_ERROR);
21808
21809 int out_len = in_len;
21810 int mem_len = in_len;
21811
21812 memcpy (out, in, out_len);
21813
21814 int rule_pos;
21815
21816 for (rule_pos = 0; rule_pos < rule_len; rule_pos++)
21817 {
21818 int upos, upos2;
21819 int ulen;
21820
21821 switch (rule[rule_pos])
21822 {
21823 case ' ':
21824 break;
21825
21826 case RULE_OP_MANGLE_NOOP:
21827 break;
21828
21829 case RULE_OP_MANGLE_LREST:
21830 out_len = mangle_lrest (out, out_len);
21831 break;
21832
21833 case RULE_OP_MANGLE_UREST:
21834 out_len = mangle_urest (out, out_len);
21835 break;
21836
21837 case RULE_OP_MANGLE_LREST_UFIRST:
21838 out_len = mangle_lrest (out, out_len);
21839 if (out_len) MANGLE_UPPER_AT (out, 0);
21840 break;
21841
21842 case RULE_OP_MANGLE_UREST_LFIRST:
21843 out_len = mangle_urest (out, out_len);
21844 if (out_len) MANGLE_LOWER_AT (out, 0);
21845 break;
21846
21847 case RULE_OP_MANGLE_TREST:
21848 out_len = mangle_trest (out, out_len);
21849 break;
21850
21851 case RULE_OP_MANGLE_TOGGLE_AT:
21852 NEXT_RULEPOS (rule_pos);
21853 NEXT_RPTOI (rule, rule_pos, upos);
21854 if (upos < out_len) MANGLE_TOGGLE_AT (out, upos);
21855 break;
21856
21857 case RULE_OP_MANGLE_REVERSE:
21858 out_len = mangle_reverse (out, out_len);
21859 break;
21860
21861 case RULE_OP_MANGLE_DUPEWORD:
21862 out_len = mangle_double (out, out_len);
21863 break;
21864
21865 case RULE_OP_MANGLE_DUPEWORD_TIMES:
21866 NEXT_RULEPOS (rule_pos);
21867 NEXT_RPTOI (rule, rule_pos, ulen);
21868 out_len = mangle_double_times (out, out_len, ulen);
21869 break;
21870
21871 case RULE_OP_MANGLE_REFLECT:
21872 out_len = mangle_reflect (out, out_len);
21873 break;
21874
21875 case RULE_OP_MANGLE_ROTATE_LEFT:
21876 mangle_rotate_left (out, out_len);
21877 break;
21878
21879 case RULE_OP_MANGLE_ROTATE_RIGHT:
21880 mangle_rotate_right (out, out_len);
21881 break;
21882
21883 case RULE_OP_MANGLE_APPEND:
21884 NEXT_RULEPOS (rule_pos);
21885 out_len = mangle_append (out, out_len, rule[rule_pos]);
21886 break;
21887
21888 case RULE_OP_MANGLE_PREPEND:
21889 NEXT_RULEPOS (rule_pos);
21890 out_len = mangle_prepend (out, out_len, rule[rule_pos]);
21891 break;
21892
21893 case RULE_OP_MANGLE_DELETE_FIRST:
21894 out_len = mangle_delete_at (out, out_len, 0);
21895 break;
21896
21897 case RULE_OP_MANGLE_DELETE_LAST:
21898 out_len = mangle_delete_at (out, out_len, (out_len) ? out_len - 1 : 0);
21899 break;
21900
21901 case RULE_OP_MANGLE_DELETE_AT:
21902 NEXT_RULEPOS (rule_pos);
21903 NEXT_RPTOI (rule, rule_pos, upos);
21904 out_len = mangle_delete_at (out, out_len, upos);
21905 break;
21906
21907 case RULE_OP_MANGLE_EXTRACT:
21908 NEXT_RULEPOS (rule_pos);
21909 NEXT_RPTOI (rule, rule_pos, upos);
21910 NEXT_RULEPOS (rule_pos);
21911 NEXT_RPTOI (rule, rule_pos, ulen);
21912 out_len = mangle_extract (out, out_len, upos, ulen);
21913 break;
21914
21915 case RULE_OP_MANGLE_OMIT:
21916 NEXT_RULEPOS (rule_pos);
21917 NEXT_RPTOI (rule, rule_pos, upos);
21918 NEXT_RULEPOS (rule_pos);
21919 NEXT_RPTOI (rule, rule_pos, ulen);
21920 out_len = mangle_omit (out, out_len, upos, ulen);
21921 break;
21922
21923 case RULE_OP_MANGLE_INSERT:
21924 NEXT_RULEPOS (rule_pos);
21925 NEXT_RPTOI (rule, rule_pos, upos);
21926 NEXT_RULEPOS (rule_pos);
21927 out_len = mangle_insert (out, out_len, upos, rule[rule_pos]);
21928 break;
21929
21930 case RULE_OP_MANGLE_OVERSTRIKE:
21931 NEXT_RULEPOS (rule_pos);
21932 NEXT_RPTOI (rule, rule_pos, upos);
21933 NEXT_RULEPOS (rule_pos);
21934 out_len = mangle_overstrike (out, out_len, upos, rule[rule_pos]);
21935 break;
21936
21937 case RULE_OP_MANGLE_TRUNCATE_AT:
21938 NEXT_RULEPOS (rule_pos);
21939 NEXT_RPTOI (rule, rule_pos, upos);
21940 out_len = mangle_truncate_at (out, out_len, upos);
21941 break;
21942
21943 case RULE_OP_MANGLE_REPLACE:
21944 NEXT_RULEPOS (rule_pos);
21945 NEXT_RULEPOS (rule_pos);
21946 out_len = mangle_replace (out, out_len, rule[rule_pos - 1], rule[rule_pos]);
21947 break;
21948
21949 case RULE_OP_MANGLE_PURGECHAR:
21950 NEXT_RULEPOS (rule_pos);
21951 out_len = mangle_purgechar (out, out_len, rule[rule_pos]);
21952 break;
21953
21954 case RULE_OP_MANGLE_TOGGLECASE_REC:
21955 /* todo */
21956 break;
21957
21958 case RULE_OP_MANGLE_DUPECHAR_FIRST:
21959 NEXT_RULEPOS (rule_pos);
21960 NEXT_RPTOI (rule, rule_pos, ulen);
21961 out_len = mangle_dupechar_at (out, out_len, 0, ulen);
21962 break;
21963
21964 case RULE_OP_MANGLE_DUPECHAR_LAST:
21965 NEXT_RULEPOS (rule_pos);
21966 NEXT_RPTOI (rule, rule_pos, ulen);
21967 out_len = mangle_dupechar_at (out, out_len, out_len - 1, ulen);
21968 break;
21969
21970 case RULE_OP_MANGLE_DUPECHAR_ALL:
21971 out_len = mangle_dupechar (out, out_len);
21972 break;
21973
21974 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
21975 NEXT_RULEPOS (rule_pos);
21976 NEXT_RPTOI (rule, rule_pos, ulen);
21977 out_len = mangle_dupeblock_prepend (out, out_len, ulen);
21978 break;
21979
21980 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
21981 NEXT_RULEPOS (rule_pos);
21982 NEXT_RPTOI (rule, rule_pos, ulen);
21983 out_len = mangle_dupeblock_append (out, out_len, ulen);
21984 break;
21985
21986 case RULE_OP_MANGLE_SWITCH_FIRST:
21987 if (out_len >= 2) mangle_switch_at (out, out_len, 0, 1);
21988 break;
21989
21990 case RULE_OP_MANGLE_SWITCH_LAST:
21991 if (out_len >= 2) mangle_switch_at (out, out_len, out_len - 1, out_len - 2);
21992 break;
21993
21994 case RULE_OP_MANGLE_SWITCH_AT:
21995 NEXT_RULEPOS (rule_pos);
21996 NEXT_RPTOI (rule, rule_pos, upos);
21997 NEXT_RULEPOS (rule_pos);
21998 NEXT_RPTOI (rule, rule_pos, upos2);
21999 out_len = mangle_switch_at_check (out, out_len, upos, upos2);
22000 break;
22001
22002 case RULE_OP_MANGLE_CHR_SHIFTL:
22003 NEXT_RULEPOS (rule_pos);
22004 NEXT_RPTOI (rule, rule_pos, upos);
22005 mangle_chr_shiftl (out, out_len, upos);
22006 break;
22007
22008 case RULE_OP_MANGLE_CHR_SHIFTR:
22009 NEXT_RULEPOS (rule_pos);
22010 NEXT_RPTOI (rule, rule_pos, upos);
22011 mangle_chr_shiftr (out, out_len, upos);
22012 break;
22013
22014 case RULE_OP_MANGLE_CHR_INCR:
22015 NEXT_RULEPOS (rule_pos);
22016 NEXT_RPTOI (rule, rule_pos, upos);
22017 mangle_chr_incr (out, out_len, upos);
22018 break;
22019
22020 case RULE_OP_MANGLE_CHR_DECR:
22021 NEXT_RULEPOS (rule_pos);
22022 NEXT_RPTOI (rule, rule_pos, upos);
22023 mangle_chr_decr (out, out_len, upos);
22024 break;
22025
22026 case RULE_OP_MANGLE_REPLACE_NP1:
22027 NEXT_RULEPOS (rule_pos);
22028 NEXT_RPTOI (rule, rule_pos, upos);
22029 if ((upos >= 0) && ((upos + 1) < out_len)) mangle_overstrike (out, out_len, upos, out[upos + 1]);
22030 break;
22031
22032 case RULE_OP_MANGLE_REPLACE_NM1:
22033 NEXT_RULEPOS (rule_pos);
22034 NEXT_RPTOI (rule, rule_pos, upos);
22035 if ((upos >= 1) && ((upos + 0) < out_len)) mangle_overstrike (out, out_len, upos, out[upos - 1]);
22036 break;
22037
22038 case RULE_OP_MANGLE_TITLE:
22039 out_len = mangle_title (out, out_len);
22040 break;
22041
22042 case RULE_OP_MANGLE_EXTRACT_MEMORY:
22043 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
22044 NEXT_RULEPOS (rule_pos);
22045 NEXT_RPTOI (rule, rule_pos, upos);
22046 NEXT_RULEPOS (rule_pos);
22047 NEXT_RPTOI (rule, rule_pos, ulen);
22048 NEXT_RULEPOS (rule_pos);
22049 NEXT_RPTOI (rule, rule_pos, upos2);
22050 if ((out_len = mangle_insert_multi (out, out_len, upos2, mem, mem_len, upos, ulen)) < 1) return (out_len);
22051 break;
22052
22053 case RULE_OP_MANGLE_APPEND_MEMORY:
22054 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
22055 if ((out_len + mem_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
22056 memcpy (out + out_len, mem, mem_len);
22057 out_len += mem_len;
22058 break;
22059
22060 case RULE_OP_MANGLE_PREPEND_MEMORY:
22061 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
22062 if ((mem_len + out_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
22063 memcpy (mem + mem_len, out, out_len);
22064 out_len += mem_len;
22065 memcpy (out, mem, out_len);
22066 break;
22067
22068 case RULE_OP_MEMORIZE_WORD:
22069 memcpy (mem, out, out_len);
22070 mem_len = out_len;
22071 break;
22072
22073 case RULE_OP_REJECT_LESS:
22074 NEXT_RULEPOS (rule_pos);
22075 NEXT_RPTOI (rule, rule_pos, upos);
22076 if (out_len > upos) return (RULE_RC_REJECT_ERROR);
22077 break;
22078
22079 case RULE_OP_REJECT_GREATER:
22080 NEXT_RULEPOS (rule_pos);
22081 NEXT_RPTOI (rule, rule_pos, upos);
22082 if (out_len < upos) return (RULE_RC_REJECT_ERROR);
22083 break;
22084
22085 case RULE_OP_REJECT_CONTAIN:
22086 NEXT_RULEPOS (rule_pos);
22087 if (strchr (out, rule[rule_pos]) != NULL) return (RULE_RC_REJECT_ERROR);
22088 break;
22089
22090 case RULE_OP_REJECT_NOT_CONTAIN:
22091 NEXT_RULEPOS (rule_pos);
22092 if (strchr (out, rule[rule_pos]) == NULL) return (RULE_RC_REJECT_ERROR);
22093 break;
22094
22095 case RULE_OP_REJECT_EQUAL_FIRST:
22096 NEXT_RULEPOS (rule_pos);
22097 if (out[0] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
22098 break;
22099
22100 case RULE_OP_REJECT_EQUAL_LAST:
22101 NEXT_RULEPOS (rule_pos);
22102 if (out[out_len - 1] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
22103 break;
22104
22105 case RULE_OP_REJECT_EQUAL_AT:
22106 NEXT_RULEPOS (rule_pos);
22107 NEXT_RPTOI (rule, rule_pos, upos);
22108 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
22109 NEXT_RULEPOS (rule_pos);
22110 if (out[upos] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
22111 break;
22112
22113 case RULE_OP_REJECT_CONTAINS:
22114 NEXT_RULEPOS (rule_pos);
22115 NEXT_RPTOI (rule, rule_pos, upos);
22116 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
22117 NEXT_RULEPOS (rule_pos);
22118 int c; int cnt; for (c = 0, cnt = 0; c < out_len; c++) if (out[c] == rule[rule_pos]) cnt++;
22119 if (cnt < upos) return (RULE_RC_REJECT_ERROR);
22120 break;
22121
22122 case RULE_OP_REJECT_MEMORY:
22123 if ((out_len == mem_len) && (memcmp (out, mem, out_len) == 0)) return (RULE_RC_REJECT_ERROR);
22124 break;
22125
22126 default:
22127 return (RULE_RC_SYNTAX_ERROR);
22128 break;
22129 }
22130 }
22131
22132 memset (out + out_len, 0, BLOCK_SIZE - out_len);
22133
22134 return (out_len);
22135 }