Hack in NvAPI_GPU_GetCoolerSettings(); Enables query fanspeed in percentage on windows
[hashcat.git] / src / shared.c
1 /**
2 * Authors.....: Jens Steube <jens.steube@gmail.com>
3 * Gabriele Gristina <matrix@hashcat.net>
4 *
5 * License.....: MIT
6 */
7
8 #ifdef OSX
9 #include <stdio.h>
10 #endif
11
12 #include <shared.h>
13 #include <limits.h>
14
15 /**
16 * tuning tools
17 */
18
19 #define GET_ACCEL(x) KERNEL_ACCEL_ ## x
20 #define GET_LOOPS(x) KERNEL_LOOPS_ ## x
21
22 /**
23 * basic bit handling
24 */
25
26 u32 rotl32 (const u32 a, const u32 n)
27 {
28 return ((a << n) | (a >> (32 - n)));
29 }
30
31 u32 rotr32 (const u32 a, const u32 n)
32 {
33 return ((a >> n) | (a << (32 - n)));
34 }
35
36 u64 rotl64 (const u64 a, const u64 n)
37 {
38 return ((a << n) | (a >> (64 - n)));
39 }
40
41 u64 rotr64 (const u64 a, const u64 n)
42 {
43 return ((a >> n) | (a << (64 - n)));
44 }
45
46 u32 byte_swap_32 (const u32 n)
47 {
48 return (n & 0xff000000) >> 24
49 | (n & 0x00ff0000) >> 8
50 | (n & 0x0000ff00) << 8
51 | (n & 0x000000ff) << 24;
52 }
53
54 u64 byte_swap_64 (const u64 n)
55 {
56 return (n & 0xff00000000000000ULL) >> 56
57 | (n & 0x00ff000000000000ULL) >> 40
58 | (n & 0x0000ff0000000000ULL) >> 24
59 | (n & 0x000000ff00000000ULL) >> 8
60 | (n & 0x00000000ff000000ULL) << 8
61 | (n & 0x0000000000ff0000ULL) << 24
62 | (n & 0x000000000000ff00ULL) << 40
63 | (n & 0x00000000000000ffULL) << 56;
64 }
65
66 /**
67 * ciphers for use on cpu
68 */
69
70 #include "cpu-des.c"
71 #include "cpu-aes.c"
72
73 /**
74 * hashes for use on cpu
75 */
76
77 #include "cpu-md5.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_temperature_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].vendor_id == VENDOR_ID_AMD)
3066 {
3067 if (data.hm_amd)
3068 {
3069 if (data.hm_device[device_id].od_version == 5)
3070 {
3071 ADLTemperature Temperature;
3072
3073 Temperature.iSize = sizeof (ADLTemperature);
3074
3075 if (hm_ADL_Overdrive5_Temperature_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, 0, &Temperature) != ADL_OK) return -1;
3076
3077 return Temperature.iTemperature / 1000;
3078 }
3079 else if (data.hm_device[device_id].od_version == 6)
3080 {
3081 int Temperature = 0;
3082
3083 if (hm_ADL_Overdrive6_Temperature_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, &Temperature) != ADL_OK) return -1;
3084
3085 return Temperature / 1000;
3086 }
3087 }
3088 }
3089 #endif
3090
3091 #if defined(HAVE_NVML) || defined(HAVE_NVAPI)
3092 if (data.devices_param[device_id].vendor_id == VENDOR_ID_NV)
3093 {
3094 #if defined(LINUX) && defined(HAVE_NVML)
3095 int temperature = 0;
3096
3097 hm_NVML_nvmlDeviceGetTemperature (data.hm_nv, data.hm_device[device_id].adapter_index.nv, NVML_TEMPERATURE_GPU, (unsigned int *) &temperature);
3098
3099 return temperature;
3100 #endif
3101
3102 #if defined(WIN) && defined(HAVE_NVAPI)
3103 NV_GPU_THERMAL_SETTINGS pThermalSettings;
3104
3105 pThermalSettings.version = NV_GPU_THERMAL_SETTINGS_VER;
3106 pThermalSettings.count = NVAPI_MAX_THERMAL_SENSORS_PER_GPU;
3107 pThermalSettings.sensor[0].controller = NVAPI_THERMAL_CONTROLLER_UNKNOWN;
3108 pThermalSettings.sensor[0].target = NVAPI_THERMAL_TARGET_GPU;
3109
3110 if (hm_NvAPI_GPU_GetThermalSettings (data.hm_nv, data.hm_device[device_id].adapter_index.nv, 0, &pThermalSettings) != NVAPI_OK) return -1;
3111
3112 return pThermalSettings.sensor[0].currentTemp;
3113 #endif // WIN && HAVE_NVAPI
3114 }
3115 #endif // HAVE_NVML || HAVE_NVAPI
3116
3117 return -1;
3118 }
3119
3120 int hm_get_fanspeed_with_device_id (const uint device_id)
3121 {
3122 // we shouldn't really need this extra CL_DEVICE_TYPE_GPU check, because fan_supported should not be set w/ CPUs
3123 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3124
3125 if (data.hm_device[device_id].fan_supported == 1)
3126 {
3127 #ifdef HAVE_ADL
3128 if (data.devices_param[device_id].vendor_id == VENDOR_ID_AMD)
3129 {
3130 if (data.hm_amd)
3131 {
3132 if (data.hm_device[device_id].od_version == 5)
3133 {
3134 ADLFanSpeedValue lpFanSpeedValue;
3135
3136 memset (&lpFanSpeedValue, 0, sizeof (lpFanSpeedValue));
3137
3138 lpFanSpeedValue.iSize = sizeof (lpFanSpeedValue);
3139 lpFanSpeedValue.iSpeedType = ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
3140 lpFanSpeedValue.iFlags = ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED;
3141
3142 if (hm_ADL_Overdrive5_FanSpeed_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, 0, &lpFanSpeedValue) != ADL_OK) return -1;
3143
3144 return lpFanSpeedValue.iFanSpeed;
3145 }
3146 else // od_version == 6
3147 {
3148 ADLOD6FanSpeedInfo faninfo;
3149
3150 memset (&faninfo, 0, sizeof (faninfo));
3151
3152 if (hm_ADL_Overdrive6_FanSpeed_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, &faninfo) != ADL_OK) return -1;
3153
3154 return faninfo.iFanSpeedPercent;
3155 }
3156 }
3157 }
3158 #endif // HAVE_ADL
3159
3160 #if defined(HAVE_NVML) || defined(HAVE_NVAPI)
3161 if (data.devices_param[device_id].vendor_id == VENDOR_ID_NV)
3162 {
3163 #if defined(LINUX) && defined(HAVE_NVML)
3164 int speed = 0;
3165
3166 hm_NVML_nvmlDeviceGetFanSpeed (data.hm_nv, 1, data.hm_device[device_id].adapter_index.nv, (unsigned int *) &speed);
3167
3168 return speed;
3169 #endif
3170
3171 #if defined(WIN) && defined(HAVE_NVAPI)
3172
3173 NV_GPU_COOLER_SETTINGS pCoolerSettings;
3174
3175 pCoolerSettings.Version = GPU_COOLER_SETTINGS_VER | sizeof (NV_GPU_COOLER_SETTINGS);
3176
3177 hm_NvAPI_GPU_GetCoolerSettings (data.hm_nv, data.hm_device[device_id].adapter_index.nv, 0, &pCoolerSettings);
3178
3179 return pCoolerSettings.Cooler[0].CurrentLevel;
3180 #endif
3181 }
3182 #endif // HAVE_NVML || HAVE_NVAPI
3183 }
3184
3185 return -1;
3186 }
3187
3188 int hm_get_utilization_with_device_id (const uint device_id)
3189 {
3190 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3191
3192 #ifdef HAVE_ADL
3193 if (data.devices_param[device_id].vendor_id == VENDOR_ID_AMD)
3194 {
3195 if (data.hm_amd)
3196 {
3197 ADLPMActivity PMActivity;
3198
3199 PMActivity.iSize = sizeof (ADLPMActivity);
3200
3201 if (hm_ADL_Overdrive_CurrentActivity_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, &PMActivity) != ADL_OK) return -1;
3202
3203 return PMActivity.iActivityPercent;
3204 }
3205 }
3206 #endif // HAVE_ADL
3207
3208 #if defined(HAVE_NVML) || defined(HAVE_NVAPI)
3209 if (data.devices_param[device_id].vendor_id == VENDOR_ID_NV)
3210 {
3211 #if defined(LINUX) && defined(HAVE_NVML)
3212 nvmlUtilization_t utilization;
3213
3214 hm_NVML_nvmlDeviceGetUtilizationRates (data.hm_nv, data.hm_device[device_id].adapter_index.nv, &utilization);
3215
3216 return utilization.gpu;
3217 #endif
3218
3219 #if defined(WIN) && defined(HAVE_NVAPI)
3220 NV_GPU_DYNAMIC_PSTATES_INFO_EX pDynamicPstatesInfoEx;
3221
3222 pDynamicPstatesInfoEx.version = NV_GPU_DYNAMIC_PSTATES_INFO_EX_VER;
3223
3224 if (hm_NvAPI_GPU_GetDynamicPstatesInfoEx (data.hm_nv, data.hm_device[device_id].adapter_index.nv, &pDynamicPstatesInfoEx) != NVAPI_OK) return -1;
3225
3226 return pDynamicPstatesInfoEx.utilization[0].percentage;
3227 #endif
3228 }
3229 #endif // HAVE_NVML || HAVE_NVAPI
3230
3231 return -1;
3232 }
3233
3234 #ifdef HAVE_ADL
3235 int hm_set_fanspeed_with_device_id_amd (const uint device_id, const int fanspeed)
3236 {
3237 if (data.hm_device[device_id].fan_supported == 1)
3238 {
3239 if (data.hm_amd)
3240 {
3241 if (data.hm_device[device_id].od_version == 5)
3242 {
3243 ADLFanSpeedValue lpFanSpeedValue;
3244
3245 memset (&lpFanSpeedValue, 0, sizeof (lpFanSpeedValue));
3246
3247 lpFanSpeedValue.iSize = sizeof (lpFanSpeedValue);
3248 lpFanSpeedValue.iSpeedType = ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
3249 lpFanSpeedValue.iFlags = ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED;
3250 lpFanSpeedValue.iFanSpeed = fanspeed;
3251
3252 if (hm_ADL_Overdrive5_FanSpeed_Set (data.hm_amd, data.hm_device[device_id].adapter_index.amd, 0, &lpFanSpeedValue) != ADL_OK) return -1;
3253
3254 return 0;
3255 }
3256 else // od_version == 6
3257 {
3258 ADLOD6FanSpeedValue fan_speed_value;
3259
3260 memset (&fan_speed_value, 0, sizeof (fan_speed_value));
3261
3262 fan_speed_value.iSpeedType = ADL_OD6_FANSPEED_TYPE_PERCENT;
3263 fan_speed_value.iFanSpeed = fanspeed;
3264
3265 if (hm_ADL_Overdrive6_FanSpeed_Set (data.hm_amd, data.hm_device[device_id].adapter_index.amd, &fan_speed_value) != ADL_OK) return -1;
3266
3267 return 0;
3268 }
3269 }
3270 }
3271
3272 return -1;
3273 }
3274 #endif
3275
3276 // helper function for status display
3277
3278 void hm_device_val_to_str (char *target_buf, int max_buf_size, char *suffix, int value)
3279 {
3280 #define VALUE_NOT_AVAILABLE "N/A"
3281
3282 if (value == -1)
3283 {
3284 snprintf (target_buf, max_buf_size, VALUE_NOT_AVAILABLE);
3285 }
3286 else
3287 {
3288 snprintf (target_buf, max_buf_size, "%2d%s", value, suffix);
3289 }
3290 }
3291 #endif // HAVE_HWMON
3292
3293 /**
3294 * maskprocessor
3295 */
3296
3297 void mp_css_to_uniq_tbl (uint css_cnt, cs_t *css, uint uniq_tbls[SP_PW_MAX][CHARSIZ])
3298 {
3299 /* generates a lookup table where key is the char itself for fastest possible lookup performance */
3300
3301 if (css_cnt > SP_PW_MAX)
3302 {
3303 log_error ("ERROR: mask length is too long");
3304
3305 exit (-1);
3306 }
3307
3308 for (uint css_pos = 0; css_pos < css_cnt; css_pos++)
3309 {
3310 uint *uniq_tbl = uniq_tbls[css_pos];
3311
3312 uint *cs_buf = css[css_pos].cs_buf;
3313 uint cs_len = css[css_pos].cs_len;
3314
3315 for (uint cs_pos = 0; cs_pos < cs_len; cs_pos++)
3316 {
3317 uint c = cs_buf[cs_pos] & 0xff;
3318
3319 uniq_tbl[c] = 1;
3320 }
3321 }
3322 }
3323
3324 void mp_add_cs_buf (uint *in_buf, size_t in_len, cs_t *css, int css_cnt)
3325 {
3326 cs_t *cs = &css[css_cnt];
3327
3328 size_t css_uniq_sz = CHARSIZ * sizeof (uint);
3329
3330 uint *css_uniq = (uint *) mymalloc (css_uniq_sz);
3331
3332 size_t i;
3333
3334 for (i = 0; i < cs->cs_len; i++)
3335 {
3336 const uint u = cs->cs_buf[i];
3337
3338 css_uniq[u] = 1;
3339 }
3340
3341 for (i = 0; i < in_len; i++)
3342 {
3343 uint u = in_buf[i] & 0xff;
3344
3345 if (data.opts_type & OPTS_TYPE_PT_UPPER) u = toupper (u);
3346
3347 if (css_uniq[u] == 1) continue;
3348
3349 css_uniq[u] = 1;
3350
3351 cs->cs_buf[cs->cs_len] = u;
3352
3353 cs->cs_len++;
3354 }
3355
3356 myfree (css_uniq);
3357 }
3358
3359 void mp_expand (char *in_buf, size_t in_len, cs_t *mp_sys, cs_t *mp_usr, int mp_usr_offset, int interpret)
3360 {
3361 size_t in_pos;
3362
3363 for (in_pos = 0; in_pos < in_len; in_pos++)
3364 {
3365 uint p0 = in_buf[in_pos] & 0xff;
3366
3367 if (interpret == 1 && p0 == '?')
3368 {
3369 in_pos++;
3370
3371 if (in_pos == in_len) break;
3372
3373 uint p1 = in_buf[in_pos] & 0xff;
3374
3375 switch (p1)
3376 {
3377 case 'l': mp_add_cs_buf (mp_sys[0].cs_buf, mp_sys[0].cs_len, mp_usr, mp_usr_offset);
3378 break;
3379 case 'u': mp_add_cs_buf (mp_sys[1].cs_buf, mp_sys[1].cs_len, mp_usr, mp_usr_offset);
3380 break;
3381 case 'd': mp_add_cs_buf (mp_sys[2].cs_buf, mp_sys[2].cs_len, mp_usr, mp_usr_offset);
3382 break;
3383 case 's': mp_add_cs_buf (mp_sys[3].cs_buf, mp_sys[3].cs_len, mp_usr, mp_usr_offset);
3384 break;
3385 case 'a': mp_add_cs_buf (mp_sys[4].cs_buf, mp_sys[4].cs_len, mp_usr, mp_usr_offset);
3386 break;
3387 case 'b': mp_add_cs_buf (mp_sys[5].cs_buf, mp_sys[5].cs_len, mp_usr, mp_usr_offset);
3388 break;
3389 case '1': if (mp_usr[0].cs_len == 0) { log_error ("ERROR: Custom-charset 1 is undefined\n"); exit (-1); }
3390 mp_add_cs_buf (mp_usr[0].cs_buf, mp_usr[0].cs_len, mp_usr, mp_usr_offset);
3391 break;
3392 case '2': if (mp_usr[1].cs_len == 0) { log_error ("ERROR: Custom-charset 2 is undefined\n"); exit (-1); }
3393 mp_add_cs_buf (mp_usr[1].cs_buf, mp_usr[1].cs_len, mp_usr, mp_usr_offset);
3394 break;
3395 case '3': if (mp_usr[2].cs_len == 0) { log_error ("ERROR: Custom-charset 3 is undefined\n"); exit (-1); }
3396 mp_add_cs_buf (mp_usr[2].cs_buf, mp_usr[2].cs_len, mp_usr, mp_usr_offset);
3397 break;
3398 case '4': if (mp_usr[3].cs_len == 0) { log_error ("ERROR: Custom-charset 4 is undefined\n"); exit (-1); }
3399 mp_add_cs_buf (mp_usr[3].cs_buf, mp_usr[3].cs_len, mp_usr, mp_usr_offset);
3400 break;
3401 case '?': mp_add_cs_buf (&p0, 1, mp_usr, mp_usr_offset);
3402 break;
3403 default: log_error ("Syntax error: %s", in_buf);
3404 exit (-1);
3405 }
3406 }
3407 else
3408 {
3409 if (data.hex_charset)
3410 {
3411 in_pos++;
3412
3413 if (in_pos == in_len)
3414 {
3415 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", in_buf);
3416
3417 exit (-1);
3418 }
3419
3420 uint p1 = in_buf[in_pos] & 0xff;
3421
3422 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3423 {
3424 log_error ("ERROR: invalid hex character detected in mask %s", in_buf);
3425
3426 exit (-1);
3427 }
3428
3429 uint chr = 0;
3430
3431 chr = hex_convert (p1) << 0;
3432 chr |= hex_convert (p0) << 4;
3433
3434 mp_add_cs_buf (&chr, 1, mp_usr, mp_usr_offset);
3435 }
3436 else
3437 {
3438 uint chr = p0;
3439
3440 mp_add_cs_buf (&chr, 1, mp_usr, mp_usr_offset);
3441 }
3442 }
3443 }
3444 }
3445
3446 u64 mp_get_sum (uint css_cnt, cs_t *css)
3447 {
3448 u64 sum = 1;
3449
3450 for (uint css_pos = 0; css_pos < css_cnt; css_pos++)
3451 {
3452 sum *= css[css_pos].cs_len;
3453 }
3454
3455 return (sum);
3456 }
3457
3458 cs_t *mp_gen_css (char *mask_buf, size_t mask_len, cs_t *mp_sys, cs_t *mp_usr, uint *css_cnt)
3459 {
3460 cs_t *css = (cs_t *) mycalloc (256, sizeof (cs_t));
3461
3462 uint mask_pos;
3463 uint css_pos;
3464
3465 for (mask_pos = 0, css_pos = 0; mask_pos < mask_len; mask_pos++, css_pos++)
3466 {
3467 char p0 = mask_buf[mask_pos];
3468
3469 if (p0 == '?')
3470 {
3471 mask_pos++;
3472
3473 if (mask_pos == mask_len) break;
3474
3475 char p1 = mask_buf[mask_pos];
3476
3477 uint chr = p1;
3478
3479 switch (p1)
3480 {
3481 case 'l': mp_add_cs_buf (mp_sys[0].cs_buf, mp_sys[0].cs_len, css, css_pos);
3482 break;
3483 case 'u': mp_add_cs_buf (mp_sys[1].cs_buf, mp_sys[1].cs_len, css, css_pos);
3484 break;
3485 case 'd': mp_add_cs_buf (mp_sys[2].cs_buf, mp_sys[2].cs_len, css, css_pos);
3486 break;
3487 case 's': mp_add_cs_buf (mp_sys[3].cs_buf, mp_sys[3].cs_len, css, css_pos);
3488 break;
3489 case 'a': mp_add_cs_buf (mp_sys[4].cs_buf, mp_sys[4].cs_len, css, css_pos);
3490 break;
3491 case 'b': mp_add_cs_buf (mp_sys[5].cs_buf, mp_sys[5].cs_len, css, css_pos);
3492 break;
3493 case '1': if (mp_usr[0].cs_len == 0) { log_error ("ERROR: Custom-charset 1 is undefined\n"); exit (-1); }
3494 mp_add_cs_buf (mp_usr[0].cs_buf, mp_usr[0].cs_len, css, css_pos);
3495 break;
3496 case '2': if (mp_usr[1].cs_len == 0) { log_error ("ERROR: Custom-charset 2 is undefined\n"); exit (-1); }
3497 mp_add_cs_buf (mp_usr[1].cs_buf, mp_usr[1].cs_len, css, css_pos);
3498 break;
3499 case '3': if (mp_usr[2].cs_len == 0) { log_error ("ERROR: Custom-charset 3 is undefined\n"); exit (-1); }
3500 mp_add_cs_buf (mp_usr[2].cs_buf, mp_usr[2].cs_len, css, css_pos);
3501 break;
3502 case '4': if (mp_usr[3].cs_len == 0) { log_error ("ERROR: Custom-charset 4 is undefined\n"); exit (-1); }
3503 mp_add_cs_buf (mp_usr[3].cs_buf, mp_usr[3].cs_len, css, css_pos);
3504 break;
3505 case '?': mp_add_cs_buf (&chr, 1, css, css_pos);
3506 break;
3507 default: log_error ("ERROR: syntax error: %s", mask_buf);
3508 exit (-1);
3509 }
3510 }
3511 else
3512 {
3513 if (data.hex_charset)
3514 {
3515 mask_pos++;
3516
3517 // if there is no 2nd hex character, show an error:
3518
3519 if (mask_pos == mask_len)
3520 {
3521 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", mask_buf);
3522
3523 exit (-1);
3524 }
3525
3526 char p1 = mask_buf[mask_pos];
3527
3528 // if they are not valid hex character, show an error:
3529
3530 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3531 {
3532 log_error ("ERROR: invalid hex character detected in mask %s", mask_buf);
3533
3534 exit (-1);
3535 }
3536
3537 uint chr = 0;
3538
3539 chr |= hex_convert (p1) << 0;
3540 chr |= hex_convert (p0) << 4;
3541
3542 mp_add_cs_buf (&chr, 1, css, css_pos);
3543 }
3544 else
3545 {
3546 uint chr = p0;
3547
3548 mp_add_cs_buf (&chr, 1, css, css_pos);
3549 }
3550 }
3551 }
3552
3553 if (css_pos == 0)
3554 {
3555 log_error ("ERROR: invalid mask length (0)");
3556
3557 exit (-1);
3558 }
3559
3560 *css_cnt = css_pos;
3561
3562 return (css);
3563 }
3564
3565 void mp_exec (u64 val, char *buf, cs_t *css, int css_cnt)
3566 {
3567 for (int i = 0; i < css_cnt; i++)
3568 {
3569 uint len = css[i].cs_len;
3570 u64 next = val / len;
3571 uint pos = val % len;
3572 buf[i] = (char) css[i].cs_buf[pos] & 0xff;
3573 val = next;
3574 }
3575 }
3576
3577 void mp_cut_at (char *mask, uint max)
3578 {
3579 uint i;
3580 uint j;
3581 uint mask_len = strlen (mask);
3582
3583 for (i = 0, j = 0; i < mask_len && j < max; i++, j++)
3584 {
3585 if (mask[i] == '?') i++;
3586 }
3587
3588 mask[i] = 0;
3589 }
3590
3591 void mp_setup_sys (cs_t *mp_sys)
3592 {
3593 uint pos;
3594 uint chr;
3595 uint donec[CHARSIZ] = { 0 };
3596
3597 for (pos = 0, chr = 'a'; chr <= 'z'; chr++) { donec[chr] = 1;
3598 mp_sys[0].cs_buf[pos++] = chr;
3599 mp_sys[0].cs_len = pos; }
3600
3601 for (pos = 0, chr = 'A'; chr <= 'Z'; chr++) { donec[chr] = 1;
3602 mp_sys[1].cs_buf[pos++] = chr;
3603 mp_sys[1].cs_len = pos; }
3604
3605 for (pos = 0, chr = '0'; chr <= '9'; chr++) { donec[chr] = 1;
3606 mp_sys[2].cs_buf[pos++] = chr;
3607 mp_sys[2].cs_len = pos; }
3608
3609 for (pos = 0, chr = 0x20; chr <= 0x7e; chr++) { if (donec[chr]) continue;
3610 mp_sys[3].cs_buf[pos++] = chr;
3611 mp_sys[3].cs_len = pos; }
3612
3613 for (pos = 0, chr = 0x20; chr <= 0x7e; chr++) { mp_sys[4].cs_buf[pos++] = chr;
3614 mp_sys[4].cs_len = pos; }
3615
3616 for (pos = 0, chr = 0x00; chr <= 0xff; chr++) { mp_sys[5].cs_buf[pos++] = chr;
3617 mp_sys[5].cs_len = pos; }
3618 }
3619
3620 void mp_setup_usr (cs_t *mp_sys, cs_t *mp_usr, char *buf, uint index)
3621 {
3622 FILE *fp = fopen (buf, "rb");
3623
3624 if (fp == NULL || feof (fp)) // feof() in case if file is empty
3625 {
3626 mp_expand (buf, strlen (buf), mp_sys, mp_usr, index, 1);
3627 }
3628 else
3629 {
3630 char mp_file[1024] = { 0 };
3631
3632 size_t len = fread (mp_file, 1, sizeof (mp_file) - 1, fp);
3633
3634 fclose (fp);
3635
3636 len = in_superchop (mp_file);
3637
3638 if (len == 0)
3639 {
3640 log_info ("WARNING: charset file corrupted");
3641
3642 mp_expand (buf, strlen (buf), mp_sys, mp_usr, index, 1);
3643 }
3644 else
3645 {
3646 mp_expand (mp_file, len, mp_sys, mp_usr, index, 0);
3647 }
3648 }
3649 }
3650
3651 void mp_reset_usr (cs_t *mp_usr, uint index)
3652 {
3653 mp_usr[index].cs_len = 0;
3654
3655 memset (mp_usr[index].cs_buf, 0, sizeof (mp_usr[index].cs_buf));
3656 }
3657
3658 char *mp_get_truncated_mask (char *mask_buf, size_t mask_len, uint len)
3659 {
3660 char *new_mask_buf = (char *) mymalloc (256);
3661
3662 uint mask_pos;
3663
3664 uint css_pos;
3665
3666 for (mask_pos = 0, css_pos = 0; mask_pos < mask_len; mask_pos++, css_pos++)
3667 {
3668 if (css_pos == len) break;
3669
3670 char p0 = mask_buf[mask_pos];
3671
3672 new_mask_buf[mask_pos] = p0;
3673
3674 if (p0 == '?')
3675 {
3676 mask_pos++;
3677
3678 if (mask_pos == mask_len) break;
3679
3680 new_mask_buf[mask_pos] = mask_buf[mask_pos];
3681 }
3682 else
3683 {
3684 if (data.hex_charset)
3685 {
3686 mask_pos++;
3687
3688 if (mask_pos == mask_len)
3689 {
3690 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", mask_buf);
3691
3692 exit (-1);
3693 }
3694
3695 char p1 = mask_buf[mask_pos];
3696
3697 // if they are not valid hex character, show an error:
3698
3699 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3700 {
3701 log_error ("ERROR: invalid hex character detected in mask: %s", mask_buf);
3702
3703 exit (-1);
3704 }
3705
3706 new_mask_buf[mask_pos] = p1;
3707 }
3708 }
3709 }
3710
3711 if (css_pos == len) return (new_mask_buf);
3712
3713 myfree (new_mask_buf);
3714
3715 return (NULL);
3716 }
3717
3718 /**
3719 * statprocessor
3720 */
3721
3722 u64 sp_get_sum (uint start, uint stop, cs_t *root_css_buf)
3723 {
3724 u64 sum = 1;
3725
3726 uint i;
3727
3728 for (i = start; i < stop; i++)
3729 {
3730 sum *= root_css_buf[i].cs_len;
3731 }
3732
3733 return (sum);
3734 }
3735
3736 void sp_exec (u64 ctx, char *pw_buf, cs_t *root_css_buf, cs_t *markov_css_buf, uint start, uint stop)
3737 {
3738 u64 v = ctx;
3739
3740 cs_t *cs = &root_css_buf[start];
3741
3742 uint i;
3743
3744 for (i = start; i < stop; i++)
3745 {
3746 const u64 m = v % cs->cs_len;
3747 const u64 d = v / cs->cs_len;
3748
3749 v = d;
3750
3751 const uint k = cs->cs_buf[m];
3752
3753 pw_buf[i - start] = (char) k;
3754
3755 cs = &markov_css_buf[(i * CHARSIZ) + k];
3756 }
3757 }
3758
3759 int sp_comp_val (const void *p1, const void *p2)
3760 {
3761 hcstat_table_t *b1 = (hcstat_table_t *) p1;
3762 hcstat_table_t *b2 = (hcstat_table_t *) p2;
3763
3764 return b2->val - b1->val;
3765 }
3766
3767 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)
3768 {
3769 uint i;
3770 uint j;
3771 uint k;
3772
3773 /**
3774 * Initialize hcstats
3775 */
3776
3777 u64 *root_stats_buf = (u64 *) mycalloc (SP_ROOT_CNT, sizeof (u64));
3778
3779 u64 *root_stats_ptr = root_stats_buf;
3780
3781 u64 *root_stats_buf_by_pos[SP_PW_MAX];
3782
3783 for (i = 0; i < SP_PW_MAX; i++)
3784 {
3785 root_stats_buf_by_pos[i] = root_stats_ptr;
3786
3787 root_stats_ptr += CHARSIZ;
3788 }
3789
3790 u64 *markov_stats_buf = (u64 *) mycalloc (SP_MARKOV_CNT, sizeof (u64));
3791
3792 u64 *markov_stats_ptr = markov_stats_buf;
3793
3794 u64 *markov_stats_buf_by_key[SP_PW_MAX][CHARSIZ];
3795
3796 for (i = 0; i < SP_PW_MAX; i++)
3797 {
3798 for (j = 0; j < CHARSIZ; j++)
3799 {
3800 markov_stats_buf_by_key[i][j] = markov_stats_ptr;
3801
3802 markov_stats_ptr += CHARSIZ;
3803 }
3804 }
3805
3806 /**
3807 * Load hcstats File
3808 */
3809
3810 if (hcstat == NULL)
3811 {
3812 char hcstat_tmp[256] = { 0 };
3813
3814 snprintf (hcstat_tmp, sizeof (hcstat_tmp) - 1, "%s/%s", shared_dir, SP_HCSTAT);
3815
3816 hcstat = hcstat_tmp;
3817 }
3818
3819 FILE *fd = fopen (hcstat, "rb");
3820
3821 if (fd == NULL)
3822 {
3823 log_error ("%s: %s", hcstat, strerror (errno));
3824
3825 exit (-1);
3826 }
3827
3828 if (fread (root_stats_buf, sizeof (u64), SP_ROOT_CNT, fd) != SP_ROOT_CNT)
3829 {
3830 log_error ("%s: Could not load data", hcstat);
3831
3832 fclose (fd);
3833
3834 exit (-1);
3835 }
3836
3837 if (fread (markov_stats_buf, sizeof (u64), SP_MARKOV_CNT, fd) != SP_MARKOV_CNT)
3838 {
3839 log_error ("%s: Could not load data", hcstat);
3840
3841 fclose (fd);
3842
3843 exit (-1);
3844 }
3845
3846 fclose (fd);
3847
3848 /**
3849 * Markov modifier of hcstat_table on user request
3850 */
3851
3852 if (disable)
3853 {
3854 memset (root_stats_buf, 0, SP_ROOT_CNT * sizeof (u64));
3855 memset (markov_stats_buf, 0, SP_MARKOV_CNT * sizeof (u64));
3856 }
3857
3858 if (classic)
3859 {
3860 /* Add all stats to first position */
3861
3862 for (i = 1; i < SP_PW_MAX; i++)
3863 {
3864 u64 *out = root_stats_buf_by_pos[0];
3865 u64 *in = root_stats_buf_by_pos[i];
3866
3867 for (j = 0; j < CHARSIZ; j++)
3868 {
3869 *out++ += *in++;
3870 }
3871 }
3872
3873 for (i = 1; i < SP_PW_MAX; i++)
3874 {
3875 u64 *out = markov_stats_buf_by_key[0][0];
3876 u64 *in = markov_stats_buf_by_key[i][0];
3877
3878 for (j = 0; j < CHARSIZ; j++)
3879 {
3880 for (k = 0; k < CHARSIZ; k++)
3881 {
3882 *out++ += *in++;
3883 }
3884 }
3885 }
3886
3887 /* copy them to all pw_positions */
3888
3889 for (i = 1; i < SP_PW_MAX; i++)
3890 {
3891 memcpy (root_stats_buf_by_pos[i], root_stats_buf_by_pos[0], CHARSIZ * sizeof (u64));
3892 }
3893
3894 for (i = 1; i < SP_PW_MAX; i++)
3895 {
3896 memcpy (markov_stats_buf_by_key[i][0], markov_stats_buf_by_key[0][0], CHARSIZ * CHARSIZ * sizeof (u64));
3897 }
3898 }
3899
3900 /**
3901 * Initialize tables
3902 */
3903
3904 hcstat_table_t *root_table_ptr = root_table_buf;
3905
3906 hcstat_table_t *root_table_buf_by_pos[SP_PW_MAX];
3907
3908 for (i = 0; i < SP_PW_MAX; i++)
3909 {
3910 root_table_buf_by_pos[i] = root_table_ptr;
3911
3912 root_table_ptr += CHARSIZ;
3913 }
3914
3915 hcstat_table_t *markov_table_ptr = markov_table_buf;
3916
3917 hcstat_table_t *markov_table_buf_by_key[SP_PW_MAX][CHARSIZ];
3918
3919 for (i = 0; i < SP_PW_MAX; i++)
3920 {
3921 for (j = 0; j < CHARSIZ; j++)
3922 {
3923 markov_table_buf_by_key[i][j] = markov_table_ptr;
3924
3925 markov_table_ptr += CHARSIZ;
3926 }
3927 }
3928
3929 /**
3930 * Convert hcstat to tables
3931 */
3932
3933 for (i = 0; i < SP_ROOT_CNT; i++)
3934 {
3935 uint key = i % CHARSIZ;
3936
3937 root_table_buf[i].key = key;
3938 root_table_buf[i].val = root_stats_buf[i];
3939 }
3940
3941 for (i = 0; i < SP_MARKOV_CNT; i++)
3942 {
3943 uint key = i % CHARSIZ;
3944
3945 markov_table_buf[i].key = key;
3946 markov_table_buf[i].val = markov_stats_buf[i];
3947 }
3948
3949 myfree (root_stats_buf);
3950 myfree (markov_stats_buf);
3951
3952 /**
3953 * Finally sort them
3954 */
3955
3956 for (i = 0; i < SP_PW_MAX; i++)
3957 {
3958 qsort (root_table_buf_by_pos[i], CHARSIZ, sizeof (hcstat_table_t), sp_comp_val);
3959 }
3960
3961 for (i = 0; i < SP_PW_MAX; i++)
3962 {
3963 for (j = 0; j < CHARSIZ; j++)
3964 {
3965 qsort (markov_table_buf_by_key[i][j], CHARSIZ, sizeof (hcstat_table_t), sp_comp_val);
3966 }
3967 }
3968 }
3969
3970 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])
3971 {
3972 /**
3973 * Convert tables to css
3974 */
3975
3976 for (uint i = 0; i < SP_ROOT_CNT; i++)
3977 {
3978 uint pw_pos = i / CHARSIZ;
3979
3980 cs_t *cs = &root_css_buf[pw_pos];
3981
3982 if (cs->cs_len == threshold) continue;
3983
3984 uint key = root_table_buf[i].key;
3985
3986 if (uniq_tbls[pw_pos][key] == 0) continue;
3987
3988 cs->cs_buf[cs->cs_len] = key;
3989
3990 cs->cs_len++;
3991 }
3992
3993 /**
3994 * Convert table to css
3995 */
3996
3997 for (uint i = 0; i < SP_MARKOV_CNT; i++)
3998 {
3999 uint c = i / CHARSIZ;
4000
4001 cs_t *cs = &markov_css_buf[c];
4002
4003 if (cs->cs_len == threshold) continue;
4004
4005 uint pw_pos = c / CHARSIZ;
4006
4007 uint key = markov_table_buf[i].key;
4008
4009 if ((pw_pos + 1) < SP_PW_MAX) if (uniq_tbls[pw_pos + 1][key] == 0) continue;
4010
4011 cs->cs_buf[cs->cs_len] = key;
4012
4013 cs->cs_len++;
4014 }
4015
4016 /*
4017 for (uint i = 0; i < 8; i++)
4018 {
4019 for (uint j = 0x20; j < 0x80; j++)
4020 {
4021 cs_t *ptr = &markov_css_buf[(i * CHARSIZ) + j];
4022
4023 printf ("pos:%u key:%u len:%u\n", i, j, ptr->cs_len);
4024
4025 for (uint k = 0; k < 10; k++)
4026 {
4027 printf (" %u\n", ptr->cs_buf[k]);
4028 }
4029 }
4030 }
4031 */
4032 }
4033
4034 void sp_stretch_root (hcstat_table_t *in, hcstat_table_t *out)
4035 {
4036 for (uint i = 0; i < SP_PW_MAX; i += 2)
4037 {
4038 memcpy (out, in, CHARSIZ * sizeof (hcstat_table_t));
4039
4040 out += CHARSIZ;
4041 in += CHARSIZ;
4042
4043 out->key = 0;
4044 out->val = 1;
4045
4046 out++;
4047
4048 for (uint j = 1; j < CHARSIZ; j++)
4049 {
4050 out->key = j;
4051 out->val = 0;
4052
4053 out++;
4054 }
4055 }
4056 }
4057
4058 void sp_stretch_markov (hcstat_table_t *in, hcstat_table_t *out)
4059 {
4060 for (uint i = 0; i < SP_PW_MAX; i += 2)
4061 {
4062 memcpy (out, in, CHARSIZ * CHARSIZ * sizeof (hcstat_table_t));
4063
4064 out += CHARSIZ * CHARSIZ;
4065 in += CHARSIZ * CHARSIZ;
4066
4067 for (uint j = 0; j < CHARSIZ; j++)
4068 {
4069 out->key = 0;
4070 out->val = 1;
4071
4072 out++;
4073
4074 for (uint k = 1; k < CHARSIZ; k++)
4075 {
4076 out->key = k;
4077 out->val = 0;
4078
4079 out++;
4080 }
4081 }
4082 }
4083 }
4084
4085 /**
4086 * mixed shared functions
4087 */
4088
4089 void dump_hex (const u8 *s, const int sz)
4090 {
4091 for (int i = 0; i < sz; i++)
4092 {
4093 log_info_nn ("%02x ", s[i]);
4094 }
4095
4096 log_info ("");
4097 }
4098
4099 void usage_mini_print (const char *progname)
4100 {
4101 for (uint i = 0; USAGE_MINI[i] != NULL; i++) log_info (USAGE_MINI[i], progname);
4102 }
4103
4104 void usage_big_print (const char *progname)
4105 {
4106 for (uint i = 0; USAGE_BIG[i] != NULL; i++) log_info (USAGE_BIG[i], progname);
4107 }
4108
4109 char *get_exec_path ()
4110 {
4111 int exec_path_len = 1024;
4112
4113 char *exec_path = (char *) mymalloc (exec_path_len);
4114
4115 #ifdef LINUX
4116
4117 char tmp[32] = { 0 };
4118
4119 snprintf (tmp, sizeof (tmp) - 1, "/proc/%d/exe", getpid ());
4120
4121 const int len = readlink (tmp, exec_path, exec_path_len - 1);
4122
4123 #elif WIN
4124
4125 const int len = GetModuleFileName (NULL, exec_path, exec_path_len - 1);
4126
4127 #elif OSX
4128
4129 uint size = exec_path_len;
4130
4131 if (_NSGetExecutablePath (exec_path, &size) != 0)
4132 {
4133 log_error("! executable path buffer too small\n");
4134
4135 exit (-1);
4136 }
4137
4138 const int len = strlen (exec_path);
4139
4140 #else
4141 #error Your Operating System is not supported or detected
4142 #endif
4143
4144 exec_path[len] = 0;
4145
4146 return exec_path;
4147 }
4148
4149 char *get_install_dir (const char *progname)
4150 {
4151 char *install_dir = mystrdup (progname);
4152 char *last_slash = NULL;
4153
4154 if ((last_slash = strrchr (install_dir, '/')) != NULL)
4155 {
4156 *last_slash = 0;
4157 }
4158 else if ((last_slash = strrchr (install_dir, '\\')) != NULL)
4159 {
4160 *last_slash = 0;
4161 }
4162 else
4163 {
4164 install_dir[0] = '.';
4165 install_dir[1] = 0;
4166 }
4167
4168 return (install_dir);
4169 }
4170
4171 char *get_profile_dir (const char *homedir)
4172 {
4173 #define DOT_HASHCAT ".hashcat"
4174
4175 size_t len = strlen (homedir) + 1 + strlen (DOT_HASHCAT) + 1;
4176
4177 char *profile_dir = (char *) mymalloc (len + 1);
4178
4179 snprintf (profile_dir, len, "%s/%s", homedir, DOT_HASHCAT);
4180
4181 return profile_dir;
4182 }
4183
4184 char *get_session_dir (const char *profile_dir)
4185 {
4186 #define SESSIONS_FOLDER "sessions"
4187
4188 size_t len = strlen (profile_dir) + 1 + strlen (SESSIONS_FOLDER) + 1;
4189
4190 char *session_dir = (char *) mymalloc (len + 1);
4191
4192 snprintf (session_dir, len, "%s/%s", profile_dir, SESSIONS_FOLDER);
4193
4194 return session_dir;
4195 }
4196
4197 void truecrypt_crc32 (const char *filename, u8 keytab[64])
4198 {
4199 uint crc = ~0;
4200
4201 FILE *fd = fopen (filename, "rb");
4202
4203 if (fd == NULL)
4204 {
4205 log_error ("%s: %s", filename, strerror (errno));
4206
4207 exit (-1);
4208 }
4209
4210 #define MAX_KEY_SIZE (1024 * 1024)
4211
4212 u8 *buf = (u8 *) mymalloc (MAX_KEY_SIZE + 1);
4213
4214 int nread = fread (buf, sizeof (u8), MAX_KEY_SIZE, fd);
4215
4216 fclose (fd);
4217
4218 int kpos = 0;
4219
4220 for (int fpos = 0; fpos < nread; fpos++)
4221 {
4222 crc = crc32tab[(crc ^ buf[fpos]) & 0xff] ^ (crc >> 8);
4223
4224 keytab[kpos++] += (crc >> 24) & 0xff;
4225 keytab[kpos++] += (crc >> 16) & 0xff;
4226 keytab[kpos++] += (crc >> 8) & 0xff;
4227 keytab[kpos++] += (crc >> 0) & 0xff;
4228
4229 if (kpos >= 64) kpos = 0;
4230 }
4231
4232 myfree (buf);
4233 }
4234
4235 void set_cpu_affinity (char *cpu_affinity)
4236 {
4237 #ifdef WIN
4238 DWORD_PTR aff_mask = 0;
4239 #elif LINUX
4240 cpu_set_t cpuset;
4241 CPU_ZERO (&cpuset);
4242 #endif
4243
4244 if (cpu_affinity)
4245 {
4246 char *devices = strdup (cpu_affinity);
4247
4248 char *next = strtok (devices, ",");
4249
4250 do
4251 {
4252 uint cpu_id = atoi (next);
4253
4254 if (cpu_id == 0)
4255 {
4256 #ifdef WIN
4257 aff_mask = 0;
4258 #elif LINUX
4259 CPU_ZERO (&cpuset);
4260 #endif
4261
4262 break;
4263 }
4264
4265 if (cpu_id > 32)
4266 {
4267 log_error ("ERROR: invalid cpu_id %u specified", cpu_id);
4268
4269 exit (-1);
4270 }
4271
4272 #ifdef WIN
4273 aff_mask |= 1 << (cpu_id - 1);
4274 #elif LINUX
4275 CPU_SET ((cpu_id - 1), &cpuset);
4276 #endif
4277
4278 } while ((next = strtok (NULL, ",")) != NULL);
4279
4280 free (devices);
4281 }
4282
4283 #ifdef WIN
4284 SetProcessAffinityMask (GetCurrentProcess (), aff_mask);
4285 SetThreadAffinityMask (GetCurrentThread (), aff_mask);
4286 #elif LINUX
4287 pthread_t thread = pthread_self ();
4288 pthread_setaffinity_np (thread, sizeof (cpu_set_t), &cpuset);
4289 #endif
4290 }
4291
4292 void *rulefind (const void *key, void *base, int nmemb, size_t size, int (*compar) (const void *, const void *))
4293 {
4294 char *element, *end;
4295
4296 end = (char *) base + nmemb * size;
4297
4298 for (element = (char *) base; element < end; element += size)
4299 if (!compar (element, key))
4300 return element;
4301
4302 return NULL;
4303 }
4304
4305 int sort_by_salt (const void *v1, const void *v2)
4306 {
4307 const salt_t *s1 = (const salt_t *) v1;
4308 const salt_t *s2 = (const salt_t *) v2;
4309
4310 const int res1 = s1->salt_len - s2->salt_len;
4311
4312 if (res1 != 0) return (res1);
4313
4314 const int res2 = s1->salt_iter - s2->salt_iter;
4315
4316 if (res2 != 0) return (res2);
4317
4318 uint n;
4319
4320 n = 12;
4321
4322 while (n--)
4323 {
4324 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4325 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4326 }
4327
4328 n = 8;
4329
4330 while (n--)
4331 {
4332 if (s1->salt_buf_pc[n] > s2->salt_buf_pc[n]) return ( 1);
4333 if (s1->salt_buf_pc[n] < s2->salt_buf_pc[n]) return (-1);
4334 }
4335
4336 return (0);
4337 }
4338
4339 int sort_by_salt_buf (const void *v1, const void *v2)
4340 {
4341 const pot_t *p1 = (const pot_t *) v1;
4342 const pot_t *p2 = (const pot_t *) v2;
4343
4344 const hash_t *h1 = &p1->hash;
4345 const hash_t *h2 = &p2->hash;
4346
4347 const salt_t *s1 = h1->salt;
4348 const salt_t *s2 = h2->salt;
4349
4350 uint n = 12;
4351
4352 while (n--)
4353 {
4354 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4355 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4356 }
4357
4358 return 0;
4359 }
4360
4361 int sort_by_hash_t_salt (const void *v1, const void *v2)
4362 {
4363 const hash_t *h1 = (const hash_t *) v1;
4364 const hash_t *h2 = (const hash_t *) v2;
4365
4366 const salt_t *s1 = h1->salt;
4367 const salt_t *s2 = h2->salt;
4368
4369 // testphase: this should work
4370 uint n = 12;
4371
4372 while (n--)
4373 {
4374 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4375 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4376 }
4377
4378 /* original code, seems buggy since salt_len can be very big (had a case with 131 len)
4379 also it thinks salt_buf[x] is a char but its a uint so salt_len should be / 4
4380 if (s1->salt_len > s2->salt_len) return ( 1);
4381 if (s1->salt_len < s2->salt_len) return (-1);
4382
4383 uint n = s1->salt_len;
4384
4385 while (n--)
4386 {
4387 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4388 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4389 }
4390 */
4391
4392 return 0;
4393 }
4394
4395 int sort_by_hash_t_salt_hccap (const void *v1, const void *v2)
4396 {
4397 const hash_t *h1 = (const hash_t *) v1;
4398 const hash_t *h2 = (const hash_t *) v2;
4399
4400 const salt_t *s1 = h1->salt;
4401 const salt_t *s2 = h2->salt;
4402
4403 // 12 - 2 (since last 2 uints contain the digest)
4404 uint n = 10;
4405
4406 while (n--)
4407 {
4408 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4409 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4410 }
4411
4412 return 0;
4413 }
4414
4415 int sort_by_hash_no_salt (const void *v1, const void *v2)
4416 {
4417 const hash_t *h1 = (const hash_t *) v1;
4418 const hash_t *h2 = (const hash_t *) v2;
4419
4420 const void *d1 = h1->digest;
4421 const void *d2 = h2->digest;
4422
4423 return data.sort_by_digest (d1, d2);
4424 }
4425
4426 int sort_by_hash (const void *v1, const void *v2)
4427 {
4428 const hash_t *h1 = (const hash_t *) v1;
4429 const hash_t *h2 = (const hash_t *) v2;
4430
4431 if (data.isSalted)
4432 {
4433 const salt_t *s1 = h1->salt;
4434 const salt_t *s2 = h2->salt;
4435
4436 int res = sort_by_salt (s1, s2);
4437
4438 if (res != 0) return (res);
4439 }
4440
4441 const void *d1 = h1->digest;
4442 const void *d2 = h2->digest;
4443
4444 return data.sort_by_digest (d1, d2);
4445 }
4446
4447 int sort_by_pot (const void *v1, const void *v2)
4448 {
4449 const pot_t *p1 = (const pot_t *) v1;
4450 const pot_t *p2 = (const pot_t *) v2;
4451
4452 const hash_t *h1 = &p1->hash;
4453 const hash_t *h2 = &p2->hash;
4454
4455 return sort_by_hash (h1, h2);
4456 }
4457
4458 int sort_by_mtime (const void *p1, const void *p2)
4459 {
4460 const char **f1 = (const char **) p1;
4461 const char **f2 = (const char **) p2;
4462
4463 struct stat s1; stat (*f1, &s1);
4464 struct stat s2; stat (*f2, &s2);
4465
4466 return s2.st_mtime - s1.st_mtime;
4467 }
4468
4469 int sort_by_cpu_rule (const void *p1, const void *p2)
4470 {
4471 const cpu_rule_t *r1 = (const cpu_rule_t *) p1;
4472 const cpu_rule_t *r2 = (const cpu_rule_t *) p2;
4473
4474 return memcmp (r1, r2, sizeof (cpu_rule_t));
4475 }
4476
4477 int sort_by_kernel_rule (const void *p1, const void *p2)
4478 {
4479 const kernel_rule_t *r1 = (const kernel_rule_t *) p1;
4480 const kernel_rule_t *r2 = (const kernel_rule_t *) p2;
4481
4482 return memcmp (r1, r2, sizeof (kernel_rule_t));
4483 }
4484
4485 int sort_by_stringptr (const void *p1, const void *p2)
4486 {
4487 const char **s1 = (const char **) p1;
4488 const char **s2 = (const char **) p2;
4489
4490 return strcmp (*s1, *s2);
4491 }
4492
4493 int sort_by_dictstat (const void *s1, const void *s2)
4494 {
4495 dictstat_t *d1 = (dictstat_t *) s1;
4496 dictstat_t *d2 = (dictstat_t *) s2;
4497
4498 #ifdef LINUX
4499 d2->stat.st_atim = d1->stat.st_atim;
4500 #else
4501 d2->stat.st_atime = d1->stat.st_atime;
4502 #endif
4503
4504 return memcmp (&d1->stat, &d2->stat, sizeof (struct stat));
4505 }
4506
4507 int sort_by_bitmap (const void *p1, const void *p2)
4508 {
4509 const bitmap_result_t *b1 = (const bitmap_result_t *) p1;
4510 const bitmap_result_t *b2 = (const bitmap_result_t *) p2;
4511
4512 return b1->collisions - b2->collisions;
4513 }
4514
4515 int sort_by_digest_4_2 (const void *v1, const void *v2)
4516 {
4517 const u32 *d1 = (const u32 *) v1;
4518 const u32 *d2 = (const u32 *) v2;
4519
4520 uint n = 2;
4521
4522 while (n--)
4523 {
4524 if (d1[n] > d2[n]) return ( 1);
4525 if (d1[n] < d2[n]) return (-1);
4526 }
4527
4528 return (0);
4529 }
4530
4531 int sort_by_digest_4_4 (const void *v1, const void *v2)
4532 {
4533 const u32 *d1 = (const u32 *) v1;
4534 const u32 *d2 = (const u32 *) v2;
4535
4536 uint n = 4;
4537
4538 while (n--)
4539 {
4540 if (d1[n] > d2[n]) return ( 1);
4541 if (d1[n] < d2[n]) return (-1);
4542 }
4543
4544 return (0);
4545 }
4546
4547 int sort_by_digest_4_5 (const void *v1, const void *v2)
4548 {
4549 const u32 *d1 = (const u32 *) v1;
4550 const u32 *d2 = (const u32 *) v2;
4551
4552 uint n = 5;
4553
4554 while (n--)
4555 {
4556 if (d1[n] > d2[n]) return ( 1);
4557 if (d1[n] < d2[n]) return (-1);
4558 }
4559
4560 return (0);
4561 }
4562
4563 int sort_by_digest_4_6 (const void *v1, const void *v2)
4564 {
4565 const u32 *d1 = (const u32 *) v1;
4566 const u32 *d2 = (const u32 *) v2;
4567
4568 uint n = 6;
4569
4570 while (n--)
4571 {
4572 if (d1[n] > d2[n]) return ( 1);
4573 if (d1[n] < d2[n]) return (-1);
4574 }
4575
4576 return (0);
4577 }
4578
4579 int sort_by_digest_4_8 (const void *v1, const void *v2)
4580 {
4581 const u32 *d1 = (const u32 *) v1;
4582 const u32 *d2 = (const u32 *) v2;
4583
4584 uint n = 8;
4585
4586 while (n--)
4587 {
4588 if (d1[n] > d2[n]) return ( 1);
4589 if (d1[n] < d2[n]) return (-1);
4590 }
4591
4592 return (0);
4593 }
4594
4595 int sort_by_digest_4_16 (const void *v1, const void *v2)
4596 {
4597 const u32 *d1 = (const u32 *) v1;
4598 const u32 *d2 = (const u32 *) v2;
4599
4600 uint n = 16;
4601
4602 while (n--)
4603 {
4604 if (d1[n] > d2[n]) return ( 1);
4605 if (d1[n] < d2[n]) return (-1);
4606 }
4607
4608 return (0);
4609 }
4610
4611 int sort_by_digest_4_32 (const void *v1, const void *v2)
4612 {
4613 const u32 *d1 = (const u32 *) v1;
4614 const u32 *d2 = (const u32 *) v2;
4615
4616 uint n = 32;
4617
4618 while (n--)
4619 {
4620 if (d1[n] > d2[n]) return ( 1);
4621 if (d1[n] < d2[n]) return (-1);
4622 }
4623
4624 return (0);
4625 }
4626
4627 int sort_by_digest_4_64 (const void *v1, const void *v2)
4628 {
4629 const u32 *d1 = (const u32 *) v1;
4630 const u32 *d2 = (const u32 *) v2;
4631
4632 uint n = 64;
4633
4634 while (n--)
4635 {
4636 if (d1[n] > d2[n]) return ( 1);
4637 if (d1[n] < d2[n]) return (-1);
4638 }
4639
4640 return (0);
4641 }
4642
4643 int sort_by_digest_8_8 (const void *v1, const void *v2)
4644 {
4645 const u64 *d1 = (const u64 *) v1;
4646 const u64 *d2 = (const u64 *) v2;
4647
4648 uint n = 8;
4649
4650 while (n--)
4651 {
4652 if (d1[n] > d2[n]) return ( 1);
4653 if (d1[n] < d2[n]) return (-1);
4654 }
4655
4656 return (0);
4657 }
4658
4659 int sort_by_digest_8_16 (const void *v1, const void *v2)
4660 {
4661 const u64 *d1 = (const u64 *) v1;
4662 const u64 *d2 = (const u64 *) v2;
4663
4664 uint n = 16;
4665
4666 while (n--)
4667 {
4668 if (d1[n] > d2[n]) return ( 1);
4669 if (d1[n] < d2[n]) return (-1);
4670 }
4671
4672 return (0);
4673 }
4674
4675 int sort_by_digest_8_25 (const void *v1, const void *v2)
4676 {
4677 const u64 *d1 = (const u64 *) v1;
4678 const u64 *d2 = (const u64 *) v2;
4679
4680 uint n = 25;
4681
4682 while (n--)
4683 {
4684 if (d1[n] > d2[n]) return ( 1);
4685 if (d1[n] < d2[n]) return (-1);
4686 }
4687
4688 return (0);
4689 }
4690
4691 int sort_by_digest_p0p1 (const void *v1, const void *v2)
4692 {
4693 const u32 *d1 = (const u32 *) v1;
4694 const u32 *d2 = (const u32 *) v2;
4695
4696 const uint dgst_pos0 = data.dgst_pos0;
4697 const uint dgst_pos1 = data.dgst_pos1;
4698 const uint dgst_pos2 = data.dgst_pos2;
4699 const uint dgst_pos3 = data.dgst_pos3;
4700
4701 if (d1[dgst_pos3] > d2[dgst_pos3]) return ( 1);
4702 if (d1[dgst_pos3] < d2[dgst_pos3]) return (-1);
4703 if (d1[dgst_pos2] > d2[dgst_pos2]) return ( 1);
4704 if (d1[dgst_pos2] < d2[dgst_pos2]) return (-1);
4705 if (d1[dgst_pos1] > d2[dgst_pos1]) return ( 1);
4706 if (d1[dgst_pos1] < d2[dgst_pos1]) return (-1);
4707 if (d1[dgst_pos0] > d2[dgst_pos0]) return ( 1);
4708 if (d1[dgst_pos0] < d2[dgst_pos0]) return (-1);
4709
4710 return (0);
4711 }
4712
4713 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)
4714 {
4715 uint outfile_autohex = data.outfile_autohex;
4716
4717 unsigned char *rule_ptr = (unsigned char *) rule_buf;
4718
4719 FILE *debug_fp = NULL;
4720
4721 if (debug_file != NULL)
4722 {
4723 debug_fp = fopen (debug_file, "ab");
4724
4725 lock_file (debug_fp);
4726 }
4727 else
4728 {
4729 debug_fp = stderr;
4730 }
4731
4732 if (debug_fp == NULL)
4733 {
4734 log_info ("WARNING: Could not open debug-file for writing");
4735 }
4736 else
4737 {
4738 if ((debug_mode == 2) || (debug_mode == 3) || (debug_mode == 4))
4739 {
4740 format_plain (debug_fp, orig_plain_ptr, orig_plain_len, outfile_autohex);
4741
4742 if ((debug_mode == 3) || (debug_mode == 4)) fputc (':', debug_fp);
4743 }
4744
4745 fwrite (rule_ptr, rule_len, 1, debug_fp);
4746
4747 if (debug_mode == 4)
4748 {
4749 fputc (':', debug_fp);
4750
4751 format_plain (debug_fp, mod_plain_ptr, mod_plain_len, outfile_autohex);
4752 }
4753
4754 fputc ('\n', debug_fp);
4755
4756 if (debug_file != NULL) fclose (debug_fp);
4757 }
4758 }
4759
4760 void format_plain (FILE *fp, unsigned char *plain_ptr, uint plain_len, uint outfile_autohex)
4761 {
4762 int needs_hexify = 0;
4763
4764 if (outfile_autohex == 1)
4765 {
4766 for (uint i = 0; i < plain_len; i++)
4767 {
4768 if (plain_ptr[i] < 0x20)
4769 {
4770 needs_hexify = 1;
4771
4772 break;
4773 }
4774
4775 if (plain_ptr[i] > 0x7f)
4776 {
4777 needs_hexify = 1;
4778
4779 break;
4780 }
4781 }
4782 }
4783
4784 if (needs_hexify == 1)
4785 {
4786 fprintf (fp, "$HEX[");
4787
4788 for (uint i = 0; i < plain_len; i++)
4789 {
4790 fprintf (fp, "%02x", plain_ptr[i]);
4791 }
4792
4793 fprintf (fp, "]");
4794 }
4795 else
4796 {
4797 fwrite (plain_ptr, plain_len, 1, fp);
4798 }
4799 }
4800
4801 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)
4802 {
4803 uint outfile_format = data.outfile_format;
4804
4805 char separator = data.separator;
4806
4807 if (outfile_format & OUTFILE_FMT_HASH)
4808 {
4809 fprintf (out_fp, "%s", out_buf);
4810
4811 if (outfile_format & (OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
4812 {
4813 fputc (separator, out_fp);
4814 }
4815 }
4816 else if (data.username)
4817 {
4818 if (username != NULL)
4819 {
4820 for (uint i = 0; i < user_len; i++)
4821 {
4822 fprintf (out_fp, "%c", username[i]);
4823 }
4824
4825 if (outfile_format & (OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
4826 {
4827 fputc (separator, out_fp);
4828 }
4829 }
4830 }
4831
4832 if (outfile_format & OUTFILE_FMT_PLAIN)
4833 {
4834 format_plain (out_fp, plain_ptr, plain_len, data.outfile_autohex);
4835
4836 if (outfile_format & (OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
4837 {
4838 fputc (separator, out_fp);
4839 }
4840 }
4841
4842 if (outfile_format & OUTFILE_FMT_HEXPLAIN)
4843 {
4844 for (uint i = 0; i < plain_len; i++)
4845 {
4846 fprintf (out_fp, "%02x", plain_ptr[i]);
4847 }
4848
4849 if (outfile_format & (OUTFILE_FMT_CRACKPOS))
4850 {
4851 fputc (separator, out_fp);
4852 }
4853 }
4854
4855 if (outfile_format & OUTFILE_FMT_CRACKPOS)
4856 {
4857 #ifdef _WIN
4858 __mingw_fprintf (out_fp, "%llu", crackpos);
4859 #endif
4860
4861 #ifdef _POSIX
4862 #ifdef __x86_64__
4863 fprintf (out_fp, "%lu", (unsigned long) crackpos);
4864 #else
4865 fprintf (out_fp, "%llu", crackpos);
4866 #endif
4867 #endif
4868 }
4869
4870 fputc ('\n', out_fp);
4871 }
4872
4873 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)
4874 {
4875 pot_t pot_key;
4876
4877 pot_key.hash.salt = hashes_buf->salt;
4878 pot_key.hash.digest = hashes_buf->digest;
4879
4880 pot_t *pot_ptr = (pot_t *) bsearch (&pot_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
4881
4882 if (pot_ptr)
4883 {
4884 log_info_nn ("");
4885
4886 input_buf[input_len] = 0;
4887
4888 // user
4889 unsigned char *username = NULL;
4890 uint user_len = 0;
4891
4892 if (data.username)
4893 {
4894 user_t *user = hashes_buf->hash_info->user;
4895
4896 if (user)
4897 {
4898 username = (unsigned char *) (user->user_name);
4899
4900 user_len = user->user_len;
4901 }
4902 }
4903
4904 // do output the line
4905 format_output (out_fp, input_buf, (unsigned char *) pot_ptr->plain_buf, pot_ptr->plain_len, 0, username, user_len);
4906 }
4907 }
4908
4909 #define LM_WEAK_HASH "\x4e\xcf\x0d\x0c\x0a\xe2\xfb\xc1"
4910 #define LM_MASKED_PLAIN "[notfound]"
4911
4912 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)
4913 {
4914 // left
4915
4916 pot_t pot_left_key;
4917
4918 pot_left_key.hash.salt = hash_left->salt;
4919 pot_left_key.hash.digest = hash_left->digest;
4920
4921 pot_t *pot_left_ptr = (pot_t *) bsearch (&pot_left_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
4922
4923 // right
4924
4925 uint weak_hash_found = 0;
4926
4927 pot_t pot_right_key;
4928
4929 pot_right_key.hash.salt = hash_right->salt;
4930 pot_right_key.hash.digest = hash_right->digest;
4931
4932 pot_t *pot_right_ptr = (pot_t *) bsearch (&pot_right_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
4933
4934 if (pot_right_ptr == NULL)
4935 {
4936 // special case, if "weak hash"
4937
4938 if (memcmp (hash_right->digest, LM_WEAK_HASH, 8) == 0)
4939 {
4940 weak_hash_found = 1;
4941
4942 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
4943
4944 // in theory this is not needed, but we are paranoia:
4945
4946 memset (pot_right_ptr->plain_buf, 0, sizeof (pot_right_ptr->plain_buf));
4947 pot_right_ptr->plain_len = 0;
4948 }
4949 }
4950
4951 if ((pot_left_ptr == NULL) && (pot_right_ptr == NULL))
4952 {
4953 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
4954
4955 return;
4956 }
4957
4958 // at least one half was found:
4959
4960 log_info_nn ("");
4961
4962 input_buf[input_len] = 0;
4963
4964 // user
4965
4966 unsigned char *username = NULL;
4967 uint user_len = 0;
4968
4969 if (data.username)
4970 {
4971 user_t *user = hash_left->hash_info->user;
4972
4973 if (user)
4974 {
4975 username = (unsigned char *) (user->user_name);
4976
4977 user_len = user->user_len;
4978 }
4979 }
4980
4981 // mask the part which was not found
4982
4983 uint left_part_masked = 0;
4984 uint right_part_masked = 0;
4985
4986 uint mask_plain_len = strlen (LM_MASKED_PLAIN);
4987
4988 if (pot_left_ptr == NULL)
4989 {
4990 left_part_masked = 1;
4991
4992 pot_left_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
4993
4994 memset (pot_left_ptr->plain_buf, 0, sizeof (pot_left_ptr->plain_buf));
4995
4996 memcpy (pot_left_ptr->plain_buf, LM_MASKED_PLAIN, mask_plain_len);
4997 pot_left_ptr->plain_len = mask_plain_len;
4998 }
4999
5000 if (pot_right_ptr == NULL)
5001 {
5002 right_part_masked = 1;
5003
5004 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5005
5006 memset (pot_right_ptr->plain_buf, 0, sizeof (pot_right_ptr->plain_buf));
5007
5008 memcpy (pot_right_ptr->plain_buf, LM_MASKED_PLAIN, mask_plain_len);
5009 pot_right_ptr->plain_len = mask_plain_len;
5010 }
5011
5012 // create the pot_ptr out of pot_left_ptr and pot_right_ptr
5013
5014 pot_t pot_ptr;
5015
5016 pot_ptr.plain_len = pot_left_ptr->plain_len + pot_right_ptr->plain_len;
5017
5018 memcpy (pot_ptr.plain_buf, pot_left_ptr->plain_buf, pot_left_ptr->plain_len);
5019
5020 memcpy (pot_ptr.plain_buf + pot_left_ptr->plain_len, pot_right_ptr->plain_buf, pot_right_ptr->plain_len);
5021
5022 // do output the line
5023
5024 format_output (out_fp, input_buf, (unsigned char *) pot_ptr.plain_buf, pot_ptr.plain_len, 0, username, user_len);
5025
5026 if (weak_hash_found == 1) myfree (pot_right_ptr);
5027
5028 if (left_part_masked == 1) myfree (pot_left_ptr);
5029 if (right_part_masked == 1) myfree (pot_right_ptr);
5030 }
5031
5032 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)
5033 {
5034 pot_t pot_key;
5035
5036 memcpy (&pot_key.hash, hashes_buf, sizeof (hash_t));
5037
5038 pot_t *pot_ptr = (pot_t *) bsearch (&pot_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5039
5040 if (pot_ptr == NULL)
5041 {
5042 log_info_nn ("");
5043
5044 input_buf[input_len] = 0;
5045
5046 format_output (out_fp, input_buf, NULL, 0, 0, NULL, 0);
5047 }
5048 }
5049
5050 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)
5051 {
5052 // left
5053
5054 pot_t pot_left_key;
5055
5056 memcpy (&pot_left_key.hash, hash_left, sizeof (hash_t));
5057
5058 pot_t *pot_left_ptr = (pot_t *) bsearch (&pot_left_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5059
5060 // right
5061
5062 pot_t pot_right_key;
5063
5064 memcpy (&pot_right_key.hash, hash_right, sizeof (hash_t));
5065
5066 pot_t *pot_right_ptr = (pot_t *) bsearch (&pot_right_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5067
5068 uint weak_hash_found = 0;
5069
5070 if (pot_right_ptr == NULL)
5071 {
5072 // special case, if "weak hash"
5073
5074 if (memcmp (hash_right->digest, LM_WEAK_HASH, 8) == 0)
5075 {
5076 weak_hash_found = 1;
5077
5078 // we just need that pot_right_ptr is not a NULL pointer
5079
5080 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5081 }
5082 }
5083
5084 if ((pot_left_ptr != NULL) && (pot_right_ptr != NULL))
5085 {
5086 if (weak_hash_found == 1) myfree (pot_right_ptr);
5087
5088 return;
5089 }
5090
5091 // ... at least one part was not cracked
5092
5093 log_info_nn ("");
5094
5095 input_buf[input_len] = 0;
5096
5097 // only show the hash part which is still not cracked
5098
5099 uint user_len = input_len - 32;
5100
5101 char *hash_output = (char *) mymalloc (33);
5102
5103 memcpy (hash_output, input_buf, input_len);
5104
5105 if (pot_left_ptr != NULL)
5106 {
5107 // only show right part (because left part was already found)
5108
5109 memcpy (hash_output + user_len, input_buf + user_len + 16, 16);
5110
5111 hash_output[user_len + 16] = 0;
5112 }
5113
5114 if (pot_right_ptr != NULL)
5115 {
5116 // only show left part (because right part was already found)
5117
5118 memcpy (hash_output + user_len, input_buf + user_len, 16);
5119
5120 hash_output[user_len + 16] = 0;
5121 }
5122
5123 format_output (out_fp, hash_output, NULL, 0, 0, NULL, 0);
5124
5125 myfree (hash_output);
5126
5127 if (weak_hash_found == 1) myfree (pot_right_ptr);
5128 }
5129
5130 uint setup_opencl_platforms_filter (char *opencl_platforms)
5131 {
5132 uint opencl_platforms_filter = 0;
5133
5134 if (opencl_platforms)
5135 {
5136 char *platforms = strdup (opencl_platforms);
5137
5138 char *next = strtok (platforms, ",");
5139
5140 do
5141 {
5142 int platform = atoi (next);
5143
5144 if (platform < 1 || platform > 32)
5145 {
5146 log_error ("ERROR: invalid OpenCL platform %u specified", platform);
5147
5148 exit (-1);
5149 }
5150
5151 opencl_platforms_filter |= 1 << (platform - 1);
5152
5153 } while ((next = strtok (NULL, ",")) != NULL);
5154
5155 free (platforms);
5156 }
5157 else
5158 {
5159 opencl_platforms_filter = -1;
5160 }
5161
5162 return opencl_platforms_filter;
5163 }
5164
5165 u32 setup_devices_filter (char *opencl_devices)
5166 {
5167 u32 devices_filter = 0;
5168
5169 if (opencl_devices)
5170 {
5171 char *devices = strdup (opencl_devices);
5172
5173 char *next = strtok (devices, ",");
5174
5175 do
5176 {
5177 int device_id = atoi (next);
5178
5179 if (device_id < 1 || device_id > 32)
5180 {
5181 log_error ("ERROR: invalid device_id %u specified", device_id);
5182
5183 exit (-1);
5184 }
5185
5186 devices_filter |= 1 << (device_id - 1);
5187
5188 } while ((next = strtok (NULL, ",")) != NULL);
5189
5190 free (devices);
5191 }
5192 else
5193 {
5194 devices_filter = -1;
5195 }
5196
5197 return devices_filter;
5198 }
5199
5200 cl_device_type setup_device_types_filter (char *opencl_device_types)
5201 {
5202 cl_device_type device_types_filter = 0;
5203
5204 if (opencl_device_types)
5205 {
5206 char *device_types = strdup (opencl_device_types);
5207
5208 char *next = strtok (device_types, ",");
5209
5210 do
5211 {
5212 int device_type = atoi (next);
5213
5214 if (device_type < 1 || device_type > 3)
5215 {
5216 log_error ("ERROR: invalid device_type %u specified", device_type);
5217
5218 exit (-1);
5219 }
5220
5221 device_types_filter |= 1 << device_type;
5222
5223 } while ((next = strtok (NULL, ",")) != NULL);
5224
5225 free (device_types);
5226 }
5227 else
5228 {
5229 // Do not use CPU by default, this often reduces GPU performance because
5230 // the CPU is too busy to handle GPU synchronization
5231
5232 device_types_filter = CL_DEVICE_TYPE_ALL & ~CL_DEVICE_TYPE_CPU;
5233 }
5234
5235 return device_types_filter;
5236 }
5237
5238 u32 get_random_num (const u32 min, const u32 max)
5239 {
5240 if (min == max) return (min);
5241
5242 return ((rand () % (max - min)) + min);
5243 }
5244
5245 u32 mydivc32 (const u32 dividend, const u32 divisor)
5246 {
5247 u32 quotient = dividend / divisor;
5248
5249 if (dividend % divisor) quotient++;
5250
5251 return quotient;
5252 }
5253
5254 u64 mydivc64 (const u64 dividend, const u64 divisor)
5255 {
5256 u64 quotient = dividend / divisor;
5257
5258 if (dividend % divisor) quotient++;
5259
5260 return quotient;
5261 }
5262
5263 void format_timer_display (struct tm *tm, char *buf, size_t len)
5264 {
5265 const char *time_entities_s[] = { "year", "day", "hour", "min", "sec" };
5266 const char *time_entities_m[] = { "years", "days", "hours", "mins", "secs" };
5267
5268 if (tm->tm_year - 70)
5269 {
5270 char *time_entity1 = ((tm->tm_year - 70) == 1) ? (char *) time_entities_s[0] : (char *) time_entities_m[0];
5271 char *time_entity2 = ( tm->tm_yday == 1) ? (char *) time_entities_s[1] : (char *) time_entities_m[1];
5272
5273 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_year - 70, time_entity1, tm->tm_yday, time_entity2);
5274 }
5275 else if (tm->tm_yday)
5276 {
5277 char *time_entity1 = (tm->tm_yday == 1) ? (char *) time_entities_s[1] : (char *) time_entities_m[1];
5278 char *time_entity2 = (tm->tm_hour == 1) ? (char *) time_entities_s[2] : (char *) time_entities_m[2];
5279
5280 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_yday, time_entity1, tm->tm_hour, time_entity2);
5281 }
5282 else if (tm->tm_hour)
5283 {
5284 char *time_entity1 = (tm->tm_hour == 1) ? (char *) time_entities_s[2] : (char *) time_entities_m[2];
5285 char *time_entity2 = (tm->tm_min == 1) ? (char *) time_entities_s[3] : (char *) time_entities_m[3];
5286
5287 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_hour, time_entity1, tm->tm_min, time_entity2);
5288 }
5289 else if (tm->tm_min)
5290 {
5291 char *time_entity1 = (tm->tm_min == 1) ? (char *) time_entities_s[3] : (char *) time_entities_m[3];
5292 char *time_entity2 = (tm->tm_sec == 1) ? (char *) time_entities_s[4] : (char *) time_entities_m[4];
5293
5294 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_min, time_entity1, tm->tm_sec, time_entity2);
5295 }
5296 else
5297 {
5298 char *time_entity1 = (tm->tm_sec == 1) ? (char *) time_entities_s[4] : (char *) time_entities_m[4];
5299
5300 snprintf (buf, len - 1, "%d %s", tm->tm_sec, time_entity1);
5301 }
5302 }
5303
5304 void format_speed_display (float val, char *buf, size_t len)
5305 {
5306 if (val <= 0)
5307 {
5308 buf[0] = '0';
5309 buf[1] = ' ';
5310 buf[2] = 0;
5311
5312 return;
5313 }
5314
5315 char units[7] = { ' ', 'k', 'M', 'G', 'T', 'P', 'E' };
5316
5317 uint level = 0;
5318
5319 while (val > 99999)
5320 {
5321 val /= 1000;
5322
5323 level++;
5324 }
5325
5326 /* generate output */
5327
5328 if (level == 0)
5329 {
5330 snprintf (buf, len - 1, "%.0f ", val);
5331 }
5332 else
5333 {
5334 snprintf (buf, len - 1, "%.1f %c", val, units[level]);
5335 }
5336 }
5337
5338 void lowercase (u8 *buf, int len)
5339 {
5340 for (int i = 0; i < len; i++) buf[i] = tolower (buf[i]);
5341 }
5342
5343 void uppercase (u8 *buf, int len)
5344 {
5345 for (int i = 0; i < len; i++) buf[i] = toupper (buf[i]);
5346 }
5347
5348 int fgetl (FILE *fp, char *line_buf)
5349 {
5350 int line_len = 0;
5351
5352 while (!feof (fp))
5353 {
5354 const int c = fgetc (fp);
5355
5356 if (c == EOF) break;
5357
5358 line_buf[line_len] = (char) c;
5359
5360 line_len++;
5361
5362 if (line_len == BUFSIZ) line_len--;
5363
5364 if (c == '\n') break;
5365 }
5366
5367 if (line_len == 0) return 0;
5368
5369 if (line_buf[line_len - 1] == '\n')
5370 {
5371 line_len--;
5372
5373 line_buf[line_len] = 0;
5374 }
5375
5376 if (line_len == 0) return 0;
5377
5378 if (line_buf[line_len - 1] == '\r')
5379 {
5380 line_len--;
5381
5382 line_buf[line_len] = 0;
5383 }
5384
5385 return (line_len);
5386 }
5387
5388 int in_superchop (char *buf)
5389 {
5390 int len = strlen (buf);
5391
5392 while (len)
5393 {
5394 if (buf[len - 1] == '\n')
5395 {
5396 len--;
5397
5398 continue;
5399 }
5400
5401 if (buf[len - 1] == '\r')
5402 {
5403 len--;
5404
5405 continue;
5406 }
5407
5408 break;
5409 }
5410
5411 buf[len] = 0;
5412
5413 return len;
5414 }
5415
5416 char **scan_directory (const char *path)
5417 {
5418 char *tmp_path = mystrdup (path);
5419
5420 size_t tmp_path_len = strlen (tmp_path);
5421
5422 while (tmp_path[tmp_path_len - 1] == '/' || tmp_path[tmp_path_len - 1] == '\\')
5423 {
5424 tmp_path[tmp_path_len - 1] = 0;
5425
5426 tmp_path_len = strlen (tmp_path);
5427 }
5428
5429 char **files = NULL;
5430
5431 int num_files = 0;
5432
5433 DIR *d = NULL;
5434
5435 if ((d = opendir (tmp_path)) != NULL)
5436 {
5437 #ifdef OSX
5438 struct dirent e;
5439
5440 for (;;) {
5441 memset (&e, 0, sizeof (e));
5442 struct dirent *de = NULL;
5443
5444 if (readdir_r (d, &e, &de) != 0)
5445 {
5446 log_error ("ERROR: readdir_r() failed");
5447
5448 break;
5449 }
5450
5451 if (de == NULL) break;
5452 #else
5453 struct dirent *de;
5454
5455 while ((de = readdir (d)) != NULL)
5456 {
5457 #endif
5458 if ((strcmp (de->d_name, ".") == 0) || (strcmp (de->d_name, "..") == 0)) continue;
5459
5460 int path_size = strlen (tmp_path) + 1 + strlen (de->d_name);
5461
5462 char *path_file = (char *) mymalloc (path_size + 1);
5463
5464 snprintf (path_file, path_size + 1, "%s/%s", tmp_path, de->d_name);
5465
5466 path_file[path_size] = 0;
5467
5468 DIR *d_test;
5469
5470 if ((d_test = opendir (path_file)) != NULL)
5471 {
5472 closedir (d_test);
5473
5474 myfree (path_file);
5475 }
5476 else
5477 {
5478 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5479
5480 num_files++;
5481
5482 files[num_files - 1] = path_file;
5483 }
5484 }
5485
5486 closedir (d);
5487 }
5488 else if (errno == ENOTDIR)
5489 {
5490 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5491
5492 num_files++;
5493
5494 files[num_files - 1] = mystrdup (path);
5495 }
5496
5497 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5498
5499 num_files++;
5500
5501 files[num_files - 1] = NULL;
5502
5503 myfree (tmp_path);
5504
5505 return (files);
5506 }
5507
5508 int count_dictionaries (char **dictionary_files)
5509 {
5510 if (dictionary_files == NULL) return 0;
5511
5512 int cnt = 0;
5513
5514 for (int d = 0; dictionary_files[d] != NULL; d++)
5515 {
5516 cnt++;
5517 }
5518
5519 return (cnt);
5520 }
5521
5522 char *stroptitype (const uint opti_type)
5523 {
5524 switch (opti_type)
5525 {
5526 case OPTI_TYPE_ZERO_BYTE: return ((char *) OPTI_STR_ZERO_BYTE); break;
5527 case OPTI_TYPE_PRECOMPUTE_INIT: return ((char *) OPTI_STR_PRECOMPUTE_INIT); break;
5528 case OPTI_TYPE_PRECOMPUTE_MERKLE: return ((char *) OPTI_STR_PRECOMPUTE_MERKLE); break;
5529 case OPTI_TYPE_PRECOMPUTE_PERMUT: return ((char *) OPTI_STR_PRECOMPUTE_PERMUT); break;
5530 case OPTI_TYPE_MEET_IN_MIDDLE: return ((char *) OPTI_STR_MEET_IN_MIDDLE); break;
5531 case OPTI_TYPE_EARLY_SKIP: return ((char *) OPTI_STR_EARLY_SKIP); break;
5532 case OPTI_TYPE_NOT_SALTED: return ((char *) OPTI_STR_NOT_SALTED); break;
5533 case OPTI_TYPE_NOT_ITERATED: return ((char *) OPTI_STR_NOT_ITERATED); break;
5534 case OPTI_TYPE_PREPENDED_SALT: return ((char *) OPTI_STR_PREPENDED_SALT); break;
5535 case OPTI_TYPE_APPENDED_SALT: return ((char *) OPTI_STR_APPENDED_SALT); break;
5536 case OPTI_TYPE_SINGLE_HASH: return ((char *) OPTI_STR_SINGLE_HASH); break;
5537 case OPTI_TYPE_SINGLE_SALT: return ((char *) OPTI_STR_SINGLE_SALT); break;
5538 case OPTI_TYPE_BRUTE_FORCE: return ((char *) OPTI_STR_BRUTE_FORCE); break;
5539 case OPTI_TYPE_RAW_HASH: return ((char *) OPTI_STR_RAW_HASH); break;
5540 }
5541
5542 return (NULL);
5543 }
5544
5545 char *strparser (const uint parser_status)
5546 {
5547 switch (parser_status)
5548 {
5549 case PARSER_OK: return ((char *) PA_000); break;
5550 case PARSER_COMMENT: return ((char *) PA_001); break;
5551 case PARSER_GLOBAL_ZERO: return ((char *) PA_002); break;
5552 case PARSER_GLOBAL_LENGTH: return ((char *) PA_003); break;
5553 case PARSER_HASH_LENGTH: return ((char *) PA_004); break;
5554 case PARSER_HASH_VALUE: return ((char *) PA_005); break;
5555 case PARSER_SALT_LENGTH: return ((char *) PA_006); break;
5556 case PARSER_SALT_VALUE: return ((char *) PA_007); break;
5557 case PARSER_SALT_ITERATION: return ((char *) PA_008); break;
5558 case PARSER_SEPARATOR_UNMATCHED: return ((char *) PA_009); break;
5559 case PARSER_SIGNATURE_UNMATCHED: return ((char *) PA_010); break;
5560 case PARSER_HCCAP_FILE_SIZE: return ((char *) PA_011); break;
5561 case PARSER_HCCAP_EAPOL_SIZE: return ((char *) PA_012); break;
5562 case PARSER_PSAFE2_FILE_SIZE: return ((char *) PA_013); break;
5563 case PARSER_PSAFE3_FILE_SIZE: return ((char *) PA_014); break;
5564 case PARSER_TC_FILE_SIZE: return ((char *) PA_015); break;
5565 case PARSER_SIP_AUTH_DIRECTIVE: return ((char *) PA_016); break;
5566 }
5567
5568 return ((char *) PA_255);
5569 }
5570
5571 char *strhashtype (const uint hash_mode)
5572 {
5573 switch (hash_mode)
5574 {
5575 case 0: return ((char *) HT_00000); break;
5576 case 10: return ((char *) HT_00010); break;
5577 case 11: return ((char *) HT_00011); break;
5578 case 12: return ((char *) HT_00012); break;
5579 case 20: return ((char *) HT_00020); break;
5580 case 21: return ((char *) HT_00021); break;
5581 case 22: return ((char *) HT_00022); break;
5582 case 23: return ((char *) HT_00023); break;
5583 case 30: return ((char *) HT_00030); break;
5584 case 40: return ((char *) HT_00040); break;
5585 case 50: return ((char *) HT_00050); break;
5586 case 60: return ((char *) HT_00060); break;
5587 case 100: return ((char *) HT_00100); break;
5588 case 101: return ((char *) HT_00101); break;
5589 case 110: return ((char *) HT_00110); break;
5590 case 111: return ((char *) HT_00111); break;
5591 case 112: return ((char *) HT_00112); break;
5592 case 120: return ((char *) HT_00120); break;
5593 case 121: return ((char *) HT_00121); break;
5594 case 122: return ((char *) HT_00122); break;
5595 case 124: return ((char *) HT_00124); break;
5596 case 130: return ((char *) HT_00130); break;
5597 case 131: return ((char *) HT_00131); break;
5598 case 132: return ((char *) HT_00132); break;
5599 case 133: return ((char *) HT_00133); break;
5600 case 140: return ((char *) HT_00140); break;
5601 case 141: return ((char *) HT_00141); break;
5602 case 150: return ((char *) HT_00150); break;
5603 case 160: return ((char *) HT_00160); break;
5604 case 190: return ((char *) HT_00190); break;
5605 case 200: return ((char *) HT_00200); break;
5606 case 300: return ((char *) HT_00300); break;
5607 case 400: return ((char *) HT_00400); break;
5608 case 500: return ((char *) HT_00500); break;
5609 case 501: return ((char *) HT_00501); break;
5610 case 900: return ((char *) HT_00900); break;
5611 case 910: return ((char *) HT_00910); break;
5612 case 1000: return ((char *) HT_01000); break;
5613 case 1100: return ((char *) HT_01100); break;
5614 case 1400: return ((char *) HT_01400); break;
5615 case 1410: return ((char *) HT_01410); break;
5616 case 1420: return ((char *) HT_01420); break;
5617 case 1421: return ((char *) HT_01421); break;
5618 case 1430: return ((char *) HT_01430); break;
5619 case 1440: return ((char *) HT_01440); break;
5620 case 1441: return ((char *) HT_01441); break;
5621 case 1450: return ((char *) HT_01450); break;
5622 case 1460: return ((char *) HT_01460); break;
5623 case 1500: return ((char *) HT_01500); break;
5624 case 1600: return ((char *) HT_01600); break;
5625 case 1700: return ((char *) HT_01700); break;
5626 case 1710: return ((char *) HT_01710); break;
5627 case 1711: return ((char *) HT_01711); break;
5628 case 1720: return ((char *) HT_01720); break;
5629 case 1722: return ((char *) HT_01722); break;
5630 case 1730: return ((char *) HT_01730); break;
5631 case 1731: return ((char *) HT_01731); break;
5632 case 1740: return ((char *) HT_01740); break;
5633 case 1750: return ((char *) HT_01750); break;
5634 case 1760: return ((char *) HT_01760); break;
5635 case 1800: return ((char *) HT_01800); break;
5636 case 2100: return ((char *) HT_02100); break;
5637 case 2400: return ((char *) HT_02400); break;
5638 case 2410: return ((char *) HT_02410); break;
5639 case 2500: return ((char *) HT_02500); break;
5640 case 2600: return ((char *) HT_02600); break;
5641 case 2611: return ((char *) HT_02611); break;
5642 case 2612: return ((char *) HT_02612); break;
5643 case 2711: return ((char *) HT_02711); break;
5644 case 2811: return ((char *) HT_02811); break;
5645 case 3000: return ((char *) HT_03000); break;
5646 case 3100: return ((char *) HT_03100); break;
5647 case 3200: return ((char *) HT_03200); break;
5648 case 3710: return ((char *) HT_03710); break;
5649 case 3711: return ((char *) HT_03711); break;
5650 case 3800: return ((char *) HT_03800); break;
5651 case 4300: return ((char *) HT_04300); break;
5652 case 4400: return ((char *) HT_04400); break;
5653 case 4500: return ((char *) HT_04500); break;
5654 case 4700: return ((char *) HT_04700); break;
5655 case 4800: return ((char *) HT_04800); break;
5656 case 4900: return ((char *) HT_04900); break;
5657 case 5000: return ((char *) HT_05000); break;
5658 case 5100: return ((char *) HT_05100); break;
5659 case 5200: return ((char *) HT_05200); break;
5660 case 5300: return ((char *) HT_05300); break;
5661 case 5400: return ((char *) HT_05400); break;
5662 case 5500: return ((char *) HT_05500); break;
5663 case 5600: return ((char *) HT_05600); break;
5664 case 5700: return ((char *) HT_05700); break;
5665 case 5800: return ((char *) HT_05800); break;
5666 case 6000: return ((char *) HT_06000); break;
5667 case 6100: return ((char *) HT_06100); break;
5668 case 6211: return ((char *) HT_06211); break;
5669 case 6212: return ((char *) HT_06212); break;
5670 case 6213: return ((char *) HT_06213); break;
5671 case 6221: return ((char *) HT_06221); break;
5672 case 6222: return ((char *) HT_06222); break;
5673 case 6223: return ((char *) HT_06223); break;
5674 case 6231: return ((char *) HT_06231); break;
5675 case 6232: return ((char *) HT_06232); break;
5676 case 6233: return ((char *) HT_06233); break;
5677 case 6241: return ((char *) HT_06241); break;
5678 case 6242: return ((char *) HT_06242); break;
5679 case 6243: return ((char *) HT_06243); break;
5680 case 6300: return ((char *) HT_06300); break;
5681 case 6400: return ((char *) HT_06400); break;
5682 case 6500: return ((char *) HT_06500); break;
5683 case 6600: return ((char *) HT_06600); break;
5684 case 6700: return ((char *) HT_06700); break;
5685 case 6800: return ((char *) HT_06800); break;
5686 case 6900: return ((char *) HT_06900); break;
5687 case 7100: return ((char *) HT_07100); break;
5688 case 7200: return ((char *) HT_07200); break;
5689 case 7300: return ((char *) HT_07300); break;
5690 case 7400: return ((char *) HT_07400); break;
5691 case 7500: return ((char *) HT_07500); break;
5692 case 7600: return ((char *) HT_07600); break;
5693 case 7700: return ((char *) HT_07700); break;
5694 case 7800: return ((char *) HT_07800); break;
5695 case 7900: return ((char *) HT_07900); break;
5696 case 8000: return ((char *) HT_08000); break;
5697 case 8100: return ((char *) HT_08100); break;
5698 case 8200: return ((char *) HT_08200); break;
5699 case 8300: return ((char *) HT_08300); break;
5700 case 8400: return ((char *) HT_08400); break;
5701 case 8500: return ((char *) HT_08500); break;
5702 case 8600: return ((char *) HT_08600); break;
5703 case 8700: return ((char *) HT_08700); break;
5704 case 8800: return ((char *) HT_08800); break;
5705 case 8900: return ((char *) HT_08900); break;
5706 case 9000: return ((char *) HT_09000); break;
5707 case 9100: return ((char *) HT_09100); break;
5708 case 9200: return ((char *) HT_09200); break;
5709 case 9300: return ((char *) HT_09300); break;
5710 case 9400: return ((char *) HT_09400); break;
5711 case 9500: return ((char *) HT_09500); break;
5712 case 9600: return ((char *) HT_09600); break;
5713 case 9700: return ((char *) HT_09700); break;
5714 case 9710: return ((char *) HT_09710); break;
5715 case 9720: return ((char *) HT_09720); break;
5716 case 9800: return ((char *) HT_09800); break;
5717 case 9810: return ((char *) HT_09810); break;
5718 case 9820: return ((char *) HT_09820); break;
5719 case 9900: return ((char *) HT_09900); break;
5720 case 10000: return ((char *) HT_10000); break;
5721 case 10100: return ((char *) HT_10100); break;
5722 case 10200: return ((char *) HT_10200); break;
5723 case 10300: return ((char *) HT_10300); break;
5724 case 10400: return ((char *) HT_10400); break;
5725 case 10410: return ((char *) HT_10410); break;
5726 case 10420: return ((char *) HT_10420); break;
5727 case 10500: return ((char *) HT_10500); break;
5728 case 10600: return ((char *) HT_10600); break;
5729 case 10700: return ((char *) HT_10700); break;
5730 case 10800: return ((char *) HT_10800); break;
5731 case 10900: return ((char *) HT_10900); break;
5732 case 11000: return ((char *) HT_11000); break;
5733 case 11100: return ((char *) HT_11100); break;
5734 case 11200: return ((char *) HT_11200); break;
5735 case 11300: return ((char *) HT_11300); break;
5736 case 11400: return ((char *) HT_11400); break;
5737 case 11500: return ((char *) HT_11500); break;
5738 case 11600: return ((char *) HT_11600); break;
5739 case 11700: return ((char *) HT_11700); break;
5740 case 11800: return ((char *) HT_11800); break;
5741 case 11900: return ((char *) HT_11900); break;
5742 case 12000: return ((char *) HT_12000); break;
5743 case 12100: return ((char *) HT_12100); break;
5744 case 12200: return ((char *) HT_12200); break;
5745 case 12300: return ((char *) HT_12300); break;
5746 case 12400: return ((char *) HT_12400); break;
5747 case 12500: return ((char *) HT_12500); break;
5748 case 12600: return ((char *) HT_12600); break;
5749 case 12700: return ((char *) HT_12700); break;
5750 case 12800: return ((char *) HT_12800); break;
5751 case 12900: return ((char *) HT_12900); break;
5752 case 13000: return ((char *) HT_13000); break;
5753 }
5754
5755 return ((char *) "Unknown");
5756 }
5757
5758 char *strstatus (const uint devices_status)
5759 {
5760 switch (devices_status)
5761 {
5762 case STATUS_INIT: return ((char *) ST_0000); break;
5763 case STATUS_STARTING: return ((char *) ST_0001); break;
5764 case STATUS_RUNNING: return ((char *) ST_0002); break;
5765 case STATUS_PAUSED: return ((char *) ST_0003); break;
5766 case STATUS_EXHAUSTED: return ((char *) ST_0004); break;
5767 case STATUS_CRACKED: return ((char *) ST_0005); break;
5768 case STATUS_ABORTED: return ((char *) ST_0006); break;
5769 case STATUS_QUIT: return ((char *) ST_0007); break;
5770 case STATUS_BYPASS: return ((char *) ST_0008); break;
5771 case STATUS_STOP_AT_CHECKPOINT: return ((char *) ST_0009); break;
5772 }
5773
5774 return ((char *) "Unknown");
5775 }
5776
5777 void ascii_digest (char out_buf[4096], uint salt_pos, uint digest_pos)
5778 {
5779 uint hash_type = data.hash_type;
5780 uint hash_mode = data.hash_mode;
5781 uint salt_type = data.salt_type;
5782 uint opts_type = data.opts_type;
5783 uint opti_type = data.opti_type;
5784 uint dgst_size = data.dgst_size;
5785
5786 char *hashfile = data.hashfile;
5787
5788 uint len = 4096;
5789
5790 uint digest_buf[64] = { 0 };
5791
5792 u64 *digest_buf64 = (u64 *) digest_buf;
5793
5794 char *digests_buf_ptr = (char *) data.digests_buf;
5795
5796 memcpy (digest_buf, digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size), dgst_size);
5797
5798 if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT)
5799 {
5800 uint tt;
5801
5802 switch (hash_type)
5803 {
5804 case HASH_TYPE_DESCRYPT:
5805 FP (digest_buf[1], digest_buf[0], tt);
5806 break;
5807
5808 case HASH_TYPE_DESRACF:
5809 digest_buf[0] = rotl32 (digest_buf[0], 29);
5810 digest_buf[1] = rotl32 (digest_buf[1], 29);
5811
5812 FP (digest_buf[1], digest_buf[0], tt);
5813 break;
5814
5815 case HASH_TYPE_LM:
5816 FP (digest_buf[1], digest_buf[0], tt);
5817 break;
5818
5819 case HASH_TYPE_NETNTLM:
5820 digest_buf[0] = rotl32 (digest_buf[0], 29);
5821 digest_buf[1] = rotl32 (digest_buf[1], 29);
5822 digest_buf[2] = rotl32 (digest_buf[2], 29);
5823 digest_buf[3] = rotl32 (digest_buf[3], 29);
5824
5825 FP (digest_buf[1], digest_buf[0], tt);
5826 FP (digest_buf[3], digest_buf[2], tt);
5827 break;
5828
5829 case HASH_TYPE_BSDICRYPT:
5830 digest_buf[0] = rotl32 (digest_buf[0], 31);
5831 digest_buf[1] = rotl32 (digest_buf[1], 31);
5832
5833 FP (digest_buf[1], digest_buf[0], tt);
5834 break;
5835 }
5836 }
5837
5838 if (opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE)
5839 {
5840 switch (hash_type)
5841 {
5842 case HASH_TYPE_MD4:
5843 digest_buf[0] += MD4M_A;
5844 digest_buf[1] += MD4M_B;
5845 digest_buf[2] += MD4M_C;
5846 digest_buf[3] += MD4M_D;
5847 break;
5848
5849 case HASH_TYPE_MD5:
5850 digest_buf[0] += MD5M_A;
5851 digest_buf[1] += MD5M_B;
5852 digest_buf[2] += MD5M_C;
5853 digest_buf[3] += MD5M_D;
5854 break;
5855
5856 case HASH_TYPE_SHA1:
5857 digest_buf[0] += SHA1M_A;
5858 digest_buf[1] += SHA1M_B;
5859 digest_buf[2] += SHA1M_C;
5860 digest_buf[3] += SHA1M_D;
5861 digest_buf[4] += SHA1M_E;
5862 break;
5863
5864 case HASH_TYPE_SHA256:
5865 digest_buf[0] += SHA256M_A;
5866 digest_buf[1] += SHA256M_B;
5867 digest_buf[2] += SHA256M_C;
5868 digest_buf[3] += SHA256M_D;
5869 digest_buf[4] += SHA256M_E;
5870 digest_buf[5] += SHA256M_F;
5871 digest_buf[6] += SHA256M_G;
5872 digest_buf[7] += SHA256M_H;
5873 break;
5874
5875 case HASH_TYPE_SHA384:
5876 digest_buf64[0] += SHA384M_A;
5877 digest_buf64[1] += SHA384M_B;
5878 digest_buf64[2] += SHA384M_C;
5879 digest_buf64[3] += SHA384M_D;
5880 digest_buf64[4] += SHA384M_E;
5881 digest_buf64[5] += SHA384M_F;
5882 digest_buf64[6] += 0;
5883 digest_buf64[7] += 0;
5884 break;
5885
5886 case HASH_TYPE_SHA512:
5887 digest_buf64[0] += SHA512M_A;
5888 digest_buf64[1] += SHA512M_B;
5889 digest_buf64[2] += SHA512M_C;
5890 digest_buf64[3] += SHA512M_D;
5891 digest_buf64[4] += SHA512M_E;
5892 digest_buf64[5] += SHA512M_F;
5893 digest_buf64[6] += SHA512M_G;
5894 digest_buf64[7] += SHA512M_H;
5895 break;
5896 }
5897 }
5898
5899 if (opts_type & OPTS_TYPE_PT_GENERATE_LE)
5900 {
5901 if (dgst_size == DGST_SIZE_4_2)
5902 {
5903 for (int i = 0; i < 2; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5904 }
5905 else if (dgst_size == DGST_SIZE_4_4)
5906 {
5907 for (int i = 0; i < 4; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5908 }
5909 else if (dgst_size == DGST_SIZE_4_5)
5910 {
5911 for (int i = 0; i < 5; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5912 }
5913 else if (dgst_size == DGST_SIZE_4_6)
5914 {
5915 for (int i = 0; i < 6; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5916 }
5917 else if (dgst_size == DGST_SIZE_4_8)
5918 {
5919 for (int i = 0; i < 8; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5920 }
5921 else if ((dgst_size == DGST_SIZE_4_16) || (dgst_size == DGST_SIZE_8_8)) // same size, same result :)
5922 {
5923 if (hash_type == HASH_TYPE_WHIRLPOOL)
5924 {
5925 for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5926 }
5927 else if (hash_type == HASH_TYPE_SHA384)
5928 {
5929 for (int i = 0; i < 8; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
5930 }
5931 else if (hash_type == HASH_TYPE_SHA512)
5932 {
5933 for (int i = 0; i < 8; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
5934 }
5935 else if (hash_type == HASH_TYPE_GOST)
5936 {
5937 for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5938 }
5939 }
5940 else if (dgst_size == DGST_SIZE_4_64)
5941 {
5942 for (int i = 0; i < 64; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5943 }
5944 else if (dgst_size == DGST_SIZE_8_25)
5945 {
5946 for (int i = 0; i < 25; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
5947 }
5948 }
5949
5950 uint isSalted = ((data.salt_type == SALT_TYPE_INTERN)
5951 | (data.salt_type == SALT_TYPE_EXTERN)
5952 | (data.salt_type == SALT_TYPE_EMBEDDED));
5953
5954 salt_t salt;
5955
5956 if (isSalted)
5957 {
5958 memset (&salt, 0, sizeof (salt_t));
5959
5960 memcpy (&salt, &data.salts_buf[salt_pos], sizeof (salt_t));
5961
5962 char *ptr = (char *) salt.salt_buf;
5963
5964 uint len = salt.salt_len;
5965
5966 if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT)
5967 {
5968 uint tt;
5969
5970 switch (hash_type)
5971 {
5972 case HASH_TYPE_NETNTLM:
5973
5974 salt.salt_buf[0] = rotr32 (salt.salt_buf[0], 3);
5975 salt.salt_buf[1] = rotr32 (salt.salt_buf[1], 3);
5976
5977 FP (salt.salt_buf[1], salt.salt_buf[0], tt);
5978
5979 break;
5980 }
5981 }
5982
5983 if (opts_type & OPTS_TYPE_ST_UNICODE)
5984 {
5985 for (uint i = 0, j = 0; i < len; i += 1, j += 2)
5986 {
5987 ptr[i] = ptr[j];
5988 }
5989
5990 len = len / 2;
5991 }
5992
5993 if (opts_type & OPTS_TYPE_ST_GENERATE_LE)
5994 {
5995 uint max = salt.salt_len / 4;
5996
5997 if (len % 4) max++;
5998
5999 for (uint i = 0; i < max; i++)
6000 {
6001 salt.salt_buf[i] = byte_swap_32 (salt.salt_buf[i]);
6002 }
6003 }
6004
6005 if (opts_type & OPTS_TYPE_ST_HEX)
6006 {
6007 char tmp[64] = { 0 };
6008
6009 for (uint i = 0, j = 0; i < len; i += 1, j += 2)
6010 {
6011 sprintf (tmp + j, "%02x", (unsigned char) ptr[i]);
6012 }
6013
6014 len = len * 2;
6015
6016 memcpy (ptr, tmp, len);
6017 }
6018
6019 uint memset_size = ((48 - (int) len) > 0) ? (48 - len) : 0;
6020
6021 memset (ptr + len, 0, memset_size);
6022
6023 salt.salt_len = len;
6024 }
6025
6026 //
6027 // some modes require special encoding
6028 //
6029
6030 uint out_buf_plain[256] = { 0 };
6031 uint out_buf_salt[256] = { 0 };
6032
6033 char tmp_buf[1024] = { 0 };
6034
6035 char *ptr_plain = (char *) out_buf_plain;
6036 char *ptr_salt = (char *) out_buf_salt;
6037
6038 if (hash_mode == 22)
6039 {
6040 char username[30] = { 0 };
6041
6042 memcpy (username, salt.salt_buf, salt.salt_len - 22);
6043
6044 char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' };
6045
6046 u16 *ptr = (u16 *) digest_buf;
6047
6048 tmp_buf[ 0] = sig[0];
6049 tmp_buf[ 1] = int_to_base64 (((ptr[1]) >> 12) & 0x3f);
6050 tmp_buf[ 2] = int_to_base64 (((ptr[1]) >> 6) & 0x3f);
6051 tmp_buf[ 3] = int_to_base64 (((ptr[1]) >> 0) & 0x3f);
6052 tmp_buf[ 4] = int_to_base64 (((ptr[0]) >> 12) & 0x3f);
6053 tmp_buf[ 5] = int_to_base64 (((ptr[0]) >> 6) & 0x3f);
6054 tmp_buf[ 6] = sig[1];
6055 tmp_buf[ 7] = int_to_base64 (((ptr[0]) >> 0) & 0x3f);
6056 tmp_buf[ 8] = int_to_base64 (((ptr[3]) >> 12) & 0x3f);
6057 tmp_buf[ 9] = int_to_base64 (((ptr[3]) >> 6) & 0x3f);
6058 tmp_buf[10] = int_to_base64 (((ptr[3]) >> 0) & 0x3f);
6059 tmp_buf[11] = int_to_base64 (((ptr[2]) >> 12) & 0x3f);
6060 tmp_buf[12] = sig[2];
6061 tmp_buf[13] = int_to_base64 (((ptr[2]) >> 6) & 0x3f);
6062 tmp_buf[14] = int_to_base64 (((ptr[2]) >> 0) & 0x3f);
6063 tmp_buf[15] = int_to_base64 (((ptr[5]) >> 12) & 0x3f);
6064 tmp_buf[16] = int_to_base64 (((ptr[5]) >> 6) & 0x3f);
6065 tmp_buf[17] = sig[3];
6066 tmp_buf[18] = int_to_base64 (((ptr[5]) >> 0) & 0x3f);
6067 tmp_buf[19] = int_to_base64 (((ptr[4]) >> 12) & 0x3f);
6068 tmp_buf[20] = int_to_base64 (((ptr[4]) >> 6) & 0x3f);
6069 tmp_buf[21] = int_to_base64 (((ptr[4]) >> 0) & 0x3f);
6070 tmp_buf[22] = int_to_base64 (((ptr[7]) >> 12) & 0x3f);
6071 tmp_buf[23] = sig[4];
6072 tmp_buf[24] = int_to_base64 (((ptr[7]) >> 6) & 0x3f);
6073 tmp_buf[25] = int_to_base64 (((ptr[7]) >> 0) & 0x3f);
6074 tmp_buf[26] = int_to_base64 (((ptr[6]) >> 12) & 0x3f);
6075 tmp_buf[27] = int_to_base64 (((ptr[6]) >> 6) & 0x3f);
6076 tmp_buf[28] = int_to_base64 (((ptr[6]) >> 0) & 0x3f);
6077 tmp_buf[29] = sig[5];
6078
6079 snprintf (out_buf, len-1, "%s:%s",
6080 tmp_buf,
6081 username);
6082 }
6083 else if (hash_mode == 23)
6084 {
6085 // do not show the \nskyper\n part in output
6086
6087 char *salt_buf_ptr = (char *) salt.salt_buf;
6088
6089 salt_buf_ptr[salt.salt_len - 8] = 0;
6090
6091 snprintf (out_buf, len-1, "%08x%08x%08x%08x:%s",
6092 digest_buf[0],
6093 digest_buf[1],
6094 digest_buf[2],
6095 digest_buf[3],
6096 salt_buf_ptr);
6097 }
6098 else if (hash_mode == 101)
6099 {
6100 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6101
6102 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6103 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6104 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6105 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6106 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6107
6108 memcpy (tmp_buf, digest_buf, 20);
6109
6110 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6111
6112 snprintf (out_buf, len-1, "{SHA}%s", ptr_plain);
6113 }
6114 else if (hash_mode == 111)
6115 {
6116 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6117
6118 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6119 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6120 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6121 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6122 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6123
6124 memcpy (tmp_buf, digest_buf, 20);
6125 memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len);
6126
6127 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20 + salt.salt_len, (u8 *) ptr_plain);
6128
6129 snprintf (out_buf, len-1, "{SSHA}%s", ptr_plain);
6130 }
6131 else if (hash_mode == 122)
6132 {
6133 snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x",
6134 (char *) salt.salt_buf,
6135 digest_buf[0],
6136 digest_buf[1],
6137 digest_buf[2],
6138 digest_buf[3],
6139 digest_buf[4]);
6140 }
6141 else if (hash_mode == 124)
6142 {
6143 snprintf (out_buf, len-1, "sha1$%s$%08x%08x%08x%08x%08x",
6144 (char *) salt.salt_buf,
6145 digest_buf[0],
6146 digest_buf[1],
6147 digest_buf[2],
6148 digest_buf[3],
6149 digest_buf[4]);
6150 }
6151 else if (hash_mode == 131)
6152 {
6153 snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6154 (char *) salt.salt_buf,
6155 0, 0, 0, 0, 0,
6156 digest_buf[0],
6157 digest_buf[1],
6158 digest_buf[2],
6159 digest_buf[3],
6160 digest_buf[4]);
6161 }
6162 else if (hash_mode == 132)
6163 {
6164 snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x",
6165 (char *) salt.salt_buf,
6166 digest_buf[0],
6167 digest_buf[1],
6168 digest_buf[2],
6169 digest_buf[3],
6170 digest_buf[4]);
6171 }
6172 else if (hash_mode == 133)
6173 {
6174 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6175
6176 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6177 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6178 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6179 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6180 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6181
6182 memcpy (tmp_buf, digest_buf, 20);
6183
6184 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6185
6186 snprintf (out_buf, len-1, "%s", ptr_plain);
6187 }
6188 else if (hash_mode == 141)
6189 {
6190 memcpy (tmp_buf, salt.salt_buf, salt.salt_len);
6191
6192 base64_encode (int_to_base64, (const u8 *) tmp_buf, salt.salt_len, (u8 *) ptr_salt);
6193
6194 memset (tmp_buf, 0, sizeof (tmp_buf));
6195
6196 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6197
6198 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6199 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6200 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6201 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6202 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6203
6204 memcpy (tmp_buf, digest_buf, 20);
6205
6206 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6207
6208 ptr_plain[27] = 0;
6209
6210 snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER, ptr_salt, ptr_plain);
6211 }
6212 else if (hash_mode == 400)
6213 {
6214 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6215
6216 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6217 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6218 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6219 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6220
6221 phpass_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6222
6223 snprintf (out_buf, len-1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, (char *) ptr_plain);
6224 }
6225 else if (hash_mode == 500)
6226 {
6227 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6228
6229 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6230 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6231 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6232 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6233
6234 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6235
6236 if (salt.salt_iter == ROUNDS_MD5CRYPT)
6237 {
6238 snprintf (out_buf, len-1, "$1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6239 }
6240 else
6241 {
6242 snprintf (out_buf, len-1, "$1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6243 }
6244 }
6245 else if (hash_mode == 501)
6246 {
6247 uint digest_idx = salt.digests_offset + digest_pos;
6248
6249 hashinfo_t **hashinfo_ptr = data.hash_info;
6250 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
6251
6252 snprintf (out_buf, len-1, "%s", hash_buf);
6253 }
6254 else if (hash_mode == 1421)
6255 {
6256 u8 *salt_ptr = (u8 *) salt.salt_buf;
6257
6258 snprintf (out_buf, len-1, "%c%c%c%c%c%c%08x%08x%08x%08x%08x%08x%08x%08x",
6259 salt_ptr[0],
6260 salt_ptr[1],
6261 salt_ptr[2],
6262 salt_ptr[3],
6263 salt_ptr[4],
6264 salt_ptr[5],
6265 digest_buf[0],
6266 digest_buf[1],
6267 digest_buf[2],
6268 digest_buf[3],
6269 digest_buf[4],
6270 digest_buf[5],
6271 digest_buf[6],
6272 digest_buf[7]);
6273 }
6274 else if (hash_mode == 1441)
6275 {
6276 memcpy (tmp_buf, salt.salt_buf, salt.salt_len);
6277
6278 base64_encode (int_to_base64, (const u8 *) tmp_buf, salt.salt_len, (u8 *) ptr_salt);
6279
6280 memset (tmp_buf, 0, sizeof (tmp_buf));
6281
6282 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6283
6284 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6285 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6286 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6287 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6288 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6289 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6290 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6291 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6292
6293 memcpy (tmp_buf, digest_buf, 32);
6294
6295 base64_encode (int_to_base64, (const u8 *) tmp_buf, 32, (u8 *) ptr_plain);
6296
6297 ptr_plain[43] = 0;
6298
6299 snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER4, ptr_salt, ptr_plain);
6300 }
6301 else if (hash_mode == 1500)
6302 {
6303 out_buf[0] = salt.salt_sign[0] & 0xff;
6304 out_buf[1] = salt.salt_sign[1] & 0xff;
6305 //original method, but changed because of this ticket: https://hashcat.net/trac/ticket/269
6306 //out_buf[0] = int_to_itoa64 ((salt.salt_buf[0] >> 0) & 0x3f);
6307 //out_buf[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f);
6308
6309 memset (tmp_buf, 0, sizeof (tmp_buf));
6310
6311 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6312
6313 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6314 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6315
6316 memcpy (tmp_buf, digest_buf, 8);
6317
6318 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 8, (u8 *) ptr_plain);
6319
6320 snprintf (out_buf + 2, len-1-2, "%s", ptr_plain);
6321
6322 out_buf[13] = 0;
6323 }
6324 else if (hash_mode == 1600)
6325 {
6326 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6327
6328 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6329 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6330 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6331 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6332
6333 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6334
6335 if (salt.salt_iter == ROUNDS_MD5CRYPT)
6336 {
6337 snprintf (out_buf, len-1, "$apr1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6338 }
6339 else
6340 {
6341 snprintf (out_buf, len-1, "$apr1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6342 }
6343 }
6344 else if (hash_mode == 1711)
6345 {
6346 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6347
6348 digest_buf64[0] = byte_swap_64 (digest_buf64[0]);
6349 digest_buf64[1] = byte_swap_64 (digest_buf64[1]);
6350 digest_buf64[2] = byte_swap_64 (digest_buf64[2]);
6351 digest_buf64[3] = byte_swap_64 (digest_buf64[3]);
6352 digest_buf64[4] = byte_swap_64 (digest_buf64[4]);
6353 digest_buf64[5] = byte_swap_64 (digest_buf64[5]);
6354 digest_buf64[6] = byte_swap_64 (digest_buf64[6]);
6355 digest_buf64[7] = byte_swap_64 (digest_buf64[7]);
6356
6357 memcpy (tmp_buf, digest_buf, 64);
6358 memcpy (tmp_buf + 64, salt.salt_buf, salt.salt_len);
6359
6360 base64_encode (int_to_base64, (const u8 *) tmp_buf, 64 + salt.salt_len, (u8 *) ptr_plain);
6361
6362 snprintf (out_buf, len-1, "%s%s", SIGNATURE_SHA512B64S, ptr_plain);
6363 }
6364 else if (hash_mode == 1722)
6365 {
6366 uint *ptr = digest_buf;
6367
6368 snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6369 (unsigned char *) salt.salt_buf,
6370 ptr[ 1], ptr[ 0],
6371 ptr[ 3], ptr[ 2],
6372 ptr[ 5], ptr[ 4],
6373 ptr[ 7], ptr[ 6],
6374 ptr[ 9], ptr[ 8],
6375 ptr[11], ptr[10],
6376 ptr[13], ptr[12],
6377 ptr[15], ptr[14]);
6378 }
6379 else if (hash_mode == 1731)
6380 {
6381 uint *ptr = digest_buf;
6382
6383 snprintf (out_buf, len-1, "0x0200%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6384 (unsigned char *) salt.salt_buf,
6385 ptr[ 1], ptr[ 0],
6386 ptr[ 3], ptr[ 2],
6387 ptr[ 5], ptr[ 4],
6388 ptr[ 7], ptr[ 6],
6389 ptr[ 9], ptr[ 8],
6390 ptr[11], ptr[10],
6391 ptr[13], ptr[12],
6392 ptr[15], ptr[14]);
6393 }
6394 else if (hash_mode == 1800)
6395 {
6396 // temp workaround
6397
6398 digest_buf64[0] = byte_swap_64 (digest_buf64[0]);
6399 digest_buf64[1] = byte_swap_64 (digest_buf64[1]);
6400 digest_buf64[2] = byte_swap_64 (digest_buf64[2]);
6401 digest_buf64[3] = byte_swap_64 (digest_buf64[3]);
6402 digest_buf64[4] = byte_swap_64 (digest_buf64[4]);
6403 digest_buf64[5] = byte_swap_64 (digest_buf64[5]);
6404 digest_buf64[6] = byte_swap_64 (digest_buf64[6]);
6405 digest_buf64[7] = byte_swap_64 (digest_buf64[7]);
6406
6407 sha512crypt_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
6408
6409 if (salt.salt_iter == ROUNDS_SHA512CRYPT)
6410 {
6411 snprintf (out_buf, len-1, "$6$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6412 }
6413 else
6414 {
6415 snprintf (out_buf, len-1, "$6$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6416 }
6417 }
6418 else if (hash_mode == 2100)
6419 {
6420 uint pos = 0;
6421
6422 snprintf (out_buf + pos, len-1, "%s%i#",
6423 SIGNATURE_DCC2,
6424 salt.salt_iter + 1);
6425
6426 uint signature_len = strlen (out_buf);
6427
6428 pos += signature_len;
6429 len -= signature_len;
6430
6431 char *salt_ptr = (char *) salt.salt_buf;
6432
6433 for (uint i = 0; i < salt.salt_len; i++, pos++, len--) snprintf (out_buf + pos, len-1, "%c", salt_ptr[i]);
6434
6435 snprintf (out_buf + pos, len-1, "#%08x%08x%08x%08x",
6436 byte_swap_32 (digest_buf[0]),
6437 byte_swap_32 (digest_buf[1]),
6438 byte_swap_32 (digest_buf[2]),
6439 byte_swap_32 (digest_buf[3]));
6440 }
6441 else if ((hash_mode == 2400) || (hash_mode == 2410))
6442 {
6443 memcpy (tmp_buf, digest_buf, 16);
6444
6445 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6446
6447 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6448 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6449 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6450 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6451
6452 out_buf[ 0] = int_to_itoa64 ((digest_buf[0] >> 0) & 0x3f);
6453 out_buf[ 1] = int_to_itoa64 ((digest_buf[0] >> 6) & 0x3f);
6454 out_buf[ 2] = int_to_itoa64 ((digest_buf[0] >> 12) & 0x3f);
6455 out_buf[ 3] = int_to_itoa64 ((digest_buf[0] >> 18) & 0x3f);
6456
6457 out_buf[ 4] = int_to_itoa64 ((digest_buf[1] >> 0) & 0x3f);
6458 out_buf[ 5] = int_to_itoa64 ((digest_buf[1] >> 6) & 0x3f);
6459 out_buf[ 6] = int_to_itoa64 ((digest_buf[1] >> 12) & 0x3f);
6460 out_buf[ 7] = int_to_itoa64 ((digest_buf[1] >> 18) & 0x3f);
6461
6462 out_buf[ 8] = int_to_itoa64 ((digest_buf[2] >> 0) & 0x3f);
6463 out_buf[ 9] = int_to_itoa64 ((digest_buf[2] >> 6) & 0x3f);
6464 out_buf[10] = int_to_itoa64 ((digest_buf[2] >> 12) & 0x3f);
6465 out_buf[11] = int_to_itoa64 ((digest_buf[2] >> 18) & 0x3f);
6466
6467 out_buf[12] = int_to_itoa64 ((digest_buf[3] >> 0) & 0x3f);
6468 out_buf[13] = int_to_itoa64 ((digest_buf[3] >> 6) & 0x3f);
6469 out_buf[14] = int_to_itoa64 ((digest_buf[3] >> 12) & 0x3f);
6470 out_buf[15] = int_to_itoa64 ((digest_buf[3] >> 18) & 0x3f);
6471
6472 out_buf[16] = 0;
6473 }
6474 else if (hash_mode == 2500)
6475 {
6476 wpa_t *wpas = (wpa_t *) data.esalts_buf;
6477
6478 wpa_t *wpa = &wpas[salt_pos];
6479
6480 uint pke[25] = { 0 };
6481
6482 char *pke_ptr = (char *) pke;
6483
6484 for (uint i = 0; i < 25; i++)
6485 {
6486 pke[i] = byte_swap_32 (wpa->pke[i]);
6487 }
6488
6489 unsigned char mac1[6] = { 0 };
6490 unsigned char mac2[6] = { 0 };
6491
6492 memcpy (mac1, pke_ptr + 23, 6);
6493 memcpy (mac2, pke_ptr + 29, 6);
6494
6495 snprintf (out_buf, len-1, "%s:%02x%02x%02x%02x%02x%02x:%02x%02x%02x%02x%02x%02x",
6496 (char *) salt.salt_buf,
6497 mac1[0],
6498 mac1[1],
6499 mac1[2],
6500 mac1[3],
6501 mac1[4],
6502 mac1[5],
6503 mac2[0],
6504 mac2[1],
6505 mac2[2],
6506 mac2[3],
6507 mac2[4],
6508 mac2[5]);
6509 }
6510 else if (hash_mode == 4400)
6511 {
6512 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
6513 byte_swap_32 (digest_buf[0]),
6514 byte_swap_32 (digest_buf[1]),
6515 byte_swap_32 (digest_buf[2]),
6516 byte_swap_32 (digest_buf[3]));
6517 }
6518 else if (hash_mode == 4700)
6519 {
6520 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6521 byte_swap_32 (digest_buf[0]),
6522 byte_swap_32 (digest_buf[1]),
6523 byte_swap_32 (digest_buf[2]),
6524 byte_swap_32 (digest_buf[3]),
6525 byte_swap_32 (digest_buf[4]));
6526 }
6527 else if (hash_mode == 4800)
6528 {
6529 u8 chap_id_byte = (u8) salt.salt_buf[4];
6530
6531 snprintf (out_buf, len-1, "%08x%08x%08x%08x:%08x%08x%08x%08x:%02x",
6532 digest_buf[0],
6533 digest_buf[1],
6534 digest_buf[2],
6535 digest_buf[3],
6536 byte_swap_32 (salt.salt_buf[0]),
6537 byte_swap_32 (salt.salt_buf[1]),
6538 byte_swap_32 (salt.salt_buf[2]),
6539 byte_swap_32 (salt.salt_buf[3]),
6540 chap_id_byte);
6541 }
6542 else if (hash_mode == 4900)
6543 {
6544 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6545 byte_swap_32 (digest_buf[0]),
6546 byte_swap_32 (digest_buf[1]),
6547 byte_swap_32 (digest_buf[2]),
6548 byte_swap_32 (digest_buf[3]),
6549 byte_swap_32 (digest_buf[4]));
6550 }
6551 else if (hash_mode == 5100)
6552 {
6553 snprintf (out_buf, len-1, "%08x%08x",
6554 digest_buf[0],
6555 digest_buf[1]);
6556 }
6557 else if (hash_mode == 5200)
6558 {
6559 snprintf (out_buf, len-1, "%s", hashfile);
6560 }
6561 else if (hash_mode == 5300)
6562 {
6563 ikepsk_t *ikepsks = (ikepsk_t *) data.esalts_buf;
6564
6565 ikepsk_t *ikepsk = &ikepsks[salt_pos];
6566
6567 int buf_len = len -1;
6568
6569 // msg_buf
6570
6571 uint ikepsk_msg_len = ikepsk->msg_len / 4;
6572
6573 for (uint i = 0; i < ikepsk_msg_len; i++)
6574 {
6575 if ((i == 32) || (i == 64) || (i == 66) || (i == 68) || (i == 108))
6576 {
6577 snprintf (out_buf, buf_len, ":");
6578
6579 buf_len--;
6580 out_buf++;
6581 }
6582
6583 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->msg_buf[i]));
6584
6585 buf_len -= 8;
6586 out_buf += 8;
6587 }
6588
6589 // nr_buf
6590
6591 uint ikepsk_nr_len = ikepsk->nr_len / 4;
6592
6593 for (uint i = 0; i < ikepsk_nr_len; i++)
6594 {
6595 if ((i == 0) || (i == 5))
6596 {
6597 snprintf (out_buf, buf_len, ":");
6598
6599 buf_len--;
6600 out_buf++;
6601 }
6602
6603 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->nr_buf[i]));
6604
6605 buf_len -= 8;
6606 out_buf += 8;
6607 }
6608
6609 // digest_buf
6610
6611 for (uint i = 0; i < 4; i++)
6612 {
6613 if (i == 0)
6614 {
6615 snprintf (out_buf, buf_len, ":");
6616
6617 buf_len--;
6618 out_buf++;
6619 }
6620
6621 snprintf (out_buf, buf_len, "%08x", digest_buf[i]);
6622
6623 buf_len -= 8;
6624 out_buf += 8;
6625 }
6626 }
6627 else if (hash_mode == 5400)
6628 {
6629 ikepsk_t *ikepsks = (ikepsk_t *) data.esalts_buf;
6630
6631 ikepsk_t *ikepsk = &ikepsks[salt_pos];
6632
6633 int buf_len = len -1;
6634
6635 // msg_buf
6636
6637 uint ikepsk_msg_len = ikepsk->msg_len / 4;
6638
6639 for (uint i = 0; i < ikepsk_msg_len; i++)
6640 {
6641 if ((i == 32) || (i == 64) || (i == 66) || (i == 68) || (i == 108))
6642 {
6643 snprintf (out_buf, buf_len, ":");
6644
6645 buf_len--;
6646 out_buf++;
6647 }
6648
6649 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->msg_buf[i]));
6650
6651 buf_len -= 8;
6652 out_buf += 8;
6653 }
6654
6655 // nr_buf
6656
6657 uint ikepsk_nr_len = ikepsk->nr_len / 4;
6658
6659 for (uint i = 0; i < ikepsk_nr_len; i++)
6660 {
6661 if ((i == 0) || (i == 5))
6662 {
6663 snprintf (out_buf, buf_len, ":");
6664
6665 buf_len--;
6666 out_buf++;
6667 }
6668
6669 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->nr_buf[i]));
6670
6671 buf_len -= 8;
6672 out_buf += 8;
6673 }
6674
6675 // digest_buf
6676
6677 for (uint i = 0; i < 5; i++)
6678 {
6679 if (i == 0)
6680 {
6681 snprintf (out_buf, buf_len, ":");
6682
6683 buf_len--;
6684 out_buf++;
6685 }
6686
6687 snprintf (out_buf, buf_len, "%08x", digest_buf[i]);
6688
6689 buf_len -= 8;
6690 out_buf += 8;
6691 }
6692 }
6693 else if (hash_mode == 5500)
6694 {
6695 netntlm_t *netntlms = (netntlm_t *) data.esalts_buf;
6696
6697 netntlm_t *netntlm = &netntlms[salt_pos];
6698
6699 char user_buf[64] = { 0 };
6700 char domain_buf[64] = { 0 };
6701 char srvchall_buf[1024] = { 0 };
6702 char clichall_buf[1024] = { 0 };
6703
6704 for (uint i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2)
6705 {
6706 char *ptr = (char *) netntlm->userdomain_buf;
6707
6708 user_buf[i] = ptr[j];
6709 }
6710
6711 for (uint i = 0, j = 0; j < netntlm->domain_len; i += 1, j += 2)
6712 {
6713 char *ptr = (char *) netntlm->userdomain_buf;
6714
6715 domain_buf[i] = ptr[netntlm->user_len + j];
6716 }
6717
6718 for (uint i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2)
6719 {
6720 u8 *ptr = (u8 *) netntlm->chall_buf;
6721
6722 sprintf (srvchall_buf + j, "%02x", ptr[i]);
6723 }
6724
6725 for (uint i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2)
6726 {
6727 u8 *ptr = (u8 *) netntlm->chall_buf;
6728
6729 sprintf (clichall_buf + j, "%02x", ptr[netntlm->srvchall_len + i]);
6730 }
6731
6732 snprintf (out_buf, len-1, "%s::%s:%s:%08x%08x%08x%08x%08x%08x:%s",
6733 user_buf,
6734 domain_buf,
6735 srvchall_buf,
6736 digest_buf[0],
6737 digest_buf[1],
6738 digest_buf[2],
6739 digest_buf[3],
6740 byte_swap_32 (salt.salt_buf_pc[0]),
6741 byte_swap_32 (salt.salt_buf_pc[1]),
6742 clichall_buf);
6743 }
6744 else if (hash_mode == 5600)
6745 {
6746 netntlm_t *netntlms = (netntlm_t *) data.esalts_buf;
6747
6748 netntlm_t *netntlm = &netntlms[salt_pos];
6749
6750 char user_buf[64] = { 0 };
6751 char domain_buf[64] = { 0 };
6752 char srvchall_buf[1024] = { 0 };
6753 char clichall_buf[1024] = { 0 };
6754
6755 for (uint i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2)
6756 {
6757 char *ptr = (char *) netntlm->userdomain_buf;
6758
6759 user_buf[i] = ptr[j];
6760 }
6761
6762 for (uint i = 0, j = 0; j < netntlm->domain_len; i += 1, j += 2)
6763 {
6764 char *ptr = (char *) netntlm->userdomain_buf;
6765
6766 domain_buf[i] = ptr[netntlm->user_len + j];
6767 }
6768
6769 for (uint i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2)
6770 {
6771 u8 *ptr = (u8 *) netntlm->chall_buf;
6772
6773 sprintf (srvchall_buf + j, "%02x", ptr[i]);
6774 }
6775
6776 for (uint i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2)
6777 {
6778 u8 *ptr = (u8 *) netntlm->chall_buf;
6779
6780 sprintf (clichall_buf + j, "%02x", ptr[netntlm->srvchall_len + i]);
6781 }
6782
6783 snprintf (out_buf, len-1, "%s::%s:%s:%08x%08x%08x%08x:%s",
6784 user_buf,
6785 domain_buf,
6786 srvchall_buf,
6787 digest_buf[0],
6788 digest_buf[1],
6789 digest_buf[2],
6790 digest_buf[3],
6791 clichall_buf);
6792 }
6793 else if (hash_mode == 5700)
6794 {
6795 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6796
6797 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6798 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6799 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6800 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6801 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6802 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6803 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6804 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6805
6806 memcpy (tmp_buf, digest_buf, 32);
6807
6808 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 32, (u8 *) ptr_plain);
6809
6810 ptr_plain[43] = 0;
6811
6812 snprintf (out_buf, len-1, "%s", ptr_plain);
6813 }
6814 else if (hash_mode == 5800)
6815 {
6816 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6817 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6818 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6819 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6820 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6821
6822 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6823 digest_buf[0],
6824 digest_buf[1],
6825 digest_buf[2],
6826 digest_buf[3],
6827 digest_buf[4]);
6828 }
6829 else if ((hash_mode >= 6200) && (hash_mode <= 6299))
6830 {
6831 snprintf (out_buf, len-1, "%s", hashfile);
6832 }
6833 else if (hash_mode == 6300)
6834 {
6835 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6836
6837 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6838 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6839 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6840 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6841
6842 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6843
6844 snprintf (out_buf, len-1, "{smd5}%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6845 }
6846 else if (hash_mode == 6400)
6847 {
6848 sha256aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6849
6850 snprintf (out_buf, len-1, "{ssha256}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
6851 }
6852 else if (hash_mode == 6500)
6853 {
6854 sha512aix_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
6855
6856 snprintf (out_buf, len-1, "{ssha512}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
6857 }
6858 else if (hash_mode == 6600)
6859 {
6860 agilekey_t *agilekeys = (agilekey_t *) data.esalts_buf;
6861
6862 agilekey_t *agilekey = &agilekeys[salt_pos];
6863
6864 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
6865 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
6866
6867 uint buf_len = len - 1;
6868
6869 uint off = snprintf (out_buf, buf_len, "%d:%08x%08x:", salt.salt_iter + 1, salt.salt_buf[0], salt.salt_buf[1]);
6870 buf_len -= 22;
6871
6872 for (uint i = 0, j = off; i < 1040; i++, j += 2)
6873 {
6874 snprintf (out_buf + j, buf_len, "%02x", agilekey->cipher[i]);
6875
6876 buf_len -= 2;
6877 }
6878 }
6879 else if (hash_mode == 6700)
6880 {
6881 sha1aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6882
6883 snprintf (out_buf, len-1, "{ssha1}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
6884 }
6885 else if (hash_mode == 6800)
6886 {
6887 snprintf (out_buf, len-1, "%s", (char *) salt.salt_buf);
6888 }
6889 else if (hash_mode == 7100)
6890 {
6891 uint *ptr = digest_buf;
6892
6893 pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) data.esalts_buf;
6894
6895 pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[salt_pos];
6896
6897 uint esalt[8] = { 0 };
6898
6899 esalt[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]);
6900 esalt[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]);
6901 esalt[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]);
6902 esalt[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]);
6903 esalt[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]);
6904 esalt[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]);
6905 esalt[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]);
6906 esalt[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]);
6907
6908 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",
6909 SIGNATURE_SHA512OSX,
6910 salt.salt_iter + 1,
6911 esalt[ 0], esalt[ 1],
6912 esalt[ 2], esalt[ 3],
6913 esalt[ 4], esalt[ 5],
6914 esalt[ 6], esalt[ 7],
6915 ptr [ 1], ptr [ 0],
6916 ptr [ 3], ptr [ 2],
6917 ptr [ 5], ptr [ 4],
6918 ptr [ 7], ptr [ 6],
6919 ptr [ 9], ptr [ 8],
6920 ptr [11], ptr [10],
6921 ptr [13], ptr [12],
6922 ptr [15], ptr [14]);
6923 }
6924 else if (hash_mode == 7200)
6925 {
6926 uint *ptr = digest_buf;
6927
6928 pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) data.esalts_buf;
6929
6930 pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[salt_pos];
6931
6932 uint len_used = 0;
6933
6934 snprintf (out_buf + len_used, len - len_used - 1, "%s%i.", SIGNATURE_SHA512GRUB, salt.salt_iter + 1);
6935
6936 len_used = strlen (out_buf);
6937
6938 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha512->salt_buf;
6939
6940 for (uint i = 0; i < salt.salt_len; i++, len_used += 2)
6941 {
6942 snprintf (out_buf + len_used, len - len_used - 1, "%02x", salt_buf_ptr[i]);
6943 }
6944
6945 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",
6946 ptr [ 1], ptr [ 0],
6947 ptr [ 3], ptr [ 2],
6948 ptr [ 5], ptr [ 4],
6949 ptr [ 7], ptr [ 6],
6950 ptr [ 9], ptr [ 8],
6951 ptr [11], ptr [10],
6952 ptr [13], ptr [12],
6953 ptr [15], ptr [14]);
6954 }
6955 else if (hash_mode == 7300)
6956 {
6957 rakp_t *rakps = (rakp_t *) data.esalts_buf;
6958
6959 rakp_t *rakp = &rakps[salt_pos];
6960
6961 for (uint i = 0, j = 0; (i * 4) < rakp->salt_len; i += 1, j += 8)
6962 {
6963 sprintf (out_buf + j, "%08x", rakp->salt_buf[i]);
6964 }
6965
6966 snprintf (out_buf + rakp->salt_len * 2, len - 1, ":%08x%08x%08x%08x%08x",
6967 digest_buf[0],
6968 digest_buf[1],
6969 digest_buf[2],
6970 digest_buf[3],
6971 digest_buf[4]);
6972 }
6973 else if (hash_mode == 7400)
6974 {
6975 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6976
6977 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6978 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6979 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6980 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6981 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6982 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6983 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6984 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6985
6986 sha256crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6987
6988 if (salt.salt_iter == ROUNDS_SHA256CRYPT)
6989 {
6990 snprintf (out_buf, len-1, "$5$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6991 }
6992 else
6993 {
6994 snprintf (out_buf, len-1, "$5$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6995 }
6996 }
6997 else if (hash_mode == 7500)
6998 {
6999 krb5pa_t *krb5pas = (krb5pa_t *) data.esalts_buf;
7000
7001 krb5pa_t *krb5pa = &krb5pas[salt_pos];
7002
7003 u8 *ptr_timestamp = (u8 *) krb5pa->timestamp;
7004 u8 *ptr_checksum = (u8 *) krb5pa->checksum;
7005
7006 char data[128] = { 0 };
7007
7008 char *ptr_data = data;
7009
7010 for (uint i = 0; i < 36; i++, ptr_data += 2)
7011 {
7012 sprintf (ptr_data, "%02x", ptr_timestamp[i]);
7013 }
7014
7015 for (uint i = 0; i < 16; i++, ptr_data += 2)
7016 {
7017 sprintf (ptr_data, "%02x", ptr_checksum[i]);
7018 }
7019
7020 *ptr_data = 0;
7021
7022 snprintf (out_buf, len-1, "%s$%s$%s$%s$%s",
7023 SIGNATURE_KRB5PA,
7024 (char *) krb5pa->user,
7025 (char *) krb5pa->realm,
7026 (char *) krb5pa->salt,
7027 data);
7028 }
7029 else if (hash_mode == 7700)
7030 {
7031 snprintf (out_buf, len-1, "%s$%08X%08X",
7032 (char *) salt.salt_buf,
7033 digest_buf[0],
7034 digest_buf[1]);
7035 }
7036 else if (hash_mode == 7800)
7037 {
7038 snprintf (out_buf, len-1, "%s$%08X%08X%08X%08X%08X",
7039 (char *) salt.salt_buf,
7040 digest_buf[0],
7041 digest_buf[1],
7042 digest_buf[2],
7043 digest_buf[3],
7044 digest_buf[4]);
7045 }
7046 else if (hash_mode == 7900)
7047 {
7048 drupal7_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
7049
7050 // ugly hack start
7051
7052 char *tmp = (char *) salt.salt_buf_pc;
7053
7054 ptr_plain[42] = tmp[0];
7055
7056 // ugly hack end
7057
7058 ptr_plain[43] = 0;
7059
7060 snprintf (out_buf, len-1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, (char *) ptr_plain);
7061 }
7062 else if (hash_mode == 8000)
7063 {
7064 snprintf (out_buf, len-1, "0xc007%s%08x%08x%08x%08x%08x%08x%08x%08x",
7065 (unsigned char *) salt.salt_buf,
7066 digest_buf[0],
7067 digest_buf[1],
7068 digest_buf[2],
7069 digest_buf[3],
7070 digest_buf[4],
7071 digest_buf[5],
7072 digest_buf[6],
7073 digest_buf[7]);
7074 }
7075 else if (hash_mode == 8100)
7076 {
7077 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
7078 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
7079
7080 snprintf (out_buf, len-1, "1%s%08x%08x%08x%08x%08x",
7081 (unsigned char *) salt.salt_buf,
7082 digest_buf[0],
7083 digest_buf[1],
7084 digest_buf[2],
7085 digest_buf[3],
7086 digest_buf[4]);
7087 }
7088 else if (hash_mode == 8200)
7089 {
7090 cloudkey_t *cloudkeys = (cloudkey_t *) data.esalts_buf;
7091
7092 cloudkey_t *cloudkey = &cloudkeys[salt_pos];
7093
7094 char data_buf[4096] = { 0 };
7095
7096 for (int i = 0, j = 0; i < 512; i += 1, j += 8)
7097 {
7098 sprintf (data_buf + j, "%08x", cloudkey->data_buf[i]);
7099 }
7100
7101 data_buf[cloudkey->data_len * 2] = 0;
7102
7103 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7104 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7105 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7106 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7107 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7108 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7109 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7110 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7111
7112 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
7113 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
7114 salt.salt_buf[2] = byte_swap_32 (salt.salt_buf[2]);
7115 salt.salt_buf[3] = byte_swap_32 (salt.salt_buf[3]);
7116
7117 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x:%08x%08x%08x%08x:%u:%s",
7118 digest_buf[0],
7119 digest_buf[1],
7120 digest_buf[2],
7121 digest_buf[3],
7122 digest_buf[4],
7123 digest_buf[5],
7124 digest_buf[6],
7125 digest_buf[7],
7126 salt.salt_buf[0],
7127 salt.salt_buf[1],
7128 salt.salt_buf[2],
7129 salt.salt_buf[3],
7130 salt.salt_iter + 1,
7131 data_buf);
7132 }
7133 else if (hash_mode == 8300)
7134 {
7135 char digest_buf_c[34] = { 0 };
7136
7137 base32_encode (int_to_itoa32, (const u8 *) digest_buf, 20, (u8 *) digest_buf_c);
7138
7139 digest_buf_c[32] = 0;
7140
7141 // domain
7142
7143 const uint salt_pc_len = salt.salt_buf_pc[7]; // what a hack
7144
7145 char domain_buf_c[33] = { 0 };
7146
7147 memcpy (domain_buf_c, (char *) salt.salt_buf_pc, salt_pc_len);
7148
7149 for (uint i = 0; i < salt_pc_len; i++)
7150 {
7151 const char next = domain_buf_c[i];
7152
7153 domain_buf_c[i] = '.';
7154
7155 i += next;
7156 }
7157
7158 domain_buf_c[salt_pc_len] = 0;
7159
7160 // final
7161
7162 snprintf (out_buf, len-1, "%s:%s:%s:%u", digest_buf_c, domain_buf_c, (char *) salt.salt_buf, salt.salt_iter);
7163 }
7164 else if (hash_mode == 8500)
7165 {
7166 snprintf (out_buf, len-1, "%s*%s*%08X%08X", SIGNATURE_RACF, (char *) salt.salt_buf, digest_buf[0], digest_buf[1]);
7167 }
7168 else if (hash_mode == 2612)
7169 {
7170 snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x",
7171 SIGNATURE_PHPS,
7172 (char *) salt.salt_buf,
7173 digest_buf[0],
7174 digest_buf[1],
7175 digest_buf[2],
7176 digest_buf[3]);
7177 }
7178 else if (hash_mode == 3711)
7179 {
7180 char *salt_ptr = (char *) salt.salt_buf;
7181
7182 salt_ptr[salt.salt_len - 1] = 0;
7183
7184 snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x",
7185 SIGNATURE_MEDIAWIKI_B,
7186 salt_ptr,
7187 digest_buf[0],
7188 digest_buf[1],
7189 digest_buf[2],
7190 digest_buf[3]);
7191 }
7192 else if (hash_mode == 8800)
7193 {
7194 androidfde_t *androidfdes = (androidfde_t *) data.esalts_buf;
7195
7196 androidfde_t *androidfde = &androidfdes[salt_pos];
7197
7198 char tmp[3073] = { 0 };
7199
7200 for (uint i = 0, j = 0; i < 384; i += 1, j += 8)
7201 {
7202 sprintf (tmp + j, "%08x", androidfde->data[i]);
7203 }
7204
7205 tmp[3072] = 0;
7206
7207 snprintf (out_buf, len-1, "%s16$%08x%08x%08x%08x$16$%08x%08x%08x%08x$%s",
7208 SIGNATURE_ANDROIDFDE,
7209 byte_swap_32 (salt.salt_buf[0]),
7210 byte_swap_32 (salt.salt_buf[1]),
7211 byte_swap_32 (salt.salt_buf[2]),
7212 byte_swap_32 (salt.salt_buf[3]),
7213 byte_swap_32 (digest_buf[0]),
7214 byte_swap_32 (digest_buf[1]),
7215 byte_swap_32 (digest_buf[2]),
7216 byte_swap_32 (digest_buf[3]),
7217 tmp);
7218 }
7219 else if (hash_mode == 8900)
7220 {
7221 uint N = salt.scrypt_N;
7222 uint r = salt.scrypt_r;
7223 uint p = salt.scrypt_p;
7224
7225 char base64_salt[32] = { 0 };
7226
7227 base64_encode (int_to_base64, (const u8 *) salt.salt_buf, salt.salt_len, (u8 *) base64_salt);
7228
7229 memset (tmp_buf, 0, 46);
7230
7231 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7232 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7233 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7234 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7235 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7236 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7237 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7238 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7239 digest_buf[8] = 0; // needed for base64_encode ()
7240
7241 base64_encode (int_to_base64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7242
7243 snprintf (out_buf, len-1, "%s:%i:%i:%i:%s:%s",
7244 SIGNATURE_SCRYPT,
7245 N,
7246 r,
7247 p,
7248 base64_salt,
7249 tmp_buf);
7250 }
7251 else if (hash_mode == 9000)
7252 {
7253 snprintf (out_buf, len-1, "%s", hashfile);
7254 }
7255 else if (hash_mode == 9200)
7256 {
7257 // salt
7258
7259 pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) data.esalts_buf;
7260
7261 pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[salt_pos];
7262
7263 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf;
7264
7265 // hash
7266
7267 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7268 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7269 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7270 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7271 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7272 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7273 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7274 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7275 digest_buf[8] = 0; // needed for base64_encode ()
7276
7277 char tmp_buf[64] = { 0 };
7278
7279 base64_encode (int_to_itoa64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7280 tmp_buf[43] = 0; // cut it here
7281
7282 // output
7283
7284 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO8, salt_buf_ptr, tmp_buf);
7285 }
7286 else if (hash_mode == 9300)
7287 {
7288 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7289 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7290 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7291 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7292 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7293 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7294 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7295 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7296 digest_buf[8] = 0; // needed for base64_encode ()
7297
7298 char tmp_buf[64] = { 0 };
7299
7300 base64_encode (int_to_itoa64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7301 tmp_buf[43] = 0; // cut it here
7302
7303 unsigned char *salt_buf_ptr = (unsigned char *) salt.salt_buf;
7304
7305 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO9, salt_buf_ptr, tmp_buf);
7306 }
7307 else if (hash_mode == 9400)
7308 {
7309 office2007_t *office2007s = (office2007_t *) data.esalts_buf;
7310
7311 office2007_t *office2007 = &office2007s[salt_pos];
7312
7313 snprintf (out_buf, len-1, "%s*%u*%u*%u*%u*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7314 SIGNATURE_OFFICE2007,
7315 2007,
7316 20,
7317 office2007->keySize,
7318 16,
7319 salt.salt_buf[0],
7320 salt.salt_buf[1],
7321 salt.salt_buf[2],
7322 salt.salt_buf[3],
7323 office2007->encryptedVerifier[0],
7324 office2007->encryptedVerifier[1],
7325 office2007->encryptedVerifier[2],
7326 office2007->encryptedVerifier[3],
7327 office2007->encryptedVerifierHash[0],
7328 office2007->encryptedVerifierHash[1],
7329 office2007->encryptedVerifierHash[2],
7330 office2007->encryptedVerifierHash[3],
7331 office2007->encryptedVerifierHash[4]);
7332 }
7333 else if (hash_mode == 9500)
7334 {
7335 office2010_t *office2010s = (office2010_t *) data.esalts_buf;
7336
7337 office2010_t *office2010 = &office2010s[salt_pos];
7338
7339 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,
7340
7341 salt.salt_buf[0],
7342 salt.salt_buf[1],
7343 salt.salt_buf[2],
7344 salt.salt_buf[3],
7345 office2010->encryptedVerifier[0],
7346 office2010->encryptedVerifier[1],
7347 office2010->encryptedVerifier[2],
7348 office2010->encryptedVerifier[3],
7349 office2010->encryptedVerifierHash[0],
7350 office2010->encryptedVerifierHash[1],
7351 office2010->encryptedVerifierHash[2],
7352 office2010->encryptedVerifierHash[3],
7353 office2010->encryptedVerifierHash[4],
7354 office2010->encryptedVerifierHash[5],
7355 office2010->encryptedVerifierHash[6],
7356 office2010->encryptedVerifierHash[7]);
7357 }
7358 else if (hash_mode == 9600)
7359 {
7360 office2013_t *office2013s = (office2013_t *) data.esalts_buf;
7361
7362 office2013_t *office2013 = &office2013s[salt_pos];
7363
7364 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,
7365
7366 salt.salt_buf[0],
7367 salt.salt_buf[1],
7368 salt.salt_buf[2],
7369 salt.salt_buf[3],
7370 office2013->encryptedVerifier[0],
7371 office2013->encryptedVerifier[1],
7372 office2013->encryptedVerifier[2],
7373 office2013->encryptedVerifier[3],
7374 office2013->encryptedVerifierHash[0],
7375 office2013->encryptedVerifierHash[1],
7376 office2013->encryptedVerifierHash[2],
7377 office2013->encryptedVerifierHash[3],
7378 office2013->encryptedVerifierHash[4],
7379 office2013->encryptedVerifierHash[5],
7380 office2013->encryptedVerifierHash[6],
7381 office2013->encryptedVerifierHash[7]);
7382 }
7383 else if (hash_mode == 9700)
7384 {
7385 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7386
7387 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7388
7389 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7390 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7391 byte_swap_32 (salt.salt_buf[0]),
7392 byte_swap_32 (salt.salt_buf[1]),
7393 byte_swap_32 (salt.salt_buf[2]),
7394 byte_swap_32 (salt.salt_buf[3]),
7395 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7396 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7397 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7398 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7399 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7400 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7401 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7402 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]));
7403 }
7404 else if (hash_mode == 9710)
7405 {
7406 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7407
7408 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7409
7410 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7411 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7412 byte_swap_32 (salt.salt_buf[0]),
7413 byte_swap_32 (salt.salt_buf[1]),
7414 byte_swap_32 (salt.salt_buf[2]),
7415 byte_swap_32 (salt.salt_buf[3]),
7416 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7417 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7418 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7419 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7420 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7421 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7422 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7423 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]));
7424 }
7425 else if (hash_mode == 9720)
7426 {
7427 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7428
7429 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7430
7431 u8 *rc4key = (u8 *) oldoffice01->rc4key;
7432
7433 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7434 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7435 byte_swap_32 (salt.salt_buf[0]),
7436 byte_swap_32 (salt.salt_buf[1]),
7437 byte_swap_32 (salt.salt_buf[2]),
7438 byte_swap_32 (salt.salt_buf[3]),
7439 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7440 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7441 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7442 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7443 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7444 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7445 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7446 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]),
7447 rc4key[0],
7448 rc4key[1],
7449 rc4key[2],
7450 rc4key[3],
7451 rc4key[4]);
7452 }
7453 else if (hash_mode == 9800)
7454 {
7455 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7456
7457 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7458
7459 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7460 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7461 salt.salt_buf[0],
7462 salt.salt_buf[1],
7463 salt.salt_buf[2],
7464 salt.salt_buf[3],
7465 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7466 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7467 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7468 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7469 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7470 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7471 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7472 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7473 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]));
7474 }
7475 else if (hash_mode == 9810)
7476 {
7477 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7478
7479 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7480
7481 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7482 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7483 salt.salt_buf[0],
7484 salt.salt_buf[1],
7485 salt.salt_buf[2],
7486 salt.salt_buf[3],
7487 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7488 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7489 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7490 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7491 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7492 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7493 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7494 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7495 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]));
7496 }
7497 else if (hash_mode == 9820)
7498 {
7499 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7500
7501 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7502
7503 u8 *rc4key = (u8 *) oldoffice34->rc4key;
7504
7505 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7506 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7507 salt.salt_buf[0],
7508 salt.salt_buf[1],
7509 salt.salt_buf[2],
7510 salt.salt_buf[3],
7511 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7512 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7513 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7514 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7515 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7516 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7517 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7518 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7519 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]),
7520 rc4key[0],
7521 rc4key[1],
7522 rc4key[2],
7523 rc4key[3],
7524 rc4key[4]);
7525 }
7526 else if (hash_mode == 10000)
7527 {
7528 // salt
7529
7530 pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) data.esalts_buf;
7531
7532 pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[salt_pos];
7533
7534 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf;
7535
7536 // hash
7537
7538 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7539 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7540 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7541 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7542 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7543 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7544 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7545 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7546 digest_buf[8] = 0; // needed for base64_encode ()
7547
7548 char tmp_buf[64] = { 0 };
7549
7550 base64_encode (int_to_base64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7551
7552 // output
7553
7554 snprintf (out_buf, len-1, "%s%i$%s$%s", SIGNATURE_DJANGOPBKDF2, salt.salt_iter + 1, salt_buf_ptr, tmp_buf);
7555 }
7556 else if (hash_mode == 10100)
7557 {
7558 snprintf (out_buf, len-1, "%08x%08x:%u:%u:%08x%08x%08x%08x",
7559 digest_buf[0],
7560 digest_buf[1],
7561 2,
7562 4,
7563 byte_swap_32 (salt.salt_buf[0]),
7564 byte_swap_32 (salt.salt_buf[1]),
7565 byte_swap_32 (salt.salt_buf[2]),
7566 byte_swap_32 (salt.salt_buf[3]));
7567 }
7568 else if (hash_mode == 10200)
7569 {
7570 cram_md5_t *cram_md5s = (cram_md5_t *) data.esalts_buf;
7571
7572 cram_md5_t *cram_md5 = &cram_md5s[salt_pos];
7573
7574 // challenge
7575
7576 char challenge[100] = { 0 };
7577
7578 base64_encode (int_to_base64, (const u8 *) salt.salt_buf, salt.salt_len, (u8 *) challenge);
7579
7580 // response
7581
7582 char tmp_buf[100] = { 0 };
7583
7584 uint tmp_len = snprintf (tmp_buf, 100, "%s %08x%08x%08x%08x",
7585 (char *) cram_md5->user,
7586 digest_buf[0],
7587 digest_buf[1],
7588 digest_buf[2],
7589 digest_buf[3]);
7590
7591 char response[100] = { 0 };
7592
7593 base64_encode (int_to_base64, (const u8 *) tmp_buf, tmp_len, (u8 *) response);
7594
7595 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CRAM_MD5, challenge, response);
7596 }
7597 else if (hash_mode == 10300)
7598 {
7599 char tmp_buf[100] = { 0 };
7600
7601 memcpy (tmp_buf + 0, digest_buf, 20);
7602 memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len);
7603
7604 uint tmp_len = 20 + salt.salt_len;
7605
7606 // base64 encode it
7607
7608 char base64_encoded[100] = { 0 };
7609
7610 base64_encode (int_to_base64, (const u8 *) tmp_buf, tmp_len, (u8 *) base64_encoded);
7611
7612 snprintf (out_buf, len-1, "%s%i}%s", SIGNATURE_SAPH_SHA1, salt.salt_iter + 1, base64_encoded);
7613 }
7614 else if (hash_mode == 10400)
7615 {
7616 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7617
7618 pdf_t *pdf = &pdfs[salt_pos];
7619
7620 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",
7621
7622 pdf->V,
7623 pdf->R,
7624 40,
7625 pdf->P,
7626 pdf->enc_md,
7627 pdf->id_len,
7628 byte_swap_32 (pdf->id_buf[0]),
7629 byte_swap_32 (pdf->id_buf[1]),
7630 byte_swap_32 (pdf->id_buf[2]),
7631 byte_swap_32 (pdf->id_buf[3]),
7632 pdf->u_len,
7633 byte_swap_32 (pdf->u_buf[0]),
7634 byte_swap_32 (pdf->u_buf[1]),
7635 byte_swap_32 (pdf->u_buf[2]),
7636 byte_swap_32 (pdf->u_buf[3]),
7637 byte_swap_32 (pdf->u_buf[4]),
7638 byte_swap_32 (pdf->u_buf[5]),
7639 byte_swap_32 (pdf->u_buf[6]),
7640 byte_swap_32 (pdf->u_buf[7]),
7641 pdf->o_len,
7642 byte_swap_32 (pdf->o_buf[0]),
7643 byte_swap_32 (pdf->o_buf[1]),
7644 byte_swap_32 (pdf->o_buf[2]),
7645 byte_swap_32 (pdf->o_buf[3]),
7646 byte_swap_32 (pdf->o_buf[4]),
7647 byte_swap_32 (pdf->o_buf[5]),
7648 byte_swap_32 (pdf->o_buf[6]),
7649 byte_swap_32 (pdf->o_buf[7])
7650 );
7651 }
7652 else if (hash_mode == 10410)
7653 {
7654 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7655
7656 pdf_t *pdf = &pdfs[salt_pos];
7657
7658 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",
7659
7660 pdf->V,
7661 pdf->R,
7662 40,
7663 pdf->P,
7664 pdf->enc_md,
7665 pdf->id_len,
7666 byte_swap_32 (pdf->id_buf[0]),
7667 byte_swap_32 (pdf->id_buf[1]),
7668 byte_swap_32 (pdf->id_buf[2]),
7669 byte_swap_32 (pdf->id_buf[3]),
7670 pdf->u_len,
7671 byte_swap_32 (pdf->u_buf[0]),
7672 byte_swap_32 (pdf->u_buf[1]),
7673 byte_swap_32 (pdf->u_buf[2]),
7674 byte_swap_32 (pdf->u_buf[3]),
7675 byte_swap_32 (pdf->u_buf[4]),
7676 byte_swap_32 (pdf->u_buf[5]),
7677 byte_swap_32 (pdf->u_buf[6]),
7678 byte_swap_32 (pdf->u_buf[7]),
7679 pdf->o_len,
7680 byte_swap_32 (pdf->o_buf[0]),
7681 byte_swap_32 (pdf->o_buf[1]),
7682 byte_swap_32 (pdf->o_buf[2]),
7683 byte_swap_32 (pdf->o_buf[3]),
7684 byte_swap_32 (pdf->o_buf[4]),
7685 byte_swap_32 (pdf->o_buf[5]),
7686 byte_swap_32 (pdf->o_buf[6]),
7687 byte_swap_32 (pdf->o_buf[7])
7688 );
7689 }
7690 else if (hash_mode == 10420)
7691 {
7692 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7693
7694 pdf_t *pdf = &pdfs[salt_pos];
7695
7696 u8 *rc4key = (u8 *) pdf->rc4key;
7697
7698 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",
7699
7700 pdf->V,
7701 pdf->R,
7702 40,
7703 pdf->P,
7704 pdf->enc_md,
7705 pdf->id_len,
7706 byte_swap_32 (pdf->id_buf[0]),
7707 byte_swap_32 (pdf->id_buf[1]),
7708 byte_swap_32 (pdf->id_buf[2]),
7709 byte_swap_32 (pdf->id_buf[3]),
7710 pdf->u_len,
7711 byte_swap_32 (pdf->u_buf[0]),
7712 byte_swap_32 (pdf->u_buf[1]),
7713 byte_swap_32 (pdf->u_buf[2]),
7714 byte_swap_32 (pdf->u_buf[3]),
7715 byte_swap_32 (pdf->u_buf[4]),
7716 byte_swap_32 (pdf->u_buf[5]),
7717 byte_swap_32 (pdf->u_buf[6]),
7718 byte_swap_32 (pdf->u_buf[7]),
7719 pdf->o_len,
7720 byte_swap_32 (pdf->o_buf[0]),
7721 byte_swap_32 (pdf->o_buf[1]),
7722 byte_swap_32 (pdf->o_buf[2]),
7723 byte_swap_32 (pdf->o_buf[3]),
7724 byte_swap_32 (pdf->o_buf[4]),
7725 byte_swap_32 (pdf->o_buf[5]),
7726 byte_swap_32 (pdf->o_buf[6]),
7727 byte_swap_32 (pdf->o_buf[7]),
7728 rc4key[0],
7729 rc4key[1],
7730 rc4key[2],
7731 rc4key[3],
7732 rc4key[4]
7733 );
7734 }
7735 else if (hash_mode == 10500)
7736 {
7737 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7738
7739 pdf_t *pdf = &pdfs[salt_pos];
7740
7741 if (pdf->id_len == 32)
7742 {
7743 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",
7744
7745 pdf->V,
7746 pdf->R,
7747 128,
7748 pdf->P,
7749 pdf->enc_md,
7750 pdf->id_len,
7751 byte_swap_32 (pdf->id_buf[0]),
7752 byte_swap_32 (pdf->id_buf[1]),
7753 byte_swap_32 (pdf->id_buf[2]),
7754 byte_swap_32 (pdf->id_buf[3]),
7755 byte_swap_32 (pdf->id_buf[4]),
7756 byte_swap_32 (pdf->id_buf[5]),
7757 byte_swap_32 (pdf->id_buf[6]),
7758 byte_swap_32 (pdf->id_buf[7]),
7759 pdf->u_len,
7760 byte_swap_32 (pdf->u_buf[0]),
7761 byte_swap_32 (pdf->u_buf[1]),
7762 byte_swap_32 (pdf->u_buf[2]),
7763 byte_swap_32 (pdf->u_buf[3]),
7764 byte_swap_32 (pdf->u_buf[4]),
7765 byte_swap_32 (pdf->u_buf[5]),
7766 byte_swap_32 (pdf->u_buf[6]),
7767 byte_swap_32 (pdf->u_buf[7]),
7768 pdf->o_len,
7769 byte_swap_32 (pdf->o_buf[0]),
7770 byte_swap_32 (pdf->o_buf[1]),
7771 byte_swap_32 (pdf->o_buf[2]),
7772 byte_swap_32 (pdf->o_buf[3]),
7773 byte_swap_32 (pdf->o_buf[4]),
7774 byte_swap_32 (pdf->o_buf[5]),
7775 byte_swap_32 (pdf->o_buf[6]),
7776 byte_swap_32 (pdf->o_buf[7])
7777 );
7778 }
7779 else
7780 {
7781 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",
7782
7783 pdf->V,
7784 pdf->R,
7785 128,
7786 pdf->P,
7787 pdf->enc_md,
7788 pdf->id_len,
7789 byte_swap_32 (pdf->id_buf[0]),
7790 byte_swap_32 (pdf->id_buf[1]),
7791 byte_swap_32 (pdf->id_buf[2]),
7792 byte_swap_32 (pdf->id_buf[3]),
7793 pdf->u_len,
7794 byte_swap_32 (pdf->u_buf[0]),
7795 byte_swap_32 (pdf->u_buf[1]),
7796 byte_swap_32 (pdf->u_buf[2]),
7797 byte_swap_32 (pdf->u_buf[3]),
7798 byte_swap_32 (pdf->u_buf[4]),
7799 byte_swap_32 (pdf->u_buf[5]),
7800 byte_swap_32 (pdf->u_buf[6]),
7801 byte_swap_32 (pdf->u_buf[7]),
7802 pdf->o_len,
7803 byte_swap_32 (pdf->o_buf[0]),
7804 byte_swap_32 (pdf->o_buf[1]),
7805 byte_swap_32 (pdf->o_buf[2]),
7806 byte_swap_32 (pdf->o_buf[3]),
7807 byte_swap_32 (pdf->o_buf[4]),
7808 byte_swap_32 (pdf->o_buf[5]),
7809 byte_swap_32 (pdf->o_buf[6]),
7810 byte_swap_32 (pdf->o_buf[7])
7811 );
7812 }
7813 }
7814 else if (hash_mode == 10600)
7815 {
7816 uint digest_idx = salt.digests_offset + digest_pos;
7817
7818 hashinfo_t **hashinfo_ptr = data.hash_info;
7819 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7820
7821 snprintf (out_buf, len-1, "%s", hash_buf);
7822 }
7823 else if (hash_mode == 10700)
7824 {
7825 uint digest_idx = salt.digests_offset + digest_pos;
7826
7827 hashinfo_t **hashinfo_ptr = data.hash_info;
7828 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7829
7830 snprintf (out_buf, len-1, "%s", hash_buf);
7831 }
7832 else if (hash_mode == 10900)
7833 {
7834 uint digest_idx = salt.digests_offset + digest_pos;
7835
7836 hashinfo_t **hashinfo_ptr = data.hash_info;
7837 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7838
7839 snprintf (out_buf, len-1, "%s", hash_buf);
7840 }
7841 else if (hash_mode == 11100)
7842 {
7843 u32 salt_challenge = salt.salt_buf[0];
7844
7845 salt_challenge = byte_swap_32 (salt_challenge);
7846
7847 unsigned char *user_name = (unsigned char *) (salt.salt_buf + 1);
7848
7849 snprintf (out_buf, len-1, "%s%s*%08x*%08x%08x%08x%08x",
7850 SIGNATURE_POSTGRESQL_AUTH,
7851 user_name,
7852 salt_challenge,
7853 digest_buf[0],
7854 digest_buf[1],
7855 digest_buf[2],
7856 digest_buf[3]);
7857 }
7858 else if (hash_mode == 11200)
7859 {
7860 snprintf (out_buf, len-1, "%s%s*%08x%08x%08x%08x%08x",
7861 SIGNATURE_MYSQL_AUTH,
7862 (unsigned char *) salt.salt_buf,
7863 digest_buf[0],
7864 digest_buf[1],
7865 digest_buf[2],
7866 digest_buf[3],
7867 digest_buf[4]);
7868 }
7869 else if (hash_mode == 11300)
7870 {
7871 bitcoin_wallet_t *bitcoin_wallets = (bitcoin_wallet_t *) data.esalts_buf;
7872
7873 bitcoin_wallet_t *bitcoin_wallet = &bitcoin_wallets[salt_pos];
7874
7875 const uint cry_master_len = bitcoin_wallet->cry_master_len;
7876 const uint ckey_len = bitcoin_wallet->ckey_len;
7877 const uint public_key_len = bitcoin_wallet->public_key_len;
7878
7879 char *cry_master_buf = (char *) mymalloc ((cry_master_len * 2) + 1);
7880 char *ckey_buf = (char *) mymalloc ((ckey_len * 2) + 1);
7881 char *public_key_buf = (char *) mymalloc ((public_key_len * 2) + 1);
7882
7883 for (uint i = 0, j = 0; i < cry_master_len; i += 1, j += 2)
7884 {
7885 const u8 *ptr = (const u8 *) bitcoin_wallet->cry_master_buf;
7886
7887 sprintf (cry_master_buf + j, "%02x", ptr[i]);
7888 }
7889
7890 for (uint i = 0, j = 0; i < ckey_len; i += 1, j += 2)
7891 {
7892 const u8 *ptr = (const u8 *) bitcoin_wallet->ckey_buf;
7893
7894 sprintf (ckey_buf + j, "%02x", ptr[i]);
7895 }
7896
7897 for (uint i = 0, j = 0; i < public_key_len; i += 1, j += 2)
7898 {
7899 const u8 *ptr = (const u8 *) bitcoin_wallet->public_key_buf;
7900
7901 sprintf (public_key_buf + j, "%02x", ptr[i]);
7902 }
7903
7904 snprintf (out_buf, len-1, "%s%d$%s$%d$%s$%d$%d$%s$%d$%s",
7905 SIGNATURE_BITCOIN_WALLET,
7906 cry_master_len * 2,
7907 cry_master_buf,
7908 salt.salt_len,
7909 (unsigned char *) salt.salt_buf,
7910 salt.salt_iter + 1,
7911 ckey_len * 2,
7912 ckey_buf,
7913 public_key_len * 2,
7914 public_key_buf
7915 );
7916
7917 free (cry_master_buf);
7918 free (ckey_buf);
7919 free (public_key_buf);
7920 }
7921 else if (hash_mode == 11400)
7922 {
7923 uint digest_idx = salt.digests_offset + digest_pos;
7924
7925 hashinfo_t **hashinfo_ptr = data.hash_info;
7926 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7927
7928 snprintf (out_buf, len-1, "%s", hash_buf);
7929 }
7930 else if (hash_mode == 11600)
7931 {
7932 seven_zip_t *seven_zips = (seven_zip_t *) data.esalts_buf;
7933
7934 seven_zip_t *seven_zip = &seven_zips[salt_pos];
7935
7936 const uint data_len = seven_zip->data_len;
7937
7938 char *data_buf = (char *) mymalloc ((data_len * 2) + 1);
7939
7940 for (uint i = 0, j = 0; i < data_len; i += 1, j += 2)
7941 {
7942 const u8 *ptr = (const u8 *) seven_zip->data_buf;
7943
7944 sprintf (data_buf + j, "%02x", ptr[i]);
7945 }
7946
7947 snprintf (out_buf, len-1, "%s%u$%u$%u$%s$%u$%08x%08x%08x%08x$%u$%u$%u$%s",
7948 SIGNATURE_SEVEN_ZIP,
7949 0,
7950 salt.salt_sign[0],
7951 0,
7952 (char *) seven_zip->salt_buf,
7953 seven_zip->iv_len,
7954 seven_zip->iv_buf[0],
7955 seven_zip->iv_buf[1],
7956 seven_zip->iv_buf[2],
7957 seven_zip->iv_buf[3],
7958 seven_zip->crc,
7959 seven_zip->data_len,
7960 seven_zip->unpack_size,
7961 data_buf);
7962
7963 free (data_buf);
7964 }
7965 else if (hash_mode == 11700)
7966 {
7967 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
7968 digest_buf[0],
7969 digest_buf[1],
7970 digest_buf[2],
7971 digest_buf[3],
7972 digest_buf[4],
7973 digest_buf[5],
7974 digest_buf[6],
7975 digest_buf[7]);
7976 }
7977 else if (hash_mode == 11800)
7978 {
7979 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
7980 digest_buf[ 0],
7981 digest_buf[ 1],
7982 digest_buf[ 2],
7983 digest_buf[ 3],
7984 digest_buf[ 4],
7985 digest_buf[ 5],
7986 digest_buf[ 6],
7987 digest_buf[ 7],
7988 digest_buf[ 8],
7989 digest_buf[ 9],
7990 digest_buf[10],
7991 digest_buf[11],
7992 digest_buf[12],
7993 digest_buf[13],
7994 digest_buf[14],
7995 digest_buf[15]);
7996 }
7997 else if (hash_mode == 11900)
7998 {
7999 uint digest_idx = salt.digests_offset + digest_pos;
8000
8001 hashinfo_t **hashinfo_ptr = data.hash_info;
8002 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8003
8004 snprintf (out_buf, len-1, "%s", hash_buf);
8005 }
8006 else if (hash_mode == 12000)
8007 {
8008 uint digest_idx = salt.digests_offset + digest_pos;
8009
8010 hashinfo_t **hashinfo_ptr = data.hash_info;
8011 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8012
8013 snprintf (out_buf, len-1, "%s", hash_buf);
8014 }
8015 else if (hash_mode == 12100)
8016 {
8017 uint digest_idx = salt.digests_offset + digest_pos;
8018
8019 hashinfo_t **hashinfo_ptr = data.hash_info;
8020 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8021
8022 snprintf (out_buf, len-1, "%s", hash_buf);
8023 }
8024 else if (hash_mode == 12200)
8025 {
8026 uint *ptr_digest = digest_buf;
8027 uint *ptr_salt = salt.salt_buf;
8028
8029 snprintf (out_buf, len-1, "%s0$1$%08x%08x$%08x%08x",
8030 SIGNATURE_ECRYPTFS,
8031 ptr_salt[0],
8032 ptr_salt[1],
8033 ptr_digest[0],
8034 ptr_digest[1]);
8035 }
8036 else if (hash_mode == 12300)
8037 {
8038 uint *ptr_digest = digest_buf;
8039 uint *ptr_salt = salt.salt_buf;
8040
8041 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",
8042 ptr_digest[ 0], ptr_digest[ 1],
8043 ptr_digest[ 2], ptr_digest[ 3],
8044 ptr_digest[ 4], ptr_digest[ 5],
8045 ptr_digest[ 6], ptr_digest[ 7],
8046 ptr_digest[ 8], ptr_digest[ 9],
8047 ptr_digest[10], ptr_digest[11],
8048 ptr_digest[12], ptr_digest[13],
8049 ptr_digest[14], ptr_digest[15],
8050 ptr_salt[0],
8051 ptr_salt[1],
8052 ptr_salt[2],
8053 ptr_salt[3]);
8054 }
8055 else if (hash_mode == 12400)
8056 {
8057 // encode iteration count
8058
8059 char salt_iter[5] = { 0 };
8060
8061 salt_iter[0] = int_to_itoa64 ((salt.salt_iter ) & 0x3f);
8062 salt_iter[1] = int_to_itoa64 ((salt.salt_iter >> 6) & 0x3f);
8063 salt_iter[2] = int_to_itoa64 ((salt.salt_iter >> 12) & 0x3f);
8064 salt_iter[3] = int_to_itoa64 ((salt.salt_iter >> 18) & 0x3f);
8065 salt_iter[4] = 0;
8066
8067 // encode salt
8068
8069 ptr_salt[0] = int_to_itoa64 ((salt.salt_buf[0] ) & 0x3f);
8070 ptr_salt[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f);
8071 ptr_salt[2] = int_to_itoa64 ((salt.salt_buf[0] >> 12) & 0x3f);
8072 ptr_salt[3] = int_to_itoa64 ((salt.salt_buf[0] >> 18) & 0x3f);
8073 ptr_salt[4] = 0;
8074
8075 // encode digest
8076
8077 memset (tmp_buf, 0, sizeof (tmp_buf));
8078
8079 digest_buf[0] = byte_swap_32 (digest_buf[0]);
8080 digest_buf[1] = byte_swap_32 (digest_buf[1]);
8081
8082 memcpy (tmp_buf, digest_buf, 8);
8083
8084 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 8, (u8 *) ptr_plain);
8085
8086 ptr_plain[11] = 0;
8087
8088 // fill the resulting buffer
8089
8090 snprintf (out_buf, len - 1, "_%s%s%s", salt_iter, ptr_salt, ptr_plain);
8091 }
8092 else if (hash_mode == 12500)
8093 {
8094 snprintf (out_buf, len - 1, "%s*0*%08x%08x*%08x%08x%08x%08x",
8095 SIGNATURE_RAR3,
8096 byte_swap_32 (salt.salt_buf[0]),
8097 byte_swap_32 (salt.salt_buf[1]),
8098 salt.salt_buf[2],
8099 salt.salt_buf[3],
8100 salt.salt_buf[4],
8101 salt.salt_buf[5]);
8102 }
8103 else if (hash_mode == 12600)
8104 {
8105 snprintf (out_buf, len - 1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8106 digest_buf[0] + salt.salt_buf_pc[0],
8107 digest_buf[1] + salt.salt_buf_pc[1],
8108 digest_buf[2] + salt.salt_buf_pc[2],
8109 digest_buf[3] + salt.salt_buf_pc[3],
8110 digest_buf[4] + salt.salt_buf_pc[4],
8111 digest_buf[5] + salt.salt_buf_pc[5],
8112 digest_buf[6] + salt.salt_buf_pc[6],
8113 digest_buf[7] + salt.salt_buf_pc[7]);
8114 }
8115 else if (hash_mode == 12700)
8116 {
8117 uint digest_idx = salt.digests_offset + digest_pos;
8118
8119 hashinfo_t **hashinfo_ptr = data.hash_info;
8120 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8121
8122 snprintf (out_buf, len-1, "%s", hash_buf);
8123 }
8124 else if (hash_mode == 12800)
8125 {
8126 const u8 *ptr = (const u8 *) salt.salt_buf;
8127
8128 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",
8129 SIGNATURE_MS_DRSR,
8130 ptr[0],
8131 ptr[1],
8132 ptr[2],
8133 ptr[3],
8134 ptr[4],
8135 ptr[5],
8136 ptr[6],
8137 ptr[7],
8138 ptr[8],
8139 ptr[9],
8140 salt.salt_iter + 1,
8141 byte_swap_32 (digest_buf[0]),
8142 byte_swap_32 (digest_buf[1]),
8143 byte_swap_32 (digest_buf[2]),
8144 byte_swap_32 (digest_buf[3]),
8145 byte_swap_32 (digest_buf[4]),
8146 byte_swap_32 (digest_buf[5]),
8147 byte_swap_32 (digest_buf[6]),
8148 byte_swap_32 (digest_buf[7])
8149 );
8150 }
8151 else if (hash_mode == 12900)
8152 {
8153 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",
8154 salt.salt_buf[ 4],
8155 salt.salt_buf[ 5],
8156 salt.salt_buf[ 6],
8157 salt.salt_buf[ 7],
8158 salt.salt_buf[ 8],
8159 salt.salt_buf[ 9],
8160 salt.salt_buf[10],
8161 salt.salt_buf[11],
8162 byte_swap_32 (digest_buf[0]),
8163 byte_swap_32 (digest_buf[1]),
8164 byte_swap_32 (digest_buf[2]),
8165 byte_swap_32 (digest_buf[3]),
8166 byte_swap_32 (digest_buf[4]),
8167 byte_swap_32 (digest_buf[5]),
8168 byte_swap_32 (digest_buf[6]),
8169 byte_swap_32 (digest_buf[7]),
8170 salt.salt_buf[ 0],
8171 salt.salt_buf[ 1],
8172 salt.salt_buf[ 2],
8173 salt.salt_buf[ 3]
8174 );
8175 }
8176 else if (hash_mode == 13000)
8177 {
8178 rar5_t *rar5s = (rar5_t *) data.esalts_buf;
8179
8180 rar5_t *rar5 = &rar5s[salt_pos];
8181
8182 snprintf (out_buf, len-1, "$rar5$16$%08x%08x%08x%08x$%u$%08x%08x%08x%08x$8$%08x%08x",
8183 salt.salt_buf[0],
8184 salt.salt_buf[1],
8185 salt.salt_buf[2],
8186 salt.salt_buf[3],
8187 salt.salt_sign[0],
8188 rar5->iv[0],
8189 rar5->iv[1],
8190 rar5->iv[2],
8191 rar5->iv[3],
8192 byte_swap_32 (digest_buf[0]),
8193 byte_swap_32 (digest_buf[1])
8194 );
8195 }
8196 else
8197 {
8198 if (hash_type == HASH_TYPE_MD4)
8199 {
8200 snprintf (out_buf, 255, "%08x%08x%08x%08x",
8201 digest_buf[0],
8202 digest_buf[1],
8203 digest_buf[2],
8204 digest_buf[3]);
8205 }
8206 else if (hash_type == HASH_TYPE_MD5)
8207 {
8208 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
8209 digest_buf[0],
8210 digest_buf[1],
8211 digest_buf[2],
8212 digest_buf[3]);
8213 }
8214 else if (hash_type == HASH_TYPE_SHA1)
8215 {
8216 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
8217 digest_buf[0],
8218 digest_buf[1],
8219 digest_buf[2],
8220 digest_buf[3],
8221 digest_buf[4]);
8222 }
8223 else if (hash_type == HASH_TYPE_SHA256)
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_type == HASH_TYPE_SHA384)
8236 {
8237 uint *ptr = digest_buf;
8238
8239 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8240 ptr[ 1], ptr[ 0],
8241 ptr[ 3], ptr[ 2],
8242 ptr[ 5], ptr[ 4],
8243 ptr[ 7], ptr[ 6],
8244 ptr[ 9], ptr[ 8],
8245 ptr[11], ptr[10]);
8246 }
8247 else if (hash_type == HASH_TYPE_SHA512)
8248 {
8249 uint *ptr = digest_buf;
8250
8251 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8252 ptr[ 1], ptr[ 0],
8253 ptr[ 3], ptr[ 2],
8254 ptr[ 5], ptr[ 4],
8255 ptr[ 7], ptr[ 6],
8256 ptr[ 9], ptr[ 8],
8257 ptr[11], ptr[10],
8258 ptr[13], ptr[12],
8259 ptr[15], ptr[14]);
8260 }
8261 else if (hash_type == HASH_TYPE_LM)
8262 {
8263 snprintf (out_buf, len-1, "%08x%08x",
8264 digest_buf[0],
8265 digest_buf[1]);
8266 }
8267 else if (hash_type == HASH_TYPE_ORACLEH)
8268 {
8269 snprintf (out_buf, len-1, "%08X%08X",
8270 digest_buf[0],
8271 digest_buf[1]);
8272 }
8273 else if (hash_type == HASH_TYPE_BCRYPT)
8274 {
8275 base64_encode (int_to_bf64, (const u8 *) salt.salt_buf, 16, (u8 *) tmp_buf + 0);
8276 base64_encode (int_to_bf64, (const u8 *) digest_buf, 23, (u8 *) tmp_buf + 22);
8277
8278 tmp_buf[22 + 31] = 0; // base64_encode wants to pad
8279
8280 snprintf (out_buf, len-1, "%s$%s", (char *) salt.salt_sign, tmp_buf);
8281 }
8282 else if (hash_type == HASH_TYPE_KECCAK)
8283 {
8284 uint *ptr = digest_buf;
8285
8286 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",
8287 ptr[ 1], ptr[ 0],
8288 ptr[ 3], ptr[ 2],
8289 ptr[ 5], ptr[ 4],
8290 ptr[ 7], ptr[ 6],
8291 ptr[ 9], ptr[ 8],
8292 ptr[11], ptr[10],
8293 ptr[13], ptr[12],
8294 ptr[15], ptr[14],
8295 ptr[17], ptr[16],
8296 ptr[19], ptr[18],
8297 ptr[21], ptr[20],
8298 ptr[23], ptr[22],
8299 ptr[25], ptr[24],
8300 ptr[27], ptr[26],
8301 ptr[29], ptr[28],
8302 ptr[31], ptr[30],
8303 ptr[33], ptr[32],
8304 ptr[35], ptr[34],
8305 ptr[37], ptr[36],
8306 ptr[39], ptr[38],
8307 ptr[41], ptr[30],
8308 ptr[43], ptr[42],
8309 ptr[45], ptr[44],
8310 ptr[47], ptr[46],
8311 ptr[49], ptr[48]
8312 );
8313
8314 out_buf[salt.keccak_mdlen * 2] = 0;
8315 }
8316 else if (hash_type == HASH_TYPE_RIPEMD160)
8317 {
8318 snprintf (out_buf, 255, "%08x%08x%08x%08x%08x",
8319 digest_buf[0],
8320 digest_buf[1],
8321 digest_buf[2],
8322 digest_buf[3],
8323 digest_buf[4]);
8324 }
8325 else if (hash_type == HASH_TYPE_WHIRLPOOL)
8326 {
8327 digest_buf[ 0] = digest_buf[ 0];
8328 digest_buf[ 1] = digest_buf[ 1];
8329 digest_buf[ 2] = digest_buf[ 2];
8330 digest_buf[ 3] = digest_buf[ 3];
8331 digest_buf[ 4] = digest_buf[ 4];
8332 digest_buf[ 5] = digest_buf[ 5];
8333 digest_buf[ 6] = digest_buf[ 6];
8334 digest_buf[ 7] = digest_buf[ 7];
8335 digest_buf[ 8] = digest_buf[ 8];
8336 digest_buf[ 9] = digest_buf[ 9];
8337 digest_buf[10] = digest_buf[10];
8338 digest_buf[11] = digest_buf[11];
8339 digest_buf[12] = digest_buf[12];
8340 digest_buf[13] = digest_buf[13];
8341 digest_buf[14] = digest_buf[14];
8342 digest_buf[15] = digest_buf[15];
8343
8344 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8345 digest_buf[ 0],
8346 digest_buf[ 1],
8347 digest_buf[ 2],
8348 digest_buf[ 3],
8349 digest_buf[ 4],
8350 digest_buf[ 5],
8351 digest_buf[ 6],
8352 digest_buf[ 7],
8353 digest_buf[ 8],
8354 digest_buf[ 9],
8355 digest_buf[10],
8356 digest_buf[11],
8357 digest_buf[12],
8358 digest_buf[13],
8359 digest_buf[14],
8360 digest_buf[15]);
8361 }
8362 else if (hash_type == HASH_TYPE_GOST)
8363 {
8364 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8365 digest_buf[0],
8366 digest_buf[1],
8367 digest_buf[2],
8368 digest_buf[3],
8369 digest_buf[4],
8370 digest_buf[5],
8371 digest_buf[6],
8372 digest_buf[7]);
8373 }
8374 else if (hash_type == HASH_TYPE_MYSQL)
8375 {
8376 snprintf (out_buf, len-1, "%08x%08x",
8377 digest_buf[0],
8378 digest_buf[1]);
8379 }
8380 else if (hash_type == HASH_TYPE_LOTUS5)
8381 {
8382 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
8383 digest_buf[0],
8384 digest_buf[1],
8385 digest_buf[2],
8386 digest_buf[3]);
8387 }
8388 else if (hash_type == HASH_TYPE_LOTUS6)
8389 {
8390 digest_buf[ 0] = byte_swap_32 (digest_buf[ 0]);
8391 digest_buf[ 1] = byte_swap_32 (digest_buf[ 1]);
8392 digest_buf[ 2] = byte_swap_32 (digest_buf[ 2]);
8393 digest_buf[ 3] = byte_swap_32 (digest_buf[ 3]);
8394
8395 char buf[16] = { 0 };
8396
8397 memcpy (buf + 0, salt.salt_buf, 5);
8398 memcpy (buf + 5, digest_buf, 9);
8399
8400 buf[3] -= -4;
8401
8402 base64_encode (int_to_lotus64, (const u8 *) buf, 14, (u8 *) tmp_buf);
8403
8404 tmp_buf[18] = salt.salt_buf_pc[7];
8405 tmp_buf[19] = 0;
8406
8407 snprintf (out_buf, len-1, "(G%s)", tmp_buf);
8408 }
8409 else if (hash_type == HASH_TYPE_LOTUS8)
8410 {
8411 char buf[52] = { 0 };
8412
8413 // salt
8414
8415 memcpy (buf + 0, salt.salt_buf, 16);
8416
8417 buf[3] -= -4;
8418
8419 // iteration
8420
8421 snprintf (buf + 16, 11, "%010i", salt.salt_iter + 1);
8422
8423 // chars
8424
8425 buf[26] = salt.salt_buf_pc[0];
8426 buf[27] = salt.salt_buf_pc[1];
8427
8428 // digest
8429
8430 memcpy (buf + 28, digest_buf, 8);
8431
8432 base64_encode (int_to_lotus64, (const u8 *) buf, 36, (u8 *) tmp_buf);
8433
8434 tmp_buf[49] = 0;
8435
8436 snprintf (out_buf, len-1, "(H%s)", tmp_buf);
8437 }
8438 else if (hash_type == HASH_TYPE_CRC32)
8439 {
8440 snprintf (out_buf, len-1, "%08x", byte_swap_32 (digest_buf[0]));
8441 }
8442 }
8443
8444 if (salt_type == SALT_TYPE_INTERN)
8445 {
8446 size_t pos = strlen (out_buf);
8447
8448 out_buf[pos] = data.separator;
8449
8450 char *ptr = (char *) salt.salt_buf;
8451
8452 memcpy (out_buf + pos + 1, ptr, salt.salt_len);
8453
8454 out_buf[pos + 1 + salt.salt_len] = 0;
8455 }
8456 }
8457
8458 void to_hccap_t (hccap_t *hccap, uint salt_pos, uint digest_pos)
8459 {
8460 memset (hccap, 0, sizeof (hccap_t));
8461
8462 salt_t *salt = &data.salts_buf[salt_pos];
8463
8464 memcpy (hccap->essid, salt->salt_buf, salt->salt_len);
8465
8466 wpa_t *wpas = (wpa_t *) data.esalts_buf;
8467 wpa_t *wpa = &wpas[salt_pos];
8468
8469 hccap->keyver = wpa->keyver;
8470
8471 hccap->eapol_size = wpa->eapol_size;
8472
8473 if (wpa->keyver != 1)
8474 {
8475 uint eapol_tmp[64] = { 0 };
8476
8477 for (uint i = 0; i < 64; i++)
8478 {
8479 eapol_tmp[i] = byte_swap_32 (wpa->eapol[i]);
8480 }
8481
8482 memcpy (hccap->eapol, eapol_tmp, wpa->eapol_size);
8483 }
8484 else
8485 {
8486 memcpy (hccap->eapol, wpa->eapol, wpa->eapol_size);
8487 }
8488
8489 uint pke_tmp[25] = { 0 };
8490
8491 for (int i = 5; i < 25; i++)
8492 {
8493 pke_tmp[i] = byte_swap_32 (wpa->pke[i]);
8494 }
8495
8496 char *pke_ptr = (char *) pke_tmp;
8497
8498 memcpy (hccap->mac1, pke_ptr + 23, 6);
8499 memcpy (hccap->mac2, pke_ptr + 29, 6);
8500 memcpy (hccap->nonce1, pke_ptr + 67, 32);
8501 memcpy (hccap->nonce2, pke_ptr + 35, 32);
8502
8503 char *digests_buf_ptr = (char *) data.digests_buf;
8504
8505 uint dgst_size = data.dgst_size;
8506
8507 uint *digest_ptr = (uint *) (digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size));
8508
8509 if (wpa->keyver != 1)
8510 {
8511 uint digest_tmp[4] = { 0 };
8512
8513 digest_tmp[0] = byte_swap_32 (digest_ptr[0]);
8514 digest_tmp[1] = byte_swap_32 (digest_ptr[1]);
8515 digest_tmp[2] = byte_swap_32 (digest_ptr[2]);
8516 digest_tmp[3] = byte_swap_32 (digest_ptr[3]);
8517
8518 memcpy (hccap->keymic, digest_tmp, 16);
8519 }
8520 else
8521 {
8522 memcpy (hccap->keymic, digest_ptr, 16);
8523 }
8524 }
8525
8526 void SuspendThreads ()
8527 {
8528 if (data.devices_status == STATUS_RUNNING)
8529 {
8530 hc_timer_set (&data.timer_paused);
8531
8532 data.devices_status = STATUS_PAUSED;
8533
8534 log_info ("Paused");
8535 }
8536 }
8537
8538 void ResumeThreads ()
8539 {
8540 if (data.devices_status == STATUS_PAUSED)
8541 {
8542 float ms_paused;
8543
8544 hc_timer_get (data.timer_paused, ms_paused);
8545
8546 data.ms_paused += ms_paused;
8547
8548 data.devices_status = STATUS_RUNNING;
8549
8550 log_info ("Resumed");
8551 }
8552 }
8553
8554 void bypass ()
8555 {
8556 if (data.devices_status != STATUS_RUNNING) return;
8557
8558 data.devices_status = STATUS_BYPASS;
8559
8560 log_info ("Next dictionary / mask in queue selected, bypassing current one");
8561 }
8562
8563 void stop_at_checkpoint ()
8564 {
8565 if (data.devices_status != STATUS_STOP_AT_CHECKPOINT)
8566 {
8567 if (data.devices_status != STATUS_RUNNING) return;
8568 }
8569
8570 // this feature only makes sense if --restore-disable was not specified
8571
8572 if (data.restore_disable == 1)
8573 {
8574 log_info ("WARNING: this feature is disabled when --restore-disable was specified");
8575
8576 return;
8577 }
8578
8579 // check if monitoring of Restore Point updates should be enabled or disabled
8580
8581 if (data.devices_status != STATUS_STOP_AT_CHECKPOINT)
8582 {
8583 data.devices_status = STATUS_STOP_AT_CHECKPOINT;
8584
8585 // save the current restore point value
8586
8587 data.checkpoint_cur_words = get_lowest_words_done ();
8588
8589 log_info ("Checkpoint enabled: will quit at next Restore Point update");
8590 }
8591 else
8592 {
8593 data.devices_status = STATUS_RUNNING;
8594
8595 // reset the global value for checkpoint checks
8596
8597 data.checkpoint_cur_words = 0;
8598
8599 log_info ("Checkpoint disabled: Restore Point updates will no longer be monitored");
8600 }
8601 }
8602
8603 void myabort ()
8604 {
8605 if (data.devices_status == STATUS_INIT) return;
8606 if (data.devices_status == STATUS_STARTING) return;
8607
8608 data.devices_status = STATUS_ABORTED;
8609 }
8610
8611 void myquit ()
8612 {
8613 if (data.devices_status == STATUS_INIT) return;
8614 if (data.devices_status == STATUS_STARTING) return;
8615
8616 data.devices_status = STATUS_QUIT;
8617 }
8618
8619 void load_kernel (const char *kernel_file, int num_devices, size_t *kernel_lengths, const u8 **kernel_sources)
8620 {
8621 FILE *fp = fopen (kernel_file, "rb");
8622
8623 if (fp != NULL)
8624 {
8625 struct stat st;
8626
8627 memset (&st, 0, sizeof (st));
8628
8629 stat (kernel_file, &st);
8630
8631 u8 *buf = (u8 *) mymalloc (st.st_size + 1);
8632
8633 size_t num_read = fread (buf, sizeof (u8), st.st_size, fp);
8634
8635 if (num_read != (size_t) st.st_size)
8636 {
8637 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
8638
8639 exit (-1);
8640 }
8641
8642 fclose (fp);
8643
8644 buf[st.st_size] = 0;
8645
8646 for (int i = 0; i < num_devices; i++)
8647 {
8648 kernel_lengths[i] = (size_t) st.st_size;
8649
8650 kernel_sources[i] = buf;
8651 }
8652 }
8653 else
8654 {
8655 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
8656
8657 exit (-1);
8658 }
8659
8660 return;
8661 }
8662
8663 void writeProgramBin (char *dst, u8 *binary, size_t binary_size)
8664 {
8665 if (binary_size > 0)
8666 {
8667 FILE *fp = fopen (dst, "wb");
8668
8669 lock_file (fp);
8670 fwrite (binary, sizeof (u8), binary_size, fp);
8671
8672 fflush (fp);
8673 fclose (fp);
8674 }
8675 }
8676
8677 /**
8678 * restore
8679 */
8680
8681 restore_data_t *init_restore (int argc, char **argv)
8682 {
8683 restore_data_t *rd = (restore_data_t *) mymalloc (sizeof (restore_data_t));
8684
8685 if (data.restore_disable == 0)
8686 {
8687 FILE *fp = fopen (data.eff_restore_file, "rb");
8688
8689 if (fp)
8690 {
8691 size_t nread = fread (rd, sizeof (restore_data_t), 1, fp);
8692
8693 if (nread != 1)
8694 {
8695 log_error ("ERROR: cannot read %s", data.eff_restore_file);
8696
8697 exit (-1);
8698 }
8699
8700 fclose (fp);
8701
8702 if (rd->pid)
8703 {
8704 char pidbin[BUFSIZ] = { 0 };
8705
8706 int pidbin_len = -1;
8707
8708 #ifdef _POSIX
8709 snprintf (pidbin, sizeof (pidbin) - 1, "/proc/%d/cmdline", rd->pid);
8710
8711 FILE *fd = fopen (pidbin, "rb");
8712
8713 if (fd)
8714 {
8715 pidbin_len = fread (pidbin, 1, BUFSIZ, fd);
8716
8717 pidbin[pidbin_len] = 0;
8718
8719 fclose (fd);
8720
8721 char *argv0_r = strrchr (argv[0], '/');
8722
8723 char *pidbin_r = strrchr (pidbin, '/');
8724
8725 if (argv0_r == NULL) argv0_r = argv[0];
8726
8727 if (pidbin_r == NULL) pidbin_r = pidbin;
8728
8729 if (strcmp (argv0_r, pidbin_r) == 0)
8730 {
8731 log_error ("ERROR: already an instance %s running on pid %d", pidbin, rd->pid);
8732
8733 exit (-1);
8734 }
8735 }
8736
8737 #elif _WIN
8738 HANDLE hProcess = OpenProcess (PROCESS_ALL_ACCESS, FALSE, rd->pid);
8739
8740 char pidbin2[BUFSIZ] = { 0 };
8741
8742 int pidbin2_len = -1;
8743
8744 pidbin_len = GetModuleFileName (NULL, pidbin, BUFSIZ);
8745 pidbin2_len = GetModuleFileNameEx (hProcess, NULL, pidbin2, BUFSIZ);
8746
8747 pidbin[pidbin_len] = 0;
8748 pidbin2[pidbin2_len] = 0;
8749
8750 if (pidbin2_len)
8751 {
8752 if (strcmp (pidbin, pidbin2) == 0)
8753 {
8754 log_error ("ERROR: already an instance %s running on pid %d", pidbin2, rd->pid);
8755
8756 exit (-1);
8757 }
8758 }
8759 #endif
8760 }
8761
8762 if (rd->version_bin < RESTORE_MIN)
8763 {
8764 log_error ("ERROR: cannot use outdated %s. Please remove it.", data.eff_restore_file);
8765
8766 exit (-1);
8767 }
8768 }
8769 }
8770
8771 memset (rd, 0, sizeof (restore_data_t));
8772
8773 rd->version_bin = VERSION_BIN;
8774
8775 #ifdef _POSIX
8776 rd->pid = getpid ();
8777 #elif _WIN
8778 rd->pid = GetCurrentProcessId ();
8779 #endif
8780
8781 if (getcwd (rd->cwd, 255) == NULL)
8782 {
8783 myfree (rd);
8784
8785 return (NULL);
8786 }
8787
8788 rd->argc = argc;
8789 rd->argv = argv;
8790
8791 return (rd);
8792 }
8793
8794 void read_restore (const char *eff_restore_file, restore_data_t *rd)
8795 {
8796 FILE *fp = fopen (eff_restore_file, "rb");
8797
8798 if (fp == NULL)
8799 {
8800 log_error ("ERROR: restore file '%s': %s", eff_restore_file, strerror (errno));
8801
8802 exit (-1);
8803 }
8804
8805 if (fread (rd, sizeof (restore_data_t), 1, fp) != 1)
8806 {
8807 log_error ("ERROR: cannot read %s", eff_restore_file);
8808
8809 exit (-1);
8810 }
8811
8812 rd->argv = (char **) mycalloc (rd->argc, sizeof (char *));
8813
8814 for (uint i = 0; i < rd->argc; i++)
8815 {
8816 char buf[BUFSIZ] = { 0 };
8817
8818 if (fgets (buf, BUFSIZ - 1, fp) == NULL)
8819 {
8820 log_error ("ERROR: cannot read %s", eff_restore_file);
8821
8822 exit (-1);
8823 }
8824
8825 size_t len = strlen (buf);
8826
8827 if (len) buf[len - 1] = 0;
8828
8829 rd->argv[i] = mystrdup (buf);
8830 }
8831
8832 fclose (fp);
8833
8834 char new_cwd[1024] = { 0 };
8835
8836 char *nwd = getcwd (new_cwd, sizeof (new_cwd));
8837
8838 if (nwd == NULL)
8839 {
8840 log_error ("Restore file is corrupted");
8841 }
8842
8843 if (strncmp (new_cwd, rd->cwd, sizeof (new_cwd)) != 0)
8844 {
8845 if (getcwd (rd->cwd, sizeof (rd->cwd)) == NULL)
8846 {
8847 log_error ("ERROR: could not determine current user path: %s", strerror (errno));
8848
8849 exit (-1);
8850 }
8851
8852 log_info ("WARNING: Found old restore file, updating path to %s...", new_cwd);
8853 }
8854
8855 if (chdir (rd->cwd))
8856 {
8857 log_error ("ERROR: cannot chdir to %s: %s", rd->cwd, strerror (errno));
8858
8859 exit (-1);
8860 }
8861 }
8862
8863 u64 get_lowest_words_done ()
8864 {
8865 u64 words_cur = -1;
8866
8867 for (uint device_id = 0; device_id < data.devices_cnt; device_id++)
8868 {
8869 hc_device_param_t *device_param = &data.devices_param[device_id];
8870
8871 if (device_param->skipped) continue;
8872
8873 const u64 words_done = device_param->words_done;
8874
8875 if (words_done < words_cur) words_cur = words_done;
8876 }
8877
8878 // It's possible that a device's workload isn't finished right after a restore-case.
8879 // In that case, this function would return 0 and overwrite the real restore point
8880 // There's also data.words_cur which is set to rd->words_cur but it changes while
8881 // the attack is running therefore we should stick to rd->words_cur.
8882 // Note that -s influences rd->words_cur we should keep a close look on that.
8883
8884 if (words_cur < data.rd->words_cur) words_cur = data.rd->words_cur;
8885
8886 return words_cur;
8887 }
8888
8889 void write_restore (const char *new_restore_file, restore_data_t *rd)
8890 {
8891 u64 words_cur = get_lowest_words_done ();
8892
8893 rd->words_cur = words_cur;
8894
8895 FILE *fp = fopen (new_restore_file, "wb");
8896
8897 if (fp == NULL)
8898 {
8899 log_error ("ERROR: %s: %s", new_restore_file, strerror (errno));
8900
8901 exit (-1);
8902 }
8903
8904 if (setvbuf (fp, NULL, _IONBF, 0))
8905 {
8906 log_error ("ERROR: setvbuf file '%s': %s", new_restore_file, strerror (errno));
8907
8908 exit (-1);
8909 }
8910
8911 fwrite (rd, sizeof (restore_data_t), 1, fp);
8912
8913 for (uint i = 0; i < rd->argc; i++)
8914 {
8915 fprintf (fp, "%s", rd->argv[i]);
8916 fputc ('\n', fp);
8917 }
8918
8919 fflush (fp);
8920
8921 fsync (fileno (fp));
8922
8923 fclose (fp);
8924 }
8925
8926 void cycle_restore ()
8927 {
8928 const char *eff_restore_file = data.eff_restore_file;
8929 const char *new_restore_file = data.new_restore_file;
8930
8931 restore_data_t *rd = data.rd;
8932
8933 write_restore (new_restore_file, rd);
8934
8935 struct stat st;
8936
8937 memset (&st, 0, sizeof(st));
8938
8939 if (stat (eff_restore_file, &st) == 0)
8940 {
8941 if (unlink (eff_restore_file))
8942 {
8943 log_info ("WARN: unlink file '%s': %s", eff_restore_file, strerror (errno));
8944 }
8945 }
8946
8947 if (rename (new_restore_file, eff_restore_file))
8948 {
8949 log_info ("WARN: rename file '%s' to '%s': %s", new_restore_file, eff_restore_file, strerror (errno));
8950 }
8951 }
8952
8953 void check_checkpoint ()
8954 {
8955 // if (data.restore_disable == 1) break; (this is already implied by previous checks)
8956
8957 u64 words_cur = get_lowest_words_done ();
8958
8959 if (words_cur != data.checkpoint_cur_words)
8960 {
8961 myabort ();
8962 }
8963 }
8964
8965 /**
8966 * adjustments
8967 */
8968
8969 uint set_kernel_accel (uint hash_mode)
8970 {
8971 switch (hash_mode)
8972 {
8973 case 0: return GET_ACCEL (0);
8974 case 10: return GET_ACCEL (10);
8975 case 11: return GET_ACCEL (11);
8976 case 12: return GET_ACCEL (12);
8977 case 20: return GET_ACCEL (20);
8978 case 21: return GET_ACCEL (21);
8979 case 22: return GET_ACCEL (22);
8980 case 23: return GET_ACCEL (23);
8981 case 30: return GET_ACCEL (30);
8982 case 40: return GET_ACCEL (40);
8983 case 50: return GET_ACCEL (50);
8984 case 60: return GET_ACCEL (60);
8985 case 100: return GET_ACCEL (100);
8986 case 101: return GET_ACCEL (101);
8987 case 110: return GET_ACCEL (110);
8988 case 111: return GET_ACCEL (111);
8989 case 112: return GET_ACCEL (112);
8990 case 120: return GET_ACCEL (120);
8991 case 121: return GET_ACCEL (121);
8992 case 122: return GET_ACCEL (122);
8993 case 124: return GET_ACCEL (124);
8994 case 130: return GET_ACCEL (130);
8995 case 131: return GET_ACCEL (131);
8996 case 132: return GET_ACCEL (132);
8997 case 133: return GET_ACCEL (133);
8998 case 140: return GET_ACCEL (140);
8999 case 141: return GET_ACCEL (141);
9000 case 150: return GET_ACCEL (150);
9001 case 160: return GET_ACCEL (160);
9002 case 190: return GET_ACCEL (190);
9003 case 200: return GET_ACCEL (200);
9004 case 300: return GET_ACCEL (300);
9005 case 400: return GET_ACCEL (400);
9006 case 500: return GET_ACCEL (500);
9007 case 501: return GET_ACCEL (501);
9008 case 900: return GET_ACCEL (900);
9009 case 910: return GET_ACCEL (910);
9010 case 1000: return GET_ACCEL (1000);
9011 case 1100: return GET_ACCEL (1100);
9012 case 1400: return GET_ACCEL (1400);
9013 case 1410: return GET_ACCEL (1410);
9014 case 1420: return GET_ACCEL (1420);
9015 case 1421: return GET_ACCEL (1421);
9016 case 1430: return GET_ACCEL (1430);
9017 case 1440: return GET_ACCEL (1440);
9018 case 1441: return GET_ACCEL (1441);
9019 case 1450: return GET_ACCEL (1450);
9020 case 1460: return GET_ACCEL (1460);
9021 case 1500: return GET_ACCEL (1500);
9022 case 1600: return GET_ACCEL (1600);
9023 case 1700: return GET_ACCEL (1700);
9024 case 1710: return GET_ACCEL (1710);
9025 case 1711: return GET_ACCEL (1711);
9026 case 1720: return GET_ACCEL (1720);
9027 case 1722: return GET_ACCEL (1722);
9028 case 1730: return GET_ACCEL (1730);
9029 case 1731: return GET_ACCEL (1731);
9030 case 1740: return GET_ACCEL (1740);
9031 case 1750: return GET_ACCEL (1750);
9032 case 1760: return GET_ACCEL (1760);
9033 case 1800: return GET_ACCEL (1800);
9034 case 2100: return GET_ACCEL (2100);
9035 case 2400: return GET_ACCEL (2400);
9036 case 2410: return GET_ACCEL (2410);
9037 case 2500: return GET_ACCEL (2500);
9038 case 2600: return GET_ACCEL (2600);
9039 case 2611: return GET_ACCEL (2611);
9040 case 2612: return GET_ACCEL (2612);
9041 case 2711: return GET_ACCEL (2711);
9042 case 2811: return GET_ACCEL (2811);
9043 case 3000: return GET_ACCEL (3000);
9044 case 3100: return GET_ACCEL (3100);
9045 case 3200: return GET_ACCEL (3200);
9046 case 3710: return GET_ACCEL (3710);
9047 case 3711: return GET_ACCEL (3711);
9048 case 3800: return GET_ACCEL (3800);
9049 case 4300: return GET_ACCEL (4300);
9050 case 4400: return GET_ACCEL (4400);
9051 case 4500: return GET_ACCEL (4500);
9052 case 4700: return GET_ACCEL (4700);
9053 case 4800: return GET_ACCEL (4800);
9054 case 4900: return GET_ACCEL (4900);
9055 case 5000: return GET_ACCEL (5000);
9056 case 5100: return GET_ACCEL (5100);
9057 case 5200: return GET_ACCEL (5200);
9058 case 5300: return GET_ACCEL (5300);
9059 case 5400: return GET_ACCEL (5400);
9060 case 5500: return GET_ACCEL (5500);
9061 case 5600: return GET_ACCEL (5600);
9062 case 5700: return GET_ACCEL (5700);
9063 case 5800: return GET_ACCEL (5800);
9064 case 6000: return GET_ACCEL (6000);
9065 case 6100: return GET_ACCEL (6100);
9066 case 6211: return GET_ACCEL (6211);
9067 case 6212: return GET_ACCEL (6212);
9068 case 6213: return GET_ACCEL (6213);
9069 case 6221: return GET_ACCEL (6221);
9070 case 6222: return GET_ACCEL (6222);
9071 case 6223: return GET_ACCEL (6223);
9072 case 6231: return GET_ACCEL (6231);
9073 case 6232: return GET_ACCEL (6232);
9074 case 6233: return GET_ACCEL (6233);
9075 case 6241: return GET_ACCEL (6241);
9076 case 6242: return GET_ACCEL (6242);
9077 case 6243: return GET_ACCEL (6243);
9078 case 6300: return GET_ACCEL (6300);
9079 case 6400: return GET_ACCEL (6400);
9080 case 6500: return GET_ACCEL (6500);
9081 case 6600: return GET_ACCEL (6600);
9082 case 6700: return GET_ACCEL (6700);
9083 case 6800: return GET_ACCEL (6800);
9084 case 6900: return GET_ACCEL (6900);
9085 case 7100: return GET_ACCEL (7100);
9086 case 7200: return GET_ACCEL (7200);
9087 case 7300: return GET_ACCEL (7300);
9088 case 7400: return GET_ACCEL (7400);
9089 case 7500: return GET_ACCEL (7500);
9090 case 7600: return GET_ACCEL (7600);
9091 case 7700: return GET_ACCEL (7700);
9092 case 7800: return GET_ACCEL (7800);
9093 case 7900: return GET_ACCEL (7900);
9094 case 8000: return GET_ACCEL (8000);
9095 case 8100: return GET_ACCEL (8100);
9096 case 8200: return GET_ACCEL (8200);
9097 case 8300: return GET_ACCEL (8300);
9098 case 8400: return GET_ACCEL (8400);
9099 case 8500: return GET_ACCEL (8500);
9100 case 8600: return GET_ACCEL (8600);
9101 case 8700: return GET_ACCEL (8700);
9102 case 8800: return GET_ACCEL (8800);
9103 case 8900: return GET_ACCEL (8900);
9104 case 9000: return GET_ACCEL (9000);
9105 case 9100: return GET_ACCEL (9100);
9106 case 9200: return GET_ACCEL (9200);
9107 case 9300: return GET_ACCEL (9300);
9108 case 9400: return GET_ACCEL (9400);
9109 case 9500: return GET_ACCEL (9500);
9110 case 9600: return GET_ACCEL (9600);
9111 case 9700: return GET_ACCEL (9700);
9112 case 9710: return GET_ACCEL (9710);
9113 case 9720: return GET_ACCEL (9720);
9114 case 9800: return GET_ACCEL (9800);
9115 case 9810: return GET_ACCEL (9810);
9116 case 9820: return GET_ACCEL (9820);
9117 case 9900: return GET_ACCEL (9900);
9118 case 10000: return GET_ACCEL (10000);
9119 case 10100: return GET_ACCEL (10100);
9120 case 10200: return GET_ACCEL (10200);
9121 case 10300: return GET_ACCEL (10300);
9122 case 10400: return GET_ACCEL (10400);
9123 case 10410: return GET_ACCEL (10410);
9124 case 10420: return GET_ACCEL (10420);
9125 case 10500: return GET_ACCEL (10500);
9126 case 10600: return GET_ACCEL (10600);
9127 case 10700: return GET_ACCEL (10700);
9128 case 10800: return GET_ACCEL (10800);
9129 case 10900: return GET_ACCEL (10900);
9130 case 11000: return GET_ACCEL (11000);
9131 case 11100: return GET_ACCEL (11100);
9132 case 11200: return GET_ACCEL (11200);
9133 case 11300: return GET_ACCEL (11300);
9134 case 11400: return GET_ACCEL (11400);
9135 case 11500: return GET_ACCEL (11500);
9136 case 11600: return GET_ACCEL (11600);
9137 case 11700: return GET_ACCEL (11700);
9138 case 11800: return GET_ACCEL (11800);
9139 case 11900: return GET_ACCEL (11900);
9140 case 12000: return GET_ACCEL (12000);
9141 case 12100: return GET_ACCEL (12100);
9142 case 12200: return GET_ACCEL (12200);
9143 case 12300: return GET_ACCEL (12300);
9144 case 12400: return GET_ACCEL (12400);
9145 case 12500: return GET_ACCEL (12500);
9146 case 12600: return GET_ACCEL (12600);
9147 case 12700: return GET_ACCEL (12700);
9148 case 12800: return GET_ACCEL (12800);
9149 case 12900: return GET_ACCEL (12900);
9150 case 13000: return GET_ACCEL (13000);
9151 }
9152
9153 return 0;
9154 }
9155
9156 uint set_kernel_loops (uint hash_mode)
9157 {
9158 switch (hash_mode)
9159 {
9160 case 0: return GET_LOOPS (0);
9161 case 10: return GET_LOOPS (10);
9162 case 11: return GET_LOOPS (11);
9163 case 12: return GET_LOOPS (12);
9164 case 20: return GET_LOOPS (20);
9165 case 21: return GET_LOOPS (21);
9166 case 22: return GET_LOOPS (22);
9167 case 23: return GET_LOOPS (23);
9168 case 30: return GET_LOOPS (30);
9169 case 40: return GET_LOOPS (40);
9170 case 50: return GET_LOOPS (50);
9171 case 60: return GET_LOOPS (60);
9172 case 100: return GET_LOOPS (100);
9173 case 101: return GET_LOOPS (101);
9174 case 110: return GET_LOOPS (110);
9175 case 111: return GET_LOOPS (111);
9176 case 112: return GET_LOOPS (112);
9177 case 120: return GET_LOOPS (120);
9178 case 121: return GET_LOOPS (121);
9179 case 122: return GET_LOOPS (122);
9180 case 124: return GET_LOOPS (124);
9181 case 130: return GET_LOOPS (130);
9182 case 131: return GET_LOOPS (131);
9183 case 132: return GET_LOOPS (132);
9184 case 133: return GET_LOOPS (133);
9185 case 140: return GET_LOOPS (140);
9186 case 141: return GET_LOOPS (141);
9187 case 150: return GET_LOOPS (150);
9188 case 160: return GET_LOOPS (160);
9189 case 190: return GET_LOOPS (190);
9190 case 200: return GET_LOOPS (200);
9191 case 300: return GET_LOOPS (300);
9192 case 400: return GET_LOOPS (400);
9193 case 500: return GET_LOOPS (500);
9194 case 501: return GET_LOOPS (501);
9195 case 900: return GET_LOOPS (900);
9196 case 910: return GET_LOOPS (910);
9197 case 1000: return GET_LOOPS (1000);
9198 case 1100: return GET_LOOPS (1100);
9199 case 1400: return GET_LOOPS (1400);
9200 case 1410: return GET_LOOPS (1410);
9201 case 1420: return GET_LOOPS (1420);
9202 case 1421: return GET_LOOPS (1421);
9203 case 1430: return GET_LOOPS (1430);
9204 case 1440: return GET_LOOPS (1440);
9205 case 1441: return GET_LOOPS (1441);
9206 case 1450: return GET_LOOPS (1450);
9207 case 1460: return GET_LOOPS (1460);
9208 case 1500: return GET_LOOPS (1500);
9209 case 1600: return GET_LOOPS (1600);
9210 case 1700: return GET_LOOPS (1700);
9211 case 1710: return GET_LOOPS (1710);
9212 case 1711: return GET_LOOPS (1711);
9213 case 1720: return GET_LOOPS (1720);
9214 case 1722: return GET_LOOPS (1722);
9215 case 1730: return GET_LOOPS (1730);
9216 case 1731: return GET_LOOPS (1731);
9217 case 1740: return GET_LOOPS (1740);
9218 case 1750: return GET_LOOPS (1750);
9219 case 1760: return GET_LOOPS (1760);
9220 case 1800: return GET_LOOPS (1800);
9221 case 2100: return GET_LOOPS (2100);
9222 case 2400: return GET_LOOPS (2400);
9223 case 2410: return GET_LOOPS (2410);
9224 case 2500: return GET_LOOPS (2500);
9225 case 2600: return GET_LOOPS (2600);
9226 case 2611: return GET_LOOPS (2611);
9227 case 2612: return GET_LOOPS (2612);
9228 case 2711: return GET_LOOPS (2711);
9229 case 2811: return GET_LOOPS (2811);
9230 case 3000: return GET_LOOPS (3000);
9231 case 3100: return GET_LOOPS (3100);
9232 case 3200: return GET_LOOPS (3200);
9233 case 3710: return GET_LOOPS (3710);
9234 case 3711: return GET_LOOPS (3711);
9235 case 3800: return GET_LOOPS (3800);
9236 case 4300: return GET_LOOPS (4300);
9237 case 4400: return GET_LOOPS (4400);
9238 case 4500: return GET_LOOPS (4500);
9239 case 4700: return GET_LOOPS (4700);
9240 case 4800: return GET_LOOPS (4800);
9241 case 4900: return GET_LOOPS (4900);
9242 case 5000: return GET_LOOPS (5000);
9243 case 5100: return GET_LOOPS (5100);
9244 case 5200: return GET_LOOPS (5200);
9245 case 5300: return GET_LOOPS (5300);
9246 case 5400: return GET_LOOPS (5400);
9247 case 5500: return GET_LOOPS (5500);
9248 case 5600: return GET_LOOPS (5600);
9249 case 5700: return GET_LOOPS (5700);
9250 case 5800: return GET_LOOPS (5800);
9251 case 6000: return GET_LOOPS (6000);
9252 case 6100: return GET_LOOPS (6100);
9253 case 6211: return GET_LOOPS (6211);
9254 case 6212: return GET_LOOPS (6212);
9255 case 6213: return GET_LOOPS (6213);
9256 case 6221: return GET_LOOPS (6221);
9257 case 6222: return GET_LOOPS (6222);
9258 case 6223: return GET_LOOPS (6223);
9259 case 6231: return GET_LOOPS (6231);
9260 case 6232: return GET_LOOPS (6232);
9261 case 6233: return GET_LOOPS (6233);
9262 case 6241: return GET_LOOPS (6241);
9263 case 6242: return GET_LOOPS (6242);
9264 case 6243: return GET_LOOPS (6243);
9265 case 6300: return GET_LOOPS (6300);
9266 case 6400: return GET_LOOPS (6400);
9267 case 6500: return GET_LOOPS (6500);
9268 case 6600: return GET_LOOPS (6600);
9269 case 6700: return GET_LOOPS (6700);
9270 case 6800: return GET_LOOPS (6800);
9271 case 6900: return GET_LOOPS (6900);
9272 case 7100: return GET_LOOPS (7100);
9273 case 7200: return GET_LOOPS (7200);
9274 case 7300: return GET_LOOPS (7300);
9275 case 7400: return GET_LOOPS (7400);
9276 case 7500: return GET_LOOPS (7500);
9277 case 7600: return GET_LOOPS (7600);
9278 case 7700: return GET_LOOPS (7700);
9279 case 7800: return GET_LOOPS (7800);
9280 case 7900: return GET_LOOPS (7900);
9281 case 8000: return GET_LOOPS (8000);
9282 case 8100: return GET_LOOPS (8100);
9283 case 8200: return GET_LOOPS (8200);
9284 case 8300: return GET_LOOPS (8300);
9285 case 8400: return GET_LOOPS (8400);
9286 case 8500: return GET_LOOPS (8500);
9287 case 8600: return GET_LOOPS (8600);
9288 case 8700: return GET_LOOPS (8700);
9289 case 8800: return GET_LOOPS (8800);
9290 case 8900: return GET_LOOPS (8900);
9291 case 9000: return GET_LOOPS (9000);
9292 case 9100: return GET_LOOPS (9100);
9293 case 9200: return GET_LOOPS (9200);
9294 case 9300: return GET_LOOPS (9300);
9295 case 9400: return GET_LOOPS (9400);
9296 case 9500: return GET_LOOPS (9500);
9297 case 9600: return GET_LOOPS (9600);
9298 case 9700: return GET_LOOPS (9700);
9299 case 9710: return GET_LOOPS (9710);
9300 case 9720: return GET_LOOPS (9720);
9301 case 9800: return GET_LOOPS (9800);
9302 case 9810: return GET_LOOPS (9810);
9303 case 9820: return GET_LOOPS (9820);
9304 case 9900: return GET_LOOPS (9900);
9305 case 10000: return GET_LOOPS (10000);
9306 case 10100: return GET_LOOPS (10100);
9307 case 10200: return GET_LOOPS (10200);
9308 case 10300: return GET_LOOPS (10300);
9309 case 10400: return GET_LOOPS (10400);
9310 case 10410: return GET_LOOPS (10410);
9311 case 10420: return GET_LOOPS (10420);
9312 case 10500: return GET_LOOPS (10500);
9313 case 10600: return GET_LOOPS (10600);
9314 case 10700: return GET_LOOPS (10700);
9315 case 10800: return GET_LOOPS (10800);
9316 case 10900: return GET_LOOPS (10900);
9317 case 11000: return GET_LOOPS (11000);
9318 case 11100: return GET_LOOPS (11100);
9319 case 11200: return GET_LOOPS (11200);
9320 case 11300: return GET_LOOPS (11300);
9321 case 11400: return GET_LOOPS (11400);
9322 case 11500: return GET_LOOPS (11500);
9323 case 11600: return GET_LOOPS (11600);
9324 case 11700: return GET_LOOPS (11700);
9325 case 11800: return GET_LOOPS (11800);
9326 case 11900: return GET_LOOPS (11900);
9327 case 12000: return GET_LOOPS (12000);
9328 case 12100: return GET_LOOPS (12100);
9329 case 12200: return GET_LOOPS (12200);
9330 case 12300: return GET_LOOPS (12300);
9331 case 12400: return GET_LOOPS (12400);
9332 case 12500: return GET_LOOPS (12500);
9333 case 12600: return GET_LOOPS (12600);
9334 case 12700: return GET_LOOPS (12700);
9335 case 12800: return GET_LOOPS (12800);
9336 case 12900: return GET_LOOPS (12900);
9337 case 13000: return GET_LOOPS (13000);
9338 }
9339
9340 return 0;
9341 }
9342
9343 /**
9344 * parser
9345 */
9346
9347 uint parse_and_store_salt (char *out, char *in, uint salt_len)
9348 {
9349 u8 tmp[256] = { 0 };
9350
9351 if (salt_len > sizeof (tmp))
9352 {
9353 return UINT_MAX;
9354 }
9355
9356 memcpy (tmp, in, salt_len);
9357
9358 if (data.opts_type & OPTS_TYPE_ST_HEX)
9359 {
9360 if ((salt_len % 2) == 0)
9361 {
9362 u32 new_salt_len = salt_len / 2;
9363
9364 for (uint i = 0, j = 0; i < new_salt_len; i += 1, j += 2)
9365 {
9366 u8 p0 = tmp[j + 0];
9367 u8 p1 = tmp[j + 1];
9368
9369 tmp[i] = hex_convert (p1) << 0;
9370 tmp[i] |= hex_convert (p0) << 4;
9371 }
9372
9373 salt_len = new_salt_len;
9374 }
9375 else
9376 {
9377 return UINT_MAX;
9378 }
9379 }
9380 else if (data.opts_type & OPTS_TYPE_ST_BASE64)
9381 {
9382 salt_len = base64_decode (base64_to_int, (const u8 *) in, salt_len, (u8 *) tmp);
9383 }
9384
9385 memset (tmp + salt_len, 0, sizeof (tmp) - salt_len);
9386
9387 if (data.opts_type & OPTS_TYPE_ST_UNICODE)
9388 {
9389 if (salt_len < 20)
9390 {
9391 u32 *tmp_uint = (u32 *) tmp;
9392
9393 tmp_uint[9] = ((tmp_uint[4] >> 8) & 0x00FF0000) | ((tmp_uint[4] >> 16) & 0x000000FF);
9394 tmp_uint[8] = ((tmp_uint[4] << 8) & 0x00FF0000) | ((tmp_uint[4] >> 0) & 0x000000FF);
9395 tmp_uint[7] = ((tmp_uint[3] >> 8) & 0x00FF0000) | ((tmp_uint[3] >> 16) & 0x000000FF);
9396 tmp_uint[6] = ((tmp_uint[3] << 8) & 0x00FF0000) | ((tmp_uint[3] >> 0) & 0x000000FF);
9397 tmp_uint[5] = ((tmp_uint[2] >> 8) & 0x00FF0000) | ((tmp_uint[2] >> 16) & 0x000000FF);
9398 tmp_uint[4] = ((tmp_uint[2] << 8) & 0x00FF0000) | ((tmp_uint[2] >> 0) & 0x000000FF);
9399 tmp_uint[3] = ((tmp_uint[1] >> 8) & 0x00FF0000) | ((tmp_uint[1] >> 16) & 0x000000FF);
9400 tmp_uint[2] = ((tmp_uint[1] << 8) & 0x00FF0000) | ((tmp_uint[1] >> 0) & 0x000000FF);
9401 tmp_uint[1] = ((tmp_uint[0] >> 8) & 0x00FF0000) | ((tmp_uint[0] >> 16) & 0x000000FF);
9402 tmp_uint[0] = ((tmp_uint[0] << 8) & 0x00FF0000) | ((tmp_uint[0] >> 0) & 0x000000FF);
9403
9404 salt_len = salt_len * 2;
9405 }
9406 else
9407 {
9408 return UINT_MAX;
9409 }
9410 }
9411
9412 if (data.opts_type & OPTS_TYPE_ST_LOWER)
9413 {
9414 lowercase (tmp, salt_len);
9415 }
9416
9417 if (data.opts_type & OPTS_TYPE_ST_UPPER)
9418 {
9419 uppercase (tmp, salt_len);
9420 }
9421
9422 u32 len = salt_len;
9423
9424 if (data.opts_type & OPTS_TYPE_ST_ADD80)
9425 {
9426 tmp[len++] = 0x80;
9427 }
9428
9429 if (data.opts_type & OPTS_TYPE_ST_ADD01)
9430 {
9431 tmp[len++] = 0x01;
9432 }
9433
9434 if (data.opts_type & OPTS_TYPE_ST_GENERATE_LE)
9435 {
9436 u32 *tmp_uint = (uint *) tmp;
9437
9438 u32 max = len / 4;
9439
9440 if (len % 4) max++;
9441
9442 for (u32 i = 0; i < max; i++)
9443 {
9444 tmp_uint[i] = byte_swap_32 (tmp_uint[i]);
9445 }
9446
9447 // Important: we may need to increase the length of memcpy since
9448 // we don't want to "loose" some swapped bytes (could happen if
9449 // they do not perfectly fit in the 4-byte blocks)
9450 // Memcpy does always copy the bytes in the BE order, but since
9451 // we swapped them, some important bytes could be in positions
9452 // we normally skip with the original len
9453
9454 if (len % 4) len += 4 - (len % 4);
9455 }
9456
9457 memcpy (out, tmp, len);
9458
9459 return (salt_len);
9460 }
9461
9462 int bcrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9463 {
9464 if ((input_len < DISPLAY_LEN_MIN_3200) || (input_len > DISPLAY_LEN_MAX_3200)) return (PARSER_GLOBAL_LENGTH);
9465
9466 if ((memcmp (SIGNATURE_BCRYPT1, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT2, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT3, input_buf, 4))) return (PARSER_SIGNATURE_UNMATCHED);
9467
9468 u32 *digest = (u32 *) hash_buf->digest;
9469
9470 salt_t *salt = hash_buf->salt;
9471
9472 memcpy ((char *) salt->salt_sign, input_buf, 6);
9473
9474 char *iter_pos = input_buf + 4;
9475
9476 salt->salt_iter = 1 << atoi (iter_pos);
9477
9478 char *salt_pos = strchr (iter_pos, '$');
9479
9480 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9481
9482 salt_pos++;
9483
9484 uint salt_len = 16;
9485
9486 salt->salt_len = salt_len;
9487
9488 u8 tmp_buf[100] = { 0 };
9489
9490 base64_decode (bf64_to_int, (const u8 *) salt_pos, 22, tmp_buf);
9491
9492 char *salt_buf_ptr = (char *) salt->salt_buf;
9493
9494 memcpy (salt_buf_ptr, tmp_buf, 16);
9495
9496 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
9497 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
9498 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
9499 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
9500
9501 char *hash_pos = salt_pos + 22;
9502
9503 memset (tmp_buf, 0, sizeof (tmp_buf));
9504
9505 base64_decode (bf64_to_int, (const u8 *) hash_pos, 31, tmp_buf);
9506
9507 memcpy (digest, tmp_buf, 24);
9508
9509 digest[0] = byte_swap_32 (digest[0]);
9510 digest[1] = byte_swap_32 (digest[1]);
9511 digest[2] = byte_swap_32 (digest[2]);
9512 digest[3] = byte_swap_32 (digest[3]);
9513 digest[4] = byte_swap_32 (digest[4]);
9514 digest[5] = byte_swap_32 (digest[5]);
9515
9516 digest[5] &= ~0xff; // its just 23 not 24 !
9517
9518 return (PARSER_OK);
9519 }
9520
9521 int cisco4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9522 {
9523 if ((input_len < DISPLAY_LEN_MIN_5700) || (input_len > DISPLAY_LEN_MAX_5700)) return (PARSER_GLOBAL_LENGTH);
9524
9525 u32 *digest = (u32 *) hash_buf->digest;
9526
9527 u8 tmp_buf[100] = { 0 };
9528
9529 base64_decode (itoa64_to_int, (const u8 *) input_buf, 43, tmp_buf);
9530
9531 memcpy (digest, tmp_buf, 32);
9532
9533 digest[0] = byte_swap_32 (digest[0]);
9534 digest[1] = byte_swap_32 (digest[1]);
9535 digest[2] = byte_swap_32 (digest[2]);
9536 digest[3] = byte_swap_32 (digest[3]);
9537 digest[4] = byte_swap_32 (digest[4]);
9538 digest[5] = byte_swap_32 (digest[5]);
9539 digest[6] = byte_swap_32 (digest[6]);
9540 digest[7] = byte_swap_32 (digest[7]);
9541
9542 digest[0] -= SHA256M_A;
9543 digest[1] -= SHA256M_B;
9544 digest[2] -= SHA256M_C;
9545 digest[3] -= SHA256M_D;
9546 digest[4] -= SHA256M_E;
9547 digest[5] -= SHA256M_F;
9548 digest[6] -= SHA256M_G;
9549 digest[7] -= SHA256M_H;
9550
9551 return (PARSER_OK);
9552 }
9553
9554 int lm_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9555 {
9556 if ((input_len < DISPLAY_LEN_MIN_3000) || (input_len > DISPLAY_LEN_MAX_3000)) return (PARSER_GLOBAL_LENGTH);
9557
9558 u32 *digest = (u32 *) hash_buf->digest;
9559
9560 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
9561 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
9562
9563 digest[0] = byte_swap_32 (digest[0]);
9564 digest[1] = byte_swap_32 (digest[1]);
9565
9566 uint tt;
9567
9568 IP (digest[0], digest[1], tt);
9569
9570 digest[0] = digest[0];
9571 digest[1] = digest[1];
9572 digest[2] = 0;
9573 digest[3] = 0;
9574
9575 return (PARSER_OK);
9576 }
9577
9578 int osx1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9579 {
9580 if ((input_len < DISPLAY_LEN_MIN_122) || (input_len > DISPLAY_LEN_MAX_122)) return (PARSER_GLOBAL_LENGTH);
9581
9582 u32 *digest = (u32 *) hash_buf->digest;
9583
9584 salt_t *salt = hash_buf->salt;
9585
9586 char *hash_pos = input_buf + 8;
9587
9588 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
9589 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
9590 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
9591 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
9592 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
9593
9594 digest[0] -= SHA1M_A;
9595 digest[1] -= SHA1M_B;
9596 digest[2] -= SHA1M_C;
9597 digest[3] -= SHA1M_D;
9598 digest[4] -= SHA1M_E;
9599
9600 uint salt_len = 8;
9601
9602 char *salt_buf_ptr = (char *) salt->salt_buf;
9603
9604 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
9605
9606 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9607
9608 salt->salt_len = salt_len;
9609
9610 return (PARSER_OK);
9611 }
9612
9613 int osx512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9614 {
9615 if ((input_len < DISPLAY_LEN_MIN_1722) || (input_len > DISPLAY_LEN_MAX_1722)) return (PARSER_GLOBAL_LENGTH);
9616
9617 u64 *digest = (u64 *) hash_buf->digest;
9618
9619 salt_t *salt = hash_buf->salt;
9620
9621 char *hash_pos = input_buf + 8;
9622
9623 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
9624 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
9625 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
9626 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
9627 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
9628 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
9629 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
9630 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
9631
9632 digest[0] -= SHA512M_A;
9633 digest[1] -= SHA512M_B;
9634 digest[2] -= SHA512M_C;
9635 digest[3] -= SHA512M_D;
9636 digest[4] -= SHA512M_E;
9637 digest[5] -= SHA512M_F;
9638 digest[6] -= SHA512M_G;
9639 digest[7] -= SHA512M_H;
9640
9641 uint salt_len = 8;
9642
9643 char *salt_buf_ptr = (char *) salt->salt_buf;
9644
9645 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
9646
9647 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9648
9649 salt->salt_len = salt_len;
9650
9651 return (PARSER_OK);
9652 }
9653
9654 int osc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9655 {
9656 if (data.opts_type & OPTS_TYPE_ST_HEX)
9657 {
9658 if ((input_len < DISPLAY_LEN_MIN_21H) || (input_len > DISPLAY_LEN_MAX_21H)) return (PARSER_GLOBAL_LENGTH);
9659 }
9660 else
9661 {
9662 if ((input_len < DISPLAY_LEN_MIN_21) || (input_len > DISPLAY_LEN_MAX_21)) return (PARSER_GLOBAL_LENGTH);
9663 }
9664
9665 u32 *digest = (u32 *) hash_buf->digest;
9666
9667 salt_t *salt = hash_buf->salt;
9668
9669 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
9670 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
9671 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
9672 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
9673
9674 digest[0] = byte_swap_32 (digest[0]);
9675 digest[1] = byte_swap_32 (digest[1]);
9676 digest[2] = byte_swap_32 (digest[2]);
9677 digest[3] = byte_swap_32 (digest[3]);
9678
9679 digest[0] -= MD5M_A;
9680 digest[1] -= MD5M_B;
9681 digest[2] -= MD5M_C;
9682 digest[3] -= MD5M_D;
9683
9684 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
9685
9686 uint salt_len = input_len - 32 - 1;
9687
9688 char *salt_buf = input_buf + 32 + 1;
9689
9690 char *salt_buf_ptr = (char *) salt->salt_buf;
9691
9692 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
9693
9694 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9695
9696 salt->salt_len = salt_len;
9697
9698 return (PARSER_OK);
9699 }
9700
9701 int netscreen_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9702 {
9703 if (data.opts_type & OPTS_TYPE_ST_HEX)
9704 {
9705 if ((input_len < DISPLAY_LEN_MIN_22H) || (input_len > DISPLAY_LEN_MAX_22H)) return (PARSER_GLOBAL_LENGTH);
9706 }
9707 else
9708 {
9709 if ((input_len < DISPLAY_LEN_MIN_22) || (input_len > DISPLAY_LEN_MAX_22)) return (PARSER_GLOBAL_LENGTH);
9710 }
9711
9712 // unscramble
9713
9714 char clean_input_buf[32] = { 0 };
9715
9716 char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' };
9717 int pos[6] = { 0, 6, 12, 17, 23, 29 };
9718
9719 for (int i = 0, j = 0, k = 0; i < 30; i++)
9720 {
9721 if (i == pos[j])
9722 {
9723 if (sig[j] != input_buf[i]) return (PARSER_SIGNATURE_UNMATCHED);
9724
9725 j++;
9726 }
9727 else
9728 {
9729 clean_input_buf[k] = input_buf[i];
9730
9731 k++;
9732 }
9733 }
9734
9735 // base64 decode
9736
9737 u32 *digest = (u32 *) hash_buf->digest;
9738
9739 salt_t *salt = hash_buf->salt;
9740
9741 u32 a, b, c, d, e, f;
9742
9743 a = base64_to_int (clean_input_buf[ 0] & 0x7f);
9744 b = base64_to_int (clean_input_buf[ 1] & 0x7f);
9745 c = base64_to_int (clean_input_buf[ 2] & 0x7f);
9746 d = base64_to_int (clean_input_buf[ 3] & 0x7f);
9747 e = base64_to_int (clean_input_buf[ 4] & 0x7f);
9748 f = base64_to_int (clean_input_buf[ 5] & 0x7f);
9749
9750 digest[0] = (((a << 12) | (b << 6) | (c)) << 16)
9751 | (((d << 12) | (e << 6) | (f)) << 0);
9752
9753 a = base64_to_int (clean_input_buf[ 6] & 0x7f);
9754 b = base64_to_int (clean_input_buf[ 7] & 0x7f);
9755 c = base64_to_int (clean_input_buf[ 8] & 0x7f);
9756 d = base64_to_int (clean_input_buf[ 9] & 0x7f);
9757 e = base64_to_int (clean_input_buf[10] & 0x7f);
9758 f = base64_to_int (clean_input_buf[11] & 0x7f);
9759
9760 digest[1] = (((a << 12) | (b << 6) | (c)) << 16)
9761 | (((d << 12) | (e << 6) | (f)) << 0);
9762
9763 a = base64_to_int (clean_input_buf[12] & 0x7f);
9764 b = base64_to_int (clean_input_buf[13] & 0x7f);
9765 c = base64_to_int (clean_input_buf[14] & 0x7f);
9766 d = base64_to_int (clean_input_buf[15] & 0x7f);
9767 e = base64_to_int (clean_input_buf[16] & 0x7f);
9768 f = base64_to_int (clean_input_buf[17] & 0x7f);
9769
9770 digest[2] = (((a << 12) | (b << 6) | (c)) << 16)
9771 | (((d << 12) | (e << 6) | (f)) << 0);
9772
9773 a = base64_to_int (clean_input_buf[18] & 0x7f);
9774 b = base64_to_int (clean_input_buf[19] & 0x7f);
9775 c = base64_to_int (clean_input_buf[20] & 0x7f);
9776 d = base64_to_int (clean_input_buf[21] & 0x7f);
9777 e = base64_to_int (clean_input_buf[22] & 0x7f);
9778 f = base64_to_int (clean_input_buf[23] & 0x7f);
9779
9780 digest[3] = (((a << 12) | (b << 6) | (c)) << 16)
9781 | (((d << 12) | (e << 6) | (f)) << 0);
9782
9783 digest[0] = byte_swap_32 (digest[0]);
9784 digest[1] = byte_swap_32 (digest[1]);
9785 digest[2] = byte_swap_32 (digest[2]);
9786 digest[3] = byte_swap_32 (digest[3]);
9787
9788 digest[0] -= MD5M_A;
9789 digest[1] -= MD5M_B;
9790 digest[2] -= MD5M_C;
9791 digest[3] -= MD5M_D;
9792
9793 if (input_buf[30] != ':') return (PARSER_SEPARATOR_UNMATCHED);
9794
9795 uint salt_len = input_len - 30 - 1;
9796
9797 char *salt_buf = input_buf + 30 + 1;
9798
9799 char *salt_buf_ptr = (char *) salt->salt_buf;
9800
9801 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
9802
9803 // max. salt length: salt_buf[32] => 32 - 22 (":Administration Tools:") = 10
9804 if (salt_len > 10) return (PARSER_SALT_LENGTH);
9805
9806 salt->salt_len = salt_len;
9807
9808 memcpy (salt_buf_ptr + salt_len, ":Administration Tools:", 22);
9809
9810 salt->salt_len += 22;
9811
9812 return (PARSER_OK);
9813 }
9814
9815 int smf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9816 {
9817 if (data.opts_type & OPTS_TYPE_ST_HEX)
9818 {
9819 if ((input_len < DISPLAY_LEN_MIN_121H) || (input_len > DISPLAY_LEN_MAX_121H)) return (PARSER_GLOBAL_LENGTH);
9820 }
9821 else
9822 {
9823 if ((input_len < DISPLAY_LEN_MIN_121) || (input_len > DISPLAY_LEN_MAX_121)) return (PARSER_GLOBAL_LENGTH);
9824 }
9825
9826 u32 *digest = (u32 *) hash_buf->digest;
9827
9828 salt_t *salt = hash_buf->salt;
9829
9830 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
9831 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
9832 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
9833 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
9834 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
9835
9836 digest[0] -= SHA1M_A;
9837 digest[1] -= SHA1M_B;
9838 digest[2] -= SHA1M_C;
9839 digest[3] -= SHA1M_D;
9840 digest[4] -= SHA1M_E;
9841
9842 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
9843
9844 uint salt_len = input_len - 40 - 1;
9845
9846 char *salt_buf = input_buf + 40 + 1;
9847
9848 char *salt_buf_ptr = (char *) salt->salt_buf;
9849
9850 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
9851
9852 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9853
9854 salt->salt_len = salt_len;
9855
9856 return (PARSER_OK);
9857 }
9858
9859 int dcc2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9860 {
9861 if (data.opts_type & OPTS_TYPE_ST_HEX)
9862 {
9863 if ((input_len < DISPLAY_LEN_MIN_2100H) || (input_len > DISPLAY_LEN_MAX_2100H)) return (PARSER_GLOBAL_LENGTH);
9864 }
9865 else
9866 {
9867 if ((input_len < DISPLAY_LEN_MIN_2100) || (input_len > DISPLAY_LEN_MAX_2100)) return (PARSER_GLOBAL_LENGTH);
9868 }
9869
9870 if (memcmp (SIGNATURE_DCC2, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
9871
9872 char *iter_pos = input_buf + 6;
9873
9874 salt_t *salt = hash_buf->salt;
9875
9876 uint iter = atoi (iter_pos);
9877
9878 if (iter < 1)
9879 {
9880 iter = ROUNDS_DCC2;
9881 }
9882
9883 salt->salt_iter = iter - 1;
9884
9885 char *salt_pos = strchr (iter_pos, '#');
9886
9887 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9888
9889 salt_pos++;
9890
9891 char *digest_pos = strchr (salt_pos, '#');
9892
9893 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9894
9895 digest_pos++;
9896
9897 uint salt_len = digest_pos - salt_pos - 1;
9898
9899 u32 *digest = (u32 *) hash_buf->digest;
9900
9901 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
9902 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
9903 digest[2] = hex_to_u32 ((const u8 *) &digest_pos[16]);
9904 digest[3] = hex_to_u32 ((const u8 *) &digest_pos[24]);
9905
9906 char *salt_buf_ptr = (char *) salt->salt_buf;
9907
9908 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
9909
9910 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9911
9912 salt->salt_len = salt_len;
9913
9914 return (PARSER_OK);
9915 }
9916
9917 int wpa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9918 {
9919 u32 *digest = (u32 *) hash_buf->digest;
9920
9921 salt_t *salt = hash_buf->salt;
9922
9923 wpa_t *wpa = (wpa_t *) hash_buf->esalt;
9924
9925 hccap_t in;
9926
9927 memcpy (&in, input_buf, input_len);
9928
9929 if (in.eapol_size < 1 || in.eapol_size > 255) return (PARSER_HCCAP_EAPOL_SIZE);
9930
9931 memcpy (digest, in.keymic, 16);
9932
9933 /*
9934 http://www.one-net.eu/jsw/j_sec/m_ptype.html
9935 The phrase "Pairwise key expansion"
9936 Access Point Address (referred to as Authenticator Address AA)
9937 Supplicant Address (referred to as Supplicant Address SA)
9938 Access Point Nonce (referred to as Authenticator Anonce)
9939 Wireless Device Nonce (referred to as Supplicant Nonce Snonce)
9940 */
9941
9942 uint salt_len = strlen (in.essid);
9943
9944 memcpy (salt->salt_buf, in.essid, salt_len);
9945
9946 salt->salt_len = salt_len;
9947
9948 salt->salt_iter = ROUNDS_WPA2 - 1;
9949
9950 unsigned char *pke_ptr = (unsigned char *) wpa->pke;
9951
9952 memcpy (pke_ptr, "Pairwise key expansion", 23);
9953
9954 if (memcmp (in.mac1, in.mac2, 6) < 0)
9955 {
9956 memcpy (pke_ptr + 23, in.mac1, 6);
9957 memcpy (pke_ptr + 29, in.mac2, 6);
9958 }
9959 else
9960 {
9961 memcpy (pke_ptr + 23, in.mac2, 6);
9962 memcpy (pke_ptr + 29, in.mac1, 6);
9963 }
9964
9965 if (memcmp (in.nonce1, in.nonce2, 32) < 0)
9966 {
9967 memcpy (pke_ptr + 35, in.nonce1, 32);
9968 memcpy (pke_ptr + 67, in.nonce2, 32);
9969 }
9970 else
9971 {
9972 memcpy (pke_ptr + 35, in.nonce2, 32);
9973 memcpy (pke_ptr + 67, in.nonce1, 32);
9974 }
9975
9976 for (int i = 0; i < 25; i++)
9977 {
9978 wpa->pke[i] = byte_swap_32 (wpa->pke[i]);
9979 }
9980
9981 wpa->keyver = in.keyver;
9982
9983 if (wpa->keyver > 255)
9984 {
9985 log_info ("ATTENTION!");
9986 log_info (" The WPA/WPA2 key version in your .hccap file is invalid!");
9987 log_info (" This could be due to a recent aircrack-ng bug.");
9988 log_info (" The key version was automatically reset to a reasonable value.");
9989 log_info ("");
9990
9991 wpa->keyver &= 0xff;
9992 }
9993
9994 wpa->eapol_size = in.eapol_size;
9995
9996 unsigned char *eapol_ptr = (unsigned char *) wpa->eapol;
9997
9998 memcpy (eapol_ptr, in.eapol, wpa->eapol_size);
9999
10000 memset (eapol_ptr + wpa->eapol_size, 0, 256 - wpa->eapol_size);
10001
10002 eapol_ptr[wpa->eapol_size] = (unsigned char) 0x80;
10003
10004 if (wpa->keyver == 1)
10005 {
10006 // nothing to do
10007 }
10008 else
10009 {
10010 digest[0] = byte_swap_32 (digest[0]);
10011 digest[1] = byte_swap_32 (digest[1]);
10012 digest[2] = byte_swap_32 (digest[2]);
10013 digest[3] = byte_swap_32 (digest[3]);
10014
10015 for (int i = 0; i < 64; i++)
10016 {
10017 wpa->eapol[i] = byte_swap_32 (wpa->eapol[i]);
10018 }
10019 }
10020
10021 salt->salt_buf[10] = digest[1];
10022 salt->salt_buf[11] = digest[2];
10023
10024 return (PARSER_OK);
10025 }
10026
10027 int psafe2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10028 {
10029 u32 *digest = (u32 *) hash_buf->digest;
10030
10031 salt_t *salt = hash_buf->salt;
10032
10033 if (input_len == 0)
10034 {
10035 log_error ("Password Safe v2 container not specified");
10036
10037 exit (-1);
10038 }
10039
10040 FILE *fp = fopen (input_buf, "rb");
10041
10042 if (fp == NULL)
10043 {
10044 log_error ("%s: %s", input_buf, strerror (errno));
10045
10046 exit (-1);
10047 }
10048
10049 psafe2_hdr buf;
10050
10051 memset (&buf, 0, sizeof (psafe2_hdr));
10052
10053 int n = fread (&buf, sizeof (psafe2_hdr), 1, fp);
10054
10055 fclose (fp);
10056
10057 if (n != 1) return (PARSER_PSAFE2_FILE_SIZE);
10058
10059 salt->salt_buf[0] = buf.random[0];
10060 salt->salt_buf[1] = buf.random[1];
10061
10062 salt->salt_len = 8;
10063 salt->salt_iter = 1000;
10064
10065 digest[0] = byte_swap_32 (buf.hash[0]);
10066 digest[1] = byte_swap_32 (buf.hash[1]);
10067 digest[2] = byte_swap_32 (buf.hash[2]);
10068 digest[3] = byte_swap_32 (buf.hash[3]);
10069 digest[4] = byte_swap_32 (buf.hash[4]);
10070
10071 return (PARSER_OK);
10072 }
10073
10074 int psafe3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10075 {
10076 u32 *digest = (u32 *) hash_buf->digest;
10077
10078 salt_t *salt = hash_buf->salt;
10079
10080 if (input_len == 0)
10081 {
10082 log_error (".psafe3 not specified");
10083
10084 exit (-1);
10085 }
10086
10087 FILE *fp = fopen (input_buf, "rb");
10088
10089 if (fp == NULL)
10090 {
10091 log_error ("%s: %s", input_buf, strerror (errno));
10092
10093 exit (-1);
10094 }
10095
10096 psafe3_t in;
10097
10098 int n = fread (&in, sizeof (psafe3_t), 1, fp);
10099
10100 fclose (fp);
10101
10102 data.hashfile = input_buf; // we will need this in case it gets cracked
10103
10104 if (memcmp (SIGNATURE_PSAFE3, in.signature, 4)) return (PARSER_SIGNATURE_UNMATCHED);
10105
10106 if (n != 1) return (PARSER_PSAFE3_FILE_SIZE);
10107
10108 salt->salt_iter = in.iterations + 1;
10109
10110 salt->salt_buf[0] = in.salt_buf[0];
10111 salt->salt_buf[1] = in.salt_buf[1];
10112 salt->salt_buf[2] = in.salt_buf[2];
10113 salt->salt_buf[3] = in.salt_buf[3];
10114 salt->salt_buf[4] = in.salt_buf[4];
10115 salt->salt_buf[5] = in.salt_buf[5];
10116 salt->salt_buf[6] = in.salt_buf[6];
10117 salt->salt_buf[7] = in.salt_buf[7];
10118
10119 salt->salt_len = 32;
10120
10121 digest[0] = in.hash_buf[0];
10122 digest[1] = in.hash_buf[1];
10123 digest[2] = in.hash_buf[2];
10124 digest[3] = in.hash_buf[3];
10125 digest[4] = in.hash_buf[4];
10126 digest[5] = in.hash_buf[5];
10127 digest[6] = in.hash_buf[6];
10128 digest[7] = in.hash_buf[7];
10129
10130 digest[0] = byte_swap_32 (digest[0]);
10131 digest[1] = byte_swap_32 (digest[1]);
10132 digest[2] = byte_swap_32 (digest[2]);
10133 digest[3] = byte_swap_32 (digest[3]);
10134 digest[4] = byte_swap_32 (digest[4]);
10135 digest[5] = byte_swap_32 (digest[5]);
10136 digest[6] = byte_swap_32 (digest[6]);
10137 digest[7] = byte_swap_32 (digest[7]);
10138
10139 return (PARSER_OK);
10140 }
10141
10142 int phpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10143 {
10144 if ((input_len < DISPLAY_LEN_MIN_400) || (input_len > DISPLAY_LEN_MAX_400)) return (PARSER_GLOBAL_LENGTH);
10145
10146 if ((memcmp (SIGNATURE_PHPASS1, input_buf, 3)) && (memcmp (SIGNATURE_PHPASS2, input_buf, 3))) return (PARSER_SIGNATURE_UNMATCHED);
10147
10148 u32 *digest = (u32 *) hash_buf->digest;
10149
10150 salt_t *salt = hash_buf->salt;
10151
10152 char *iter_pos = input_buf + 3;
10153
10154 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
10155
10156 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
10157
10158 memcpy ((char *) salt->salt_sign, input_buf, 4);
10159
10160 salt->salt_iter = salt_iter;
10161
10162 char *salt_pos = iter_pos + 1;
10163
10164 uint salt_len = 8;
10165
10166 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10167
10168 salt->salt_len = salt_len;
10169
10170 char *hash_pos = salt_pos + salt_len;
10171
10172 phpass_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10173
10174 return (PARSER_OK);
10175 }
10176
10177 int md5crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10178 {
10179 if (memcmp (SIGNATURE_MD5CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
10180
10181 u32 *digest = (u32 *) hash_buf->digest;
10182
10183 salt_t *salt = hash_buf->salt;
10184
10185 char *salt_pos = input_buf + 3;
10186
10187 uint iterations_len = 0;
10188
10189 if (memcmp (salt_pos, "rounds=", 7) == 0)
10190 {
10191 salt_pos += 7;
10192
10193 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10194
10195 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10196 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10197
10198 salt_pos[0] = 0x0;
10199
10200 salt->salt_iter = atoi (salt_pos - iterations_len);
10201
10202 salt_pos += 1;
10203
10204 iterations_len += 8;
10205 }
10206 else
10207 {
10208 salt->salt_iter = ROUNDS_MD5CRYPT;
10209 }
10210
10211 if ((input_len < DISPLAY_LEN_MIN_500) || (input_len > (DISPLAY_LEN_MAX_500 + iterations_len))) return (PARSER_GLOBAL_LENGTH);
10212
10213 char *hash_pos = strchr (salt_pos, '$');
10214
10215 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10216
10217 uint salt_len = hash_pos - salt_pos;
10218
10219 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10220
10221 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10222
10223 salt->salt_len = salt_len;
10224
10225 hash_pos++;
10226
10227 uint hash_len = input_len - 3 - iterations_len - salt_len - 1;
10228
10229 if (hash_len != 22) return (PARSER_HASH_LENGTH);
10230
10231 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10232
10233 return (PARSER_OK);
10234 }
10235
10236 int md5apr1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10237 {
10238 if (memcmp (SIGNATURE_MD5APR1, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
10239
10240 u32 *digest = (u32 *) hash_buf->digest;
10241
10242 salt_t *salt = hash_buf->salt;
10243
10244 char *salt_pos = input_buf + 6;
10245
10246 uint iterations_len = 0;
10247
10248 if (memcmp (salt_pos, "rounds=", 7) == 0)
10249 {
10250 salt_pos += 7;
10251
10252 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10253
10254 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10255 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10256
10257 salt_pos[0] = 0x0;
10258
10259 salt->salt_iter = atoi (salt_pos - iterations_len);
10260
10261 salt_pos += 1;
10262
10263 iterations_len += 8;
10264 }
10265 else
10266 {
10267 salt->salt_iter = ROUNDS_MD5CRYPT;
10268 }
10269
10270 if ((input_len < DISPLAY_LEN_MIN_1600) || (input_len > DISPLAY_LEN_MAX_1600 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
10271
10272 char *hash_pos = strchr (salt_pos, '$');
10273
10274 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10275
10276 uint salt_len = hash_pos - salt_pos;
10277
10278 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10279
10280 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10281
10282 salt->salt_len = salt_len;
10283
10284 hash_pos++;
10285
10286 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10287
10288 return (PARSER_OK);
10289 }
10290
10291 int episerver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10292 {
10293 if ((input_len < DISPLAY_LEN_MIN_141) || (input_len > DISPLAY_LEN_MAX_141)) return (PARSER_GLOBAL_LENGTH);
10294
10295 if (memcmp (SIGNATURE_EPISERVER, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
10296
10297 u32 *digest = (u32 *) hash_buf->digest;
10298
10299 salt_t *salt = hash_buf->salt;
10300
10301 char *salt_pos = input_buf + 14;
10302
10303 char *hash_pos = strchr (salt_pos, '*');
10304
10305 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10306
10307 hash_pos++;
10308
10309 uint salt_len = hash_pos - salt_pos - 1;
10310
10311 char *salt_buf_ptr = (char *) salt->salt_buf;
10312
10313 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
10314
10315 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10316
10317 salt->salt_len = salt_len;
10318
10319 u8 tmp_buf[100] = { 0 };
10320
10321 base64_decode (base64_to_int, (const u8 *) hash_pos, 27, tmp_buf);
10322
10323 memcpy (digest, tmp_buf, 20);
10324
10325 digest[0] = byte_swap_32 (digest[0]);
10326 digest[1] = byte_swap_32 (digest[1]);
10327 digest[2] = byte_swap_32 (digest[2]);
10328 digest[3] = byte_swap_32 (digest[3]);
10329 digest[4] = byte_swap_32 (digest[4]);
10330
10331 digest[0] -= SHA1M_A;
10332 digest[1] -= SHA1M_B;
10333 digest[2] -= SHA1M_C;
10334 digest[3] -= SHA1M_D;
10335 digest[4] -= SHA1M_E;
10336
10337 return (PARSER_OK);
10338 }
10339
10340 int descrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10341 {
10342 if ((input_len < DISPLAY_LEN_MIN_1500) || (input_len > DISPLAY_LEN_MAX_1500)) return (PARSER_GLOBAL_LENGTH);
10343
10344 unsigned char c12 = itoa64_to_int (input_buf[12]);
10345
10346 if (c12 & 3) return (PARSER_HASH_VALUE);
10347
10348 u32 *digest = (u32 *) hash_buf->digest;
10349
10350 salt_t *salt = hash_buf->salt;
10351
10352 // for ascii_digest
10353 salt->salt_sign[0] = input_buf[0];
10354 salt->salt_sign[1] = input_buf[1];
10355
10356 salt->salt_buf[0] = itoa64_to_int (input_buf[0])
10357 | itoa64_to_int (input_buf[1]) << 6;
10358
10359 salt->salt_len = 2;
10360
10361 u8 tmp_buf[100] = { 0 };
10362
10363 base64_decode (itoa64_to_int, (const u8 *) input_buf + 2, 11, tmp_buf);
10364
10365 memcpy (digest, tmp_buf, 8);
10366
10367 uint tt;
10368
10369 IP (digest[0], digest[1], tt);
10370
10371 digest[2] = 0;
10372 digest[3] = 0;
10373
10374 return (PARSER_OK);
10375 }
10376
10377 int md4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10378 {
10379 if ((input_len < DISPLAY_LEN_MIN_900) || (input_len > DISPLAY_LEN_MAX_900)) return (PARSER_GLOBAL_LENGTH);
10380
10381 u32 *digest = (u32 *) hash_buf->digest;
10382
10383 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10384 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10385 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10386 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10387
10388 digest[0] = byte_swap_32 (digest[0]);
10389 digest[1] = byte_swap_32 (digest[1]);
10390 digest[2] = byte_swap_32 (digest[2]);
10391 digest[3] = byte_swap_32 (digest[3]);
10392
10393 digest[0] -= MD4M_A;
10394 digest[1] -= MD4M_B;
10395 digest[2] -= MD4M_C;
10396 digest[3] -= MD4M_D;
10397
10398 return (PARSER_OK);
10399 }
10400
10401 int md4s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10402 {
10403 if (data.opts_type & OPTS_TYPE_ST_HEX)
10404 {
10405 if ((input_len < DISPLAY_LEN_MIN_910H) || (input_len > DISPLAY_LEN_MAX_910H)) return (PARSER_GLOBAL_LENGTH);
10406 }
10407 else
10408 {
10409 if ((input_len < DISPLAY_LEN_MIN_910) || (input_len > DISPLAY_LEN_MAX_910)) return (PARSER_GLOBAL_LENGTH);
10410 }
10411
10412 u32 *digest = (u32 *) hash_buf->digest;
10413
10414 salt_t *salt = hash_buf->salt;
10415
10416 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10417 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10418 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10419 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10420
10421 digest[0] = byte_swap_32 (digest[0]);
10422 digest[1] = byte_swap_32 (digest[1]);
10423 digest[2] = byte_swap_32 (digest[2]);
10424 digest[3] = byte_swap_32 (digest[3]);
10425
10426 digest[0] -= MD4M_A;
10427 digest[1] -= MD4M_B;
10428 digest[2] -= MD4M_C;
10429 digest[3] -= MD4M_D;
10430
10431 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10432
10433 uint salt_len = input_len - 32 - 1;
10434
10435 char *salt_buf = input_buf + 32 + 1;
10436
10437 char *salt_buf_ptr = (char *) salt->salt_buf;
10438
10439 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10440
10441 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10442
10443 salt->salt_len = salt_len;
10444
10445 return (PARSER_OK);
10446 }
10447
10448 int md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10449 {
10450 if ((input_len < DISPLAY_LEN_MIN_0) || (input_len > DISPLAY_LEN_MAX_0)) return (PARSER_GLOBAL_LENGTH);
10451
10452 u32 *digest = (u32 *) hash_buf->digest;
10453
10454 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10455 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10456 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10457 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10458
10459 digest[0] = byte_swap_32 (digest[0]);
10460 digest[1] = byte_swap_32 (digest[1]);
10461 digest[2] = byte_swap_32 (digest[2]);
10462 digest[3] = byte_swap_32 (digest[3]);
10463
10464 digest[0] -= MD5M_A;
10465 digest[1] -= MD5M_B;
10466 digest[2] -= MD5M_C;
10467 digest[3] -= MD5M_D;
10468
10469 return (PARSER_OK);
10470 }
10471
10472 int md5half_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10473 {
10474 if ((input_len < DISPLAY_LEN_MIN_5100) || (input_len > DISPLAY_LEN_MAX_5100)) return (PARSER_GLOBAL_LENGTH);
10475
10476 u32 *digest = (u32 *) hash_buf->digest;
10477
10478 digest[0] = hex_to_u32 ((const u8 *) &input_buf[0]);
10479 digest[1] = hex_to_u32 ((const u8 *) &input_buf[8]);
10480 digest[2] = 0;
10481 digest[3] = 0;
10482
10483 digest[0] = byte_swap_32 (digest[0]);
10484 digest[1] = byte_swap_32 (digest[1]);
10485
10486 return (PARSER_OK);
10487 }
10488
10489 int md5s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10490 {
10491 if (data.opts_type & OPTS_TYPE_ST_HEX)
10492 {
10493 if ((input_len < DISPLAY_LEN_MIN_10H) || (input_len > DISPLAY_LEN_MAX_10H)) return (PARSER_GLOBAL_LENGTH);
10494 }
10495 else
10496 {
10497 if ((input_len < DISPLAY_LEN_MIN_10) || (input_len > DISPLAY_LEN_MAX_10)) return (PARSER_GLOBAL_LENGTH);
10498 }
10499
10500 u32 *digest = (u32 *) hash_buf->digest;
10501
10502 salt_t *salt = hash_buf->salt;
10503
10504 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10505 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10506 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10507 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10508
10509 digest[0] = byte_swap_32 (digest[0]);
10510 digest[1] = byte_swap_32 (digest[1]);
10511 digest[2] = byte_swap_32 (digest[2]);
10512 digest[3] = byte_swap_32 (digest[3]);
10513
10514 digest[0] -= MD5M_A;
10515 digest[1] -= MD5M_B;
10516 digest[2] -= MD5M_C;
10517 digest[3] -= MD5M_D;
10518
10519 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10520
10521 uint salt_len = input_len - 32 - 1;
10522
10523 char *salt_buf = input_buf + 32 + 1;
10524
10525 char *salt_buf_ptr = (char *) salt->salt_buf;
10526
10527 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10528
10529 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10530
10531 salt->salt_len = salt_len;
10532
10533 return (PARSER_OK);
10534 }
10535
10536 int md5pix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10537 {
10538 if ((input_len < DISPLAY_LEN_MIN_2400) || (input_len > DISPLAY_LEN_MAX_2400)) return (PARSER_GLOBAL_LENGTH);
10539
10540 u32 *digest = (u32 *) hash_buf->digest;
10541
10542 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
10543 | itoa64_to_int (input_buf[ 1]) << 6
10544 | itoa64_to_int (input_buf[ 2]) << 12
10545 | itoa64_to_int (input_buf[ 3]) << 18;
10546 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
10547 | itoa64_to_int (input_buf[ 5]) << 6
10548 | itoa64_to_int (input_buf[ 6]) << 12
10549 | itoa64_to_int (input_buf[ 7]) << 18;
10550 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
10551 | itoa64_to_int (input_buf[ 9]) << 6
10552 | itoa64_to_int (input_buf[10]) << 12
10553 | itoa64_to_int (input_buf[11]) << 18;
10554 digest[3] = itoa64_to_int (input_buf[12]) << 0
10555 | itoa64_to_int (input_buf[13]) << 6
10556 | itoa64_to_int (input_buf[14]) << 12
10557 | itoa64_to_int (input_buf[15]) << 18;
10558
10559 digest[0] -= MD5M_A;
10560 digest[1] -= MD5M_B;
10561 digest[2] -= MD5M_C;
10562 digest[3] -= MD5M_D;
10563
10564 digest[0] &= 0x00ffffff;
10565 digest[1] &= 0x00ffffff;
10566 digest[2] &= 0x00ffffff;
10567 digest[3] &= 0x00ffffff;
10568
10569 return (PARSER_OK);
10570 }
10571
10572 int md5asa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10573 {
10574 if (data.opts_type & OPTS_TYPE_ST_HEX)
10575 {
10576 if ((input_len < DISPLAY_LEN_MIN_2410H) || (input_len > DISPLAY_LEN_MAX_2410H)) return (PARSER_GLOBAL_LENGTH);
10577 }
10578 else
10579 {
10580 if ((input_len < DISPLAY_LEN_MIN_2410) || (input_len > DISPLAY_LEN_MAX_2410)) return (PARSER_GLOBAL_LENGTH);
10581 }
10582
10583 u32 *digest = (u32 *) hash_buf->digest;
10584
10585 salt_t *salt = hash_buf->salt;
10586
10587 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
10588 | itoa64_to_int (input_buf[ 1]) << 6
10589 | itoa64_to_int (input_buf[ 2]) << 12
10590 | itoa64_to_int (input_buf[ 3]) << 18;
10591 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
10592 | itoa64_to_int (input_buf[ 5]) << 6
10593 | itoa64_to_int (input_buf[ 6]) << 12
10594 | itoa64_to_int (input_buf[ 7]) << 18;
10595 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
10596 | itoa64_to_int (input_buf[ 9]) << 6
10597 | itoa64_to_int (input_buf[10]) << 12
10598 | itoa64_to_int (input_buf[11]) << 18;
10599 digest[3] = itoa64_to_int (input_buf[12]) << 0
10600 | itoa64_to_int (input_buf[13]) << 6
10601 | itoa64_to_int (input_buf[14]) << 12
10602 | itoa64_to_int (input_buf[15]) << 18;
10603
10604 digest[0] -= MD5M_A;
10605 digest[1] -= MD5M_B;
10606 digest[2] -= MD5M_C;
10607 digest[3] -= MD5M_D;
10608
10609 digest[0] &= 0x00ffffff;
10610 digest[1] &= 0x00ffffff;
10611 digest[2] &= 0x00ffffff;
10612 digest[3] &= 0x00ffffff;
10613
10614 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10615
10616 uint salt_len = input_len - 16 - 1;
10617
10618 char *salt_buf = input_buf + 16 + 1;
10619
10620 char *salt_buf_ptr = (char *) salt->salt_buf;
10621
10622 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10623
10624 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10625
10626 salt->salt_len = salt_len;
10627
10628 return (PARSER_OK);
10629 }
10630
10631 void transform_netntlmv1_key (const u8 *nthash, u8 *key)
10632 {
10633 key[0] = (nthash[0] >> 0);
10634 key[1] = (nthash[0] << 7) | (nthash[1] >> 1);
10635 key[2] = (nthash[1] << 6) | (nthash[2] >> 2);
10636 key[3] = (nthash[2] << 5) | (nthash[3] >> 3);
10637 key[4] = (nthash[3] << 4) | (nthash[4] >> 4);
10638 key[5] = (nthash[4] << 3) | (nthash[5] >> 5);
10639 key[6] = (nthash[5] << 2) | (nthash[6] >> 6);
10640 key[7] = (nthash[6] << 1);
10641
10642 key[0] |= 0x01;
10643 key[1] |= 0x01;
10644 key[2] |= 0x01;
10645 key[3] |= 0x01;
10646 key[4] |= 0x01;
10647 key[5] |= 0x01;
10648 key[6] |= 0x01;
10649 key[7] |= 0x01;
10650 }
10651
10652 int netntlmv1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10653 {
10654 if ((input_len < DISPLAY_LEN_MIN_5500) || (input_len > DISPLAY_LEN_MAX_5500)) return (PARSER_GLOBAL_LENGTH);
10655
10656 u32 *digest = (u32 *) hash_buf->digest;
10657
10658 salt_t *salt = hash_buf->salt;
10659
10660 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
10661
10662 /**
10663 * parse line
10664 */
10665
10666 char *user_pos = input_buf;
10667
10668 char *unused_pos = strchr (user_pos, ':');
10669
10670 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10671
10672 uint user_len = unused_pos - user_pos;
10673
10674 if (user_len > 60) return (PARSER_SALT_LENGTH);
10675
10676 unused_pos++;
10677
10678 char *domain_pos = strchr (unused_pos, ':');
10679
10680 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10681
10682 uint unused_len = domain_pos - unused_pos;
10683
10684 if (unused_len != 0) return (PARSER_SALT_LENGTH);
10685
10686 domain_pos++;
10687
10688 char *srvchall_pos = strchr (domain_pos, ':');
10689
10690 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10691
10692 uint domain_len = srvchall_pos - domain_pos;
10693
10694 if (domain_len > 45) return (PARSER_SALT_LENGTH);
10695
10696 srvchall_pos++;
10697
10698 char *hash_pos = strchr (srvchall_pos, ':');
10699
10700 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10701
10702 uint srvchall_len = hash_pos - srvchall_pos;
10703
10704 // if (srvchall_len != 0) return (PARSER_SALT_LENGTH);
10705
10706 hash_pos++;
10707
10708 char *clichall_pos = strchr (hash_pos, ':');
10709
10710 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10711
10712 uint hash_len = clichall_pos - hash_pos;
10713
10714 if (hash_len != 48) return (PARSER_HASH_LENGTH);
10715
10716 clichall_pos++;
10717
10718 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
10719
10720 if (clichall_len != 16) return (PARSER_SALT_LENGTH);
10721
10722 /**
10723 * store some data for later use
10724 */
10725
10726 netntlm->user_len = user_len * 2;
10727 netntlm->domain_len = domain_len * 2;
10728 netntlm->srvchall_len = srvchall_len / 2;
10729 netntlm->clichall_len = clichall_len / 2;
10730
10731 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
10732 char *chall_ptr = (char *) netntlm->chall_buf;
10733
10734 /**
10735 * handle username and domainname
10736 */
10737
10738 for (uint i = 0; i < user_len; i++)
10739 {
10740 *userdomain_ptr++ = user_pos[i];
10741 *userdomain_ptr++ = 0;
10742 }
10743
10744 for (uint i = 0; i < domain_len; i++)
10745 {
10746 *userdomain_ptr++ = domain_pos[i];
10747 *userdomain_ptr++ = 0;
10748 }
10749
10750 /**
10751 * handle server challenge encoding
10752 */
10753
10754 for (uint i = 0; i < srvchall_len; i += 2)
10755 {
10756 const char p0 = srvchall_pos[i + 0];
10757 const char p1 = srvchall_pos[i + 1];
10758
10759 *chall_ptr++ = hex_convert (p1) << 0
10760 | hex_convert (p0) << 4;
10761 }
10762
10763 /**
10764 * handle client challenge encoding
10765 */
10766
10767 for (uint i = 0; i < clichall_len; i += 2)
10768 {
10769 const char p0 = clichall_pos[i + 0];
10770 const char p1 = clichall_pos[i + 1];
10771
10772 *chall_ptr++ = hex_convert (p1) << 0
10773 | hex_convert (p0) << 4;
10774 }
10775
10776 /**
10777 * store data
10778 */
10779
10780 char *salt_buf_ptr = (char *) salt->salt_buf;
10781
10782 uint salt_len = parse_and_store_salt (salt_buf_ptr, clichall_pos, clichall_len);
10783
10784 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10785
10786 salt->salt_len = salt_len;
10787
10788 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
10789 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
10790 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
10791 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
10792
10793 digest[0] = byte_swap_32 (digest[0]);
10794 digest[1] = byte_swap_32 (digest[1]);
10795 digest[2] = byte_swap_32 (digest[2]);
10796 digest[3] = byte_swap_32 (digest[3]);
10797
10798 /* special case, last 8 byte do not need to be checked since they are brute-forced next */
10799
10800 uint digest_tmp[2] = { 0 };
10801
10802 digest_tmp[0] = hex_to_u32 ((const u8 *) &hash_pos[32]);
10803 digest_tmp[1] = hex_to_u32 ((const u8 *) &hash_pos[40]);
10804
10805 digest_tmp[0] = byte_swap_32 (digest_tmp[0]);
10806 digest_tmp[1] = byte_swap_32 (digest_tmp[1]);
10807
10808 /* special case 2: ESS */
10809
10810 if (srvchall_len == 48)
10811 {
10812 if ((netntlm->chall_buf[2] == 0) && (netntlm->chall_buf[3] == 0) && (netntlm->chall_buf[4] == 0) && (netntlm->chall_buf[5] == 0))
10813 {
10814 uint w[16] = { 0 };
10815
10816 w[ 0] = netntlm->chall_buf[6];
10817 w[ 1] = netntlm->chall_buf[7];
10818 w[ 2] = netntlm->chall_buf[0];
10819 w[ 3] = netntlm->chall_buf[1];
10820 w[ 4] = 0x80;
10821 w[14] = 16 * 8;
10822
10823 uint dgst[4] = { 0 };
10824
10825 dgst[0] = MAGIC_A;
10826 dgst[1] = MAGIC_B;
10827 dgst[2] = MAGIC_C;
10828 dgst[3] = MAGIC_D;
10829
10830 md5_64 (w, dgst);
10831
10832 salt->salt_buf[0] = dgst[0];
10833 salt->salt_buf[1] = dgst[1];
10834 }
10835 }
10836
10837 /* precompute netntlmv1 exploit start */
10838
10839 for (uint i = 0; i < 0x10000; i++)
10840 {
10841 uint key_md4[2] = { i, 0 };
10842 uint key_des[2] = { 0, 0 };
10843
10844 transform_netntlmv1_key ((u8 *) key_md4, (u8 *) key_des);
10845
10846 uint Kc[16] = { 0 };
10847 uint Kd[16] = { 0 };
10848
10849 _des_keysetup (key_des, Kc, Kd, c_skb);
10850
10851 uint data3[2] = { salt->salt_buf[0], salt->salt_buf[1] };
10852
10853 _des_encrypt (data3, Kc, Kd, c_SPtrans);
10854
10855 if (data3[0] != digest_tmp[0]) continue;
10856 if (data3[1] != digest_tmp[1]) continue;
10857
10858 salt->salt_buf[2] = i;
10859
10860 salt->salt_len = 24;
10861
10862 break;
10863 }
10864
10865 salt->salt_buf_pc[0] = digest_tmp[0];
10866 salt->salt_buf_pc[1] = digest_tmp[1];
10867
10868 /* precompute netntlmv1 exploit stop */
10869
10870 u32 tt;
10871
10872 IP (digest[0], digest[1], tt);
10873 IP (digest[2], digest[3], tt);
10874
10875 digest[0] = rotr32 (digest[0], 29);
10876 digest[1] = rotr32 (digest[1], 29);
10877 digest[2] = rotr32 (digest[2], 29);
10878 digest[3] = rotr32 (digest[3], 29);
10879
10880 IP (salt->salt_buf[0], salt->salt_buf[1], tt);
10881
10882 salt->salt_buf[0] = rotl32 (salt->salt_buf[0], 3);
10883 salt->salt_buf[1] = rotl32 (salt->salt_buf[1], 3);
10884
10885 return (PARSER_OK);
10886 }
10887
10888 int netntlmv2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10889 {
10890 if ((input_len < DISPLAY_LEN_MIN_5600) || (input_len > DISPLAY_LEN_MAX_5600)) return (PARSER_GLOBAL_LENGTH);
10891
10892 u32 *digest = (u32 *) hash_buf->digest;
10893
10894 salt_t *salt = hash_buf->salt;
10895
10896 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
10897
10898 /**
10899 * parse line
10900 */
10901
10902 char *user_pos = input_buf;
10903
10904 char *unused_pos = strchr (user_pos, ':');
10905
10906 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10907
10908 uint user_len = unused_pos - user_pos;
10909
10910 if (user_len > 60) return (PARSER_SALT_LENGTH);
10911
10912 unused_pos++;
10913
10914 char *domain_pos = strchr (unused_pos, ':');
10915
10916 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10917
10918 uint unused_len = domain_pos - unused_pos;
10919
10920 if (unused_len != 0) return (PARSER_SALT_LENGTH);
10921
10922 domain_pos++;
10923
10924 char *srvchall_pos = strchr (domain_pos, ':');
10925
10926 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10927
10928 uint domain_len = srvchall_pos - domain_pos;
10929
10930 if (domain_len > 45) return (PARSER_SALT_LENGTH);
10931
10932 srvchall_pos++;
10933
10934 char *hash_pos = strchr (srvchall_pos, ':');
10935
10936 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10937
10938 uint srvchall_len = hash_pos - srvchall_pos;
10939
10940 if (srvchall_len != 16) return (PARSER_SALT_LENGTH);
10941
10942 hash_pos++;
10943
10944 char *clichall_pos = strchr (hash_pos, ':');
10945
10946 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10947
10948 uint hash_len = clichall_pos - hash_pos;
10949
10950 if (hash_len != 32) return (PARSER_HASH_LENGTH);
10951
10952 clichall_pos++;
10953
10954 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
10955
10956 if (clichall_len > 1024) return (PARSER_SALT_LENGTH);
10957
10958 if (clichall_len % 2) return (PARSER_SALT_VALUE);
10959
10960 /**
10961 * store some data for later use
10962 */
10963
10964 netntlm->user_len = user_len * 2;
10965 netntlm->domain_len = domain_len * 2;
10966 netntlm->srvchall_len = srvchall_len / 2;
10967 netntlm->clichall_len = clichall_len / 2;
10968
10969 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
10970 char *chall_ptr = (char *) netntlm->chall_buf;
10971
10972 /**
10973 * handle username and domainname
10974 */
10975
10976 for (uint i = 0; i < user_len; i++)
10977 {
10978 *userdomain_ptr++ = toupper (user_pos[i]);
10979 *userdomain_ptr++ = 0;
10980 }
10981
10982 for (uint i = 0; i < domain_len; i++)
10983 {
10984 *userdomain_ptr++ = domain_pos[i];
10985 *userdomain_ptr++ = 0;
10986 }
10987
10988 *userdomain_ptr++ = 0x80;
10989
10990 /**
10991 * handle server challenge encoding
10992 */
10993
10994 for (uint i = 0; i < srvchall_len; i += 2)
10995 {
10996 const char p0 = srvchall_pos[i + 0];
10997 const char p1 = srvchall_pos[i + 1];
10998
10999 *chall_ptr++ = hex_convert (p1) << 0
11000 | hex_convert (p0) << 4;
11001 }
11002
11003 /**
11004 * handle client challenge encoding
11005 */
11006
11007 for (uint i = 0; i < clichall_len; i += 2)
11008 {
11009 const char p0 = clichall_pos[i + 0];
11010 const char p1 = clichall_pos[i + 1];
11011
11012 *chall_ptr++ = hex_convert (p1) << 0
11013 | hex_convert (p0) << 4;
11014 }
11015
11016 *chall_ptr++ = 0x80;
11017
11018 /**
11019 * handle hash itself
11020 */
11021
11022 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11023 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11024 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11025 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11026
11027 digest[0] = byte_swap_32 (digest[0]);
11028 digest[1] = byte_swap_32 (digest[1]);
11029 digest[2] = byte_swap_32 (digest[2]);
11030 digest[3] = byte_swap_32 (digest[3]);
11031
11032 /**
11033 * reuse challange data as salt_buf, its the buffer that is most likely unique
11034 */
11035
11036 salt->salt_buf[0] = 0;
11037 salt->salt_buf[1] = 0;
11038 salt->salt_buf[2] = 0;
11039 salt->salt_buf[3] = 0;
11040 salt->salt_buf[4] = 0;
11041 salt->salt_buf[5] = 0;
11042 salt->salt_buf[6] = 0;
11043 salt->salt_buf[7] = 0;
11044
11045 uint *uptr;
11046
11047 uptr = (uint *) netntlm->userdomain_buf;
11048
11049 for (uint i = 0; i < 16; i += 16)
11050 {
11051 md5_64 (uptr, salt->salt_buf);
11052 }
11053
11054 uptr = (uint *) netntlm->chall_buf;
11055
11056 for (uint i = 0; i < 256; i += 16)
11057 {
11058 md5_64 (uptr, salt->salt_buf);
11059 }
11060
11061 salt->salt_len = 16;
11062
11063 return (PARSER_OK);
11064 }
11065
11066 int joomla_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11067 {
11068 if (data.opts_type & OPTS_TYPE_ST_HEX)
11069 {
11070 if ((input_len < DISPLAY_LEN_MIN_11H) || (input_len > DISPLAY_LEN_MAX_11H)) return (PARSER_GLOBAL_LENGTH);
11071 }
11072 else
11073 {
11074 if ((input_len < DISPLAY_LEN_MIN_11) || (input_len > DISPLAY_LEN_MAX_11)) return (PARSER_GLOBAL_LENGTH);
11075 }
11076
11077 u32 *digest = (u32 *) hash_buf->digest;
11078
11079 salt_t *salt = hash_buf->salt;
11080
11081 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11082 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11083 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11084 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11085
11086 digest[0] = byte_swap_32 (digest[0]);
11087 digest[1] = byte_swap_32 (digest[1]);
11088 digest[2] = byte_swap_32 (digest[2]);
11089 digest[3] = byte_swap_32 (digest[3]);
11090
11091 digest[0] -= MD5M_A;
11092 digest[1] -= MD5M_B;
11093 digest[2] -= MD5M_C;
11094 digest[3] -= MD5M_D;
11095
11096 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11097
11098 uint salt_len = input_len - 32 - 1;
11099
11100 char *salt_buf = input_buf + 32 + 1;
11101
11102 char *salt_buf_ptr = (char *) salt->salt_buf;
11103
11104 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11105
11106 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11107
11108 salt->salt_len = salt_len;
11109
11110 return (PARSER_OK);
11111 }
11112
11113 int postgresql_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11114 {
11115 if (data.opts_type & OPTS_TYPE_ST_HEX)
11116 {
11117 if ((input_len < DISPLAY_LEN_MIN_12H) || (input_len > DISPLAY_LEN_MAX_12H)) return (PARSER_GLOBAL_LENGTH);
11118 }
11119 else
11120 {
11121 if ((input_len < DISPLAY_LEN_MIN_12) || (input_len > DISPLAY_LEN_MAX_12)) return (PARSER_GLOBAL_LENGTH);
11122 }
11123
11124 u32 *digest = (u32 *) hash_buf->digest;
11125
11126 salt_t *salt = hash_buf->salt;
11127
11128 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11129 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11130 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11131 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11132
11133 digest[0] = byte_swap_32 (digest[0]);
11134 digest[1] = byte_swap_32 (digest[1]);
11135 digest[2] = byte_swap_32 (digest[2]);
11136 digest[3] = byte_swap_32 (digest[3]);
11137
11138 digest[0] -= MD5M_A;
11139 digest[1] -= MD5M_B;
11140 digest[2] -= MD5M_C;
11141 digest[3] -= MD5M_D;
11142
11143 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11144
11145 uint salt_len = input_len - 32 - 1;
11146
11147 char *salt_buf = input_buf + 32 + 1;
11148
11149 char *salt_buf_ptr = (char *) salt->salt_buf;
11150
11151 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11152
11153 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11154
11155 salt->salt_len = salt_len;
11156
11157 return (PARSER_OK);
11158 }
11159
11160 int md5md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11161 {
11162 if ((input_len < DISPLAY_LEN_MIN_2600) || (input_len > DISPLAY_LEN_MAX_2600)) return (PARSER_GLOBAL_LENGTH);
11163
11164 u32 *digest = (u32 *) hash_buf->digest;
11165
11166 salt_t *salt = hash_buf->salt;
11167
11168 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11169 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11170 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11171 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11172
11173 digest[0] = byte_swap_32 (digest[0]);
11174 digest[1] = byte_swap_32 (digest[1]);
11175 digest[2] = byte_swap_32 (digest[2]);
11176 digest[3] = byte_swap_32 (digest[3]);
11177
11178 digest[0] -= MD5M_A;
11179 digest[1] -= MD5M_B;
11180 digest[2] -= MD5M_C;
11181 digest[3] -= MD5M_D;
11182
11183 /**
11184 * This is a virtual salt. While the algorithm is basically not salted
11185 * we can exploit the salt buffer to set the 0x80 and the w[14] value.
11186 * This way we can save a special md5md5 kernel and reuse the one from vbull.
11187 */
11188
11189 char *salt_buf_ptr = (char *) salt->salt_buf;
11190
11191 uint salt_len = parse_and_store_salt (salt_buf_ptr, (char *) "", 0);
11192
11193 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11194
11195 salt->salt_len = salt_len;
11196
11197 return (PARSER_OK);
11198 }
11199
11200 int vb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11201 {
11202 if (data.opts_type & OPTS_TYPE_ST_HEX)
11203 {
11204 if ((input_len < DISPLAY_LEN_MIN_2611H) || (input_len > DISPLAY_LEN_MAX_2611H)) return (PARSER_GLOBAL_LENGTH);
11205 }
11206 else
11207 {
11208 if ((input_len < DISPLAY_LEN_MIN_2611) || (input_len > DISPLAY_LEN_MAX_2611)) return (PARSER_GLOBAL_LENGTH);
11209 }
11210
11211 u32 *digest = (u32 *) hash_buf->digest;
11212
11213 salt_t *salt = hash_buf->salt;
11214
11215 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11216 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11217 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11218 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11219
11220 digest[0] = byte_swap_32 (digest[0]);
11221 digest[1] = byte_swap_32 (digest[1]);
11222 digest[2] = byte_swap_32 (digest[2]);
11223 digest[3] = byte_swap_32 (digest[3]);
11224
11225 digest[0] -= MD5M_A;
11226 digest[1] -= MD5M_B;
11227 digest[2] -= MD5M_C;
11228 digest[3] -= MD5M_D;
11229
11230 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11231
11232 uint salt_len = input_len - 32 - 1;
11233
11234 char *salt_buf = input_buf + 32 + 1;
11235
11236 char *salt_buf_ptr = (char *) salt->salt_buf;
11237
11238 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11239
11240 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11241
11242 salt->salt_len = salt_len;
11243
11244 return (PARSER_OK);
11245 }
11246
11247 int vb30_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11248 {
11249 if (data.opts_type & OPTS_TYPE_ST_HEX)
11250 {
11251 if ((input_len < DISPLAY_LEN_MIN_2711H) || (input_len > DISPLAY_LEN_MAX_2711H)) return (PARSER_GLOBAL_LENGTH);
11252 }
11253 else
11254 {
11255 if ((input_len < DISPLAY_LEN_MIN_2711) || (input_len > DISPLAY_LEN_MAX_2711)) return (PARSER_GLOBAL_LENGTH);
11256 }
11257
11258 u32 *digest = (u32 *) hash_buf->digest;
11259
11260 salt_t *salt = hash_buf->salt;
11261
11262 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11263 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11264 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11265 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11266
11267 digest[0] = byte_swap_32 (digest[0]);
11268 digest[1] = byte_swap_32 (digest[1]);
11269 digest[2] = byte_swap_32 (digest[2]);
11270 digest[3] = byte_swap_32 (digest[3]);
11271
11272 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11273
11274 uint salt_len = input_len - 32 - 1;
11275
11276 char *salt_buf = input_buf + 32 + 1;
11277
11278 char *salt_buf_ptr = (char *) salt->salt_buf;
11279
11280 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11281
11282 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11283
11284 salt->salt_len = salt_len;
11285
11286 return (PARSER_OK);
11287 }
11288
11289 int dcc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11290 {
11291 if (data.opts_type & OPTS_TYPE_ST_HEX)
11292 {
11293 if ((input_len < DISPLAY_LEN_MIN_1100H) || (input_len > DISPLAY_LEN_MAX_1100H)) return (PARSER_GLOBAL_LENGTH);
11294 }
11295 else
11296 {
11297 if ((input_len < DISPLAY_LEN_MIN_1100) || (input_len > DISPLAY_LEN_MAX_1100)) return (PARSER_GLOBAL_LENGTH);
11298 }
11299
11300 u32 *digest = (u32 *) hash_buf->digest;
11301
11302 salt_t *salt = hash_buf->salt;
11303
11304 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11305 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11306 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11307 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11308
11309 digest[0] = byte_swap_32 (digest[0]);
11310 digest[1] = byte_swap_32 (digest[1]);
11311 digest[2] = byte_swap_32 (digest[2]);
11312 digest[3] = byte_swap_32 (digest[3]);
11313
11314 digest[0] -= MD4M_A;
11315 digest[1] -= MD4M_B;
11316 digest[2] -= MD4M_C;
11317 digest[3] -= MD4M_D;
11318
11319 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11320
11321 uint salt_len = input_len - 32 - 1;
11322
11323 char *salt_buf = input_buf + 32 + 1;
11324
11325 char *salt_buf_ptr = (char *) salt->salt_buf;
11326
11327 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11328
11329 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11330
11331 salt->salt_len = salt_len;
11332
11333 return (PARSER_OK);
11334 }
11335
11336 int ipb2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11337 {
11338 if (data.opts_type & OPTS_TYPE_ST_HEX)
11339 {
11340 if ((input_len < DISPLAY_LEN_MIN_2811H) || (input_len > DISPLAY_LEN_MAX_2811H)) return (PARSER_GLOBAL_LENGTH);
11341 }
11342 else
11343 {
11344 if ((input_len < DISPLAY_LEN_MIN_2811) || (input_len > DISPLAY_LEN_MAX_2811)) return (PARSER_GLOBAL_LENGTH);
11345 }
11346
11347 u32 *digest = (u32 *) hash_buf->digest;
11348
11349 salt_t *salt = hash_buf->salt;
11350
11351 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11352 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11353 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11354 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11355
11356 digest[0] = byte_swap_32 (digest[0]);
11357 digest[1] = byte_swap_32 (digest[1]);
11358 digest[2] = byte_swap_32 (digest[2]);
11359 digest[3] = byte_swap_32 (digest[3]);
11360
11361 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11362
11363 uint salt_len = input_len - 32 - 1;
11364
11365 char *salt_buf = input_buf + 32 + 1;
11366
11367 uint salt_pc_block[16] = { 0 };
11368
11369 char *salt_pc_block_ptr = (char *) salt_pc_block;
11370
11371 salt_len = parse_and_store_salt (salt_pc_block_ptr, salt_buf, salt_len);
11372
11373 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11374
11375 salt_pc_block_ptr[salt_len] = (unsigned char) 0x80;
11376
11377 salt_pc_block[14] = salt_len * 8;
11378
11379 uint salt_pc_digest[4] = { MAGIC_A, MAGIC_B, MAGIC_C, MAGIC_D };
11380
11381 md5_64 (salt_pc_block, salt_pc_digest);
11382
11383 salt_pc_digest[0] = byte_swap_32 (salt_pc_digest[0]);
11384 salt_pc_digest[1] = byte_swap_32 (salt_pc_digest[1]);
11385 salt_pc_digest[2] = byte_swap_32 (salt_pc_digest[2]);
11386 salt_pc_digest[3] = byte_swap_32 (salt_pc_digest[3]);
11387
11388 u8 *salt_buf_ptr = (u8 *) salt->salt_buf;
11389
11390 memcpy (salt_buf_ptr, salt_buf, salt_len);
11391
11392 u8 *salt_buf_pc_ptr = (u8 *) salt->salt_buf_pc;
11393
11394 bin_to_hex_lower (salt_pc_digest[0], salt_buf_pc_ptr + 0);
11395 bin_to_hex_lower (salt_pc_digest[1], salt_buf_pc_ptr + 8);
11396 bin_to_hex_lower (salt_pc_digest[2], salt_buf_pc_ptr + 16);
11397 bin_to_hex_lower (salt_pc_digest[3], salt_buf_pc_ptr + 24);
11398
11399 salt->salt_len = 32; // changed, was salt_len before -- was a bug? 32 should be correct
11400
11401 return (PARSER_OK);
11402 }
11403
11404 int sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11405 {
11406 if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH);
11407
11408 u32 *digest = (u32 *) hash_buf->digest;
11409
11410 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11411 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11412 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11413 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11414 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11415
11416 digest[0] -= SHA1M_A;
11417 digest[1] -= SHA1M_B;
11418 digest[2] -= SHA1M_C;
11419 digest[3] -= SHA1M_D;
11420 digest[4] -= SHA1M_E;
11421
11422 return (PARSER_OK);
11423 }
11424
11425 int sha1linkedin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11426 {
11427 if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH);
11428
11429 u32 *digest = (u32 *) hash_buf->digest;
11430
11431 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11432 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11433 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11434 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11435 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11436
11437 return (PARSER_OK);
11438 }
11439
11440 int sha1s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11441 {
11442 if (data.opts_type & OPTS_TYPE_ST_HEX)
11443 {
11444 if ((input_len < DISPLAY_LEN_MIN_110H) || (input_len > DISPLAY_LEN_MAX_110H)) return (PARSER_GLOBAL_LENGTH);
11445 }
11446 else
11447 {
11448 if ((input_len < DISPLAY_LEN_MIN_110) || (input_len > DISPLAY_LEN_MAX_110)) return (PARSER_GLOBAL_LENGTH);
11449 }
11450
11451 u32 *digest = (u32 *) hash_buf->digest;
11452
11453 salt_t *salt = hash_buf->salt;
11454
11455 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11456 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11457 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11458 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11459 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11460
11461 digest[0] -= SHA1M_A;
11462 digest[1] -= SHA1M_B;
11463 digest[2] -= SHA1M_C;
11464 digest[3] -= SHA1M_D;
11465 digest[4] -= SHA1M_E;
11466
11467 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11468
11469 uint salt_len = input_len - 40 - 1;
11470
11471 char *salt_buf = input_buf + 40 + 1;
11472
11473 char *salt_buf_ptr = (char *) salt->salt_buf;
11474
11475 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11476
11477 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11478
11479 salt->salt_len = salt_len;
11480
11481 return (PARSER_OK);
11482 }
11483
11484 int sha1b64_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11485 {
11486 if ((input_len < DISPLAY_LEN_MIN_101) || (input_len > DISPLAY_LEN_MAX_101)) return (PARSER_GLOBAL_LENGTH);
11487
11488 if (memcmp (SIGNATURE_SHA1B64, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
11489
11490 u32 *digest = (u32 *) hash_buf->digest;
11491
11492 u8 tmp_buf[100] = { 0 };
11493
11494 base64_decode (base64_to_int, (const u8 *) input_buf + 5, input_len - 5, tmp_buf);
11495
11496 memcpy (digest, tmp_buf, 20);
11497
11498 digest[0] = byte_swap_32 (digest[0]);
11499 digest[1] = byte_swap_32 (digest[1]);
11500 digest[2] = byte_swap_32 (digest[2]);
11501 digest[3] = byte_swap_32 (digest[3]);
11502 digest[4] = byte_swap_32 (digest[4]);
11503
11504 digest[0] -= SHA1M_A;
11505 digest[1] -= SHA1M_B;
11506 digest[2] -= SHA1M_C;
11507 digest[3] -= SHA1M_D;
11508 digest[4] -= SHA1M_E;
11509
11510 return (PARSER_OK);
11511 }
11512
11513 int sha1b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11514 {
11515 if ((input_len < DISPLAY_LEN_MIN_111) || (input_len > DISPLAY_LEN_MAX_111)) return (PARSER_GLOBAL_LENGTH);
11516
11517 if (memcmp (SIGNATURE_SSHA1B64_lower, input_buf, 6) && memcmp (SIGNATURE_SSHA1B64_upper, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11518
11519 u32 *digest = (u32 *) hash_buf->digest;
11520
11521 salt_t *salt = hash_buf->salt;
11522
11523 u8 tmp_buf[100] = { 0 };
11524
11525 int tmp_len = base64_decode (base64_to_int, (const u8 *) input_buf + 6, input_len - 6, tmp_buf);
11526
11527 memcpy (digest, tmp_buf, 20);
11528
11529 salt->salt_len = tmp_len - 20;
11530
11531 memcpy (salt->salt_buf, tmp_buf + 20, salt->salt_len);
11532
11533 if (data.opts_type & OPTS_TYPE_ST_ADD80)
11534 {
11535 char *ptr = (char *) salt->salt_buf;
11536
11537 ptr[salt->salt_len] = 0x80;
11538 }
11539
11540 digest[0] = byte_swap_32 (digest[0]);
11541 digest[1] = byte_swap_32 (digest[1]);
11542 digest[2] = byte_swap_32 (digest[2]);
11543 digest[3] = byte_swap_32 (digest[3]);
11544 digest[4] = byte_swap_32 (digest[4]);
11545
11546 digest[0] -= SHA1M_A;
11547 digest[1] -= SHA1M_B;
11548 digest[2] -= SHA1M_C;
11549 digest[3] -= SHA1M_D;
11550 digest[4] -= SHA1M_E;
11551
11552 return (PARSER_OK);
11553 }
11554
11555 int mssql2000_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11556 {
11557 if ((input_len < DISPLAY_LEN_MIN_131) || (input_len > DISPLAY_LEN_MAX_131)) return (PARSER_GLOBAL_LENGTH);
11558
11559 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11560
11561 u32 *digest = (u32 *) hash_buf->digest;
11562
11563 salt_t *salt = hash_buf->salt;
11564
11565 char *salt_buf = input_buf + 6;
11566
11567 uint salt_len = 8;
11568
11569 char *salt_buf_ptr = (char *) salt->salt_buf;
11570
11571 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11572
11573 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11574
11575 salt->salt_len = salt_len;
11576
11577 char *hash_pos = input_buf + 6 + 8 + 40;
11578
11579 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11580 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11581 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11582 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11583 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
11584
11585 digest[0] -= SHA1M_A;
11586 digest[1] -= SHA1M_B;
11587 digest[2] -= SHA1M_C;
11588 digest[3] -= SHA1M_D;
11589 digest[4] -= SHA1M_E;
11590
11591 return (PARSER_OK);
11592 }
11593
11594 int mssql2005_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11595 {
11596 if ((input_len < DISPLAY_LEN_MIN_132) || (input_len > DISPLAY_LEN_MAX_132)) return (PARSER_GLOBAL_LENGTH);
11597
11598 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11599
11600 u32 *digest = (u32 *) hash_buf->digest;
11601
11602 salt_t *salt = hash_buf->salt;
11603
11604 char *salt_buf = input_buf + 6;
11605
11606 uint salt_len = 8;
11607
11608 char *salt_buf_ptr = (char *) salt->salt_buf;
11609
11610 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11611
11612 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11613
11614 salt->salt_len = salt_len;
11615
11616 char *hash_pos = input_buf + 6 + 8;
11617
11618 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11619 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11620 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11621 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11622 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
11623
11624 digest[0] -= SHA1M_A;
11625 digest[1] -= SHA1M_B;
11626 digest[2] -= SHA1M_C;
11627 digest[3] -= SHA1M_D;
11628 digest[4] -= SHA1M_E;
11629
11630 return (PARSER_OK);
11631 }
11632
11633 int mssql2012_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11634 {
11635 if ((input_len < DISPLAY_LEN_MIN_1731) || (input_len > DISPLAY_LEN_MAX_1731)) return (PARSER_GLOBAL_LENGTH);
11636
11637 if (memcmp (SIGNATURE_MSSQL2012, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11638
11639 u64 *digest = (u64 *) hash_buf->digest;
11640
11641 salt_t *salt = hash_buf->salt;
11642
11643 char *salt_buf = input_buf + 6;
11644
11645 uint salt_len = 8;
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 char *hash_pos = input_buf + 6 + 8;
11656
11657 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
11658 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
11659 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
11660 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
11661 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
11662 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
11663 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
11664 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
11665
11666 digest[0] -= SHA512M_A;
11667 digest[1] -= SHA512M_B;
11668 digest[2] -= SHA512M_C;
11669 digest[3] -= SHA512M_D;
11670 digest[4] -= SHA512M_E;
11671 digest[5] -= SHA512M_F;
11672 digest[6] -= SHA512M_G;
11673 digest[7] -= SHA512M_H;
11674
11675 return (PARSER_OK);
11676 }
11677
11678 int oracleh_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11679 {
11680 if (data.opts_type & OPTS_TYPE_ST_HEX)
11681 {
11682 if ((input_len < DISPLAY_LEN_MIN_3100H) || (input_len > DISPLAY_LEN_MAX_3100H)) return (PARSER_GLOBAL_LENGTH);
11683 }
11684 else
11685 {
11686 if ((input_len < DISPLAY_LEN_MIN_3100) || (input_len > DISPLAY_LEN_MAX_3100)) return (PARSER_GLOBAL_LENGTH);
11687 }
11688
11689 u32 *digest = (u32 *) hash_buf->digest;
11690
11691 salt_t *salt = hash_buf->salt;
11692
11693 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11694 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11695 digest[2] = 0;
11696 digest[3] = 0;
11697
11698 digest[0] = byte_swap_32 (digest[0]);
11699 digest[1] = byte_swap_32 (digest[1]);
11700
11701 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11702
11703 uint salt_len = input_len - 16 - 1;
11704
11705 char *salt_buf = input_buf + 16 + 1;
11706
11707 char *salt_buf_ptr = (char *) salt->salt_buf;
11708
11709 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11710
11711 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11712
11713 salt->salt_len = salt_len;
11714
11715 return (PARSER_OK);
11716 }
11717
11718 int oracles_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11719 {
11720 if ((input_len < DISPLAY_LEN_MIN_112) || (input_len > DISPLAY_LEN_MAX_112)) return (PARSER_GLOBAL_LENGTH);
11721
11722 u32 *digest = (u32 *) hash_buf->digest;
11723
11724 salt_t *salt = hash_buf->salt;
11725
11726 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11727 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11728 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11729 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11730 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11731
11732 digest[0] -= SHA1M_A;
11733 digest[1] -= SHA1M_B;
11734 digest[2] -= SHA1M_C;
11735 digest[3] -= SHA1M_D;
11736 digest[4] -= SHA1M_E;
11737
11738 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11739
11740 uint salt_len = input_len - 40 - 1;
11741
11742 char *salt_buf = input_buf + 40 + 1;
11743
11744 char *salt_buf_ptr = (char *) salt->salt_buf;
11745
11746 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11747
11748 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11749
11750 salt->salt_len = salt_len;
11751
11752 return (PARSER_OK);
11753 }
11754
11755 int oraclet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11756 {
11757 if ((input_len < DISPLAY_LEN_MIN_12300) || (input_len > DISPLAY_LEN_MAX_12300)) return (PARSER_GLOBAL_LENGTH);
11758
11759 u32 *digest = (u32 *) hash_buf->digest;
11760
11761 salt_t *salt = hash_buf->salt;
11762
11763 char *hash_pos = input_buf;
11764
11765 digest[ 0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11766 digest[ 1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11767 digest[ 2] = hex_to_u32 ((const u8 *) &hash_pos[ 16]);
11768 digest[ 3] = hex_to_u32 ((const u8 *) &hash_pos[ 24]);
11769 digest[ 4] = hex_to_u32 ((const u8 *) &hash_pos[ 32]);
11770 digest[ 5] = hex_to_u32 ((const u8 *) &hash_pos[ 40]);
11771 digest[ 6] = hex_to_u32 ((const u8 *) &hash_pos[ 48]);
11772 digest[ 7] = hex_to_u32 ((const u8 *) &hash_pos[ 56]);
11773 digest[ 8] = hex_to_u32 ((const u8 *) &hash_pos[ 64]);
11774 digest[ 9] = hex_to_u32 ((const u8 *) &hash_pos[ 72]);
11775 digest[10] = hex_to_u32 ((const u8 *) &hash_pos[ 80]);
11776 digest[11] = hex_to_u32 ((const u8 *) &hash_pos[ 88]);
11777 digest[12] = hex_to_u32 ((const u8 *) &hash_pos[ 96]);
11778 digest[13] = hex_to_u32 ((const u8 *) &hash_pos[104]);
11779 digest[14] = hex_to_u32 ((const u8 *) &hash_pos[112]);
11780 digest[15] = hex_to_u32 ((const u8 *) &hash_pos[120]);
11781
11782 char *salt_pos = input_buf + 128;
11783
11784 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
11785 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
11786 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
11787 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
11788
11789 salt->salt_iter = ROUNDS_ORACLET - 1;
11790 salt->salt_len = 16;
11791
11792 return (PARSER_OK);
11793 }
11794
11795 int sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11796 {
11797 if ((input_len < DISPLAY_LEN_MIN_1400) || (input_len > DISPLAY_LEN_MAX_1400)) return (PARSER_GLOBAL_LENGTH);
11798
11799 u32 *digest = (u32 *) hash_buf->digest;
11800
11801 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11802 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11803 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11804 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11805 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11806 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
11807 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
11808 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
11809
11810 digest[0] -= SHA256M_A;
11811 digest[1] -= SHA256M_B;
11812 digest[2] -= SHA256M_C;
11813 digest[3] -= SHA256M_D;
11814 digest[4] -= SHA256M_E;
11815 digest[5] -= SHA256M_F;
11816 digest[6] -= SHA256M_G;
11817 digest[7] -= SHA256M_H;
11818
11819 return (PARSER_OK);
11820 }
11821
11822 int sha256s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11823 {
11824 if (data.opts_type & OPTS_TYPE_ST_HEX)
11825 {
11826 if ((input_len < DISPLAY_LEN_MIN_1410H) || (input_len > DISPLAY_LEN_MAX_1410H)) return (PARSER_GLOBAL_LENGTH);
11827 }
11828 else
11829 {
11830 if ((input_len < DISPLAY_LEN_MIN_1410) || (input_len > DISPLAY_LEN_MAX_1410)) return (PARSER_GLOBAL_LENGTH);
11831 }
11832
11833 u32 *digest = (u32 *) hash_buf->digest;
11834
11835 salt_t *salt = hash_buf->salt;
11836
11837 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11838 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11839 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11840 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11841 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11842 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
11843 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
11844 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
11845
11846 digest[0] -= SHA256M_A;
11847 digest[1] -= SHA256M_B;
11848 digest[2] -= SHA256M_C;
11849 digest[3] -= SHA256M_D;
11850 digest[4] -= SHA256M_E;
11851 digest[5] -= SHA256M_F;
11852 digest[6] -= SHA256M_G;
11853 digest[7] -= SHA256M_H;
11854
11855 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11856
11857 uint salt_len = input_len - 64 - 1;
11858
11859 char *salt_buf = input_buf + 64 + 1;
11860
11861 char *salt_buf_ptr = (char *) salt->salt_buf;
11862
11863 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11864
11865 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11866
11867 salt->salt_len = salt_len;
11868
11869 return (PARSER_OK);
11870 }
11871
11872 int sha384_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11873 {
11874 if ((input_len < DISPLAY_LEN_MIN_10800) || (input_len > DISPLAY_LEN_MAX_10800)) return (PARSER_GLOBAL_LENGTH);
11875
11876 u64 *digest = (u64 *) hash_buf->digest;
11877
11878 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
11879 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
11880 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
11881 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
11882 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
11883 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
11884 digest[6] = 0;
11885 digest[7] = 0;
11886
11887 digest[0] -= SHA384M_A;
11888 digest[1] -= SHA384M_B;
11889 digest[2] -= SHA384M_C;
11890 digest[3] -= SHA384M_D;
11891 digest[4] -= SHA384M_E;
11892 digest[5] -= SHA384M_F;
11893 digest[6] -= 0;
11894 digest[7] -= 0;
11895
11896 return (PARSER_OK);
11897 }
11898
11899 int sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11900 {
11901 if ((input_len < DISPLAY_LEN_MIN_1700) || (input_len > DISPLAY_LEN_MAX_1700)) return (PARSER_GLOBAL_LENGTH);
11902
11903 u64 *digest = (u64 *) hash_buf->digest;
11904
11905 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
11906 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
11907 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
11908 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
11909 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
11910 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
11911 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
11912 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
11913
11914 digest[0] -= SHA512M_A;
11915 digest[1] -= SHA512M_B;
11916 digest[2] -= SHA512M_C;
11917 digest[3] -= SHA512M_D;
11918 digest[4] -= SHA512M_E;
11919 digest[5] -= SHA512M_F;
11920 digest[6] -= SHA512M_G;
11921 digest[7] -= SHA512M_H;
11922
11923 return (PARSER_OK);
11924 }
11925
11926 int sha512s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11927 {
11928 if (data.opts_type & OPTS_TYPE_ST_HEX)
11929 {
11930 if ((input_len < DISPLAY_LEN_MIN_1710H) || (input_len > DISPLAY_LEN_MAX_1710H)) return (PARSER_GLOBAL_LENGTH);
11931 }
11932 else
11933 {
11934 if ((input_len < DISPLAY_LEN_MIN_1710) || (input_len > DISPLAY_LEN_MAX_1710)) return (PARSER_GLOBAL_LENGTH);
11935 }
11936
11937 u64 *digest = (u64 *) hash_buf->digest;
11938
11939 salt_t *salt = hash_buf->salt;
11940
11941 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
11942 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
11943 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
11944 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
11945 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
11946 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
11947 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
11948 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
11949
11950 digest[0] -= SHA512M_A;
11951 digest[1] -= SHA512M_B;
11952 digest[2] -= SHA512M_C;
11953 digest[3] -= SHA512M_D;
11954 digest[4] -= SHA512M_E;
11955 digest[5] -= SHA512M_F;
11956 digest[6] -= SHA512M_G;
11957 digest[7] -= SHA512M_H;
11958
11959 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11960
11961 uint salt_len = input_len - 128 - 1;
11962
11963 char *salt_buf = input_buf + 128 + 1;
11964
11965 char *salt_buf_ptr = (char *) salt->salt_buf;
11966
11967 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11968
11969 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11970
11971 salt->salt_len = salt_len;
11972
11973 return (PARSER_OK);
11974 }
11975
11976 int sha512crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11977 {
11978 if (memcmp (SIGNATURE_SHA512CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
11979
11980 u64 *digest = (u64 *) hash_buf->digest;
11981
11982 salt_t *salt = hash_buf->salt;
11983
11984 char *salt_pos = input_buf + 3;
11985
11986 uint iterations_len = 0;
11987
11988 if (memcmp (salt_pos, "rounds=", 7) == 0)
11989 {
11990 salt_pos += 7;
11991
11992 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
11993
11994 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
11995 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
11996
11997 salt_pos[0] = 0x0;
11998
11999 salt->salt_iter = atoi (salt_pos - iterations_len);
12000
12001 salt_pos += 1;
12002
12003 iterations_len += 8;
12004 }
12005 else
12006 {
12007 salt->salt_iter = ROUNDS_SHA512CRYPT;
12008 }
12009
12010 if ((input_len < DISPLAY_LEN_MIN_1800) || (input_len > DISPLAY_LEN_MAX_1800 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
12011
12012 char *hash_pos = strchr (salt_pos, '$');
12013
12014 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12015
12016 uint salt_len = hash_pos - salt_pos;
12017
12018 if (salt_len > 16) return (PARSER_SALT_LENGTH);
12019
12020 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12021
12022 salt->salt_len = salt_len;
12023
12024 hash_pos++;
12025
12026 sha512crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12027
12028 return (PARSER_OK);
12029 }
12030
12031 int keccak_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12032 {
12033 if ((input_len < DISPLAY_LEN_MIN_5000) || (input_len > DISPLAY_LEN_MAX_5000)) return (PARSER_GLOBAL_LENGTH);
12034
12035 if (input_len % 16) return (PARSER_GLOBAL_LENGTH);
12036
12037 u64 *digest = (u64 *) hash_buf->digest;
12038
12039 salt_t *salt = hash_buf->salt;
12040
12041 uint keccak_mdlen = input_len / 2;
12042
12043 for (uint i = 0; i < keccak_mdlen / 8; i++)
12044 {
12045 digest[i] = hex_to_u64 ((const u8 *) &input_buf[i * 16]);
12046
12047 digest[i] = byte_swap_64 (digest[i]);
12048 }
12049
12050 salt->keccak_mdlen = keccak_mdlen;
12051
12052 return (PARSER_OK);
12053 }
12054
12055 int ikepsk_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12056 {
12057 if ((input_len < DISPLAY_LEN_MIN_5300) || (input_len > DISPLAY_LEN_MAX_5300)) return (PARSER_GLOBAL_LENGTH);
12058
12059 u32 *digest = (u32 *) hash_buf->digest;
12060
12061 salt_t *salt = hash_buf->salt;
12062
12063 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
12064
12065 /**
12066 * Parse that strange long line
12067 */
12068
12069 char *in_off[9];
12070
12071 size_t in_len[9] = { 0 };
12072
12073 in_off[0] = strtok (input_buf, ":");
12074
12075 in_len[0] = strlen (in_off[0]);
12076
12077 size_t i;
12078
12079 for (i = 1; i < 9; i++)
12080 {
12081 in_off[i] = strtok (NULL, ":");
12082
12083 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12084
12085 in_len[i] = strlen (in_off[i]);
12086 }
12087
12088 char *ptr = (char *) ikepsk->msg_buf;
12089
12090 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[0] + i);
12091 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[1] + i);
12092 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[2] + i);
12093 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[3] + i);
12094 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[4] + i);
12095 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[5] + i);
12096
12097 *ptr = 0x80;
12098
12099 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
12100
12101 ptr = (char *) ikepsk->nr_buf;
12102
12103 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[6] + i);
12104 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[7] + i);
12105
12106 *ptr = 0x80;
12107
12108 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
12109
12110 /**
12111 * Store to database
12112 */
12113
12114 ptr = in_off[8];
12115
12116 digest[0] = hex_to_u32 ((const u8 *) &ptr[ 0]);
12117 digest[1] = hex_to_u32 ((const u8 *) &ptr[ 8]);
12118 digest[2] = hex_to_u32 ((const u8 *) &ptr[16]);
12119 digest[3] = hex_to_u32 ((const u8 *) &ptr[24]);
12120
12121 digest[0] = byte_swap_32 (digest[0]);
12122 digest[1] = byte_swap_32 (digest[1]);
12123 digest[2] = byte_swap_32 (digest[2]);
12124 digest[3] = byte_swap_32 (digest[3]);
12125
12126 salt->salt_len = 32;
12127
12128 salt->salt_buf[0] = ikepsk->nr_buf[0];
12129 salt->salt_buf[1] = ikepsk->nr_buf[1];
12130 salt->salt_buf[2] = ikepsk->nr_buf[2];
12131 salt->salt_buf[3] = ikepsk->nr_buf[3];
12132 salt->salt_buf[4] = ikepsk->nr_buf[4];
12133 salt->salt_buf[5] = ikepsk->nr_buf[5];
12134 salt->salt_buf[6] = ikepsk->nr_buf[6];
12135 salt->salt_buf[7] = ikepsk->nr_buf[7];
12136
12137 return (PARSER_OK);
12138 }
12139
12140 int ikepsk_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12141 {
12142 if ((input_len < DISPLAY_LEN_MIN_5400) || (input_len > DISPLAY_LEN_MAX_5400)) return (PARSER_GLOBAL_LENGTH);
12143
12144 u32 *digest = (u32 *) hash_buf->digest;
12145
12146 salt_t *salt = hash_buf->salt;
12147
12148 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
12149
12150 /**
12151 * Parse that strange long line
12152 */
12153
12154 char *in_off[9];
12155
12156 size_t in_len[9] = { 0 };
12157
12158 in_off[0] = strtok (input_buf, ":");
12159
12160 in_len[0] = strlen (in_off[0]);
12161
12162 size_t i;
12163
12164 for (i = 1; i < 9; i++)
12165 {
12166 in_off[i] = strtok (NULL, ":");
12167
12168 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12169
12170 in_len[i] = strlen (in_off[i]);
12171 }
12172
12173 char *ptr = (char *) ikepsk->msg_buf;
12174
12175 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[0] + i);
12176 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[1] + i);
12177 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[2] + i);
12178 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[3] + i);
12179 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[4] + i);
12180 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[5] + i);
12181
12182 *ptr = 0x80;
12183
12184 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
12185
12186 ptr = (char *) ikepsk->nr_buf;
12187
12188 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[6] + i);
12189 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[7] + i);
12190
12191 *ptr = 0x80;
12192
12193 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
12194
12195 /**
12196 * Store to database
12197 */
12198
12199 ptr = in_off[8];
12200
12201 digest[0] = hex_to_u32 ((const u8 *) &ptr[ 0]);
12202 digest[1] = hex_to_u32 ((const u8 *) &ptr[ 8]);
12203 digest[2] = hex_to_u32 ((const u8 *) &ptr[16]);
12204 digest[3] = hex_to_u32 ((const u8 *) &ptr[24]);
12205 digest[4] = hex_to_u32 ((const u8 *) &ptr[32]);
12206
12207 salt->salt_len = 32;
12208
12209 salt->salt_buf[0] = ikepsk->nr_buf[0];
12210 salt->salt_buf[1] = ikepsk->nr_buf[1];
12211 salt->salt_buf[2] = ikepsk->nr_buf[2];
12212 salt->salt_buf[3] = ikepsk->nr_buf[3];
12213 salt->salt_buf[4] = ikepsk->nr_buf[4];
12214 salt->salt_buf[5] = ikepsk->nr_buf[5];
12215 salt->salt_buf[6] = ikepsk->nr_buf[6];
12216 salt->salt_buf[7] = ikepsk->nr_buf[7];
12217
12218 return (PARSER_OK);
12219 }
12220
12221 int ripemd160_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12222 {
12223 if ((input_len < DISPLAY_LEN_MIN_6000) || (input_len > DISPLAY_LEN_MAX_6000)) return (PARSER_GLOBAL_LENGTH);
12224
12225 u32 *digest = (u32 *) hash_buf->digest;
12226
12227 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12228 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12229 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12230 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12231 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12232
12233 digest[0] = byte_swap_32 (digest[0]);
12234 digest[1] = byte_swap_32 (digest[1]);
12235 digest[2] = byte_swap_32 (digest[2]);
12236 digest[3] = byte_swap_32 (digest[3]);
12237 digest[4] = byte_swap_32 (digest[4]);
12238
12239 return (PARSER_OK);
12240 }
12241
12242 int whirlpool_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12243 {
12244 if ((input_len < DISPLAY_LEN_MIN_6100) || (input_len > DISPLAY_LEN_MAX_6100)) return (PARSER_GLOBAL_LENGTH);
12245
12246 u32 *digest = (u32 *) hash_buf->digest;
12247
12248 digest[ 0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12249 digest[ 1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12250 digest[ 2] = hex_to_u32 ((const u8 *) &input_buf[ 16]);
12251 digest[ 3] = hex_to_u32 ((const u8 *) &input_buf[ 24]);
12252 digest[ 4] = hex_to_u32 ((const u8 *) &input_buf[ 32]);
12253 digest[ 5] = hex_to_u32 ((const u8 *) &input_buf[ 40]);
12254 digest[ 6] = hex_to_u32 ((const u8 *) &input_buf[ 48]);
12255 digest[ 7] = hex_to_u32 ((const u8 *) &input_buf[ 56]);
12256 digest[ 8] = hex_to_u32 ((const u8 *) &input_buf[ 64]);
12257 digest[ 9] = hex_to_u32 ((const u8 *) &input_buf[ 72]);
12258 digest[10] = hex_to_u32 ((const u8 *) &input_buf[ 80]);
12259 digest[11] = hex_to_u32 ((const u8 *) &input_buf[ 88]);
12260 digest[12] = hex_to_u32 ((const u8 *) &input_buf[ 96]);
12261 digest[13] = hex_to_u32 ((const u8 *) &input_buf[104]);
12262 digest[14] = hex_to_u32 ((const u8 *) &input_buf[112]);
12263 digest[15] = hex_to_u32 ((const u8 *) &input_buf[120]);
12264
12265 return (PARSER_OK);
12266 }
12267
12268 int androidpin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12269 {
12270 if ((input_len < DISPLAY_LEN_MIN_5800) || (input_len > DISPLAY_LEN_MAX_5800)) return (PARSER_GLOBAL_LENGTH);
12271
12272 u32 *digest = (u32 *) hash_buf->digest;
12273
12274 salt_t *salt = hash_buf->salt;
12275
12276 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12277 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12278 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12279 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12280 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12281
12282 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12283
12284 uint salt_len = input_len - 40 - 1;
12285
12286 char *salt_buf = input_buf + 40 + 1;
12287
12288 char *salt_buf_ptr = (char *) salt->salt_buf;
12289
12290 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12291
12292 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12293
12294 salt->salt_len = salt_len;
12295
12296 salt->salt_iter = ROUNDS_ANDROIDPIN - 1;
12297
12298 return (PARSER_OK);
12299 }
12300
12301 int truecrypt_parse_hash_1k (char *input_buf, uint input_len, hash_t *hash_buf)
12302 {
12303 u32 *digest = (u32 *) hash_buf->digest;
12304
12305 salt_t *salt = hash_buf->salt;
12306
12307 tc_t *tc = (tc_t *) hash_buf->esalt;
12308
12309 if (input_len == 0)
12310 {
12311 log_error ("TrueCrypt container not specified");
12312
12313 exit (-1);
12314 }
12315
12316 FILE *fp = fopen (input_buf, "rb");
12317
12318 if (fp == NULL)
12319 {
12320 log_error ("%s: %s", input_buf, strerror (errno));
12321
12322 exit (-1);
12323 }
12324
12325 char buf[512] = { 0 };
12326
12327 int n = fread (buf, 1, sizeof (buf), fp);
12328
12329 fclose (fp);
12330
12331 if (n != 512) return (PARSER_TC_FILE_SIZE);
12332
12333 memcpy (tc->salt_buf, buf, 64);
12334
12335 memcpy (tc->data_buf, buf + 64, 512 - 64);
12336
12337 salt->salt_buf[0] = tc->salt_buf[0];
12338
12339 salt->salt_len = 4;
12340
12341 salt->salt_iter = 1000 - 1;
12342
12343 digest[0] = tc->data_buf[0];
12344
12345 return (PARSER_OK);
12346 }
12347
12348 int truecrypt_parse_hash_2k (char *input_buf, uint input_len, hash_t *hash_buf)
12349 {
12350 u32 *digest = (u32 *) hash_buf->digest;
12351
12352 salt_t *salt = hash_buf->salt;
12353
12354 tc_t *tc = (tc_t *) hash_buf->esalt;
12355
12356 if (input_len == 0)
12357 {
12358 log_error ("TrueCrypt container not specified");
12359
12360 exit (-1);
12361 }
12362
12363 FILE *fp = fopen (input_buf, "rb");
12364
12365 if (fp == NULL)
12366 {
12367 log_error ("%s: %s", input_buf, strerror (errno));
12368
12369 exit (-1);
12370 }
12371
12372 char buf[512] = { 0 };
12373
12374 int n = fread (buf, 1, sizeof (buf), fp);
12375
12376 fclose (fp);
12377
12378 if (n != 512) return (PARSER_TC_FILE_SIZE);
12379
12380 memcpy (tc->salt_buf, buf, 64);
12381
12382 memcpy (tc->data_buf, buf + 64, 512 - 64);
12383
12384 salt->salt_buf[0] = tc->salt_buf[0];
12385
12386 salt->salt_len = 4;
12387
12388 salt->salt_iter = 2000 - 1;
12389
12390 digest[0] = tc->data_buf[0];
12391
12392 return (PARSER_OK);
12393 }
12394
12395 int md5aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12396 {
12397 if ((input_len < DISPLAY_LEN_MIN_6300) || (input_len > DISPLAY_LEN_MAX_6300)) return (PARSER_GLOBAL_LENGTH);
12398
12399 if (memcmp (SIGNATURE_MD5AIX, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
12400
12401 u32 *digest = (u32 *) hash_buf->digest;
12402
12403 salt_t *salt = hash_buf->salt;
12404
12405 char *salt_pos = input_buf + 6;
12406
12407 char *hash_pos = strchr (salt_pos, '$');
12408
12409 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12410
12411 uint salt_len = hash_pos - salt_pos;
12412
12413 if (salt_len < 8) return (PARSER_SALT_LENGTH);
12414
12415 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12416
12417 salt->salt_len = salt_len;
12418
12419 salt->salt_iter = 1000;
12420
12421 hash_pos++;
12422
12423 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12424
12425 return (PARSER_OK);
12426 }
12427
12428 int sha1aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12429 {
12430 if ((input_len < DISPLAY_LEN_MIN_6700) || (input_len > DISPLAY_LEN_MAX_6700)) return (PARSER_GLOBAL_LENGTH);
12431
12432 if (memcmp (SIGNATURE_SHA1AIX, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
12433
12434 u32 *digest = (u32 *) hash_buf->digest;
12435
12436 salt_t *salt = hash_buf->salt;
12437
12438 char *iter_pos = input_buf + 7;
12439
12440 char *salt_pos = strchr (iter_pos, '$');
12441
12442 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12443
12444 salt_pos++;
12445
12446 char *hash_pos = strchr (salt_pos, '$');
12447
12448 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12449
12450 uint salt_len = hash_pos - salt_pos;
12451
12452 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12453
12454 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12455
12456 salt->salt_len = salt_len;
12457
12458 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12459
12460 salt->salt_sign[0] = atoi (salt_iter);
12461
12462 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12463
12464 hash_pos++;
12465
12466 sha1aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12467
12468 digest[0] = byte_swap_32 (digest[0]);
12469 digest[1] = byte_swap_32 (digest[1]);
12470 digest[2] = byte_swap_32 (digest[2]);
12471 digest[3] = byte_swap_32 (digest[3]);
12472 digest[4] = byte_swap_32 (digest[4]);
12473
12474 return (PARSER_OK);
12475 }
12476
12477 int sha256aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12478 {
12479 if ((input_len < DISPLAY_LEN_MIN_6400) || (input_len > DISPLAY_LEN_MAX_6400)) return (PARSER_GLOBAL_LENGTH);
12480
12481 if (memcmp (SIGNATURE_SHA256AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
12482
12483 u32 *digest = (u32 *) hash_buf->digest;
12484
12485 salt_t *salt = hash_buf->salt;
12486
12487 char *iter_pos = input_buf + 9;
12488
12489 char *salt_pos = strchr (iter_pos, '$');
12490
12491 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12492
12493 salt_pos++;
12494
12495 char *hash_pos = strchr (salt_pos, '$');
12496
12497 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12498
12499 uint salt_len = hash_pos - salt_pos;
12500
12501 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12502
12503 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12504
12505 salt->salt_len = salt_len;
12506
12507 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12508
12509 salt->salt_sign[0] = atoi (salt_iter);
12510
12511 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12512
12513 hash_pos++;
12514
12515 sha256aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12516
12517 digest[0] = byte_swap_32 (digest[0]);
12518 digest[1] = byte_swap_32 (digest[1]);
12519 digest[2] = byte_swap_32 (digest[2]);
12520 digest[3] = byte_swap_32 (digest[3]);
12521 digest[4] = byte_swap_32 (digest[4]);
12522 digest[5] = byte_swap_32 (digest[5]);
12523 digest[6] = byte_swap_32 (digest[6]);
12524 digest[7] = byte_swap_32 (digest[7]);
12525
12526 return (PARSER_OK);
12527 }
12528
12529 int sha512aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12530 {
12531 if ((input_len < DISPLAY_LEN_MIN_6500) || (input_len > DISPLAY_LEN_MAX_6500)) return (PARSER_GLOBAL_LENGTH);
12532
12533 if (memcmp (SIGNATURE_SHA512AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
12534
12535 u64 *digest = (u64 *) hash_buf->digest;
12536
12537 salt_t *salt = hash_buf->salt;
12538
12539 char *iter_pos = input_buf + 9;
12540
12541 char *salt_pos = strchr (iter_pos, '$');
12542
12543 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12544
12545 salt_pos++;
12546
12547 char *hash_pos = strchr (salt_pos, '$');
12548
12549 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12550
12551 uint salt_len = hash_pos - salt_pos;
12552
12553 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12554
12555 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12556
12557 salt->salt_len = salt_len;
12558
12559 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12560
12561 salt->salt_sign[0] = atoi (salt_iter);
12562
12563 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12564
12565 hash_pos++;
12566
12567 sha512aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12568
12569 digest[0] = byte_swap_64 (digest[0]);
12570 digest[1] = byte_swap_64 (digest[1]);
12571 digest[2] = byte_swap_64 (digest[2]);
12572 digest[3] = byte_swap_64 (digest[3]);
12573 digest[4] = byte_swap_64 (digest[4]);
12574 digest[5] = byte_swap_64 (digest[5]);
12575 digest[6] = byte_swap_64 (digest[6]);
12576 digest[7] = byte_swap_64 (digest[7]);
12577
12578 return (PARSER_OK);
12579 }
12580
12581 int agilekey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12582 {
12583 if ((input_len < DISPLAY_LEN_MIN_6600) || (input_len > DISPLAY_LEN_MAX_6600)) return (PARSER_GLOBAL_LENGTH);
12584
12585 u32 *digest = (u32 *) hash_buf->digest;
12586
12587 salt_t *salt = hash_buf->salt;
12588
12589 agilekey_t *agilekey = (agilekey_t *) hash_buf->esalt;
12590
12591 /**
12592 * parse line
12593 */
12594
12595 char *iterations_pos = input_buf;
12596
12597 char *saltbuf_pos = strchr (iterations_pos, ':');
12598
12599 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12600
12601 uint iterations_len = saltbuf_pos - iterations_pos;
12602
12603 if (iterations_len > 6) return (PARSER_SALT_LENGTH);
12604
12605 saltbuf_pos++;
12606
12607 char *cipherbuf_pos = strchr (saltbuf_pos, ':');
12608
12609 if (cipherbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12610
12611 uint saltbuf_len = cipherbuf_pos - saltbuf_pos;
12612
12613 if (saltbuf_len != 16) return (PARSER_SALT_LENGTH);
12614
12615 uint cipherbuf_len = input_len - iterations_len - 1 - saltbuf_len - 1;
12616
12617 if (cipherbuf_len != 2080) return (PARSER_HASH_LENGTH);
12618
12619 cipherbuf_pos++;
12620
12621 /**
12622 * pbkdf2 iterations
12623 */
12624
12625 salt->salt_iter = atoi (iterations_pos) - 1;
12626
12627 /**
12628 * handle salt encoding
12629 */
12630
12631 char *saltbuf_ptr = (char *) salt->salt_buf;
12632
12633 for (uint i = 0; i < saltbuf_len; i += 2)
12634 {
12635 const char p0 = saltbuf_pos[i + 0];
12636 const char p1 = saltbuf_pos[i + 1];
12637
12638 *saltbuf_ptr++ = hex_convert (p1) << 0
12639 | hex_convert (p0) << 4;
12640 }
12641
12642 salt->salt_len = saltbuf_len / 2;
12643
12644 /**
12645 * handle cipher encoding
12646 */
12647
12648 uint *tmp = (uint *) mymalloc (32);
12649
12650 char *cipherbuf_ptr = (char *) tmp;
12651
12652 for (uint i = 2016; i < cipherbuf_len; i += 2)
12653 {
12654 const char p0 = cipherbuf_pos[i + 0];
12655 const char p1 = cipherbuf_pos[i + 1];
12656
12657 *cipherbuf_ptr++ = hex_convert (p1) << 0
12658 | hex_convert (p0) << 4;
12659 }
12660
12661 // iv is stored at salt_buf 4 (length 16)
12662 // data is stored at salt_buf 8 (length 16)
12663
12664 salt->salt_buf[ 4] = byte_swap_32 (tmp[0]);
12665 salt->salt_buf[ 5] = byte_swap_32 (tmp[1]);
12666 salt->salt_buf[ 6] = byte_swap_32 (tmp[2]);
12667 salt->salt_buf[ 7] = byte_swap_32 (tmp[3]);
12668
12669 salt->salt_buf[ 8] = byte_swap_32 (tmp[4]);
12670 salt->salt_buf[ 9] = byte_swap_32 (tmp[5]);
12671 salt->salt_buf[10] = byte_swap_32 (tmp[6]);
12672 salt->salt_buf[11] = byte_swap_32 (tmp[7]);
12673
12674 free (tmp);
12675
12676 for (uint i = 0, j = 0; i < 1040; i += 1, j += 2)
12677 {
12678 const char p0 = cipherbuf_pos[j + 0];
12679 const char p1 = cipherbuf_pos[j + 1];
12680
12681 agilekey->cipher[i] = hex_convert (p1) << 0
12682 | hex_convert (p0) << 4;
12683 }
12684
12685 /**
12686 * digest buf
12687 */
12688
12689 digest[0] = 0x10101010;
12690 digest[1] = 0x10101010;
12691 digest[2] = 0x10101010;
12692 digest[3] = 0x10101010;
12693
12694 return (PARSER_OK);
12695 }
12696
12697 int lastpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12698 {
12699 if ((input_len < DISPLAY_LEN_MIN_6800) || (input_len > DISPLAY_LEN_MAX_6800)) return (PARSER_GLOBAL_LENGTH);
12700
12701 u32 *digest = (u32 *) hash_buf->digest;
12702
12703 salt_t *salt = hash_buf->salt;
12704
12705 char *hashbuf_pos = input_buf;
12706
12707 char *iterations_pos = strchr (hashbuf_pos, ':');
12708
12709 if (iterations_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12710
12711 uint hash_len = iterations_pos - hashbuf_pos;
12712
12713 if ((hash_len != 32) && (hash_len != 64)) return (PARSER_HASH_LENGTH);
12714
12715 iterations_pos++;
12716
12717 char *saltbuf_pos = strchr (iterations_pos, ':');
12718
12719 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12720
12721 uint iterations_len = saltbuf_pos - iterations_pos;
12722
12723 saltbuf_pos++;
12724
12725 uint salt_len = input_len - hash_len - 1 - iterations_len - 1;
12726
12727 if (salt_len > 32) return (PARSER_SALT_LENGTH);
12728
12729 char *salt_buf_ptr = (char *) salt->salt_buf;
12730
12731 salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, salt_len);
12732
12733 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12734
12735 salt->salt_len = salt_len;
12736
12737 salt->salt_iter = atoi (iterations_pos) - 1;
12738
12739 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
12740 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
12741 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
12742 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
12743
12744 return (PARSER_OK);
12745 }
12746
12747 int gost_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12748 {
12749 if ((input_len < DISPLAY_LEN_MIN_6900) || (input_len > DISPLAY_LEN_MAX_6900)) return (PARSER_GLOBAL_LENGTH);
12750
12751 u32 *digest = (u32 *) hash_buf->digest;
12752
12753 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12754 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12755 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12756 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12757 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12758 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
12759 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
12760 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
12761
12762 digest[0] = byte_swap_32 (digest[0]);
12763 digest[1] = byte_swap_32 (digest[1]);
12764 digest[2] = byte_swap_32 (digest[2]);
12765 digest[3] = byte_swap_32 (digest[3]);
12766 digest[4] = byte_swap_32 (digest[4]);
12767 digest[5] = byte_swap_32 (digest[5]);
12768 digest[6] = byte_swap_32 (digest[6]);
12769 digest[7] = byte_swap_32 (digest[7]);
12770
12771 return (PARSER_OK);
12772 }
12773
12774 int sha256crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12775 {
12776 if (memcmp (SIGNATURE_SHA256CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
12777
12778 u32 *digest = (u32 *) hash_buf->digest;
12779
12780 salt_t *salt = hash_buf->salt;
12781
12782 char *salt_pos = input_buf + 3;
12783
12784 uint iterations_len = 0;
12785
12786 if (memcmp (salt_pos, "rounds=", 7) == 0)
12787 {
12788 salt_pos += 7;
12789
12790 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
12791
12792 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
12793 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
12794
12795 salt_pos[0] = 0x0;
12796
12797 salt->salt_iter = atoi (salt_pos - iterations_len);
12798
12799 salt_pos += 1;
12800
12801 iterations_len += 8;
12802 }
12803 else
12804 {
12805 salt->salt_iter = ROUNDS_SHA256CRYPT;
12806 }
12807
12808 if ((input_len < DISPLAY_LEN_MIN_7400) || (input_len > DISPLAY_LEN_MAX_7400 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
12809
12810 char *hash_pos = strchr (salt_pos, '$');
12811
12812 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12813
12814 uint salt_len = hash_pos - salt_pos;
12815
12816 if (salt_len > 16) return (PARSER_SALT_LENGTH);
12817
12818 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12819
12820 salt->salt_len = salt_len;
12821
12822 hash_pos++;
12823
12824 sha256crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12825
12826 return (PARSER_OK);
12827 }
12828
12829 int sha512osx_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12830 {
12831 uint max_len = DISPLAY_LEN_MAX_7100 + (2 * 128);
12832
12833 if ((input_len < DISPLAY_LEN_MIN_7100) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
12834
12835 if (memcmp (SIGNATURE_SHA512OSX, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
12836
12837 u64 *digest = (u64 *) hash_buf->digest;
12838
12839 salt_t *salt = hash_buf->salt;
12840
12841 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
12842
12843 char *iter_pos = input_buf + 4;
12844
12845 char *salt_pos = strchr (iter_pos, '$');
12846
12847 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12848
12849 salt_pos++;
12850
12851 char *hash_pos = strchr (salt_pos, '$');
12852
12853 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12854
12855 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
12856
12857 hash_pos++;
12858
12859 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
12860 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
12861 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
12862 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
12863 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
12864 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
12865 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
12866 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
12867
12868 uint salt_len = hash_pos - salt_pos - 1;
12869
12870 if ((salt_len % 2) != 0) return (PARSER_SALT_LENGTH);
12871
12872 salt->salt_len = salt_len / 2;
12873
12874 pbkdf2_sha512->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
12875 pbkdf2_sha512->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
12876 pbkdf2_sha512->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
12877 pbkdf2_sha512->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
12878 pbkdf2_sha512->salt_buf[4] = hex_to_u32 ((const u8 *) &salt_pos[32]);
12879 pbkdf2_sha512->salt_buf[5] = hex_to_u32 ((const u8 *) &salt_pos[40]);
12880 pbkdf2_sha512->salt_buf[6] = hex_to_u32 ((const u8 *) &salt_pos[48]);
12881 pbkdf2_sha512->salt_buf[7] = hex_to_u32 ((const u8 *) &salt_pos[56]);
12882
12883 pbkdf2_sha512->salt_buf[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]);
12884 pbkdf2_sha512->salt_buf[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]);
12885 pbkdf2_sha512->salt_buf[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]);
12886 pbkdf2_sha512->salt_buf[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]);
12887 pbkdf2_sha512->salt_buf[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]);
12888 pbkdf2_sha512->salt_buf[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]);
12889 pbkdf2_sha512->salt_buf[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]);
12890 pbkdf2_sha512->salt_buf[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]);
12891 pbkdf2_sha512->salt_buf[8] = 0x01000000;
12892 pbkdf2_sha512->salt_buf[9] = 0x80;
12893
12894 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
12895
12896 salt->salt_iter = atoi (iter_pos) - 1;
12897
12898 return (PARSER_OK);
12899 }
12900
12901 int episerver4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12902 {
12903 if ((input_len < DISPLAY_LEN_MIN_1441) || (input_len > DISPLAY_LEN_MAX_1441)) return (PARSER_GLOBAL_LENGTH);
12904
12905 if (memcmp (SIGNATURE_EPISERVER4, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
12906
12907 u32 *digest = (u32 *) hash_buf->digest;
12908
12909 salt_t *salt = hash_buf->salt;
12910
12911 char *salt_pos = input_buf + 14;
12912
12913 char *hash_pos = strchr (salt_pos, '*');
12914
12915 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12916
12917 hash_pos++;
12918
12919 uint salt_len = hash_pos - salt_pos - 1;
12920
12921 char *salt_buf_ptr = (char *) salt->salt_buf;
12922
12923 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
12924
12925 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12926
12927 salt->salt_len = salt_len;
12928
12929 u8 tmp_buf[100] = { 0 };
12930
12931 base64_decode (base64_to_int, (const u8 *) hash_pos, 43, tmp_buf);
12932
12933 memcpy (digest, tmp_buf, 32);
12934
12935 digest[0] = byte_swap_32 (digest[0]);
12936 digest[1] = byte_swap_32 (digest[1]);
12937 digest[2] = byte_swap_32 (digest[2]);
12938 digest[3] = byte_swap_32 (digest[3]);
12939 digest[4] = byte_swap_32 (digest[4]);
12940 digest[5] = byte_swap_32 (digest[5]);
12941 digest[6] = byte_swap_32 (digest[6]);
12942 digest[7] = byte_swap_32 (digest[7]);
12943
12944 digest[0] -= SHA256M_A;
12945 digest[1] -= SHA256M_B;
12946 digest[2] -= SHA256M_C;
12947 digest[3] -= SHA256M_D;
12948 digest[4] -= SHA256M_E;
12949 digest[5] -= SHA256M_F;
12950 digest[6] -= SHA256M_G;
12951 digest[7] -= SHA256M_H;
12952
12953 return (PARSER_OK);
12954 }
12955
12956 int sha512grub_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12957 {
12958 uint max_len = DISPLAY_LEN_MAX_7200 + (8 * 128);
12959
12960 if ((input_len < DISPLAY_LEN_MIN_7200) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
12961
12962 if (memcmp (SIGNATURE_SHA512GRUB, input_buf, 19)) return (PARSER_SIGNATURE_UNMATCHED);
12963
12964 u64 *digest = (u64 *) hash_buf->digest;
12965
12966 salt_t *salt = hash_buf->salt;
12967
12968 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
12969
12970 char *iter_pos = input_buf + 19;
12971
12972 char *salt_pos = strchr (iter_pos, '.');
12973
12974 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12975
12976 salt_pos++;
12977
12978 char *hash_pos = strchr (salt_pos, '.');
12979
12980 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12981
12982 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
12983
12984 hash_pos++;
12985
12986 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
12987 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
12988 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
12989 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
12990 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
12991 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
12992 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
12993 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
12994
12995 uint salt_len = hash_pos - salt_pos - 1;
12996
12997 salt_len /= 2;
12998
12999 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
13000
13001 uint i;
13002
13003 for (i = 0; i < salt_len; i++)
13004 {
13005 salt_buf_ptr[i] = hex_to_u8 ((const u8 *) &salt_pos[i * 2]);
13006 }
13007
13008 salt_buf_ptr[salt_len + 3] = 0x01;
13009 salt_buf_ptr[salt_len + 4] = 0x80;
13010
13011 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
13012
13013 salt->salt_len = salt_len;
13014
13015 salt->salt_iter = atoi (iter_pos) - 1;
13016
13017 return (PARSER_OK);
13018 }
13019
13020 int sha512b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13021 {
13022 if ((input_len < DISPLAY_LEN_MIN_1711) || (input_len > DISPLAY_LEN_MAX_1711)) return (PARSER_GLOBAL_LENGTH);
13023
13024 if (memcmp (SIGNATURE_SHA512B64S, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
13025
13026 u64 *digest = (u64 *) hash_buf->digest;
13027
13028 salt_t *salt = hash_buf->salt;
13029
13030 u8 tmp_buf[120] = { 0 };
13031
13032 int tmp_len = base64_decode (base64_to_int, (const u8 *) input_buf + 9, input_len - 9, tmp_buf);
13033
13034 memcpy (digest, tmp_buf, 64);
13035
13036 digest[0] = byte_swap_64 (digest[0]);
13037 digest[1] = byte_swap_64 (digest[1]);
13038 digest[2] = byte_swap_64 (digest[2]);
13039 digest[3] = byte_swap_64 (digest[3]);
13040 digest[4] = byte_swap_64 (digest[4]);
13041 digest[5] = byte_swap_64 (digest[5]);
13042 digest[6] = byte_swap_64 (digest[6]);
13043 digest[7] = byte_swap_64 (digest[7]);
13044
13045 digest[0] -= SHA512M_A;
13046 digest[1] -= SHA512M_B;
13047 digest[2] -= SHA512M_C;
13048 digest[3] -= SHA512M_D;
13049 digest[4] -= SHA512M_E;
13050 digest[5] -= SHA512M_F;
13051 digest[6] -= SHA512M_G;
13052 digest[7] -= SHA512M_H;
13053
13054 salt->salt_len = tmp_len - 64;
13055
13056 memcpy (salt->salt_buf, tmp_buf + 64, salt->salt_len);
13057
13058 if (data.opts_type & OPTS_TYPE_ST_ADD80)
13059 {
13060 char *ptr = (char *) salt->salt_buf;
13061
13062 ptr[salt->salt_len] = 0x80;
13063 }
13064
13065 return (PARSER_OK);
13066 }
13067
13068 int hmacmd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13069 {
13070 if (data.opts_type & OPTS_TYPE_ST_HEX)
13071 {
13072 if ((input_len < DISPLAY_LEN_MIN_50H) || (input_len > DISPLAY_LEN_MAX_50H)) return (PARSER_GLOBAL_LENGTH);
13073 }
13074 else
13075 {
13076 if ((input_len < DISPLAY_LEN_MIN_50) || (input_len > DISPLAY_LEN_MAX_50)) return (PARSER_GLOBAL_LENGTH);
13077 }
13078
13079 u32 *digest = (u32 *) hash_buf->digest;
13080
13081 salt_t *salt = hash_buf->salt;
13082
13083 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13084 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13085 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13086 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13087
13088 digest[0] = byte_swap_32 (digest[0]);
13089 digest[1] = byte_swap_32 (digest[1]);
13090 digest[2] = byte_swap_32 (digest[2]);
13091 digest[3] = byte_swap_32 (digest[3]);
13092
13093 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13094
13095 uint salt_len = input_len - 32 - 1;
13096
13097 char *salt_buf = input_buf + 32 + 1;
13098
13099 char *salt_buf_ptr = (char *) salt->salt_buf;
13100
13101 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13102
13103 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13104
13105 salt->salt_len = salt_len;
13106
13107 return (PARSER_OK);
13108 }
13109
13110 int hmacsha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13111 {
13112 if (data.opts_type & OPTS_TYPE_ST_HEX)
13113 {
13114 if ((input_len < DISPLAY_LEN_MIN_150H) || (input_len > DISPLAY_LEN_MAX_150H)) return (PARSER_GLOBAL_LENGTH);
13115 }
13116 else
13117 {
13118 if ((input_len < DISPLAY_LEN_MIN_150) || (input_len > DISPLAY_LEN_MAX_150)) return (PARSER_GLOBAL_LENGTH);
13119 }
13120
13121 u32 *digest = (u32 *) hash_buf->digest;
13122
13123 salt_t *salt = hash_buf->salt;
13124
13125 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13126 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13127 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13128 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13129 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
13130
13131 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13132
13133 uint salt_len = input_len - 40 - 1;
13134
13135 char *salt_buf = input_buf + 40 + 1;
13136
13137 char *salt_buf_ptr = (char *) salt->salt_buf;
13138
13139 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13140
13141 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13142
13143 salt->salt_len = salt_len;
13144
13145 return (PARSER_OK);
13146 }
13147
13148 int hmacsha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13149 {
13150 if (data.opts_type & OPTS_TYPE_ST_HEX)
13151 {
13152 if ((input_len < DISPLAY_LEN_MIN_1450H) || (input_len > DISPLAY_LEN_MAX_1450H)) return (PARSER_GLOBAL_LENGTH);
13153 }
13154 else
13155 {
13156 if ((input_len < DISPLAY_LEN_MIN_1450) || (input_len > DISPLAY_LEN_MAX_1450)) return (PARSER_GLOBAL_LENGTH);
13157 }
13158
13159 u32 *digest = (u32 *) hash_buf->digest;
13160
13161 salt_t *salt = hash_buf->salt;
13162
13163 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13164 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13165 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13166 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13167 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
13168 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
13169 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
13170 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
13171
13172 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13173
13174 uint salt_len = input_len - 64 - 1;
13175
13176 char *salt_buf = input_buf + 64 + 1;
13177
13178 char *salt_buf_ptr = (char *) salt->salt_buf;
13179
13180 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13181
13182 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13183
13184 salt->salt_len = salt_len;
13185
13186 return (PARSER_OK);
13187 }
13188
13189 int hmacsha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13190 {
13191 if (data.opts_type & OPTS_TYPE_ST_HEX)
13192 {
13193 if ((input_len < DISPLAY_LEN_MIN_1750H) || (input_len > DISPLAY_LEN_MAX_1750H)) return (PARSER_GLOBAL_LENGTH);
13194 }
13195 else
13196 {
13197 if ((input_len < DISPLAY_LEN_MIN_1750) || (input_len > DISPLAY_LEN_MAX_1750)) return (PARSER_GLOBAL_LENGTH);
13198 }
13199
13200 u64 *digest = (u64 *) hash_buf->digest;
13201
13202 salt_t *salt = hash_buf->salt;
13203
13204 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
13205 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
13206 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
13207 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
13208 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
13209 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
13210 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
13211 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
13212
13213 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13214
13215 uint salt_len = input_len - 128 - 1;
13216
13217 char *salt_buf = input_buf + 128 + 1;
13218
13219 char *salt_buf_ptr = (char *) salt->salt_buf;
13220
13221 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13222
13223 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13224
13225 salt->salt_len = salt_len;
13226
13227 return (PARSER_OK);
13228 }
13229
13230 int krb5pa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13231 {
13232 if ((input_len < DISPLAY_LEN_MIN_7500) || (input_len > DISPLAY_LEN_MAX_7500)) return (PARSER_GLOBAL_LENGTH);
13233
13234 if (memcmp (SIGNATURE_KRB5PA, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
13235
13236 u32 *digest = (u32 *) hash_buf->digest;
13237
13238 salt_t *salt = hash_buf->salt;
13239
13240 krb5pa_t *krb5pa = (krb5pa_t *) hash_buf->esalt;
13241
13242 /**
13243 * parse line
13244 */
13245
13246 char *user_pos = input_buf + 10 + 1;
13247
13248 char *realm_pos = strchr (user_pos, '$');
13249
13250 if (realm_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13251
13252 uint user_len = realm_pos - user_pos;
13253
13254 if (user_len >= 64) return (PARSER_SALT_LENGTH);
13255
13256 realm_pos++;
13257
13258 char *salt_pos = strchr (realm_pos, '$');
13259
13260 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13261
13262 uint realm_len = salt_pos - realm_pos;
13263
13264 if (realm_len >= 64) return (PARSER_SALT_LENGTH);
13265
13266 salt_pos++;
13267
13268 char *data_pos = strchr (salt_pos, '$');
13269
13270 if (data_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13271
13272 uint salt_len = data_pos - salt_pos;
13273
13274 if (salt_len >= 128) return (PARSER_SALT_LENGTH);
13275
13276 data_pos++;
13277
13278 uint data_len = input_len - 10 - 1 - user_len - 1 - realm_len - 1 - salt_len - 1;
13279
13280 if (data_len != ((36 + 16) * 2)) return (PARSER_SALT_LENGTH);
13281
13282 /**
13283 * copy data
13284 */
13285
13286 memcpy (krb5pa->user, user_pos, user_len);
13287 memcpy (krb5pa->realm, realm_pos, realm_len);
13288 memcpy (krb5pa->salt, salt_pos, salt_len);
13289
13290 char *timestamp_ptr = (char *) krb5pa->timestamp;
13291
13292 for (uint i = 0; i < (36 * 2); i += 2)
13293 {
13294 const char p0 = data_pos[i + 0];
13295 const char p1 = data_pos[i + 1];
13296
13297 *timestamp_ptr++ = hex_convert (p1) << 0
13298 | hex_convert (p0) << 4;
13299 }
13300
13301 char *checksum_ptr = (char *) krb5pa->checksum;
13302
13303 for (uint i = (36 * 2); i < ((36 + 16) * 2); i += 2)
13304 {
13305 const char p0 = data_pos[i + 0];
13306 const char p1 = data_pos[i + 1];
13307
13308 *checksum_ptr++ = hex_convert (p1) << 0
13309 | hex_convert (p0) << 4;
13310 }
13311
13312 /**
13313 * copy some data to generic buffers to make sorting happy
13314 */
13315
13316 salt->salt_buf[0] = krb5pa->timestamp[0];
13317 salt->salt_buf[1] = krb5pa->timestamp[1];
13318 salt->salt_buf[2] = krb5pa->timestamp[2];
13319 salt->salt_buf[3] = krb5pa->timestamp[3];
13320 salt->salt_buf[4] = krb5pa->timestamp[4];
13321 salt->salt_buf[5] = krb5pa->timestamp[5];
13322 salt->salt_buf[6] = krb5pa->timestamp[6];
13323 salt->salt_buf[7] = krb5pa->timestamp[7];
13324 salt->salt_buf[8] = krb5pa->timestamp[8];
13325
13326 salt->salt_len = 36;
13327
13328 digest[0] = krb5pa->checksum[0];
13329 digest[1] = krb5pa->checksum[1];
13330 digest[2] = krb5pa->checksum[2];
13331 digest[3] = krb5pa->checksum[3];
13332
13333 return (PARSER_OK);
13334 }
13335
13336 int sapb_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13337 {
13338 if ((input_len < DISPLAY_LEN_MIN_7700) || (input_len > DISPLAY_LEN_MAX_7700)) return (PARSER_GLOBAL_LENGTH);
13339
13340 u32 *digest = (u32 *) hash_buf->digest;
13341
13342 salt_t *salt = hash_buf->salt;
13343
13344 /**
13345 * parse line
13346 */
13347
13348 char *salt_pos = input_buf;
13349
13350 char *hash_pos = strchr (salt_pos, '$');
13351
13352 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13353
13354 uint salt_len = hash_pos - salt_pos;
13355
13356 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
13357
13358 hash_pos++;
13359
13360 uint hash_len = input_len - 1 - salt_len;
13361
13362 if (hash_len != 16) return (PARSER_HASH_LENGTH);
13363
13364 /**
13365 * valid some data
13366 */
13367
13368 uint user_len = 0;
13369
13370 for (uint i = 0; i < salt_len; i++)
13371 {
13372 if (salt_pos[i] == ' ') continue;
13373
13374 user_len++;
13375 }
13376
13377 // SAP user names cannot be longer than 12 characters
13378 if (user_len > 12) return (PARSER_SALT_LENGTH);
13379
13380 // SAP user name cannot start with ! or ?
13381 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
13382
13383 /**
13384 * copy data
13385 */
13386
13387 char *salt_buf_ptr = (char *) salt->salt_buf;
13388
13389 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13390
13391 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13392
13393 salt->salt_len = salt_len;
13394
13395 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[0]);
13396 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[8]);
13397 digest[2] = 0;
13398 digest[3] = 0;
13399
13400 digest[0] = byte_swap_32 (digest[0]);
13401 digest[1] = byte_swap_32 (digest[1]);
13402
13403 return (PARSER_OK);
13404 }
13405
13406 int sapg_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13407 {
13408 if ((input_len < DISPLAY_LEN_MIN_7800) || (input_len > DISPLAY_LEN_MAX_7800)) return (PARSER_GLOBAL_LENGTH);
13409
13410 u32 *digest = (u32 *) hash_buf->digest;
13411
13412 salt_t *salt = hash_buf->salt;
13413
13414 /**
13415 * parse line
13416 */
13417
13418 char *salt_pos = input_buf;
13419
13420 char *hash_pos = strchr (salt_pos, '$');
13421
13422 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13423
13424 uint salt_len = hash_pos - salt_pos;
13425
13426 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
13427
13428 hash_pos++;
13429
13430 uint hash_len = input_len - 1 - salt_len;
13431
13432 if (hash_len != 40) return (PARSER_HASH_LENGTH);
13433
13434 /**
13435 * valid some data
13436 */
13437
13438 uint user_len = 0;
13439
13440 for (uint i = 0; i < salt_len; i++)
13441 {
13442 if (salt_pos[i] == ' ') continue;
13443
13444 user_len++;
13445 }
13446
13447 // SAP user names cannot be longer than 12 characters
13448 // this is kinda buggy. if the username is in utf the length can be up to length 12*3
13449 // so far nobody complained so we stay with this because it helps in optimization
13450 // final string can have a max size of 32 (password) + (10 * 5) = lengthMagicArray + 12 (max salt) + 1 (the 0x80)
13451
13452 if (user_len > 12) return (PARSER_SALT_LENGTH);
13453
13454 // SAP user name cannot start with ! or ?
13455 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
13456
13457 /**
13458 * copy data
13459 */
13460
13461 char *salt_buf_ptr = (char *) salt->salt_buf;
13462
13463 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13464
13465 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13466
13467 salt->salt_len = salt_len;
13468
13469 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
13470 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
13471 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
13472 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
13473 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
13474
13475 return (PARSER_OK);
13476 }
13477
13478 int drupal7_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13479 {
13480 if ((input_len < DISPLAY_LEN_MIN_7900) || (input_len > DISPLAY_LEN_MAX_7900)) return (PARSER_GLOBAL_LENGTH);
13481
13482 if (memcmp (SIGNATURE_DRUPAL7, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
13483
13484 u64 *digest = (u64 *) hash_buf->digest;
13485
13486 salt_t *salt = hash_buf->salt;
13487
13488 char *iter_pos = input_buf + 3;
13489
13490 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
13491
13492 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
13493
13494 memcpy ((char *) salt->salt_sign, input_buf, 4);
13495
13496 salt->salt_iter = salt_iter;
13497
13498 char *salt_pos = iter_pos + 1;
13499
13500 uint salt_len = 8;
13501
13502 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13503
13504 salt->salt_len = salt_len;
13505
13506 char *hash_pos = salt_pos + salt_len;
13507
13508 drupal7_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13509
13510 // ugly hack start
13511
13512 char *tmp = (char *) salt->salt_buf_pc;
13513
13514 tmp[0] = hash_pos[42];
13515
13516 // ugly hack end
13517
13518 digest[ 0] = byte_swap_64 (digest[ 0]);
13519 digest[ 1] = byte_swap_64 (digest[ 1]);
13520 digest[ 2] = byte_swap_64 (digest[ 2]);
13521 digest[ 3] = byte_swap_64 (digest[ 3]);
13522 digest[ 4] = 0;
13523 digest[ 5] = 0;
13524 digest[ 6] = 0;
13525 digest[ 7] = 0;
13526
13527 return (PARSER_OK);
13528 }
13529
13530 int sybasease_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13531 {
13532 if ((input_len < DISPLAY_LEN_MIN_8000) || (input_len > DISPLAY_LEN_MAX_8000)) return (PARSER_GLOBAL_LENGTH);
13533
13534 if (memcmp (SIGNATURE_SYBASEASE, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
13535
13536 u32 *digest = (u32 *) hash_buf->digest;
13537
13538 salt_t *salt = hash_buf->salt;
13539
13540 char *salt_buf = input_buf + 6;
13541
13542 uint salt_len = 16;
13543
13544 char *salt_buf_ptr = (char *) salt->salt_buf;
13545
13546 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13547
13548 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13549
13550 salt->salt_len = salt_len;
13551
13552 char *hash_pos = input_buf + 6 + 16;
13553
13554 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
13555 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
13556 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
13557 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
13558 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
13559 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
13560 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
13561 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
13562
13563 return (PARSER_OK);
13564 }
13565
13566 int mysql323_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13567 {
13568 if ((input_len < DISPLAY_LEN_MIN_200) || (input_len > DISPLAY_LEN_MAX_200)) return (PARSER_GLOBAL_LENGTH);
13569
13570 u32 *digest = (u32 *) hash_buf->digest;
13571
13572 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13573 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13574 digest[2] = 0;
13575 digest[3] = 0;
13576
13577 return (PARSER_OK);
13578 }
13579
13580 int rakp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13581 {
13582 if ((input_len < DISPLAY_LEN_MIN_7300) || (input_len > DISPLAY_LEN_MAX_7300)) return (PARSER_GLOBAL_LENGTH);
13583
13584 u32 *digest = (u32 *) hash_buf->digest;
13585
13586 salt_t *salt = hash_buf->salt;
13587
13588 rakp_t *rakp = (rakp_t *) hash_buf->esalt;
13589
13590 char *saltbuf_pos = input_buf;
13591
13592 char *hashbuf_pos = strchr (saltbuf_pos, ':');
13593
13594 if (hashbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13595
13596 uint saltbuf_len = hashbuf_pos - saltbuf_pos;
13597
13598 if (saltbuf_len < 64) return (PARSER_SALT_LENGTH);
13599 if (saltbuf_len > 512) return (PARSER_SALT_LENGTH);
13600
13601 if (saltbuf_len & 1) return (PARSER_SALT_LENGTH); // muss gerade sein wegen hex
13602
13603 hashbuf_pos++;
13604
13605 uint hashbuf_len = input_len - saltbuf_len - 1;
13606
13607 if (hashbuf_len != 40) return (PARSER_HASH_LENGTH);
13608
13609 char *salt_ptr = (char *) saltbuf_pos;
13610 char *rakp_ptr = (char *) rakp->salt_buf;
13611
13612 uint i;
13613 uint j;
13614
13615 for (i = 0, j = 0; i < saltbuf_len; i += 2, j += 1)
13616 {
13617 rakp_ptr[j] = hex_to_u8 ((const u8 *) &salt_ptr[i]);
13618 }
13619
13620 rakp_ptr[j] = 0x80;
13621
13622 rakp->salt_len = j;
13623
13624 for (i = 0; i < 64; i++)
13625 {
13626 rakp->salt_buf[i] = byte_swap_32 (rakp->salt_buf[i]);
13627 }
13628
13629 salt->salt_buf[0] = rakp->salt_buf[0];
13630 salt->salt_buf[1] = rakp->salt_buf[1];
13631 salt->salt_buf[2] = rakp->salt_buf[2];
13632 salt->salt_buf[3] = rakp->salt_buf[3];
13633 salt->salt_buf[4] = rakp->salt_buf[4];
13634 salt->salt_buf[5] = rakp->salt_buf[5];
13635 salt->salt_buf[6] = rakp->salt_buf[6];
13636 salt->salt_buf[7] = rakp->salt_buf[7];
13637
13638 salt->salt_len = 32; // muss min. 32 haben
13639
13640 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
13641 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
13642 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
13643 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
13644 digest[4] = hex_to_u32 ((const u8 *) &hashbuf_pos[32]);
13645
13646 return (PARSER_OK);
13647 }
13648
13649 int netscaler_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13650 {
13651 if ((input_len < DISPLAY_LEN_MIN_8100) || (input_len > DISPLAY_LEN_MAX_8100)) return (PARSER_GLOBAL_LENGTH);
13652
13653 u32 *digest = (u32 *) hash_buf->digest;
13654
13655 salt_t *salt = hash_buf->salt;
13656
13657 if (memcmp (SIGNATURE_NETSCALER, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
13658
13659 char *salt_pos = input_buf + 1;
13660
13661 memcpy (salt->salt_buf, salt_pos, 8);
13662
13663 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
13664 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
13665
13666 salt->salt_len = 8;
13667
13668 char *hash_pos = salt_pos + 8;
13669
13670 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
13671 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
13672 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
13673 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
13674 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
13675
13676 digest[0] -= SHA1M_A;
13677 digest[1] -= SHA1M_B;
13678 digest[2] -= SHA1M_C;
13679 digest[3] -= SHA1M_D;
13680 digest[4] -= SHA1M_E;
13681
13682 return (PARSER_OK);
13683 }
13684
13685 int chap_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13686 {
13687 if ((input_len < DISPLAY_LEN_MIN_4800) || (input_len > DISPLAY_LEN_MAX_4800)) return (PARSER_GLOBAL_LENGTH);
13688
13689 u32 *digest = (u32 *) hash_buf->digest;
13690
13691 salt_t *salt = hash_buf->salt;
13692
13693 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13694 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13695 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13696 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13697
13698 digest[0] = byte_swap_32 (digest[0]);
13699 digest[1] = byte_swap_32 (digest[1]);
13700 digest[2] = byte_swap_32 (digest[2]);
13701 digest[3] = byte_swap_32 (digest[3]);
13702
13703 digest[0] -= MD5M_A;
13704 digest[1] -= MD5M_B;
13705 digest[2] -= MD5M_C;
13706 digest[3] -= MD5M_D;
13707
13708 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13709
13710 char *salt_buf_ptr = input_buf + 32 + 1;
13711
13712 u32 *salt_buf = salt->salt_buf;
13713
13714 salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf_ptr[ 0]);
13715 salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf_ptr[ 8]);
13716 salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf_ptr[16]);
13717 salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf_ptr[24]);
13718
13719 salt_buf[0] = byte_swap_32 (salt_buf[0]);
13720 salt_buf[1] = byte_swap_32 (salt_buf[1]);
13721 salt_buf[2] = byte_swap_32 (salt_buf[2]);
13722 salt_buf[3] = byte_swap_32 (salt_buf[3]);
13723
13724 salt->salt_len = 16 + 1;
13725
13726 if (input_buf[65] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13727
13728 char *idbyte_buf_ptr = input_buf + 32 + 1 + 32 + 1;
13729
13730 salt_buf[4] = hex_to_u8 ((const u8 *) &idbyte_buf_ptr[0]) & 0xff;
13731
13732 return (PARSER_OK);
13733 }
13734
13735 int cloudkey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13736 {
13737 if ((input_len < DISPLAY_LEN_MIN_8200) || (input_len > DISPLAY_LEN_MAX_8200)) return (PARSER_GLOBAL_LENGTH);
13738
13739 u32 *digest = (u32 *) hash_buf->digest;
13740
13741 salt_t *salt = hash_buf->salt;
13742
13743 cloudkey_t *cloudkey = (cloudkey_t *) hash_buf->esalt;
13744
13745 /**
13746 * parse line
13747 */
13748
13749 char *hashbuf_pos = input_buf;
13750
13751 char *saltbuf_pos = strchr (hashbuf_pos, ':');
13752
13753 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13754
13755 const uint hashbuf_len = saltbuf_pos - hashbuf_pos;
13756
13757 if (hashbuf_len != 64) return (PARSER_HASH_LENGTH);
13758
13759 saltbuf_pos++;
13760
13761 char *iteration_pos = strchr (saltbuf_pos, ':');
13762
13763 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13764
13765 const uint saltbuf_len = iteration_pos - saltbuf_pos;
13766
13767 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
13768
13769 iteration_pos++;
13770
13771 char *databuf_pos = strchr (iteration_pos, ':');
13772
13773 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13774
13775 const uint iteration_len = databuf_pos - iteration_pos;
13776
13777 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
13778 if (iteration_len > 8) return (PARSER_SALT_ITERATION);
13779
13780 const uint databuf_len = input_len - hashbuf_len - 1 - saltbuf_len - 1 - iteration_len - 1;
13781
13782 if (databuf_len < 1) return (PARSER_SALT_LENGTH);
13783 if (databuf_len > 2048) return (PARSER_SALT_LENGTH);
13784
13785 databuf_pos++;
13786
13787 // digest
13788
13789 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
13790 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
13791 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
13792 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
13793 digest[4] = hex_to_u32 ((const u8 *) &hashbuf_pos[32]);
13794 digest[5] = hex_to_u32 ((const u8 *) &hashbuf_pos[40]);
13795 digest[6] = hex_to_u32 ((const u8 *) &hashbuf_pos[48]);
13796 digest[7] = hex_to_u32 ((const u8 *) &hashbuf_pos[56]);
13797
13798 // salt
13799
13800 char *saltbuf_ptr = (char *) salt->salt_buf;
13801
13802 for (uint i = 0; i < saltbuf_len; i += 2)
13803 {
13804 const char p0 = saltbuf_pos[i + 0];
13805 const char p1 = saltbuf_pos[i + 1];
13806
13807 *saltbuf_ptr++ = hex_convert (p1) << 0
13808 | hex_convert (p0) << 4;
13809 }
13810
13811 salt->salt_buf[4] = 0x01000000;
13812 salt->salt_buf[5] = 0x80;
13813
13814 salt->salt_len = saltbuf_len / 2;
13815
13816 // iteration
13817
13818 salt->salt_iter = atoi (iteration_pos) - 1;
13819
13820 // data
13821
13822 char *databuf_ptr = (char *) cloudkey->data_buf;
13823
13824 for (uint i = 0; i < databuf_len; i += 2)
13825 {
13826 const char p0 = databuf_pos[i + 0];
13827 const char p1 = databuf_pos[i + 1];
13828
13829 *databuf_ptr++ = hex_convert (p1) << 0
13830 | hex_convert (p0) << 4;
13831 }
13832
13833 *databuf_ptr++ = 0x80;
13834
13835 for (uint i = 0; i < 512; i++)
13836 {
13837 cloudkey->data_buf[i] = byte_swap_32 (cloudkey->data_buf[i]);
13838 }
13839
13840 cloudkey->data_len = databuf_len / 2;
13841
13842 return (PARSER_OK);
13843 }
13844
13845 int nsec3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13846 {
13847 if ((input_len < DISPLAY_LEN_MIN_8300) || (input_len > DISPLAY_LEN_MAX_8300)) return (PARSER_GLOBAL_LENGTH);
13848
13849 u32 *digest = (u32 *) hash_buf->digest;
13850
13851 salt_t *salt = hash_buf->salt;
13852
13853 /**
13854 * parse line
13855 */
13856
13857 char *hashbuf_pos = input_buf;
13858
13859 char *domainbuf_pos = strchr (hashbuf_pos, ':');
13860
13861 if (domainbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13862
13863 const uint hashbuf_len = domainbuf_pos - hashbuf_pos;
13864
13865 if (hashbuf_len != 32) return (PARSER_HASH_LENGTH);
13866
13867 domainbuf_pos++;
13868
13869 if (domainbuf_pos[0] != '.') return (PARSER_SALT_VALUE);
13870
13871 char *saltbuf_pos = strchr (domainbuf_pos, ':');
13872
13873 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13874
13875 const uint domainbuf_len = saltbuf_pos - domainbuf_pos;
13876
13877 if (domainbuf_len >= 32) return (PARSER_SALT_LENGTH);
13878
13879 saltbuf_pos++;
13880
13881 char *iteration_pos = strchr (saltbuf_pos, ':');
13882
13883 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13884
13885 const uint saltbuf_len = iteration_pos - saltbuf_pos;
13886
13887 if (saltbuf_len >= 28) return (PARSER_SALT_LENGTH); // 28 = 32 - 4; 4 = length
13888
13889 if ((domainbuf_len + saltbuf_len) >= 48) return (PARSER_SALT_LENGTH);
13890
13891 iteration_pos++;
13892
13893 const uint iteration_len = input_len - hashbuf_len - 1 - domainbuf_len - 1 - saltbuf_len - 1;
13894
13895 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
13896 if (iteration_len > 5) return (PARSER_SALT_ITERATION);
13897
13898 // ok, the plan for this algorithm is the following:
13899 // we have 2 salts here, the domain-name and a random salt
13900 // while both are used in the initial transformation,
13901 // only the random salt is used in the following iterations
13902 // so we create two buffer, one that includes domain-name (stored into salt_buf_pc[])
13903 // and one that includes only the real salt (stored into salt_buf[]).
13904 // the domain-name length is put into array position 7 of salt_buf_pc[] since there is not salt_pc_len
13905
13906 u8 tmp_buf[100] = { 0 };
13907
13908 base32_decode (itoa32_to_int, (const u8 *) hashbuf_pos, 32, tmp_buf);
13909
13910 memcpy (digest, tmp_buf, 20);
13911
13912 digest[0] = byte_swap_32 (digest[0]);
13913 digest[1] = byte_swap_32 (digest[1]);
13914 digest[2] = byte_swap_32 (digest[2]);
13915 digest[3] = byte_swap_32 (digest[3]);
13916 digest[4] = byte_swap_32 (digest[4]);
13917
13918 // domain
13919
13920 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
13921
13922 memcpy (salt_buf_pc_ptr, domainbuf_pos, domainbuf_len);
13923
13924 char *len_ptr = NULL;
13925
13926 for (uint i = 0; i < domainbuf_len; i++)
13927 {
13928 if (salt_buf_pc_ptr[i] == '.')
13929 {
13930 len_ptr = &salt_buf_pc_ptr[i];
13931
13932 *len_ptr = 0;
13933 }
13934 else
13935 {
13936 *len_ptr += 1;
13937 }
13938 }
13939
13940 salt->salt_buf_pc[7] = domainbuf_len;
13941
13942 // "real" salt
13943
13944 char *salt_buf_ptr = (char *) salt->salt_buf;
13945
13946 const uint salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, saltbuf_len);
13947
13948 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13949
13950 salt->salt_len = salt_len;
13951
13952 // iteration
13953
13954 salt->salt_iter = atoi (iteration_pos);
13955
13956 return (PARSER_OK);
13957 }
13958
13959 int wbb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13960 {
13961 if ((input_len < DISPLAY_LEN_MIN_8400) || (input_len > DISPLAY_LEN_MAX_8400)) return (PARSER_GLOBAL_LENGTH);
13962
13963 u32 *digest = (u32 *) hash_buf->digest;
13964
13965 salt_t *salt = hash_buf->salt;
13966
13967 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13968 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13969 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13970 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13971 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
13972
13973 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13974
13975 uint salt_len = input_len - 40 - 1;
13976
13977 char *salt_buf = input_buf + 40 + 1;
13978
13979 char *salt_buf_ptr = (char *) salt->salt_buf;
13980
13981 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13982
13983 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13984
13985 salt->salt_len = salt_len;
13986
13987 return (PARSER_OK);
13988 }
13989
13990 int racf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13991 {
13992 const u8 ascii_to_ebcdic[] =
13993 {
13994 0x00, 0x01, 0x02, 0x03, 0x37, 0x2d, 0x2e, 0x2f, 0x16, 0x05, 0x25, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
13995 0x10, 0x11, 0x12, 0x13, 0x3c, 0x3d, 0x32, 0x26, 0x18, 0x19, 0x3f, 0x27, 0x1c, 0x1d, 0x1e, 0x1f,
13996 0x40, 0x4f, 0x7f, 0x7b, 0x5b, 0x6c, 0x50, 0x7d, 0x4d, 0x5d, 0x5c, 0x4e, 0x6b, 0x60, 0x4b, 0x61,
13997 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0x7a, 0x5e, 0x4c, 0x7e, 0x6e, 0x6f,
13998 0x7c, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6,
13999 0xd7, 0xd8, 0xd9, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0x4a, 0xe0, 0x5a, 0x5f, 0x6d,
14000 0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
14001 0x97, 0x98, 0x99, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xc0, 0x6a, 0xd0, 0xa1, 0x07,
14002 0x20, 0x21, 0x22, 0x23, 0x24, 0x15, 0x06, 0x17, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x09, 0x0a, 0x1b,
14003 0x30, 0x31, 0x1a, 0x33, 0x34, 0x35, 0x36, 0x08, 0x38, 0x39, 0x3a, 0x3b, 0x04, 0x14, 0x3e, 0xe1,
14004 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
14005 0x58, 0x59, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75,
14006 0x76, 0x77, 0x78, 0x80, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e,
14007 0x9f, 0xa0, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
14008 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xda, 0xdb,
14009 0xdc, 0xdd, 0xde, 0xdf, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
14010 };
14011
14012 if ((input_len < DISPLAY_LEN_MIN_8500) || (input_len > DISPLAY_LEN_MAX_8500)) return (PARSER_GLOBAL_LENGTH);
14013
14014 if (memcmp (SIGNATURE_RACF, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14015
14016 u32 *digest = (u32 *) hash_buf->digest;
14017
14018 salt_t *salt = hash_buf->salt;
14019
14020 char *salt_pos = input_buf + 6 + 1;
14021
14022 char *digest_pos = strchr (salt_pos, '*');
14023
14024 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14025
14026 uint salt_len = digest_pos - salt_pos;
14027
14028 if (salt_len > 8) return (PARSER_SALT_LENGTH);
14029
14030 uint hash_len = input_len - 1 - salt_len - 1 - 6;
14031
14032 if (hash_len != 16) return (PARSER_HASH_LENGTH);
14033
14034 digest_pos++;
14035
14036 char *salt_buf_ptr = (char *) salt->salt_buf;
14037 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
14038
14039 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
14040
14041 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14042
14043 salt->salt_len = salt_len;
14044
14045 for (uint i = 0; i < salt_len; i++)
14046 {
14047 salt_buf_pc_ptr[i] = ascii_to_ebcdic[(int) salt_buf_ptr[i]];
14048 }
14049 for (uint i = salt_len; i < 8; i++)
14050 {
14051 salt_buf_pc_ptr[i] = 0x40;
14052 }
14053
14054 uint tt;
14055
14056 IP (salt->salt_buf_pc[0], salt->salt_buf_pc[1], tt);
14057
14058 salt->salt_buf_pc[0] = rotl32 (salt->salt_buf_pc[0], 3u);
14059 salt->salt_buf_pc[1] = rotl32 (salt->salt_buf_pc[1], 3u);
14060
14061 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
14062 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
14063
14064 digest[0] = byte_swap_32 (digest[0]);
14065 digest[1] = byte_swap_32 (digest[1]);
14066
14067 IP (digest[0], digest[1], tt);
14068
14069 digest[0] = rotr32 (digest[0], 29);
14070 digest[1] = rotr32 (digest[1], 29);
14071 digest[2] = 0;
14072 digest[3] = 0;
14073
14074 return (PARSER_OK);
14075 }
14076
14077 int lotus5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14078 {
14079 if ((input_len < DISPLAY_LEN_MIN_8600) || (input_len > DISPLAY_LEN_MAX_8600)) return (PARSER_GLOBAL_LENGTH);
14080
14081 u32 *digest = (u32 *) hash_buf->digest;
14082
14083 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14084 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14085 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14086 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14087
14088 digest[0] = byte_swap_32 (digest[0]);
14089 digest[1] = byte_swap_32 (digest[1]);
14090 digest[2] = byte_swap_32 (digest[2]);
14091 digest[3] = byte_swap_32 (digest[3]);
14092
14093 return (PARSER_OK);
14094 }
14095
14096 int lotus6_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14097 {
14098 if ((input_len < DISPLAY_LEN_MIN_8700) || (input_len > DISPLAY_LEN_MAX_8700)) return (PARSER_GLOBAL_LENGTH);
14099
14100 if ((input_buf[0] != '(') || (input_buf[1] != 'G') || (input_buf[21] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
14101
14102 u32 *digest = (u32 *) hash_buf->digest;
14103
14104 salt_t *salt = hash_buf->salt;
14105
14106 u8 tmp_buf[120] = { 0 };
14107
14108 base64_decode (lotus64_to_int, (const u8 *) input_buf + 2, input_len - 3, tmp_buf);
14109
14110 tmp_buf[3] += -4; // dont ask!
14111
14112 memcpy (salt->salt_buf, tmp_buf, 5);
14113
14114 salt->salt_len = 5;
14115
14116 memcpy (digest, tmp_buf + 5, 9);
14117
14118 // yes, only 9 byte are needed to crack, but 10 to display
14119
14120 salt->salt_buf_pc[7] = input_buf[20];
14121
14122 return (PARSER_OK);
14123 }
14124
14125 int lotus8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14126 {
14127 if ((input_len < DISPLAY_LEN_MIN_9100) || (input_len > DISPLAY_LEN_MAX_9100)) return (PARSER_GLOBAL_LENGTH);
14128
14129 if ((input_buf[0] != '(') || (input_buf[1] != 'H') || (input_buf[DISPLAY_LEN_MAX_9100 - 1] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
14130
14131 u32 *digest = (u32 *) hash_buf->digest;
14132
14133 salt_t *salt = hash_buf->salt;
14134
14135 u8 tmp_buf[120] = { 0 };
14136
14137 base64_decode (lotus64_to_int, (const u8 *) input_buf + 2, input_len - 3, tmp_buf);
14138
14139 tmp_buf[3] += -4; // dont ask!
14140
14141 // salt
14142
14143 memcpy (salt->salt_buf, tmp_buf, 16);
14144
14145 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)
14146
14147 // iteration
14148
14149 char tmp_iter_buf[11] = { 0 };
14150
14151 memcpy (tmp_iter_buf, tmp_buf + 16, 10);
14152
14153 tmp_iter_buf[10] = 0;
14154
14155 salt->salt_iter = atoi (tmp_iter_buf);
14156
14157 if (salt->salt_iter < 1) // well, the limit hopefully is much higher
14158 {
14159 return (PARSER_SALT_ITERATION);
14160 }
14161
14162 salt->salt_iter--; // first round in init
14163
14164 // 2 additional bytes for display only
14165
14166 salt->salt_buf_pc[0] = tmp_buf[26];
14167 salt->salt_buf_pc[1] = tmp_buf[27];
14168
14169 // digest
14170
14171 memcpy (digest, tmp_buf + 28, 8);
14172
14173 digest[0] = byte_swap_32 (digest[0]);
14174 digest[1] = byte_swap_32 (digest[1]);
14175 digest[2] = 0;
14176 digest[3] = 0;
14177
14178 return (PARSER_OK);
14179 }
14180
14181 int hmailserver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14182 {
14183 if ((input_len < DISPLAY_LEN_MIN_1421) || (input_len > DISPLAY_LEN_MAX_1421)) return (PARSER_GLOBAL_LENGTH);
14184
14185 u32 *digest = (u32 *) hash_buf->digest;
14186
14187 salt_t *salt = hash_buf->salt;
14188
14189 char *salt_buf_pos = input_buf;
14190
14191 char *hash_buf_pos = salt_buf_pos + 6;
14192
14193 digest[0] = hex_to_u32 ((const u8 *) &hash_buf_pos[ 0]);
14194 digest[1] = hex_to_u32 ((const u8 *) &hash_buf_pos[ 8]);
14195 digest[2] = hex_to_u32 ((const u8 *) &hash_buf_pos[16]);
14196 digest[3] = hex_to_u32 ((const u8 *) &hash_buf_pos[24]);
14197 digest[4] = hex_to_u32 ((const u8 *) &hash_buf_pos[32]);
14198 digest[5] = hex_to_u32 ((const u8 *) &hash_buf_pos[40]);
14199 digest[6] = hex_to_u32 ((const u8 *) &hash_buf_pos[48]);
14200 digest[7] = hex_to_u32 ((const u8 *) &hash_buf_pos[56]);
14201
14202 digest[0] -= SHA256M_A;
14203 digest[1] -= SHA256M_B;
14204 digest[2] -= SHA256M_C;
14205 digest[3] -= SHA256M_D;
14206 digest[4] -= SHA256M_E;
14207 digest[5] -= SHA256M_F;
14208 digest[6] -= SHA256M_G;
14209 digest[7] -= SHA256M_H;
14210
14211 char *salt_buf_ptr = (char *) salt->salt_buf;
14212
14213 const uint salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf_pos, 6);
14214
14215 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14216
14217 salt->salt_len = salt_len;
14218
14219 return (PARSER_OK);
14220 }
14221
14222 int phps_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14223 {
14224 if ((input_len < DISPLAY_LEN_MIN_2612) || (input_len > DISPLAY_LEN_MAX_2612)) return (PARSER_GLOBAL_LENGTH);
14225
14226 u32 *digest = (u32 *) hash_buf->digest;
14227
14228 if (memcmp (SIGNATURE_PHPS, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14229
14230 salt_t *salt = hash_buf->salt;
14231
14232 char *salt_buf = input_buf + 6;
14233
14234 char *digest_buf = strchr (salt_buf, '$');
14235
14236 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14237
14238 uint salt_len = digest_buf - salt_buf;
14239
14240 digest_buf++; // skip the '$' symbol
14241
14242 char *salt_buf_ptr = (char *) salt->salt_buf;
14243
14244 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14245
14246 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14247
14248 salt->salt_len = salt_len;
14249
14250 digest[0] = hex_to_u32 ((const u8 *) &digest_buf[ 0]);
14251 digest[1] = hex_to_u32 ((const u8 *) &digest_buf[ 8]);
14252 digest[2] = hex_to_u32 ((const u8 *) &digest_buf[16]);
14253 digest[3] = hex_to_u32 ((const u8 *) &digest_buf[24]);
14254
14255 digest[0] = byte_swap_32 (digest[0]);
14256 digest[1] = byte_swap_32 (digest[1]);
14257 digest[2] = byte_swap_32 (digest[2]);
14258 digest[3] = byte_swap_32 (digest[3]);
14259
14260 digest[0] -= MD5M_A;
14261 digest[1] -= MD5M_B;
14262 digest[2] -= MD5M_C;
14263 digest[3] -= MD5M_D;
14264
14265 return (PARSER_OK);
14266 }
14267
14268 int mediawiki_b_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14269 {
14270 if ((input_len < DISPLAY_LEN_MIN_3711) || (input_len > DISPLAY_LEN_MAX_3711)) return (PARSER_GLOBAL_LENGTH);
14271
14272 if (memcmp (SIGNATURE_MEDIAWIKI_B, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14273
14274 u32 *digest = (u32 *) hash_buf->digest;
14275
14276 salt_t *salt = hash_buf->salt;
14277
14278 char *salt_buf = input_buf + 3;
14279
14280 char *digest_buf = strchr (salt_buf, '$');
14281
14282 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14283
14284 uint salt_len = digest_buf - salt_buf;
14285
14286 digest_buf++; // skip the '$' symbol
14287
14288 char *salt_buf_ptr = (char *) salt->salt_buf;
14289
14290 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14291
14292 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14293
14294 salt_buf_ptr[salt_len] = 0x2d;
14295
14296 salt->salt_len = salt_len + 1;
14297
14298 digest[0] = hex_to_u32 ((const u8 *) &digest_buf[ 0]);
14299 digest[1] = hex_to_u32 ((const u8 *) &digest_buf[ 8]);
14300 digest[2] = hex_to_u32 ((const u8 *) &digest_buf[16]);
14301 digest[3] = hex_to_u32 ((const u8 *) &digest_buf[24]);
14302
14303 digest[0] = byte_swap_32 (digest[0]);
14304 digest[1] = byte_swap_32 (digest[1]);
14305 digest[2] = byte_swap_32 (digest[2]);
14306 digest[3] = byte_swap_32 (digest[3]);
14307
14308 digest[0] -= MD5M_A;
14309 digest[1] -= MD5M_B;
14310 digest[2] -= MD5M_C;
14311 digest[3] -= MD5M_D;
14312
14313 return (PARSER_OK);
14314 }
14315
14316 int peoplesoft_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14317 {
14318 if ((input_len < DISPLAY_LEN_MIN_133) || (input_len > DISPLAY_LEN_MAX_133)) return (PARSER_GLOBAL_LENGTH);
14319
14320 u32 *digest = (u32 *) hash_buf->digest;
14321
14322 u8 tmp_buf[100] = { 0 };
14323
14324 base64_decode (base64_to_int, (const u8 *) input_buf, input_len, tmp_buf);
14325
14326 memcpy (digest, tmp_buf, 20);
14327
14328 digest[0] = byte_swap_32 (digest[0]);
14329 digest[1] = byte_swap_32 (digest[1]);
14330 digest[2] = byte_swap_32 (digest[2]);
14331 digest[3] = byte_swap_32 (digest[3]);
14332 digest[4] = byte_swap_32 (digest[4]);
14333
14334 digest[0] -= SHA1M_A;
14335 digest[1] -= SHA1M_B;
14336 digest[2] -= SHA1M_C;
14337 digest[3] -= SHA1M_D;
14338 digest[4] -= SHA1M_E;
14339
14340 return (PARSER_OK);
14341 }
14342
14343 int skype_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14344 {
14345 if ((input_len < DISPLAY_LEN_MIN_23) || (input_len > DISPLAY_LEN_MAX_23)) return (PARSER_GLOBAL_LENGTH);
14346
14347 u32 *digest = (u32 *) hash_buf->digest;
14348
14349 salt_t *salt = hash_buf->salt;
14350
14351 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14352 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14353 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14354 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14355
14356 digest[0] = byte_swap_32 (digest[0]);
14357 digest[1] = byte_swap_32 (digest[1]);
14358 digest[2] = byte_swap_32 (digest[2]);
14359 digest[3] = byte_swap_32 (digest[3]);
14360
14361 digest[0] -= MD5M_A;
14362 digest[1] -= MD5M_B;
14363 digest[2] -= MD5M_C;
14364 digest[3] -= MD5M_D;
14365
14366 if (input_buf[32] != ':') return (PARSER_SEPARATOR_UNMATCHED);
14367
14368 uint salt_len = input_len - 32 - 1;
14369
14370 char *salt_buf = input_buf + 32 + 1;
14371
14372 char *salt_buf_ptr = (char *) salt->salt_buf;
14373
14374 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14375
14376 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14377
14378 /*
14379 * add static "salt" part
14380 */
14381
14382 memcpy (salt_buf_ptr + salt_len, "\nskyper\n", 8);
14383
14384 salt_len += 8;
14385
14386 salt->salt_len = salt_len;
14387
14388 return (PARSER_OK);
14389 }
14390
14391 int androidfde_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14392 {
14393 if ((input_len < DISPLAY_LEN_MIN_8800) || (input_len > DISPLAY_LEN_MAX_8800)) return (PARSER_GLOBAL_LENGTH);
14394
14395 if (memcmp (SIGNATURE_ANDROIDFDE, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
14396
14397 u32 *digest = (u32 *) hash_buf->digest;
14398
14399 salt_t *salt = hash_buf->salt;
14400
14401 androidfde_t *androidfde = (androidfde_t *) hash_buf->esalt;
14402
14403 /**
14404 * parse line
14405 */
14406
14407 char *saltlen_pos = input_buf + 1 + 3 + 1;
14408
14409 char *saltbuf_pos = strchr (saltlen_pos, '$');
14410
14411 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14412
14413 uint saltlen_len = saltbuf_pos - saltlen_pos;
14414
14415 if (saltlen_len != 2) return (PARSER_SALT_LENGTH);
14416
14417 saltbuf_pos++;
14418
14419 char *keylen_pos = strchr (saltbuf_pos, '$');
14420
14421 if (keylen_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14422
14423 uint saltbuf_len = keylen_pos - saltbuf_pos;
14424
14425 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
14426
14427 keylen_pos++;
14428
14429 char *keybuf_pos = strchr (keylen_pos, '$');
14430
14431 if (keybuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14432
14433 uint keylen_len = keybuf_pos - keylen_pos;
14434
14435 if (keylen_len != 2) return (PARSER_SALT_LENGTH);
14436
14437 keybuf_pos++;
14438
14439 char *databuf_pos = strchr (keybuf_pos, '$');
14440
14441 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14442
14443 uint keybuf_len = databuf_pos - keybuf_pos;
14444
14445 if (keybuf_len != 32) return (PARSER_SALT_LENGTH);
14446
14447 databuf_pos++;
14448
14449 uint data_len = input_len - 1 - 3 - 1 - saltlen_len - 1 - saltbuf_len - 1 - keylen_len - 1 - keybuf_len - 1;
14450
14451 if (data_len != 3072) return (PARSER_SALT_LENGTH);
14452
14453 /**
14454 * copy data
14455 */
14456
14457 digest[0] = hex_to_u32 ((const u8 *) &keybuf_pos[ 0]);
14458 digest[1] = hex_to_u32 ((const u8 *) &keybuf_pos[ 8]);
14459 digest[2] = hex_to_u32 ((const u8 *) &keybuf_pos[16]);
14460 digest[3] = hex_to_u32 ((const u8 *) &keybuf_pos[24]);
14461
14462 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &saltbuf_pos[ 0]);
14463 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &saltbuf_pos[ 8]);
14464 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &saltbuf_pos[16]);
14465 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &saltbuf_pos[24]);
14466
14467 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
14468 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
14469 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
14470 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
14471
14472 salt->salt_len = 16;
14473 salt->salt_iter = ROUNDS_ANDROIDFDE - 1;
14474
14475 for (uint i = 0, j = 0; i < 3072; i += 8, j += 1)
14476 {
14477 androidfde->data[j] = hex_to_u32 ((const u8 *) &databuf_pos[i]);
14478 }
14479
14480 return (PARSER_OK);
14481 }
14482
14483 int scrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14484 {
14485 if ((input_len < DISPLAY_LEN_MIN_8900) || (input_len > DISPLAY_LEN_MAX_8900)) return (PARSER_GLOBAL_LENGTH);
14486
14487 if (memcmp (SIGNATURE_SCRYPT, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14488
14489 u32 *digest = (u32 *) hash_buf->digest;
14490
14491 salt_t *salt = hash_buf->salt;
14492
14493 /**
14494 * parse line
14495 */
14496
14497 // first is the N salt parameter
14498
14499 char *N_pos = input_buf + 6;
14500
14501 if (N_pos[0] != ':') return (PARSER_SEPARATOR_UNMATCHED);
14502
14503 N_pos++;
14504
14505 salt->scrypt_N = atoi (N_pos);
14506
14507 // r
14508
14509 char *r_pos = strchr (N_pos, ':');
14510
14511 if (r_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14512
14513 r_pos++;
14514
14515 salt->scrypt_r = atoi (r_pos);
14516
14517 // p
14518
14519 char *p_pos = strchr (r_pos, ':');
14520
14521 if (p_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14522
14523 p_pos++;
14524
14525 salt->scrypt_p = atoi (p_pos);
14526
14527 // salt
14528
14529 char *saltbuf_pos = strchr (p_pos, ':');
14530
14531 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14532
14533 saltbuf_pos++;
14534
14535 char *hash_pos = strchr (saltbuf_pos, ':');
14536
14537 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14538
14539 hash_pos++;
14540
14541 // base64 decode
14542
14543 u8 tmp_buf[33] = { 0 };
14544
14545 int tmp_len = base64_decode (base64_to_int, (const u8 *) saltbuf_pos, hash_pos - saltbuf_pos, tmp_buf);
14546
14547 char *salt_buf_ptr = (char *) salt->salt_buf;
14548
14549 memcpy (salt_buf_ptr, tmp_buf, tmp_len);
14550
14551 salt->salt_len = tmp_len;
14552 salt->salt_iter = 1;
14553
14554 // digest - base64 decode
14555
14556 memset (tmp_buf, 0, sizeof (tmp_buf));
14557
14558 tmp_len = input_len - (hash_pos - input_buf);
14559
14560 if (tmp_len != 44) return (PARSER_GLOBAL_LENGTH);
14561
14562 base64_decode (base64_to_int, (const u8 *) hash_pos, tmp_len, tmp_buf);
14563
14564 memcpy (digest, tmp_buf, 32);
14565
14566 return (PARSER_OK);
14567 }
14568
14569 int juniper_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14570 {
14571 if ((input_len < DISPLAY_LEN_MIN_501) || (input_len > DISPLAY_LEN_MAX_501)) return (PARSER_GLOBAL_LENGTH);
14572
14573 u32 *digest = (u32 *) hash_buf->digest;
14574
14575 salt_t *salt = hash_buf->salt;
14576
14577 /**
14578 * parse line
14579 */
14580
14581 char decrypted[76] = { 0 }; // iv + hash
14582
14583 juniper_decrypt_hash (input_buf, decrypted);
14584
14585 char *md5crypt_hash = decrypted + 12;
14586
14587 if (memcmp (md5crypt_hash, "$1$danastre$", 12)) return (PARSER_SALT_VALUE);
14588
14589 salt->salt_iter = ROUNDS_MD5CRYPT;
14590
14591 char *salt_pos = md5crypt_hash + 3;
14592
14593 char *hash_pos = strchr (salt_pos, '$'); // or simply salt_pos + 8
14594
14595 salt->salt_len = hash_pos - salt_pos; // should be 8
14596
14597 memcpy ((char *) salt->salt_buf, salt_pos, salt->salt_len);
14598
14599 hash_pos++;
14600
14601 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
14602
14603 return (PARSER_OK);
14604 }
14605
14606 int cisco8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14607 {
14608 if ((input_len < DISPLAY_LEN_MIN_9200) || (input_len > DISPLAY_LEN_MAX_9200)) return (PARSER_GLOBAL_LENGTH);
14609
14610 if (memcmp (SIGNATURE_CISCO8, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14611
14612 u32 *digest = (u32 *) hash_buf->digest;
14613
14614 salt_t *salt = hash_buf->salt;
14615
14616 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
14617
14618 /**
14619 * parse line
14620 */
14621
14622 // first is *raw* salt
14623
14624 char *salt_pos = input_buf + 3;
14625
14626 char *hash_pos = strchr (salt_pos, '$');
14627
14628 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14629
14630 uint salt_len = hash_pos - salt_pos;
14631
14632 if (salt_len != 14) return (PARSER_SALT_LENGTH);
14633
14634 hash_pos++;
14635
14636 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
14637
14638 memcpy (salt_buf_ptr, salt_pos, 14);
14639
14640 salt_buf_ptr[17] = 0x01;
14641 salt_buf_ptr[18] = 0x80;
14642
14643 // add some stuff to normal salt to make sorted happy
14644
14645 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
14646 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
14647 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
14648 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
14649
14650 salt->salt_len = salt_len;
14651 salt->salt_iter = ROUNDS_CISCO8 - 1;
14652
14653 // base64 decode hash
14654
14655 u8 tmp_buf[100] = { 0 };
14656
14657 uint hash_len = input_len - 3 - salt_len - 1;
14658
14659 int tmp_len = base64_decode (itoa64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
14660
14661 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
14662
14663 memcpy (digest, tmp_buf, 32);
14664
14665 digest[0] = byte_swap_32 (digest[0]);
14666 digest[1] = byte_swap_32 (digest[1]);
14667 digest[2] = byte_swap_32 (digest[2]);
14668 digest[3] = byte_swap_32 (digest[3]);
14669 digest[4] = byte_swap_32 (digest[4]);
14670 digest[5] = byte_swap_32 (digest[5]);
14671 digest[6] = byte_swap_32 (digest[6]);
14672 digest[7] = byte_swap_32 (digest[7]);
14673
14674 return (PARSER_OK);
14675 }
14676
14677 int cisco9_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14678 {
14679 if ((input_len < DISPLAY_LEN_MIN_9300) || (input_len > DISPLAY_LEN_MAX_9300)) return (PARSER_GLOBAL_LENGTH);
14680
14681 if (memcmp (SIGNATURE_CISCO9, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14682
14683 u32 *digest = (u32 *) hash_buf->digest;
14684
14685 salt_t *salt = hash_buf->salt;
14686
14687 /**
14688 * parse line
14689 */
14690
14691 // first is *raw* salt
14692
14693 char *salt_pos = input_buf + 3;
14694
14695 char *hash_pos = strchr (salt_pos, '$');
14696
14697 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14698
14699 uint salt_len = hash_pos - salt_pos;
14700
14701 if (salt_len != 14) return (PARSER_SALT_LENGTH);
14702
14703 salt->salt_len = salt_len;
14704 hash_pos++;
14705
14706 char *salt_buf_ptr = (char *) salt->salt_buf;
14707
14708 memcpy (salt_buf_ptr, salt_pos, salt_len);
14709 salt_buf_ptr[salt_len] = 0;
14710
14711 // base64 decode hash
14712
14713 u8 tmp_buf[100] = { 0 };
14714
14715 uint hash_len = input_len - 3 - salt_len - 1;
14716
14717 int tmp_len = base64_decode (itoa64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
14718
14719 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
14720
14721 memcpy (digest, tmp_buf, 32);
14722
14723 // fixed:
14724 salt->scrypt_N = 16384;
14725 salt->scrypt_r = 1;
14726 salt->scrypt_p = 1;
14727 salt->salt_iter = 1;
14728
14729 return (PARSER_OK);
14730 }
14731
14732 int office2007_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14733 {
14734 if ((input_len < DISPLAY_LEN_MIN_9400) || (input_len > DISPLAY_LEN_MAX_9400)) return (PARSER_GLOBAL_LENGTH);
14735
14736 if (memcmp (SIGNATURE_OFFICE2007, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
14737
14738 u32 *digest = (u32 *) hash_buf->digest;
14739
14740 salt_t *salt = hash_buf->salt;
14741
14742 office2007_t *office2007 = (office2007_t *) hash_buf->esalt;
14743
14744 /**
14745 * parse line
14746 */
14747
14748 char *version_pos = input_buf + 8 + 1;
14749
14750 char *verifierHashSize_pos = strchr (version_pos, '*');
14751
14752 if (verifierHashSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14753
14754 u32 version_len = verifierHashSize_pos - version_pos;
14755
14756 if (version_len != 4) return (PARSER_SALT_LENGTH);
14757
14758 verifierHashSize_pos++;
14759
14760 char *keySize_pos = strchr (verifierHashSize_pos, '*');
14761
14762 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14763
14764 u32 verifierHashSize_len = keySize_pos - verifierHashSize_pos;
14765
14766 if (verifierHashSize_len != 2) return (PARSER_SALT_LENGTH);
14767
14768 keySize_pos++;
14769
14770 char *saltSize_pos = strchr (keySize_pos, '*');
14771
14772 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14773
14774 u32 keySize_len = saltSize_pos - keySize_pos;
14775
14776 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
14777
14778 saltSize_pos++;
14779
14780 char *osalt_pos = strchr (saltSize_pos, '*');
14781
14782 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14783
14784 u32 saltSize_len = osalt_pos - saltSize_pos;
14785
14786 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
14787
14788 osalt_pos++;
14789
14790 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
14791
14792 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14793
14794 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
14795
14796 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
14797
14798 encryptedVerifier_pos++;
14799
14800 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
14801
14802 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14803
14804 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
14805
14806 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
14807
14808 encryptedVerifierHash_pos++;
14809
14810 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;
14811
14812 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
14813
14814 const uint version = atoi (version_pos);
14815
14816 if (version != 2007) return (PARSER_SALT_VALUE);
14817
14818 const uint verifierHashSize = atoi (verifierHashSize_pos);
14819
14820 if (verifierHashSize != 20) return (PARSER_SALT_VALUE);
14821
14822 const uint keySize = atoi (keySize_pos);
14823
14824 if ((keySize != 128) && (keySize != 256)) return (PARSER_SALT_VALUE);
14825
14826 office2007->keySize = keySize;
14827
14828 const uint saltSize = atoi (saltSize_pos);
14829
14830 if (saltSize != 16) return (PARSER_SALT_VALUE);
14831
14832 /**
14833 * salt
14834 */
14835
14836 salt->salt_len = 16;
14837 salt->salt_iter = ROUNDS_OFFICE2007;
14838
14839 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
14840 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
14841 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
14842 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
14843
14844 /**
14845 * esalt
14846 */
14847
14848 office2007->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
14849 office2007->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
14850 office2007->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
14851 office2007->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
14852
14853 office2007->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
14854 office2007->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
14855 office2007->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
14856 office2007->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
14857 office2007->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
14858
14859 /**
14860 * digest
14861 */
14862
14863 digest[0] = office2007->encryptedVerifierHash[0];
14864 digest[1] = office2007->encryptedVerifierHash[1];
14865 digest[2] = office2007->encryptedVerifierHash[2];
14866 digest[3] = office2007->encryptedVerifierHash[3];
14867
14868 return (PARSER_OK);
14869 }
14870
14871 int office2010_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14872 {
14873 if ((input_len < DISPLAY_LEN_MIN_9500) || (input_len > DISPLAY_LEN_MAX_9500)) return (PARSER_GLOBAL_LENGTH);
14874
14875 if (memcmp (SIGNATURE_OFFICE2010, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
14876
14877 u32 *digest = (u32 *) hash_buf->digest;
14878
14879 salt_t *salt = hash_buf->salt;
14880
14881 office2010_t *office2010 = (office2010_t *) hash_buf->esalt;
14882
14883 /**
14884 * parse line
14885 */
14886
14887 char *version_pos = input_buf + 8 + 1;
14888
14889 char *spinCount_pos = strchr (version_pos, '*');
14890
14891 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14892
14893 u32 version_len = spinCount_pos - version_pos;
14894
14895 if (version_len != 4) return (PARSER_SALT_LENGTH);
14896
14897 spinCount_pos++;
14898
14899 char *keySize_pos = strchr (spinCount_pos, '*');
14900
14901 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14902
14903 u32 spinCount_len = keySize_pos - spinCount_pos;
14904
14905 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
14906
14907 keySize_pos++;
14908
14909 char *saltSize_pos = strchr (keySize_pos, '*');
14910
14911 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14912
14913 u32 keySize_len = saltSize_pos - keySize_pos;
14914
14915 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
14916
14917 saltSize_pos++;
14918
14919 char *osalt_pos = strchr (saltSize_pos, '*');
14920
14921 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14922
14923 u32 saltSize_len = osalt_pos - saltSize_pos;
14924
14925 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
14926
14927 osalt_pos++;
14928
14929 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
14930
14931 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14932
14933 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
14934
14935 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
14936
14937 encryptedVerifier_pos++;
14938
14939 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
14940
14941 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14942
14943 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
14944
14945 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
14946
14947 encryptedVerifierHash_pos++;
14948
14949 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;
14950
14951 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
14952
14953 const uint version = atoi (version_pos);
14954
14955 if (version != 2010) return (PARSER_SALT_VALUE);
14956
14957 const uint spinCount = atoi (spinCount_pos);
14958
14959 if (spinCount != 100000) return (PARSER_SALT_VALUE);
14960
14961 const uint keySize = atoi (keySize_pos);
14962
14963 if (keySize != 128) return (PARSER_SALT_VALUE);
14964
14965 const uint saltSize = atoi (saltSize_pos);
14966
14967 if (saltSize != 16) return (PARSER_SALT_VALUE);
14968
14969 /**
14970 * salt
14971 */
14972
14973 salt->salt_len = 16;
14974 salt->salt_iter = spinCount;
14975
14976 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
14977 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
14978 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
14979 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
14980
14981 /**
14982 * esalt
14983 */
14984
14985 office2010->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
14986 office2010->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
14987 office2010->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
14988 office2010->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
14989
14990 office2010->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
14991 office2010->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
14992 office2010->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
14993 office2010->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
14994 office2010->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
14995 office2010->encryptedVerifierHash[5] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[40]);
14996 office2010->encryptedVerifierHash[6] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[48]);
14997 office2010->encryptedVerifierHash[7] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[56]);
14998
14999 /**
15000 * digest
15001 */
15002
15003 digest[0] = office2010->encryptedVerifierHash[0];
15004 digest[1] = office2010->encryptedVerifierHash[1];
15005 digest[2] = office2010->encryptedVerifierHash[2];
15006 digest[3] = office2010->encryptedVerifierHash[3];
15007
15008 return (PARSER_OK);
15009 }
15010
15011 int office2013_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15012 {
15013 if ((input_len < DISPLAY_LEN_MIN_9600) || (input_len > DISPLAY_LEN_MAX_9600)) return (PARSER_GLOBAL_LENGTH);
15014
15015 if (memcmp (SIGNATURE_OFFICE2013, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
15016
15017 u32 *digest = (u32 *) hash_buf->digest;
15018
15019 salt_t *salt = hash_buf->salt;
15020
15021 office2013_t *office2013 = (office2013_t *) hash_buf->esalt;
15022
15023 /**
15024 * parse line
15025 */
15026
15027 char *version_pos = input_buf + 8 + 1;
15028
15029 char *spinCount_pos = strchr (version_pos, '*');
15030
15031 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15032
15033 u32 version_len = spinCount_pos - version_pos;
15034
15035 if (version_len != 4) return (PARSER_SALT_LENGTH);
15036
15037 spinCount_pos++;
15038
15039 char *keySize_pos = strchr (spinCount_pos, '*');
15040
15041 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15042
15043 u32 spinCount_len = keySize_pos - spinCount_pos;
15044
15045 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
15046
15047 keySize_pos++;
15048
15049 char *saltSize_pos = strchr (keySize_pos, '*');
15050
15051 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15052
15053 u32 keySize_len = saltSize_pos - keySize_pos;
15054
15055 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
15056
15057 saltSize_pos++;
15058
15059 char *osalt_pos = strchr (saltSize_pos, '*');
15060
15061 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15062
15063 u32 saltSize_len = osalt_pos - saltSize_pos;
15064
15065 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
15066
15067 osalt_pos++;
15068
15069 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15070
15071 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15072
15073 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15074
15075 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15076
15077 encryptedVerifier_pos++;
15078
15079 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15080
15081 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15082
15083 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15084
15085 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15086
15087 encryptedVerifierHash_pos++;
15088
15089 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;
15090
15091 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
15092
15093 const uint version = atoi (version_pos);
15094
15095 if (version != 2013) return (PARSER_SALT_VALUE);
15096
15097 const uint spinCount = atoi (spinCount_pos);
15098
15099 if (spinCount != 100000) return (PARSER_SALT_VALUE);
15100
15101 const uint keySize = atoi (keySize_pos);
15102
15103 if (keySize != 256) return (PARSER_SALT_VALUE);
15104
15105 const uint saltSize = atoi (saltSize_pos);
15106
15107 if (saltSize != 16) return (PARSER_SALT_VALUE);
15108
15109 /**
15110 * salt
15111 */
15112
15113 salt->salt_len = 16;
15114 salt->salt_iter = spinCount;
15115
15116 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15117 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15118 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15119 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15120
15121 /**
15122 * esalt
15123 */
15124
15125 office2013->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15126 office2013->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15127 office2013->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15128 office2013->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15129
15130 office2013->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15131 office2013->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15132 office2013->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15133 office2013->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15134 office2013->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15135 office2013->encryptedVerifierHash[5] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[40]);
15136 office2013->encryptedVerifierHash[6] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[48]);
15137 office2013->encryptedVerifierHash[7] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[56]);
15138
15139 /**
15140 * digest
15141 */
15142
15143 digest[0] = office2013->encryptedVerifierHash[0];
15144 digest[1] = office2013->encryptedVerifierHash[1];
15145 digest[2] = office2013->encryptedVerifierHash[2];
15146 digest[3] = office2013->encryptedVerifierHash[3];
15147
15148 return (PARSER_OK);
15149 }
15150
15151 int oldoffice01_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15152 {
15153 if ((input_len < DISPLAY_LEN_MIN_9700) || (input_len > DISPLAY_LEN_MAX_9700)) return (PARSER_GLOBAL_LENGTH);
15154
15155 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15156
15157 u32 *digest = (u32 *) hash_buf->digest;
15158
15159 salt_t *salt = hash_buf->salt;
15160
15161 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
15162
15163 /**
15164 * parse line
15165 */
15166
15167 char *version_pos = input_buf + 11;
15168
15169 char *osalt_pos = strchr (version_pos, '*');
15170
15171 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15172
15173 u32 version_len = osalt_pos - version_pos;
15174
15175 if (version_len != 1) return (PARSER_SALT_LENGTH);
15176
15177 osalt_pos++;
15178
15179 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15180
15181 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15182
15183 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15184
15185 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15186
15187 encryptedVerifier_pos++;
15188
15189 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15190
15191 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15192
15193 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15194
15195 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15196
15197 encryptedVerifierHash_pos++;
15198
15199 u32 encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
15200
15201 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
15202
15203 const uint version = *version_pos - 0x30;
15204
15205 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
15206
15207 /**
15208 * esalt
15209 */
15210
15211 oldoffice01->version = version;
15212
15213 oldoffice01->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15214 oldoffice01->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15215 oldoffice01->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15216 oldoffice01->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15217
15218 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
15219 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
15220 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
15221 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
15222
15223 oldoffice01->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15224 oldoffice01->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15225 oldoffice01->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15226 oldoffice01->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15227
15228 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
15229 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
15230 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
15231 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
15232
15233 /**
15234 * salt
15235 */
15236
15237 salt->salt_len = 16;
15238
15239 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15240 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15241 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15242 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15243
15244 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15245 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15246 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15247 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15248
15249 // this is a workaround as office produces multiple documents with the same salt
15250
15251 salt->salt_len += 32;
15252
15253 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
15254 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
15255 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
15256 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
15257 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
15258 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
15259 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
15260 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
15261
15262 /**
15263 * digest
15264 */
15265
15266 digest[0] = oldoffice01->encryptedVerifierHash[0];
15267 digest[1] = oldoffice01->encryptedVerifierHash[1];
15268 digest[2] = oldoffice01->encryptedVerifierHash[2];
15269 digest[3] = oldoffice01->encryptedVerifierHash[3];
15270
15271 return (PARSER_OK);
15272 }
15273
15274 int oldoffice01cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15275 {
15276 return oldoffice01_parse_hash (input_buf, input_len, hash_buf);
15277 }
15278
15279 int oldoffice01cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15280 {
15281 if ((input_len < DISPLAY_LEN_MIN_9720) || (input_len > DISPLAY_LEN_MAX_9720)) return (PARSER_GLOBAL_LENGTH);
15282
15283 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15284
15285 u32 *digest = (u32 *) hash_buf->digest;
15286
15287 salt_t *salt = hash_buf->salt;
15288
15289 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
15290
15291 /**
15292 * parse line
15293 */
15294
15295 char *version_pos = input_buf + 11;
15296
15297 char *osalt_pos = strchr (version_pos, '*');
15298
15299 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15300
15301 u32 version_len = osalt_pos - version_pos;
15302
15303 if (version_len != 1) return (PARSER_SALT_LENGTH);
15304
15305 osalt_pos++;
15306
15307 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15308
15309 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15310
15311 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15312
15313 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15314
15315 encryptedVerifier_pos++;
15316
15317 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15318
15319 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15320
15321 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15322
15323 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15324
15325 encryptedVerifierHash_pos++;
15326
15327 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
15328
15329 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15330
15331 u32 encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
15332
15333 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
15334
15335 rc4key_pos++;
15336
15337 u32 rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
15338
15339 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
15340
15341 const uint version = *version_pos - 0x30;
15342
15343 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
15344
15345 /**
15346 * esalt
15347 */
15348
15349 oldoffice01->version = version;
15350
15351 oldoffice01->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15352 oldoffice01->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15353 oldoffice01->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15354 oldoffice01->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15355
15356 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
15357 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
15358 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
15359 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
15360
15361 oldoffice01->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15362 oldoffice01->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15363 oldoffice01->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15364 oldoffice01->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15365
15366 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
15367 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
15368 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
15369 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
15370
15371 oldoffice01->rc4key[1] = 0;
15372 oldoffice01->rc4key[0] = 0;
15373
15374 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
15375 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
15376 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
15377 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
15378 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
15379 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
15380 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
15381 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
15382 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
15383 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
15384
15385 oldoffice01->rc4key[0] = byte_swap_32 (oldoffice01->rc4key[0]);
15386 oldoffice01->rc4key[1] = byte_swap_32 (oldoffice01->rc4key[1]);
15387
15388 /**
15389 * salt
15390 */
15391
15392 salt->salt_len = 16;
15393
15394 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15395 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15396 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15397 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15398
15399 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15400 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15401 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15402 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15403
15404 // this is a workaround as office produces multiple documents with the same salt
15405
15406 salt->salt_len += 32;
15407
15408 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
15409 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
15410 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
15411 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
15412 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
15413 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
15414 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
15415 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
15416
15417 /**
15418 * digest
15419 */
15420
15421 digest[0] = oldoffice01->rc4key[0];
15422 digest[1] = oldoffice01->rc4key[1];
15423 digest[2] = 0;
15424 digest[3] = 0;
15425
15426 return (PARSER_OK);
15427 }
15428
15429 int oldoffice34_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15430 {
15431 if ((input_len < DISPLAY_LEN_MIN_9800) || (input_len > DISPLAY_LEN_MAX_9800)) return (PARSER_GLOBAL_LENGTH);
15432
15433 if ((memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE4, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15434
15435 u32 *digest = (u32 *) hash_buf->digest;
15436
15437 salt_t *salt = hash_buf->salt;
15438
15439 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
15440
15441 /**
15442 * parse line
15443 */
15444
15445 char *version_pos = input_buf + 11;
15446
15447 char *osalt_pos = strchr (version_pos, '*');
15448
15449 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15450
15451 u32 version_len = osalt_pos - version_pos;
15452
15453 if (version_len != 1) return (PARSER_SALT_LENGTH);
15454
15455 osalt_pos++;
15456
15457 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15458
15459 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15460
15461 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15462
15463 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15464
15465 encryptedVerifier_pos++;
15466
15467 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15468
15469 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15470
15471 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15472
15473 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15474
15475 encryptedVerifierHash_pos++;
15476
15477 u32 encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
15478
15479 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
15480
15481 const uint version = *version_pos - 0x30;
15482
15483 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
15484
15485 /**
15486 * esalt
15487 */
15488
15489 oldoffice34->version = version;
15490
15491 oldoffice34->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15492 oldoffice34->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15493 oldoffice34->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15494 oldoffice34->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15495
15496 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
15497 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
15498 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
15499 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
15500
15501 oldoffice34->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15502 oldoffice34->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15503 oldoffice34->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15504 oldoffice34->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15505 oldoffice34->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15506
15507 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
15508 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
15509 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
15510 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
15511 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
15512
15513 /**
15514 * salt
15515 */
15516
15517 salt->salt_len = 16;
15518
15519 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15520 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15521 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15522 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15523
15524 // this is a workaround as office produces multiple documents with the same salt
15525
15526 salt->salt_len += 32;
15527
15528 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
15529 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
15530 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
15531 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
15532 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
15533 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
15534 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
15535 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
15536
15537 /**
15538 * digest
15539 */
15540
15541 digest[0] = oldoffice34->encryptedVerifierHash[0];
15542 digest[1] = oldoffice34->encryptedVerifierHash[1];
15543 digest[2] = oldoffice34->encryptedVerifierHash[2];
15544 digest[3] = oldoffice34->encryptedVerifierHash[3];
15545
15546 return (PARSER_OK);
15547 }
15548
15549 int oldoffice34cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15550 {
15551 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
15552
15553 return oldoffice34_parse_hash (input_buf, input_len, hash_buf);
15554 }
15555
15556 int oldoffice34cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15557 {
15558 if ((input_len < DISPLAY_LEN_MIN_9820) || (input_len > DISPLAY_LEN_MAX_9820)) return (PARSER_GLOBAL_LENGTH);
15559
15560 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
15561
15562 u32 *digest = (u32 *) hash_buf->digest;
15563
15564 salt_t *salt = hash_buf->salt;
15565
15566 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
15567
15568 /**
15569 * parse line
15570 */
15571
15572 char *version_pos = input_buf + 11;
15573
15574 char *osalt_pos = strchr (version_pos, '*');
15575
15576 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15577
15578 u32 version_len = osalt_pos - version_pos;
15579
15580 if (version_len != 1) return (PARSER_SALT_LENGTH);
15581
15582 osalt_pos++;
15583
15584 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15585
15586 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15587
15588 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15589
15590 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15591
15592 encryptedVerifier_pos++;
15593
15594 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15595
15596 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15597
15598 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15599
15600 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15601
15602 encryptedVerifierHash_pos++;
15603
15604 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
15605
15606 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15607
15608 u32 encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
15609
15610 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
15611
15612 rc4key_pos++;
15613
15614 u32 rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
15615
15616 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
15617
15618 const uint version = *version_pos - 0x30;
15619
15620 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
15621
15622 /**
15623 * esalt
15624 */
15625
15626 oldoffice34->version = version;
15627
15628 oldoffice34->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15629 oldoffice34->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15630 oldoffice34->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15631 oldoffice34->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15632
15633 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
15634 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
15635 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
15636 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
15637
15638 oldoffice34->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15639 oldoffice34->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15640 oldoffice34->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15641 oldoffice34->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15642 oldoffice34->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15643
15644 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
15645 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
15646 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
15647 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
15648 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
15649
15650 oldoffice34->rc4key[1] = 0;
15651 oldoffice34->rc4key[0] = 0;
15652
15653 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
15654 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
15655 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
15656 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
15657 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
15658 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
15659 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
15660 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
15661 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
15662 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
15663
15664 oldoffice34->rc4key[0] = byte_swap_32 (oldoffice34->rc4key[0]);
15665 oldoffice34->rc4key[1] = byte_swap_32 (oldoffice34->rc4key[1]);
15666
15667 /**
15668 * salt
15669 */
15670
15671 salt->salt_len = 16;
15672
15673 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15674 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15675 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15676 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15677
15678 // this is a workaround as office produces multiple documents with the same salt
15679
15680 salt->salt_len += 32;
15681
15682 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
15683 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
15684 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
15685 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
15686 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
15687 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
15688 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
15689 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
15690
15691 /**
15692 * digest
15693 */
15694
15695 digest[0] = oldoffice34->rc4key[0];
15696 digest[1] = oldoffice34->rc4key[1];
15697 digest[2] = 0;
15698 digest[3] = 0;
15699
15700 return (PARSER_OK);
15701 }
15702
15703 int radmin2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15704 {
15705 if ((input_len < DISPLAY_LEN_MIN_9900) || (input_len > DISPLAY_LEN_MAX_9900)) return (PARSER_GLOBAL_LENGTH);
15706
15707 u32 *digest = (u32 *) hash_buf->digest;
15708
15709 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
15710 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
15711 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
15712 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
15713
15714 digest[0] = byte_swap_32 (digest[0]);
15715 digest[1] = byte_swap_32 (digest[1]);
15716 digest[2] = byte_swap_32 (digest[2]);
15717 digest[3] = byte_swap_32 (digest[3]);
15718
15719 return (PARSER_OK);
15720 }
15721
15722 int djangosha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15723 {
15724 if ((input_len < DISPLAY_LEN_MIN_124) || (input_len > DISPLAY_LEN_MAX_124)) return (PARSER_GLOBAL_LENGTH);
15725
15726 if ((memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5)) && (memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
15727
15728 u32 *digest = (u32 *) hash_buf->digest;
15729
15730 salt_t *salt = hash_buf->salt;
15731
15732 char *signature_pos = input_buf;
15733
15734 char *salt_pos = strchr (signature_pos, '$');
15735
15736 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15737
15738 u32 signature_len = salt_pos - signature_pos;
15739
15740 if (signature_len != 4) return (PARSER_SIGNATURE_UNMATCHED);
15741
15742 salt_pos++;
15743
15744 char *hash_pos = strchr (salt_pos, '$');
15745
15746 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15747
15748 u32 salt_len = hash_pos - salt_pos;
15749
15750 if (salt_len > 32) return (PARSER_SALT_LENGTH);
15751
15752 hash_pos++;
15753
15754 u32 hash_len = input_len - signature_len - 1 - salt_len - 1;
15755
15756 if (hash_len != 40) return (PARSER_SALT_LENGTH);
15757
15758 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
15759 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
15760 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
15761 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
15762 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
15763
15764 digest[0] -= SHA1M_A;
15765 digest[1] -= SHA1M_B;
15766 digest[2] -= SHA1M_C;
15767 digest[3] -= SHA1M_D;
15768 digest[4] -= SHA1M_E;
15769
15770 char *salt_buf_ptr = (char *) salt->salt_buf;
15771
15772 memcpy (salt_buf_ptr, salt_pos, salt_len);
15773
15774 salt->salt_len = salt_len;
15775
15776 return (PARSER_OK);
15777 }
15778
15779 int djangopbkdf2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15780 {
15781 if ((input_len < DISPLAY_LEN_MIN_10000) || (input_len > DISPLAY_LEN_MAX_10000)) return (PARSER_GLOBAL_LENGTH);
15782
15783 if (memcmp (SIGNATURE_DJANGOPBKDF2, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
15784
15785 u32 *digest = (u32 *) hash_buf->digest;
15786
15787 salt_t *salt = hash_buf->salt;
15788
15789 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
15790
15791 /**
15792 * parse line
15793 */
15794
15795 char *iter_pos = input_buf + 14;
15796
15797 const int iter = atoi (iter_pos);
15798
15799 if (iter < 1) return (PARSER_SALT_ITERATION);
15800
15801 salt->salt_iter = iter - 1;
15802
15803 char *salt_pos = strchr (iter_pos, '$');
15804
15805 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15806
15807 salt_pos++;
15808
15809 char *hash_pos = strchr (salt_pos, '$');
15810
15811 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15812
15813 const uint salt_len = hash_pos - salt_pos;
15814
15815 hash_pos++;
15816
15817 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
15818
15819 memcpy (salt_buf_ptr, salt_pos, salt_len);
15820
15821 salt->salt_len = salt_len;
15822
15823 salt_buf_ptr[salt_len + 3] = 0x01;
15824 salt_buf_ptr[salt_len + 4] = 0x80;
15825
15826 // add some stuff to normal salt to make sorted happy
15827
15828 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
15829 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
15830 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
15831 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
15832 salt->salt_buf[4] = salt->salt_iter;
15833
15834 // base64 decode hash
15835
15836 u8 tmp_buf[100] = { 0 };
15837
15838 uint hash_len = input_len - (hash_pos - input_buf);
15839
15840 if (hash_len != 44) return (PARSER_HASH_LENGTH);
15841
15842 base64_decode (base64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
15843
15844 memcpy (digest, tmp_buf, 32);
15845
15846 digest[0] = byte_swap_32 (digest[0]);
15847 digest[1] = byte_swap_32 (digest[1]);
15848 digest[2] = byte_swap_32 (digest[2]);
15849 digest[3] = byte_swap_32 (digest[3]);
15850 digest[4] = byte_swap_32 (digest[4]);
15851 digest[5] = byte_swap_32 (digest[5]);
15852 digest[6] = byte_swap_32 (digest[6]);
15853 digest[7] = byte_swap_32 (digest[7]);
15854
15855 return (PARSER_OK);
15856 }
15857
15858 int siphash_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15859 {
15860 if ((input_len < DISPLAY_LEN_MIN_10100) || (input_len > DISPLAY_LEN_MAX_10100)) return (PARSER_GLOBAL_LENGTH);
15861
15862 u32 *digest = (u32 *) hash_buf->digest;
15863
15864 salt_t *salt = hash_buf->salt;
15865
15866 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
15867 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
15868 digest[2] = 0;
15869 digest[3] = 0;
15870
15871 digest[0] = byte_swap_32 (digest[0]);
15872 digest[1] = byte_swap_32 (digest[1]);
15873
15874 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15875 if (input_buf[18] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15876 if (input_buf[20] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15877
15878 char iter_c = input_buf[17];
15879 char iter_d = input_buf[19];
15880
15881 // atm only defaults, let's see if there's more request
15882 if (iter_c != '2') return (PARSER_SALT_ITERATION);
15883 if (iter_d != '4') return (PARSER_SALT_ITERATION);
15884
15885 char *salt_buf = input_buf + 16 + 1 + 1 + 1 + 1 + 1;
15886
15887 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
15888 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
15889 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
15890 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf[24]);
15891
15892 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15893 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15894 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15895 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15896
15897 salt->salt_len = 16;
15898
15899 return (PARSER_OK);
15900 }
15901
15902 int crammd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15903 {
15904 if ((input_len < DISPLAY_LEN_MIN_10200) || (input_len > DISPLAY_LEN_MAX_10200)) return (PARSER_GLOBAL_LENGTH);
15905
15906 if (memcmp (SIGNATURE_CRAM_MD5, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
15907
15908 u32 *digest = (u32 *) hash_buf->digest;
15909
15910 cram_md5_t *cram_md5 = (cram_md5_t *) hash_buf->esalt;
15911
15912 salt_t *salt = hash_buf->salt;
15913
15914 char *salt_pos = input_buf + 10;
15915
15916 char *hash_pos = strchr (salt_pos, '$');
15917
15918 uint salt_len = hash_pos - salt_pos;
15919
15920 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15921
15922 hash_pos++;
15923
15924 uint hash_len = input_len - 10 - salt_len - 1;
15925
15926 // base64 decode salt
15927
15928 u8 tmp_buf[100] = { 0 };
15929
15930 salt_len = base64_decode (base64_to_int, (const u8 *) salt_pos, salt_len, tmp_buf);
15931
15932 if (salt_len > 55) return (PARSER_SALT_LENGTH);
15933
15934 tmp_buf[salt_len] = 0x80;
15935
15936 memcpy (&salt->salt_buf, tmp_buf, salt_len + 1);
15937
15938 salt->salt_len = salt_len;
15939
15940 // base64 decode salt
15941
15942 memset (tmp_buf, 0, sizeof (tmp_buf));
15943
15944 hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
15945
15946 uint user_len = hash_len - 32;
15947
15948 const u8 *tmp_hash = tmp_buf + user_len;
15949
15950 user_len--; // skip the trailing space
15951
15952 digest[0] = hex_to_u32 (&tmp_hash[ 0]);
15953 digest[1] = hex_to_u32 (&tmp_hash[ 8]);
15954 digest[2] = hex_to_u32 (&tmp_hash[16]);
15955 digest[3] = hex_to_u32 (&tmp_hash[24]);
15956
15957 digest[0] = byte_swap_32 (digest[0]);
15958 digest[1] = byte_swap_32 (digest[1]);
15959 digest[2] = byte_swap_32 (digest[2]);
15960 digest[3] = byte_swap_32 (digest[3]);
15961
15962 // store username for host only (output hash if cracked)
15963
15964 memset (cram_md5->user, 0, sizeof (cram_md5->user));
15965 memcpy (cram_md5->user, tmp_buf, user_len);
15966
15967 return (PARSER_OK);
15968 }
15969
15970 int saph_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15971 {
15972 if ((input_len < DISPLAY_LEN_MIN_10300) || (input_len > DISPLAY_LEN_MAX_10300)) return (PARSER_GLOBAL_LENGTH);
15973
15974 if (memcmp (SIGNATURE_SAPH_SHA1, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
15975
15976 u32 *digest = (u32 *) hash_buf->digest;
15977
15978 salt_t *salt = hash_buf->salt;
15979
15980 char *iter_pos = input_buf + 10;
15981
15982 u32 iter = atoi (iter_pos);
15983
15984 if (iter < 1)
15985 {
15986 return (PARSER_SALT_ITERATION);
15987 }
15988
15989 iter--; // first iteration is special
15990
15991 salt->salt_iter = iter;
15992
15993 char *base64_pos = strchr (iter_pos, '}');
15994
15995 if (base64_pos == NULL)
15996 {
15997 return (PARSER_SIGNATURE_UNMATCHED);
15998 }
15999
16000 base64_pos++;
16001
16002 // base64 decode salt
16003
16004 u32 base64_len = input_len - (base64_pos - input_buf);
16005
16006 u8 tmp_buf[100] = { 0 };
16007
16008 u32 decoded_len = base64_decode (base64_to_int, (const u8 *) base64_pos, base64_len, tmp_buf);
16009
16010 if (decoded_len < 24)
16011 {
16012 return (PARSER_SALT_LENGTH);
16013 }
16014
16015 // copy the salt
16016
16017 uint salt_len = decoded_len - 20;
16018
16019 if (salt_len < 4) return (PARSER_SALT_LENGTH);
16020 if (salt_len > 16) return (PARSER_SALT_LENGTH);
16021
16022 memcpy (&salt->salt_buf, tmp_buf + 20, salt_len);
16023
16024 salt->salt_len = salt_len;
16025
16026 // set digest
16027
16028 u32 *digest_ptr = (u32*) tmp_buf;
16029
16030 digest[0] = byte_swap_32 (digest_ptr[0]);
16031 digest[1] = byte_swap_32 (digest_ptr[1]);
16032 digest[2] = byte_swap_32 (digest_ptr[2]);
16033 digest[3] = byte_swap_32 (digest_ptr[3]);
16034 digest[4] = byte_swap_32 (digest_ptr[4]);
16035
16036 return (PARSER_OK);
16037 }
16038
16039 int redmine_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16040 {
16041 if ((input_len < DISPLAY_LEN_MIN_7600) || (input_len > DISPLAY_LEN_MAX_7600)) return (PARSER_GLOBAL_LENGTH);
16042
16043 u32 *digest = (u32 *) hash_buf->digest;
16044
16045 salt_t *salt = hash_buf->salt;
16046
16047 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
16048 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
16049 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
16050 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
16051 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
16052
16053 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16054
16055 uint salt_len = input_len - 40 - 1;
16056
16057 char *salt_buf = input_buf + 40 + 1;
16058
16059 char *salt_buf_ptr = (char *) salt->salt_buf;
16060
16061 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
16062
16063 if (salt_len != 32) return (PARSER_SALT_LENGTH);
16064
16065 salt->salt_len = salt_len;
16066
16067 return (PARSER_OK);
16068 }
16069
16070 int pdf11_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16071 {
16072 if ((input_len < DISPLAY_LEN_MIN_10400) || (input_len > DISPLAY_LEN_MAX_10400)) return (PARSER_GLOBAL_LENGTH);
16073
16074 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16075
16076 u32 *digest = (u32 *) hash_buf->digest;
16077
16078 salt_t *salt = hash_buf->salt;
16079
16080 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16081
16082 /**
16083 * parse line
16084 */
16085
16086 char *V_pos = input_buf + 5;
16087
16088 char *R_pos = strchr (V_pos, '*');
16089
16090 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16091
16092 u32 V_len = R_pos - V_pos;
16093
16094 R_pos++;
16095
16096 char *bits_pos = strchr (R_pos, '*');
16097
16098 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16099
16100 u32 R_len = bits_pos - R_pos;
16101
16102 bits_pos++;
16103
16104 char *P_pos = strchr (bits_pos, '*');
16105
16106 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16107
16108 u32 bits_len = P_pos - bits_pos;
16109
16110 P_pos++;
16111
16112 char *enc_md_pos = strchr (P_pos, '*');
16113
16114 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16115
16116 u32 P_len = enc_md_pos - P_pos;
16117
16118 enc_md_pos++;
16119
16120 char *id_len_pos = strchr (enc_md_pos, '*');
16121
16122 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16123
16124 u32 enc_md_len = id_len_pos - enc_md_pos;
16125
16126 id_len_pos++;
16127
16128 char *id_buf_pos = strchr (id_len_pos, '*');
16129
16130 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16131
16132 u32 id_len_len = id_buf_pos - id_len_pos;
16133
16134 id_buf_pos++;
16135
16136 char *u_len_pos = strchr (id_buf_pos, '*');
16137
16138 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16139
16140 u32 id_buf_len = u_len_pos - id_buf_pos;
16141
16142 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
16143
16144 u_len_pos++;
16145
16146 char *u_buf_pos = strchr (u_len_pos, '*');
16147
16148 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16149
16150 u32 u_len_len = u_buf_pos - u_len_pos;
16151
16152 u_buf_pos++;
16153
16154 char *o_len_pos = strchr (u_buf_pos, '*');
16155
16156 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16157
16158 u32 u_buf_len = o_len_pos - u_buf_pos;
16159
16160 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16161
16162 o_len_pos++;
16163
16164 char *o_buf_pos = strchr (o_len_pos, '*');
16165
16166 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16167
16168 u32 o_len_len = o_buf_pos - o_len_pos;
16169
16170 o_buf_pos++;
16171
16172 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;
16173
16174 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16175
16176 // validate data
16177
16178 const int V = atoi (V_pos);
16179 const int R = atoi (R_pos);
16180 const int P = atoi (P_pos);
16181
16182 if (V != 1) return (PARSER_SALT_VALUE);
16183 if (R != 2) return (PARSER_SALT_VALUE);
16184
16185 const int enc_md = atoi (enc_md_pos);
16186
16187 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
16188
16189 const int id_len = atoi (id_len_pos);
16190 const int u_len = atoi (u_len_pos);
16191 const int o_len = atoi (o_len_pos);
16192
16193 if (id_len != 16) return (PARSER_SALT_VALUE);
16194 if (u_len != 32) return (PARSER_SALT_VALUE);
16195 if (o_len != 32) return (PARSER_SALT_VALUE);
16196
16197 const int bits = atoi (bits_pos);
16198
16199 if (bits != 40) return (PARSER_SALT_VALUE);
16200
16201 // copy data to esalt
16202
16203 pdf->V = V;
16204 pdf->R = R;
16205 pdf->P = P;
16206
16207 pdf->enc_md = enc_md;
16208
16209 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
16210 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
16211 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
16212 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
16213 pdf->id_len = id_len;
16214
16215 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
16216 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
16217 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
16218 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
16219 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
16220 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
16221 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
16222 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
16223 pdf->u_len = u_len;
16224
16225 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
16226 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
16227 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
16228 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
16229 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
16230 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
16231 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
16232 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
16233 pdf->o_len = o_len;
16234
16235 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16236 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16237 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16238 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16239
16240 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16241 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16242 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16243 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16244 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16245 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16246 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16247 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16248
16249 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16250 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16251 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16252 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16253 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16254 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16255 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16256 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16257
16258 // we use ID for salt, maybe needs to change, we will see...
16259
16260 salt->salt_buf[0] = pdf->id_buf[0];
16261 salt->salt_buf[1] = pdf->id_buf[1];
16262 salt->salt_buf[2] = pdf->id_buf[2];
16263 salt->salt_buf[3] = pdf->id_buf[3];
16264 salt->salt_len = pdf->id_len;
16265
16266 digest[0] = pdf->u_buf[0];
16267 digest[1] = pdf->u_buf[1];
16268 digest[2] = pdf->u_buf[2];
16269 digest[3] = pdf->u_buf[3];
16270
16271 return (PARSER_OK);
16272 }
16273
16274 int pdf11cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16275 {
16276 return pdf11_parse_hash (input_buf, input_len, hash_buf);
16277 }
16278
16279 int pdf11cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16280 {
16281 if ((input_len < DISPLAY_LEN_MIN_10420) || (input_len > DISPLAY_LEN_MAX_10420)) return (PARSER_GLOBAL_LENGTH);
16282
16283 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16284
16285 u32 *digest = (u32 *) hash_buf->digest;
16286
16287 salt_t *salt = hash_buf->salt;
16288
16289 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16290
16291 /**
16292 * parse line
16293 */
16294
16295 char *V_pos = input_buf + 5;
16296
16297 char *R_pos = strchr (V_pos, '*');
16298
16299 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16300
16301 u32 V_len = R_pos - V_pos;
16302
16303 R_pos++;
16304
16305 char *bits_pos = strchr (R_pos, '*');
16306
16307 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16308
16309 u32 R_len = bits_pos - R_pos;
16310
16311 bits_pos++;
16312
16313 char *P_pos = strchr (bits_pos, '*');
16314
16315 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16316
16317 u32 bits_len = P_pos - bits_pos;
16318
16319 P_pos++;
16320
16321 char *enc_md_pos = strchr (P_pos, '*');
16322
16323 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16324
16325 u32 P_len = enc_md_pos - P_pos;
16326
16327 enc_md_pos++;
16328
16329 char *id_len_pos = strchr (enc_md_pos, '*');
16330
16331 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16332
16333 u32 enc_md_len = id_len_pos - enc_md_pos;
16334
16335 id_len_pos++;
16336
16337 char *id_buf_pos = strchr (id_len_pos, '*');
16338
16339 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16340
16341 u32 id_len_len = id_buf_pos - id_len_pos;
16342
16343 id_buf_pos++;
16344
16345 char *u_len_pos = strchr (id_buf_pos, '*');
16346
16347 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16348
16349 u32 id_buf_len = u_len_pos - id_buf_pos;
16350
16351 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
16352
16353 u_len_pos++;
16354
16355 char *u_buf_pos = strchr (u_len_pos, '*');
16356
16357 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16358
16359 u32 u_len_len = u_buf_pos - u_len_pos;
16360
16361 u_buf_pos++;
16362
16363 char *o_len_pos = strchr (u_buf_pos, '*');
16364
16365 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16366
16367 u32 u_buf_len = o_len_pos - u_buf_pos;
16368
16369 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16370
16371 o_len_pos++;
16372
16373 char *o_buf_pos = strchr (o_len_pos, '*');
16374
16375 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16376
16377 u32 o_len_len = o_buf_pos - o_len_pos;
16378
16379 o_buf_pos++;
16380
16381 char *rc4key_pos = strchr (o_buf_pos, ':');
16382
16383 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16384
16385 u32 o_buf_len = rc4key_pos - o_buf_pos;
16386
16387 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16388
16389 rc4key_pos++;
16390
16391 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;
16392
16393 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
16394
16395 // validate data
16396
16397 const int V = atoi (V_pos);
16398 const int R = atoi (R_pos);
16399 const int P = atoi (P_pos);
16400
16401 if (V != 1) return (PARSER_SALT_VALUE);
16402 if (R != 2) return (PARSER_SALT_VALUE);
16403
16404 const int enc_md = atoi (enc_md_pos);
16405
16406 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
16407
16408 const int id_len = atoi (id_len_pos);
16409 const int u_len = atoi (u_len_pos);
16410 const int o_len = atoi (o_len_pos);
16411
16412 if (id_len != 16) return (PARSER_SALT_VALUE);
16413 if (u_len != 32) return (PARSER_SALT_VALUE);
16414 if (o_len != 32) return (PARSER_SALT_VALUE);
16415
16416 const int bits = atoi (bits_pos);
16417
16418 if (bits != 40) return (PARSER_SALT_VALUE);
16419
16420 // copy data to esalt
16421
16422 pdf->V = V;
16423 pdf->R = R;
16424 pdf->P = P;
16425
16426 pdf->enc_md = enc_md;
16427
16428 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
16429 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
16430 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
16431 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
16432 pdf->id_len = id_len;
16433
16434 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
16435 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
16436 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
16437 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
16438 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
16439 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
16440 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
16441 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
16442 pdf->u_len = u_len;
16443
16444 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
16445 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
16446 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
16447 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
16448 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
16449 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
16450 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
16451 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
16452 pdf->o_len = o_len;
16453
16454 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16455 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16456 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16457 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16458
16459 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16460 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16461 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16462 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16463 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16464 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16465 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16466 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16467
16468 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16469 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16470 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16471 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16472 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16473 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16474 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16475 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16476
16477 pdf->rc4key[1] = 0;
16478 pdf->rc4key[0] = 0;
16479
16480 pdf->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
16481 pdf->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
16482 pdf->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
16483 pdf->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
16484 pdf->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
16485 pdf->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
16486 pdf->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
16487 pdf->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
16488 pdf->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
16489 pdf->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
16490
16491 pdf->rc4key[0] = byte_swap_32 (pdf->rc4key[0]);
16492 pdf->rc4key[1] = byte_swap_32 (pdf->rc4key[1]);
16493
16494 // we use ID for salt, maybe needs to change, we will see...
16495
16496 salt->salt_buf[0] = pdf->id_buf[0];
16497 salt->salt_buf[1] = pdf->id_buf[1];
16498 salt->salt_buf[2] = pdf->id_buf[2];
16499 salt->salt_buf[3] = pdf->id_buf[3];
16500 salt->salt_buf[4] = pdf->u_buf[0];
16501 salt->salt_buf[5] = pdf->u_buf[1];
16502 salt->salt_buf[6] = pdf->o_buf[0];
16503 salt->salt_buf[7] = pdf->o_buf[1];
16504 salt->salt_len = pdf->id_len + 16;
16505
16506 digest[0] = pdf->rc4key[0];
16507 digest[1] = pdf->rc4key[1];
16508 digest[2] = 0;
16509 digest[3] = 0;
16510
16511 return (PARSER_OK);
16512 }
16513
16514 int pdf14_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16515 {
16516 if ((input_len < DISPLAY_LEN_MIN_10500) || (input_len > DISPLAY_LEN_MAX_10500)) return (PARSER_GLOBAL_LENGTH);
16517
16518 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16519
16520 u32 *digest = (u32 *) hash_buf->digest;
16521
16522 salt_t *salt = hash_buf->salt;
16523
16524 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16525
16526 /**
16527 * parse line
16528 */
16529
16530 char *V_pos = input_buf + 5;
16531
16532 char *R_pos = strchr (V_pos, '*');
16533
16534 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16535
16536 u32 V_len = R_pos - V_pos;
16537
16538 R_pos++;
16539
16540 char *bits_pos = strchr (R_pos, '*');
16541
16542 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16543
16544 u32 R_len = bits_pos - R_pos;
16545
16546 bits_pos++;
16547
16548 char *P_pos = strchr (bits_pos, '*');
16549
16550 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16551
16552 u32 bits_len = P_pos - bits_pos;
16553
16554 P_pos++;
16555
16556 char *enc_md_pos = strchr (P_pos, '*');
16557
16558 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16559
16560 u32 P_len = enc_md_pos - P_pos;
16561
16562 enc_md_pos++;
16563
16564 char *id_len_pos = strchr (enc_md_pos, '*');
16565
16566 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16567
16568 u32 enc_md_len = id_len_pos - enc_md_pos;
16569
16570 id_len_pos++;
16571
16572 char *id_buf_pos = strchr (id_len_pos, '*');
16573
16574 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16575
16576 u32 id_len_len = id_buf_pos - id_len_pos;
16577
16578 id_buf_pos++;
16579
16580 char *u_len_pos = strchr (id_buf_pos, '*');
16581
16582 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16583
16584 u32 id_buf_len = u_len_pos - id_buf_pos;
16585
16586 if ((id_buf_len != 32) && (id_buf_len != 64)) return (PARSER_SALT_LENGTH);
16587
16588 u_len_pos++;
16589
16590 char *u_buf_pos = strchr (u_len_pos, '*');
16591
16592 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16593
16594 u32 u_len_len = u_buf_pos - u_len_pos;
16595
16596 u_buf_pos++;
16597
16598 char *o_len_pos = strchr (u_buf_pos, '*');
16599
16600 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16601
16602 u32 u_buf_len = o_len_pos - u_buf_pos;
16603
16604 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16605
16606 o_len_pos++;
16607
16608 char *o_buf_pos = strchr (o_len_pos, '*');
16609
16610 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16611
16612 u32 o_len_len = o_buf_pos - o_len_pos;
16613
16614 o_buf_pos++;
16615
16616 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;
16617
16618 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16619
16620 // validate data
16621
16622 const int V = atoi (V_pos);
16623 const int R = atoi (R_pos);
16624 const int P = atoi (P_pos);
16625
16626 int vr_ok = 0;
16627
16628 if ((V == 2) && (R == 3)) vr_ok = 1;
16629 if ((V == 4) && (R == 4)) vr_ok = 1;
16630
16631 if (vr_ok == 0) return (PARSER_SALT_VALUE);
16632
16633 const int id_len = atoi (id_len_pos);
16634 const int u_len = atoi (u_len_pos);
16635 const int o_len = atoi (o_len_pos);
16636
16637 if ((id_len != 16) && (id_len != 32)) return (PARSER_SALT_VALUE);
16638
16639 if (u_len != 32) return (PARSER_SALT_VALUE);
16640 if (o_len != 32) return (PARSER_SALT_VALUE);
16641
16642 const int bits = atoi (bits_pos);
16643
16644 if (bits != 128) return (PARSER_SALT_VALUE);
16645
16646 int enc_md = 1;
16647
16648 if (R >= 4)
16649 {
16650 enc_md = atoi (enc_md_pos);
16651 }
16652
16653 // copy data to esalt
16654
16655 pdf->V = V;
16656 pdf->R = R;
16657 pdf->P = P;
16658
16659 pdf->enc_md = enc_md;
16660
16661 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
16662 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
16663 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
16664 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
16665
16666 if (id_len == 32)
16667 {
16668 pdf->id_buf[4] = hex_to_u32 ((const u8 *) &id_buf_pos[32]);
16669 pdf->id_buf[5] = hex_to_u32 ((const u8 *) &id_buf_pos[40]);
16670 pdf->id_buf[6] = hex_to_u32 ((const u8 *) &id_buf_pos[48]);
16671 pdf->id_buf[7] = hex_to_u32 ((const u8 *) &id_buf_pos[56]);
16672 }
16673
16674 pdf->id_len = id_len;
16675
16676 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
16677 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
16678 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
16679 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
16680 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
16681 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
16682 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
16683 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
16684 pdf->u_len = u_len;
16685
16686 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
16687 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
16688 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
16689 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
16690 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
16691 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
16692 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
16693 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
16694 pdf->o_len = o_len;
16695
16696 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16697 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16698 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16699 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16700
16701 if (id_len == 32)
16702 {
16703 pdf->id_buf[4] = byte_swap_32 (pdf->id_buf[4]);
16704 pdf->id_buf[5] = byte_swap_32 (pdf->id_buf[5]);
16705 pdf->id_buf[6] = byte_swap_32 (pdf->id_buf[6]);
16706 pdf->id_buf[7] = byte_swap_32 (pdf->id_buf[7]);
16707 }
16708
16709 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16710 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16711 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16712 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16713 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16714 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16715 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16716 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16717
16718 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16719 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16720 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16721 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16722 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16723 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16724 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16725 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16726
16727 // precompute rc4 data for later use
16728
16729 uint padding[8] =
16730 {
16731 0x5e4ebf28,
16732 0x418a754e,
16733 0x564e0064,
16734 0x0801faff,
16735 0xb6002e2e,
16736 0x803e68d0,
16737 0xfea90c2f,
16738 0x7a695364
16739 };
16740
16741 // md5
16742
16743 uint salt_pc_block[32] = { 0 };
16744
16745 char *salt_pc_ptr = (char *) salt_pc_block;
16746
16747 memcpy (salt_pc_ptr, padding, 32);
16748 memcpy (salt_pc_ptr + 32, pdf->id_buf, pdf->id_len);
16749
16750 uint salt_pc_digest[4] = { 0 };
16751
16752 md5_complete_no_limit (salt_pc_digest, salt_pc_block, 32 + pdf->id_len);
16753
16754 pdf->rc4data[0] = salt_pc_digest[0];
16755 pdf->rc4data[1] = salt_pc_digest[1];
16756
16757 // we use ID for salt, maybe needs to change, we will see...
16758
16759 salt->salt_buf[0] = pdf->id_buf[0];
16760 salt->salt_buf[1] = pdf->id_buf[1];
16761 salt->salt_buf[2] = pdf->id_buf[2];
16762 salt->salt_buf[3] = pdf->id_buf[3];
16763 salt->salt_buf[4] = pdf->u_buf[0];
16764 salt->salt_buf[5] = pdf->u_buf[1];
16765 salt->salt_buf[6] = pdf->o_buf[0];
16766 salt->salt_buf[7] = pdf->o_buf[1];
16767 salt->salt_len = pdf->id_len + 16;
16768
16769 salt->salt_iter = ROUNDS_PDF14;
16770
16771 digest[0] = pdf->u_buf[0];
16772 digest[1] = pdf->u_buf[1];
16773 digest[2] = 0;
16774 digest[3] = 0;
16775
16776 return (PARSER_OK);
16777 }
16778
16779 int pdf17l3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16780 {
16781 int ret = pdf17l8_parse_hash (input_buf, input_len, hash_buf);
16782
16783 if (ret != PARSER_OK)
16784 {
16785 return ret;
16786 }
16787
16788 u32 *digest = (u32 *) hash_buf->digest;
16789
16790 salt_t *salt = hash_buf->salt;
16791
16792 digest[0] -= SHA256M_A;
16793 digest[1] -= SHA256M_B;
16794 digest[2] -= SHA256M_C;
16795 digest[3] -= SHA256M_D;
16796 digest[4] -= SHA256M_E;
16797 digest[5] -= SHA256M_F;
16798 digest[6] -= SHA256M_G;
16799 digest[7] -= SHA256M_H;
16800
16801 salt->salt_buf[2] = 0x80;
16802
16803 return (PARSER_OK);
16804 }
16805
16806 int pdf17l8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16807 {
16808 if ((input_len < DISPLAY_LEN_MIN_10600) || (input_len > DISPLAY_LEN_MAX_10600)) return (PARSER_GLOBAL_LENGTH);
16809
16810 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16811
16812 u32 *digest = (u32 *) hash_buf->digest;
16813
16814 salt_t *salt = hash_buf->salt;
16815
16816 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16817
16818 /**
16819 * parse line
16820 */
16821
16822 char *V_pos = input_buf + 5;
16823
16824 char *R_pos = strchr (V_pos, '*');
16825
16826 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16827
16828 u32 V_len = R_pos - V_pos;
16829
16830 R_pos++;
16831
16832 char *bits_pos = strchr (R_pos, '*');
16833
16834 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16835
16836 u32 R_len = bits_pos - R_pos;
16837
16838 bits_pos++;
16839
16840 char *P_pos = strchr (bits_pos, '*');
16841
16842 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16843
16844 u32 bits_len = P_pos - bits_pos;
16845
16846 P_pos++;
16847
16848 char *enc_md_pos = strchr (P_pos, '*');
16849
16850 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16851
16852 u32 P_len = enc_md_pos - P_pos;
16853
16854 enc_md_pos++;
16855
16856 char *id_len_pos = strchr (enc_md_pos, '*');
16857
16858 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16859
16860 u32 enc_md_len = id_len_pos - enc_md_pos;
16861
16862 id_len_pos++;
16863
16864 char *id_buf_pos = strchr (id_len_pos, '*');
16865
16866 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16867
16868 u32 id_len_len = id_buf_pos - id_len_pos;
16869
16870 id_buf_pos++;
16871
16872 char *u_len_pos = strchr (id_buf_pos, '*');
16873
16874 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16875
16876 u32 id_buf_len = u_len_pos - id_buf_pos;
16877
16878 u_len_pos++;
16879
16880 char *u_buf_pos = strchr (u_len_pos, '*');
16881
16882 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16883
16884 u32 u_len_len = u_buf_pos - u_len_pos;
16885
16886 u_buf_pos++;
16887
16888 char *o_len_pos = strchr (u_buf_pos, '*');
16889
16890 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16891
16892 u32 u_buf_len = o_len_pos - u_buf_pos;
16893
16894 o_len_pos++;
16895
16896 char *o_buf_pos = strchr (o_len_pos, '*');
16897
16898 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16899
16900 u32 o_len_len = o_buf_pos - o_len_pos;
16901
16902 o_buf_pos++;
16903
16904 char *last = strchr (o_buf_pos, '*');
16905
16906 if (last == NULL) last = input_buf + input_len;
16907
16908 u32 o_buf_len = last - o_buf_pos;
16909
16910 // validate data
16911
16912 const int V = atoi (V_pos);
16913 const int R = atoi (R_pos);
16914
16915 int vr_ok = 0;
16916
16917 if ((V == 5) && (R == 5)) vr_ok = 1;
16918 if ((V == 5) && (R == 6)) vr_ok = 1;
16919
16920 if (vr_ok == 0) return (PARSER_SALT_VALUE);
16921
16922 const int bits = atoi (bits_pos);
16923
16924 if (bits != 256) return (PARSER_SALT_VALUE);
16925
16926 int enc_md = atoi (enc_md_pos);
16927
16928 if (enc_md != 1) return (PARSER_SALT_VALUE);
16929
16930 const uint id_len = atoi (id_len_pos);
16931 const uint u_len = atoi (u_len_pos);
16932 const uint o_len = atoi (o_len_pos);
16933
16934 if (V_len > 6) return (PARSER_SALT_LENGTH);
16935 if (R_len > 6) return (PARSER_SALT_LENGTH);
16936 if (P_len > 6) return (PARSER_SALT_LENGTH);
16937 if (id_len_len > 6) return (PARSER_SALT_LENGTH);
16938 if (u_len_len > 6) return (PARSER_SALT_LENGTH);
16939 if (o_len_len > 6) return (PARSER_SALT_LENGTH);
16940 if (bits_len > 6) return (PARSER_SALT_LENGTH);
16941 if (enc_md_len > 6) return (PARSER_SALT_LENGTH);
16942
16943 if ((id_len * 2) != id_buf_len) return (PARSER_SALT_VALUE);
16944 if ((u_len * 2) != u_buf_len) return (PARSER_SALT_VALUE);
16945 if ((o_len * 2) != o_buf_len) return (PARSER_SALT_VALUE);
16946
16947 // copy data to esalt
16948
16949 if (u_len < 40) return (PARSER_SALT_VALUE);
16950
16951 for (int i = 0, j = 0; i < 8 + 2; i += 1, j += 8)
16952 {
16953 pdf->u_buf[i] = hex_to_u32 ((const u8 *) &u_buf_pos[j]);
16954 }
16955
16956 salt->salt_buf[0] = pdf->u_buf[8];
16957 salt->salt_buf[1] = pdf->u_buf[9];
16958
16959 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
16960 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
16961
16962 salt->salt_len = 8;
16963 salt->salt_iter = ROUNDS_PDF17L8;
16964
16965 digest[0] = pdf->u_buf[0];
16966 digest[1] = pdf->u_buf[1];
16967 digest[2] = pdf->u_buf[2];
16968 digest[3] = pdf->u_buf[3];
16969 digest[4] = pdf->u_buf[4];
16970 digest[5] = pdf->u_buf[5];
16971 digest[6] = pdf->u_buf[6];
16972 digest[7] = pdf->u_buf[7];
16973
16974 return (PARSER_OK);
16975 }
16976
16977 int pbkdf2_sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16978 {
16979 if ((input_len < DISPLAY_LEN_MIN_10900) || (input_len > DISPLAY_LEN_MAX_10900)) return (PARSER_GLOBAL_LENGTH);
16980
16981 if (memcmp (SIGNATURE_PBKDF2_SHA256, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
16982
16983 u32 *digest = (u32 *) hash_buf->digest;
16984
16985 salt_t *salt = hash_buf->salt;
16986
16987 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
16988
16989 /**
16990 * parse line
16991 */
16992
16993 // iterations
16994
16995 char *iter_pos = input_buf + 7;
16996
16997 u32 iter = atoi (iter_pos);
16998
16999 if (iter < 1) return (PARSER_SALT_ITERATION);
17000 if (iter > 999999) return (PARSER_SALT_ITERATION);
17001
17002 // first is *raw* salt
17003
17004 char *salt_pos = strchr (iter_pos, ':');
17005
17006 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17007
17008 salt_pos++;
17009
17010 char *hash_pos = strchr (salt_pos, ':');
17011
17012 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17013
17014 u32 salt_len = hash_pos - salt_pos;
17015
17016 if (salt_len > 64) return (PARSER_SALT_LENGTH);
17017
17018 hash_pos++;
17019
17020 u32 hash_b64_len = input_len - (hash_pos - input_buf);
17021
17022 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
17023
17024 // decode salt
17025
17026 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
17027
17028 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
17029
17030 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17031
17032 salt_buf_ptr[salt_len + 3] = 0x01;
17033 salt_buf_ptr[salt_len + 4] = 0x80;
17034
17035 salt->salt_len = salt_len;
17036 salt->salt_iter = iter - 1;
17037
17038 // decode hash
17039
17040 u8 tmp_buf[100] = { 0 };
17041
17042 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
17043
17044 if (hash_len < 16) return (PARSER_HASH_LENGTH);
17045
17046 memcpy (digest, tmp_buf, 16);
17047
17048 digest[0] = byte_swap_32 (digest[0]);
17049 digest[1] = byte_swap_32 (digest[1]);
17050 digest[2] = byte_swap_32 (digest[2]);
17051 digest[3] = byte_swap_32 (digest[3]);
17052
17053 // add some stuff to normal salt to make sorted happy
17054
17055 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
17056 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
17057 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
17058 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
17059 salt->salt_buf[4] = salt->salt_iter;
17060
17061 return (PARSER_OK);
17062 }
17063
17064 int prestashop_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17065 {
17066 if ((input_len < DISPLAY_LEN_MIN_11000) || (input_len > DISPLAY_LEN_MAX_11000)) return (PARSER_GLOBAL_LENGTH);
17067
17068 u32 *digest = (u32 *) hash_buf->digest;
17069
17070 salt_t *salt = hash_buf->salt;
17071
17072 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
17073 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
17074 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
17075 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
17076
17077 digest[0] = byte_swap_32 (digest[0]);
17078 digest[1] = byte_swap_32 (digest[1]);
17079 digest[2] = byte_swap_32 (digest[2]);
17080 digest[3] = byte_swap_32 (digest[3]);
17081
17082 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
17083
17084 uint salt_len = input_len - 32 - 1;
17085
17086 char *salt_buf = input_buf + 32 + 1;
17087
17088 char *salt_buf_ptr = (char *) salt->salt_buf;
17089
17090 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
17091
17092 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17093
17094 salt->salt_len = salt_len;
17095
17096 return (PARSER_OK);
17097 }
17098
17099 int postgresql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17100 {
17101 if ((input_len < DISPLAY_LEN_MIN_11100) || (input_len > DISPLAY_LEN_MAX_11100)) return (PARSER_GLOBAL_LENGTH);
17102
17103 if (memcmp (SIGNATURE_POSTGRESQL_AUTH, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
17104
17105 u32 *digest = (u32 *) hash_buf->digest;
17106
17107 salt_t *salt = hash_buf->salt;
17108
17109 char *user_pos = input_buf + 10;
17110
17111 char *salt_pos = strchr (user_pos, '*');
17112
17113 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17114
17115 salt_pos++;
17116
17117 char *hash_pos = strchr (salt_pos, '*');
17118
17119 hash_pos++;
17120
17121 uint hash_len = input_len - (hash_pos - input_buf);
17122
17123 if (hash_len != 32) return (PARSER_HASH_LENGTH);
17124
17125 uint user_len = salt_pos - user_pos - 1;
17126
17127 uint salt_len = hash_pos - salt_pos - 1;
17128
17129 if (salt_len != 8) return (PARSER_SALT_LENGTH);
17130
17131 /*
17132 * store digest
17133 */
17134
17135 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
17136 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
17137 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
17138 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
17139
17140 digest[0] = byte_swap_32 (digest[0]);
17141 digest[1] = byte_swap_32 (digest[1]);
17142 digest[2] = byte_swap_32 (digest[2]);
17143 digest[3] = byte_swap_32 (digest[3]);
17144
17145 digest[0] -= MD5M_A;
17146 digest[1] -= MD5M_B;
17147 digest[2] -= MD5M_C;
17148 digest[3] -= MD5M_D;
17149
17150 /*
17151 * store salt
17152 */
17153
17154 char *salt_buf_ptr = (char *) salt->salt_buf;
17155
17156 // first 4 bytes are the "challenge"
17157
17158 salt_buf_ptr[0] = hex_to_u8 ((const u8 *) &salt_pos[0]);
17159 salt_buf_ptr[1] = hex_to_u8 ((const u8 *) &salt_pos[2]);
17160 salt_buf_ptr[2] = hex_to_u8 ((const u8 *) &salt_pos[4]);
17161 salt_buf_ptr[3] = hex_to_u8 ((const u8 *) &salt_pos[6]);
17162
17163 // append the user name
17164
17165 user_len = parse_and_store_salt (salt_buf_ptr + 4, user_pos, user_len);
17166
17167 salt->salt_len = 4 + user_len;
17168
17169 return (PARSER_OK);
17170 }
17171
17172 int mysql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17173 {
17174 if ((input_len < DISPLAY_LEN_MIN_11200) || (input_len > DISPLAY_LEN_MAX_11200)) return (PARSER_GLOBAL_LENGTH);
17175
17176 if (memcmp (SIGNATURE_MYSQL_AUTH, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
17177
17178 u32 *digest = (u32 *) hash_buf->digest;
17179
17180 salt_t *salt = hash_buf->salt;
17181
17182 char *salt_pos = input_buf + 9;
17183
17184 char *hash_pos = strchr (salt_pos, '*');
17185
17186 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17187
17188 hash_pos++;
17189
17190 uint hash_len = input_len - (hash_pos - input_buf);
17191
17192 if (hash_len != 40) return (PARSER_HASH_LENGTH);
17193
17194 uint salt_len = hash_pos - salt_pos - 1;
17195
17196 if (salt_len != 40) return (PARSER_SALT_LENGTH);
17197
17198 /*
17199 * store digest
17200 */
17201
17202 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
17203 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
17204 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
17205 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
17206 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
17207
17208 /*
17209 * store salt
17210 */
17211
17212 char *salt_buf_ptr = (char *) salt->salt_buf;
17213
17214 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
17215
17216 salt->salt_len = salt_len;
17217
17218 return (PARSER_OK);
17219 }
17220
17221 int bitcoin_wallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17222 {
17223 if ((input_len < DISPLAY_LEN_MIN_11300) || (input_len > DISPLAY_LEN_MAX_11300)) return (PARSER_GLOBAL_LENGTH);
17224
17225 if (memcmp (SIGNATURE_BITCOIN_WALLET, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
17226
17227 u32 *digest = (u32 *) hash_buf->digest;
17228
17229 salt_t *salt = hash_buf->salt;
17230
17231 bitcoin_wallet_t *bitcoin_wallet = (bitcoin_wallet_t *) hash_buf->esalt;
17232
17233 /**
17234 * parse line
17235 */
17236
17237 char *cry_master_len_pos = input_buf + 9;
17238
17239 char *cry_master_buf_pos = strchr (cry_master_len_pos, '$');
17240
17241 if (cry_master_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17242
17243 u32 cry_master_len_len = cry_master_buf_pos - cry_master_len_pos;
17244
17245 cry_master_buf_pos++;
17246
17247 char *cry_salt_len_pos = strchr (cry_master_buf_pos, '$');
17248
17249 if (cry_salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17250
17251 u32 cry_master_buf_len = cry_salt_len_pos - cry_master_buf_pos;
17252
17253 cry_salt_len_pos++;
17254
17255 char *cry_salt_buf_pos = strchr (cry_salt_len_pos, '$');
17256
17257 if (cry_salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17258
17259 u32 cry_salt_len_len = cry_salt_buf_pos - cry_salt_len_pos;
17260
17261 cry_salt_buf_pos++;
17262
17263 char *cry_rounds_pos = strchr (cry_salt_buf_pos, '$');
17264
17265 if (cry_rounds_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17266
17267 u32 cry_salt_buf_len = cry_rounds_pos - cry_salt_buf_pos;
17268
17269 cry_rounds_pos++;
17270
17271 char *ckey_len_pos = strchr (cry_rounds_pos, '$');
17272
17273 if (ckey_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17274
17275 u32 cry_rounds_len = ckey_len_pos - cry_rounds_pos;
17276
17277 ckey_len_pos++;
17278
17279 char *ckey_buf_pos = strchr (ckey_len_pos, '$');
17280
17281 if (ckey_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17282
17283 u32 ckey_len_len = ckey_buf_pos - ckey_len_pos;
17284
17285 ckey_buf_pos++;
17286
17287 char *public_key_len_pos = strchr (ckey_buf_pos, '$');
17288
17289 if (public_key_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17290
17291 u32 ckey_buf_len = public_key_len_pos - ckey_buf_pos;
17292
17293 public_key_len_pos++;
17294
17295 char *public_key_buf_pos = strchr (public_key_len_pos, '$');
17296
17297 if (public_key_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17298
17299 u32 public_key_len_len = public_key_buf_pos - public_key_len_pos;
17300
17301 public_key_buf_pos++;
17302
17303 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;
17304
17305 const uint cry_master_len = atoi (cry_master_len_pos);
17306 const uint cry_salt_len = atoi (cry_salt_len_pos);
17307 const uint ckey_len = atoi (ckey_len_pos);
17308 const uint public_key_len = atoi (public_key_len_pos);
17309
17310 if (cry_master_buf_len != cry_master_len) return (PARSER_SALT_VALUE);
17311 if (cry_salt_buf_len != cry_salt_len) return (PARSER_SALT_VALUE);
17312 if (ckey_buf_len != ckey_len) return (PARSER_SALT_VALUE);
17313 if (public_key_buf_len != public_key_len) return (PARSER_SALT_VALUE);
17314
17315 for (uint i = 0, j = 0; j < cry_master_len; i += 1, j += 8)
17316 {
17317 bitcoin_wallet->cry_master_buf[i] = hex_to_u32 ((const u8 *) &cry_master_buf_pos[j]);
17318
17319 bitcoin_wallet->cry_master_buf[i] = byte_swap_32 (bitcoin_wallet->cry_master_buf[i]);
17320 }
17321
17322 for (uint i = 0, j = 0; j < ckey_len; i += 1, j += 8)
17323 {
17324 bitcoin_wallet->ckey_buf[i] = hex_to_u32 ((const u8 *) &ckey_buf_pos[j]);
17325
17326 bitcoin_wallet->ckey_buf[i] = byte_swap_32 (bitcoin_wallet->ckey_buf[i]);
17327 }
17328
17329 for (uint i = 0, j = 0; j < public_key_len; i += 1, j += 8)
17330 {
17331 bitcoin_wallet->public_key_buf[i] = hex_to_u32 ((const u8 *) &public_key_buf_pos[j]);
17332
17333 bitcoin_wallet->public_key_buf[i] = byte_swap_32 (bitcoin_wallet->public_key_buf[i]);
17334 }
17335
17336 bitcoin_wallet->cry_master_len = cry_master_len / 2;
17337 bitcoin_wallet->ckey_len = ckey_len / 2;
17338 bitcoin_wallet->public_key_len = public_key_len / 2;
17339
17340 /*
17341 * store digest (should be unique enought, hopefully)
17342 */
17343
17344 digest[0] = bitcoin_wallet->cry_master_buf[0];
17345 digest[1] = bitcoin_wallet->cry_master_buf[1];
17346 digest[2] = bitcoin_wallet->cry_master_buf[2];
17347 digest[3] = bitcoin_wallet->cry_master_buf[3];
17348
17349 /*
17350 * store salt
17351 */
17352
17353 if (cry_rounds_len >= 7) return (PARSER_SALT_VALUE);
17354
17355 const uint cry_rounds = atoi (cry_rounds_pos);
17356
17357 salt->salt_iter = cry_rounds - 1;
17358
17359 char *salt_buf_ptr = (char *) salt->salt_buf;
17360
17361 const uint salt_len = parse_and_store_salt (salt_buf_ptr, cry_salt_buf_pos, cry_salt_buf_len);
17362
17363 salt->salt_len = salt_len;
17364
17365 return (PARSER_OK);
17366 }
17367
17368 int sip_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17369 {
17370 if ((input_len < DISPLAY_LEN_MIN_11400) || (input_len > DISPLAY_LEN_MAX_11400)) return (PARSER_GLOBAL_LENGTH);
17371
17372 if (memcmp (SIGNATURE_SIP_AUTH, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
17373
17374 u32 *digest = (u32 *) hash_buf->digest;
17375
17376 salt_t *salt = hash_buf->salt;
17377
17378 sip_t *sip = (sip_t *) hash_buf->esalt;
17379
17380 // work with a temporary copy of input_buf (s.t. we can manipulate it directly)
17381
17382 char *temp_input_buf = (char *) mymalloc (input_len + 1);
17383
17384 memcpy (temp_input_buf, input_buf, input_len);
17385
17386 // URI_server:
17387
17388 char *URI_server_pos = temp_input_buf + 6;
17389
17390 char *URI_client_pos = strchr (URI_server_pos, '*');
17391
17392 if (URI_client_pos == NULL)
17393 {
17394 myfree (temp_input_buf);
17395
17396 return (PARSER_SEPARATOR_UNMATCHED);
17397 }
17398
17399 URI_client_pos[0] = 0;
17400 URI_client_pos++;
17401
17402 uint URI_server_len = strlen (URI_server_pos);
17403
17404 if (URI_server_len > 512)
17405 {
17406 myfree (temp_input_buf);
17407
17408 return (PARSER_SALT_LENGTH);
17409 }
17410
17411 // URI_client:
17412
17413 char *user_pos = strchr (URI_client_pos, '*');
17414
17415 if (user_pos == NULL)
17416 {
17417 myfree (temp_input_buf);
17418
17419 return (PARSER_SEPARATOR_UNMATCHED);
17420 }
17421
17422 user_pos[0] = 0;
17423 user_pos++;
17424
17425 uint URI_client_len = strlen (URI_client_pos);
17426
17427 if (URI_client_len > 512)
17428 {
17429 myfree (temp_input_buf);
17430
17431 return (PARSER_SALT_LENGTH);
17432 }
17433
17434 // user:
17435
17436 char *realm_pos = strchr (user_pos, '*');
17437
17438 if (realm_pos == NULL)
17439 {
17440 myfree (temp_input_buf);
17441
17442 return (PARSER_SEPARATOR_UNMATCHED);
17443 }
17444
17445 realm_pos[0] = 0;
17446 realm_pos++;
17447
17448 uint user_len = strlen (user_pos);
17449
17450 if (user_len > 116)
17451 {
17452 myfree (temp_input_buf);
17453
17454 return (PARSER_SALT_LENGTH);
17455 }
17456
17457 // realm:
17458
17459 char *method_pos = strchr (realm_pos, '*');
17460
17461 if (method_pos == NULL)
17462 {
17463 myfree (temp_input_buf);
17464
17465 return (PARSER_SEPARATOR_UNMATCHED);
17466 }
17467
17468 method_pos[0] = 0;
17469 method_pos++;
17470
17471 uint realm_len = strlen (realm_pos);
17472
17473 if (realm_len > 116)
17474 {
17475 myfree (temp_input_buf);
17476
17477 return (PARSER_SALT_LENGTH);
17478 }
17479
17480 // method:
17481
17482 char *URI_prefix_pos = strchr (method_pos, '*');
17483
17484 if (URI_prefix_pos == NULL)
17485 {
17486 myfree (temp_input_buf);
17487
17488 return (PARSER_SEPARATOR_UNMATCHED);
17489 }
17490
17491 URI_prefix_pos[0] = 0;
17492 URI_prefix_pos++;
17493
17494 uint method_len = strlen (method_pos);
17495
17496 if (method_len > 246)
17497 {
17498 myfree (temp_input_buf);
17499
17500 return (PARSER_SALT_LENGTH);
17501 }
17502
17503 // URI_prefix:
17504
17505 char *URI_resource_pos = strchr (URI_prefix_pos, '*');
17506
17507 if (URI_resource_pos == NULL)
17508 {
17509 myfree (temp_input_buf);
17510
17511 return (PARSER_SEPARATOR_UNMATCHED);
17512 }
17513
17514 URI_resource_pos[0] = 0;
17515 URI_resource_pos++;
17516
17517 uint URI_prefix_len = strlen (URI_prefix_pos);
17518
17519 if (URI_prefix_len > 245)
17520 {
17521 myfree (temp_input_buf);
17522
17523 return (PARSER_SALT_LENGTH);
17524 }
17525
17526 // URI_resource:
17527
17528 char *URI_suffix_pos = strchr (URI_resource_pos, '*');
17529
17530 if (URI_suffix_pos == NULL)
17531 {
17532 myfree (temp_input_buf);
17533
17534 return (PARSER_SEPARATOR_UNMATCHED);
17535 }
17536
17537 URI_suffix_pos[0] = 0;
17538 URI_suffix_pos++;
17539
17540 uint URI_resource_len = strlen (URI_resource_pos);
17541
17542 if (URI_resource_len < 1 || URI_resource_len > 246)
17543 {
17544 myfree (temp_input_buf);
17545
17546 return (PARSER_SALT_LENGTH);
17547 }
17548
17549 // URI_suffix:
17550
17551 char *nonce_pos = strchr (URI_suffix_pos, '*');
17552
17553 if (nonce_pos == NULL)
17554 {
17555 myfree (temp_input_buf);
17556
17557 return (PARSER_SEPARATOR_UNMATCHED);
17558 }
17559
17560 nonce_pos[0] = 0;
17561 nonce_pos++;
17562
17563 uint URI_suffix_len = strlen (URI_suffix_pos);
17564
17565 if (URI_suffix_len > 245)
17566 {
17567 myfree (temp_input_buf);
17568
17569 return (PARSER_SALT_LENGTH);
17570 }
17571
17572 // nonce:
17573
17574 char *nonce_client_pos = strchr (nonce_pos, '*');
17575
17576 if (nonce_client_pos == NULL)
17577 {
17578 myfree (temp_input_buf);
17579
17580 return (PARSER_SEPARATOR_UNMATCHED);
17581 }
17582
17583 nonce_client_pos[0] = 0;
17584 nonce_client_pos++;
17585
17586 uint nonce_len = strlen (nonce_pos);
17587
17588 if (nonce_len < 1 || nonce_len > 50)
17589 {
17590 myfree (temp_input_buf);
17591
17592 return (PARSER_SALT_LENGTH);
17593 }
17594
17595 // nonce_client:
17596
17597 char *nonce_count_pos = strchr (nonce_client_pos, '*');
17598
17599 if (nonce_count_pos == NULL)
17600 {
17601 myfree (temp_input_buf);
17602
17603 return (PARSER_SEPARATOR_UNMATCHED);
17604 }
17605
17606 nonce_count_pos[0] = 0;
17607 nonce_count_pos++;
17608
17609 uint nonce_client_len = strlen (nonce_client_pos);
17610
17611 if (nonce_client_len > 50)
17612 {
17613 myfree (temp_input_buf);
17614
17615 return (PARSER_SALT_LENGTH);
17616 }
17617
17618 // nonce_count:
17619
17620 char *qop_pos = strchr (nonce_count_pos, '*');
17621
17622 if (qop_pos == NULL)
17623 {
17624 myfree (temp_input_buf);
17625
17626 return (PARSER_SEPARATOR_UNMATCHED);
17627 }
17628
17629 qop_pos[0] = 0;
17630 qop_pos++;
17631
17632 uint nonce_count_len = strlen (nonce_count_pos);
17633
17634 if (nonce_count_len > 50)
17635 {
17636 myfree (temp_input_buf);
17637
17638 return (PARSER_SALT_LENGTH);
17639 }
17640
17641 // qop:
17642
17643 char *directive_pos = strchr (qop_pos, '*');
17644
17645 if (directive_pos == NULL)
17646 {
17647 myfree (temp_input_buf);
17648
17649 return (PARSER_SEPARATOR_UNMATCHED);
17650 }
17651
17652 directive_pos[0] = 0;
17653 directive_pos++;
17654
17655 uint qop_len = strlen (qop_pos);
17656
17657 if (qop_len > 50)
17658 {
17659 myfree (temp_input_buf);
17660
17661 return (PARSER_SALT_LENGTH);
17662 }
17663
17664 // directive
17665
17666 char *digest_pos = strchr (directive_pos, '*');
17667
17668 if (digest_pos == NULL)
17669 {
17670 myfree (temp_input_buf);
17671
17672 return (PARSER_SEPARATOR_UNMATCHED);
17673 }
17674
17675 digest_pos[0] = 0;
17676 digest_pos++;
17677
17678 uint directive_len = strlen (directive_pos);
17679
17680 if (directive_len != 3)
17681 {
17682 myfree (temp_input_buf);
17683
17684 return (PARSER_SALT_LENGTH);
17685 }
17686
17687 if (memcmp (directive_pos, "MD5", 3))
17688 {
17689 log_info ("ERROR: only the MD5 directive is currently supported\n");
17690
17691 myfree (temp_input_buf);
17692
17693 return (PARSER_SIP_AUTH_DIRECTIVE);
17694 }
17695
17696 /*
17697 * first (pre-)compute: HA2 = md5 ($method . ":" . $uri)
17698 */
17699
17700 uint md5_len = 0;
17701
17702 uint md5_max_len = 4 * 64;
17703
17704 uint md5_remaining_len = md5_max_len;
17705
17706 uint tmp_md5_buf[64] = { 0 };
17707
17708 char *tmp_md5_ptr = (char *) tmp_md5_buf;
17709
17710 snprintf (tmp_md5_ptr, md5_remaining_len, "%s:", method_pos);
17711
17712 md5_len += method_len + 1;
17713 tmp_md5_ptr += method_len + 1;
17714
17715 if (URI_prefix_len > 0)
17716 {
17717 md5_remaining_len = md5_max_len - md5_len;
17718
17719 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s:", URI_prefix_pos);
17720
17721 md5_len += URI_prefix_len + 1;
17722 tmp_md5_ptr += URI_prefix_len + 1;
17723 }
17724
17725 md5_remaining_len = md5_max_len - md5_len;
17726
17727 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s", URI_resource_pos);
17728
17729 md5_len += URI_resource_len;
17730 tmp_md5_ptr += URI_resource_len;
17731
17732 if (URI_suffix_len > 0)
17733 {
17734 md5_remaining_len = md5_max_len - md5_len;
17735
17736 snprintf (tmp_md5_ptr, md5_remaining_len + 1, ":%s", URI_suffix_pos);
17737
17738 md5_len += 1 + URI_suffix_len;
17739 }
17740
17741 uint tmp_digest[4] = { 0 };
17742
17743 md5_complete_no_limit (tmp_digest, tmp_md5_buf, md5_len);
17744
17745 tmp_digest[0] = byte_swap_32 (tmp_digest[0]);
17746 tmp_digest[1] = byte_swap_32 (tmp_digest[1]);
17747 tmp_digest[2] = byte_swap_32 (tmp_digest[2]);
17748 tmp_digest[3] = byte_swap_32 (tmp_digest[3]);
17749
17750 /*
17751 * esalt
17752 */
17753
17754 char *esalt_buf_ptr = (char *) sip->esalt_buf;
17755
17756 uint esalt_len = 0;
17757
17758 uint max_esalt_len = sizeof (sip->esalt_buf); // 151 = (64 + 64 + 55) - 32, where 32 is the hexadecimal MD5 HA1 hash
17759
17760 // there are 2 possibilities for the esalt:
17761
17762 if ((strcmp (qop_pos, "auth") == 0) || (strcmp (qop_pos, "auth-int") == 0))
17763 {
17764 esalt_len = 1 + nonce_len + 1 + nonce_count_len + 1 + nonce_client_len + 1 + qop_len + 1 + 32;
17765
17766 if (esalt_len > max_esalt_len)
17767 {
17768 myfree (temp_input_buf);
17769
17770 return (PARSER_SALT_LENGTH);
17771 }
17772
17773 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%s:%s:%s:%08x%08x%08x%08x",
17774 nonce_pos,
17775 nonce_count_pos,
17776 nonce_client_pos,
17777 qop_pos,
17778 tmp_digest[0],
17779 tmp_digest[1],
17780 tmp_digest[2],
17781 tmp_digest[3]);
17782 }
17783 else
17784 {
17785 esalt_len = 1 + nonce_len + 1 + 32;
17786
17787 if (esalt_len > max_esalt_len)
17788 {
17789 myfree (temp_input_buf);
17790
17791 return (PARSER_SALT_LENGTH);
17792 }
17793
17794 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%08x%08x%08x%08x",
17795 nonce_pos,
17796 tmp_digest[0],
17797 tmp_digest[1],
17798 tmp_digest[2],
17799 tmp_digest[3]);
17800 }
17801
17802 // add 0x80 to esalt
17803
17804 esalt_buf_ptr[esalt_len] = 0x80;
17805
17806 sip->esalt_len = esalt_len;
17807
17808 /*
17809 * actual salt
17810 */
17811
17812 char *sip_salt_ptr = (char *) sip->salt_buf;
17813
17814 uint salt_len = user_len + 1 + realm_len + 1;
17815
17816 uint max_salt_len = 119;
17817
17818 if (salt_len > max_salt_len)
17819 {
17820 myfree (temp_input_buf);
17821
17822 return (PARSER_SALT_LENGTH);
17823 }
17824
17825 snprintf (sip_salt_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
17826
17827 sip->salt_len = salt_len;
17828
17829 /*
17830 * fake salt (for sorting)
17831 */
17832
17833 char *salt_buf_ptr = (char *) salt->salt_buf;
17834
17835 max_salt_len = 55;
17836
17837 uint fake_salt_len = salt_len;
17838
17839 if (fake_salt_len > max_salt_len)
17840 {
17841 fake_salt_len = max_salt_len;
17842 }
17843
17844 snprintf (salt_buf_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
17845
17846 salt->salt_len = fake_salt_len;
17847
17848 /*
17849 * digest
17850 */
17851
17852 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
17853 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
17854 digest[2] = hex_to_u32 ((const u8 *) &digest_pos[16]);
17855 digest[3] = hex_to_u32 ((const u8 *) &digest_pos[24]);
17856
17857 digest[0] = byte_swap_32 (digest[0]);
17858 digest[1] = byte_swap_32 (digest[1]);
17859 digest[2] = byte_swap_32 (digest[2]);
17860 digest[3] = byte_swap_32 (digest[3]);
17861
17862 myfree (temp_input_buf);
17863
17864 return (PARSER_OK);
17865 }
17866
17867 int crc32_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17868 {
17869 if ((input_len < DISPLAY_LEN_MIN_11500) || (input_len > DISPLAY_LEN_MAX_11500)) return (PARSER_GLOBAL_LENGTH);
17870
17871 if (input_buf[8] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
17872
17873 u32 *digest = (u32 *) hash_buf->digest;
17874
17875 salt_t *salt = hash_buf->salt;
17876
17877 // digest
17878
17879 char *digest_pos = input_buf;
17880
17881 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[0]);
17882 digest[1] = 0;
17883 digest[2] = 0;
17884 digest[3] = 0;
17885
17886 // salt
17887
17888 char *salt_buf = input_buf + 8 + 1;
17889
17890 uint salt_len = 8;
17891
17892 char *salt_buf_ptr = (char *) salt->salt_buf;
17893
17894 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
17895
17896 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17897
17898 salt->salt_len = salt_len;
17899
17900 return (PARSER_OK);
17901 }
17902
17903 int seven_zip_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17904 {
17905 if ((input_len < DISPLAY_LEN_MIN_11600) || (input_len > DISPLAY_LEN_MAX_11600)) return (PARSER_GLOBAL_LENGTH);
17906
17907 if (memcmp (SIGNATURE_SEVEN_ZIP, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
17908
17909 u32 *digest = (u32 *) hash_buf->digest;
17910
17911 salt_t *salt = hash_buf->salt;
17912
17913 seven_zip_t *seven_zip = (seven_zip_t *) hash_buf->esalt;
17914
17915 /**
17916 * parse line
17917 */
17918
17919 char *p_buf_pos = input_buf + 4;
17920
17921 char *NumCyclesPower_pos = strchr (p_buf_pos, '$');
17922
17923 if (NumCyclesPower_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17924
17925 u32 p_buf_len = NumCyclesPower_pos - p_buf_pos;
17926
17927 NumCyclesPower_pos++;
17928
17929 char *salt_len_pos = strchr (NumCyclesPower_pos, '$');
17930
17931 if (salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17932
17933 u32 NumCyclesPower_len = salt_len_pos - NumCyclesPower_pos;
17934
17935 salt_len_pos++;
17936
17937 char *salt_buf_pos = strchr (salt_len_pos, '$');
17938
17939 if (salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17940
17941 u32 salt_len_len = salt_buf_pos - salt_len_pos;
17942
17943 salt_buf_pos++;
17944
17945 char *iv_len_pos = strchr (salt_buf_pos, '$');
17946
17947 if (iv_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17948
17949 u32 salt_buf_len = iv_len_pos - salt_buf_pos;
17950
17951 iv_len_pos++;
17952
17953 char *iv_buf_pos = strchr (iv_len_pos, '$');
17954
17955 if (iv_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17956
17957 u32 iv_len_len = iv_buf_pos - iv_len_pos;
17958
17959 iv_buf_pos++;
17960
17961 char *crc_buf_pos = strchr (iv_buf_pos, '$');
17962
17963 if (crc_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17964
17965 u32 iv_buf_len = crc_buf_pos - iv_buf_pos;
17966
17967 crc_buf_pos++;
17968
17969 char *data_len_pos = strchr (crc_buf_pos, '$');
17970
17971 if (data_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17972
17973 u32 crc_buf_len = data_len_pos - crc_buf_pos;
17974
17975 data_len_pos++;
17976
17977 char *unpack_size_pos = strchr (data_len_pos, '$');
17978
17979 if (unpack_size_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17980
17981 u32 data_len_len = unpack_size_pos - data_len_pos;
17982
17983 unpack_size_pos++;
17984
17985 char *data_buf_pos = strchr (unpack_size_pos, '$');
17986
17987 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17988
17989 u32 unpack_size_len = data_buf_pos - unpack_size_pos;
17990
17991 data_buf_pos++;
17992
17993 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;
17994
17995 const uint iter = atoi (NumCyclesPower_pos);
17996 const uint crc = atoi (crc_buf_pos);
17997 const uint p_buf = atoi (p_buf_pos);
17998 const uint salt_len = atoi (salt_len_pos);
17999 const uint iv_len = atoi (iv_len_pos);
18000 const uint unpack_size = atoi (unpack_size_pos);
18001 const uint data_len = atoi (data_len_pos);
18002
18003 /**
18004 * verify some data
18005 */
18006
18007 if (p_buf != 0) return (PARSER_SALT_VALUE);
18008 if (salt_len != 0) return (PARSER_SALT_VALUE);
18009
18010 if ((data_len * 2) != data_buf_len) return (PARSER_SALT_VALUE);
18011
18012 if (data_len > 384) return (PARSER_SALT_VALUE);
18013
18014 if (unpack_size > data_len) return (PARSER_SALT_VALUE);
18015
18016 /**
18017 * store data
18018 */
18019
18020 seven_zip->iv_buf[0] = hex_to_u32 ((const u8 *) &iv_buf_pos[ 0]);
18021 seven_zip->iv_buf[1] = hex_to_u32 ((const u8 *) &iv_buf_pos[ 8]);
18022 seven_zip->iv_buf[2] = hex_to_u32 ((const u8 *) &iv_buf_pos[16]);
18023 seven_zip->iv_buf[3] = hex_to_u32 ((const u8 *) &iv_buf_pos[24]);
18024
18025 seven_zip->iv_len = iv_len;
18026
18027 memcpy (seven_zip->salt_buf, salt_buf_pos, salt_buf_len); // we just need that for later ascii_digest()
18028
18029 seven_zip->salt_len = 0;
18030
18031 seven_zip->crc = crc;
18032
18033 for (uint i = 0, j = 0; j < data_buf_len; i += 1, j += 8)
18034 {
18035 seven_zip->data_buf[i] = hex_to_u32 ((const u8 *) &data_buf_pos[j]);
18036
18037 seven_zip->data_buf[i] = byte_swap_32 (seven_zip->data_buf[i]);
18038 }
18039
18040 seven_zip->data_len = data_len;
18041
18042 seven_zip->unpack_size = unpack_size;
18043
18044 // real salt
18045
18046 salt->salt_buf[0] = seven_zip->data_buf[0];
18047 salt->salt_buf[1] = seven_zip->data_buf[1];
18048 salt->salt_buf[2] = seven_zip->data_buf[2];
18049 salt->salt_buf[3] = seven_zip->data_buf[3];
18050
18051 salt->salt_len = 16;
18052
18053 salt->salt_sign[0] = iter;
18054
18055 salt->salt_iter = 1 << iter;
18056
18057 /**
18058 * digest
18059 */
18060
18061 digest[0] = crc;
18062 digest[1] = 0;
18063 digest[2] = 0;
18064 digest[3] = 0;
18065
18066 return (PARSER_OK);
18067 }
18068
18069 int gost2012sbog_256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18070 {
18071 if ((input_len < DISPLAY_LEN_MIN_11700) || (input_len > DISPLAY_LEN_MAX_11700)) return (PARSER_GLOBAL_LENGTH);
18072
18073 u32 *digest = (u32 *) hash_buf->digest;
18074
18075 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
18076 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
18077 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
18078 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
18079 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
18080 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
18081 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
18082 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
18083
18084 digest[0] = byte_swap_32 (digest[0]);
18085 digest[1] = byte_swap_32 (digest[1]);
18086 digest[2] = byte_swap_32 (digest[2]);
18087 digest[3] = byte_swap_32 (digest[3]);
18088 digest[4] = byte_swap_32 (digest[4]);
18089 digest[5] = byte_swap_32 (digest[5]);
18090 digest[6] = byte_swap_32 (digest[6]);
18091 digest[7] = byte_swap_32 (digest[7]);
18092
18093 return (PARSER_OK);
18094 }
18095
18096 int gost2012sbog_512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18097 {
18098 if ((input_len < DISPLAY_LEN_MIN_11800) || (input_len > DISPLAY_LEN_MAX_11800)) return (PARSER_GLOBAL_LENGTH);
18099
18100 u32 *digest = (u32 *) hash_buf->digest;
18101
18102 digest[ 0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
18103 digest[ 1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
18104 digest[ 2] = hex_to_u32 ((const u8 *) &input_buf[ 16]);
18105 digest[ 3] = hex_to_u32 ((const u8 *) &input_buf[ 24]);
18106 digest[ 4] = hex_to_u32 ((const u8 *) &input_buf[ 32]);
18107 digest[ 5] = hex_to_u32 ((const u8 *) &input_buf[ 40]);
18108 digest[ 6] = hex_to_u32 ((const u8 *) &input_buf[ 48]);
18109 digest[ 7] = hex_to_u32 ((const u8 *) &input_buf[ 56]);
18110 digest[ 8] = hex_to_u32 ((const u8 *) &input_buf[ 64]);
18111 digest[ 9] = hex_to_u32 ((const u8 *) &input_buf[ 72]);
18112 digest[10] = hex_to_u32 ((const u8 *) &input_buf[ 80]);
18113 digest[11] = hex_to_u32 ((const u8 *) &input_buf[ 88]);
18114 digest[12] = hex_to_u32 ((const u8 *) &input_buf[ 96]);
18115 digest[13] = hex_to_u32 ((const u8 *) &input_buf[104]);
18116 digest[14] = hex_to_u32 ((const u8 *) &input_buf[112]);
18117 digest[15] = hex_to_u32 ((const u8 *) &input_buf[120]);
18118
18119 digest[ 0] = byte_swap_32 (digest[ 0]);
18120 digest[ 1] = byte_swap_32 (digest[ 1]);
18121 digest[ 2] = byte_swap_32 (digest[ 2]);
18122 digest[ 3] = byte_swap_32 (digest[ 3]);
18123 digest[ 4] = byte_swap_32 (digest[ 4]);
18124 digest[ 5] = byte_swap_32 (digest[ 5]);
18125 digest[ 6] = byte_swap_32 (digest[ 6]);
18126 digest[ 7] = byte_swap_32 (digest[ 7]);
18127 digest[ 8] = byte_swap_32 (digest[ 8]);
18128 digest[ 9] = byte_swap_32 (digest[ 9]);
18129 digest[10] = byte_swap_32 (digest[10]);
18130 digest[11] = byte_swap_32 (digest[11]);
18131 digest[12] = byte_swap_32 (digest[12]);
18132 digest[13] = byte_swap_32 (digest[13]);
18133 digest[14] = byte_swap_32 (digest[14]);
18134 digest[15] = byte_swap_32 (digest[15]);
18135
18136 return (PARSER_OK);
18137 }
18138
18139 int pbkdf2_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18140 {
18141 if ((input_len < DISPLAY_LEN_MIN_11900) || (input_len > DISPLAY_LEN_MAX_11900)) return (PARSER_GLOBAL_LENGTH);
18142
18143 if (memcmp (SIGNATURE_PBKDF2_MD5, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
18144
18145 u32 *digest = (u32 *) hash_buf->digest;
18146
18147 salt_t *salt = hash_buf->salt;
18148
18149 pbkdf2_md5_t *pbkdf2_md5 = (pbkdf2_md5_t *) hash_buf->esalt;
18150
18151 /**
18152 * parse line
18153 */
18154
18155 // iterations
18156
18157 char *iter_pos = input_buf + 4;
18158
18159 u32 iter = atoi (iter_pos);
18160
18161 if (iter < 1) return (PARSER_SALT_ITERATION);
18162 if (iter > 999999) return (PARSER_SALT_ITERATION);
18163
18164 // first is *raw* salt
18165
18166 char *salt_pos = strchr (iter_pos, ':');
18167
18168 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18169
18170 salt_pos++;
18171
18172 char *hash_pos = strchr (salt_pos, ':');
18173
18174 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18175
18176 u32 salt_len = hash_pos - salt_pos;
18177
18178 if (salt_len > 64) return (PARSER_SALT_LENGTH);
18179
18180 hash_pos++;
18181
18182 u32 hash_b64_len = input_len - (hash_pos - input_buf);
18183
18184 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
18185
18186 // decode salt
18187
18188 char *salt_buf_ptr = (char *) pbkdf2_md5->salt_buf;
18189
18190 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18191
18192 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18193
18194 salt_buf_ptr[salt_len + 3] = 0x01;
18195 salt_buf_ptr[salt_len + 4] = 0x80;
18196
18197 salt->salt_len = salt_len;
18198 salt->salt_iter = iter - 1;
18199
18200 // decode hash
18201
18202 u8 tmp_buf[100] = { 0 };
18203
18204 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
18205
18206 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18207
18208 memcpy (digest, tmp_buf, 16);
18209
18210 // add some stuff to normal salt to make sorted happy
18211
18212 salt->salt_buf[0] = pbkdf2_md5->salt_buf[0];
18213 salt->salt_buf[1] = pbkdf2_md5->salt_buf[1];
18214 salt->salt_buf[2] = pbkdf2_md5->salt_buf[2];
18215 salt->salt_buf[3] = pbkdf2_md5->salt_buf[3];
18216 salt->salt_buf[4] = salt->salt_iter;
18217
18218 return (PARSER_OK);
18219 }
18220
18221 int pbkdf2_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18222 {
18223 if ((input_len < DISPLAY_LEN_MIN_12000) || (input_len > DISPLAY_LEN_MAX_12000)) return (PARSER_GLOBAL_LENGTH);
18224
18225 if (memcmp (SIGNATURE_PBKDF2_SHA1, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
18226
18227 u32 *digest = (u32 *) hash_buf->digest;
18228
18229 salt_t *salt = hash_buf->salt;
18230
18231 pbkdf2_sha1_t *pbkdf2_sha1 = (pbkdf2_sha1_t *) hash_buf->esalt;
18232
18233 /**
18234 * parse line
18235 */
18236
18237 // iterations
18238
18239 char *iter_pos = input_buf + 5;
18240
18241 u32 iter = atoi (iter_pos);
18242
18243 if (iter < 1) return (PARSER_SALT_ITERATION);
18244 if (iter > 999999) return (PARSER_SALT_ITERATION);
18245
18246 // first is *raw* salt
18247
18248 char *salt_pos = strchr (iter_pos, ':');
18249
18250 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18251
18252 salt_pos++;
18253
18254 char *hash_pos = strchr (salt_pos, ':');
18255
18256 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18257
18258 u32 salt_len = hash_pos - salt_pos;
18259
18260 if (salt_len > 64) return (PARSER_SALT_LENGTH);
18261
18262 hash_pos++;
18263
18264 u32 hash_b64_len = input_len - (hash_pos - input_buf);
18265
18266 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
18267
18268 // decode salt
18269
18270 char *salt_buf_ptr = (char *) pbkdf2_sha1->salt_buf;
18271
18272 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18273
18274 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18275
18276 salt_buf_ptr[salt_len + 3] = 0x01;
18277 salt_buf_ptr[salt_len + 4] = 0x80;
18278
18279 salt->salt_len = salt_len;
18280 salt->salt_iter = iter - 1;
18281
18282 // decode hash
18283
18284 u8 tmp_buf[100] = { 0 };
18285
18286 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
18287
18288 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18289
18290 memcpy (digest, tmp_buf, 16);
18291
18292 digest[0] = byte_swap_32 (digest[0]);
18293 digest[1] = byte_swap_32 (digest[1]);
18294 digest[2] = byte_swap_32 (digest[2]);
18295 digest[3] = byte_swap_32 (digest[3]);
18296
18297 // add some stuff to normal salt to make sorted happy
18298
18299 salt->salt_buf[0] = pbkdf2_sha1->salt_buf[0];
18300 salt->salt_buf[1] = pbkdf2_sha1->salt_buf[1];
18301 salt->salt_buf[2] = pbkdf2_sha1->salt_buf[2];
18302 salt->salt_buf[3] = pbkdf2_sha1->salt_buf[3];
18303 salt->salt_buf[4] = salt->salt_iter;
18304
18305 return (PARSER_OK);
18306 }
18307
18308 int pbkdf2_sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18309 {
18310 if ((input_len < DISPLAY_LEN_MIN_12100) || (input_len > DISPLAY_LEN_MAX_12100)) return (PARSER_GLOBAL_LENGTH);
18311
18312 if (memcmp (SIGNATURE_PBKDF2_SHA512, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
18313
18314 u64 *digest = (u64 *) hash_buf->digest;
18315
18316 salt_t *salt = hash_buf->salt;
18317
18318 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
18319
18320 /**
18321 * parse line
18322 */
18323
18324 // iterations
18325
18326 char *iter_pos = input_buf + 7;
18327
18328 u32 iter = atoi (iter_pos);
18329
18330 if (iter < 1) return (PARSER_SALT_ITERATION);
18331 if (iter > 999999) return (PARSER_SALT_ITERATION);
18332
18333 // first is *raw* salt
18334
18335 char *salt_pos = strchr (iter_pos, ':');
18336
18337 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18338
18339 salt_pos++;
18340
18341 char *hash_pos = strchr (salt_pos, ':');
18342
18343 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18344
18345 u32 salt_len = hash_pos - salt_pos;
18346
18347 if (salt_len > 64) return (PARSER_SALT_LENGTH);
18348
18349 hash_pos++;
18350
18351 u32 hash_b64_len = input_len - (hash_pos - input_buf);
18352
18353 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
18354
18355 // decode salt
18356
18357 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
18358
18359 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18360
18361 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18362
18363 salt_buf_ptr[salt_len + 3] = 0x01;
18364 salt_buf_ptr[salt_len + 4] = 0x80;
18365
18366 salt->salt_len = salt_len;
18367 salt->salt_iter = iter - 1;
18368
18369 // decode hash
18370
18371 u8 tmp_buf[100] = { 0 };
18372
18373 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
18374
18375 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18376
18377 memcpy (digest, tmp_buf, 64);
18378
18379 digest[0] = byte_swap_64 (digest[0]);
18380 digest[1] = byte_swap_64 (digest[1]);
18381 digest[2] = byte_swap_64 (digest[2]);
18382 digest[3] = byte_swap_64 (digest[3]);
18383 digest[4] = byte_swap_64 (digest[4]);
18384 digest[5] = byte_swap_64 (digest[5]);
18385 digest[6] = byte_swap_64 (digest[6]);
18386 digest[7] = byte_swap_64 (digest[7]);
18387
18388 // add some stuff to normal salt to make sorted happy
18389
18390 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
18391 salt->salt_buf[1] = pbkdf2_sha512->salt_buf[1];
18392 salt->salt_buf[2] = pbkdf2_sha512->salt_buf[2];
18393 salt->salt_buf[3] = pbkdf2_sha512->salt_buf[3];
18394 salt->salt_buf[4] = salt->salt_iter;
18395
18396 return (PARSER_OK);
18397 }
18398
18399 int ecryptfs_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18400 {
18401 if ((input_len < DISPLAY_LEN_MIN_12200) || (input_len > DISPLAY_LEN_MAX_12200)) return (PARSER_GLOBAL_LENGTH);
18402
18403 if (memcmp (SIGNATURE_ECRYPTFS, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
18404
18405 uint *digest = (uint *) hash_buf->digest;
18406
18407 salt_t *salt = hash_buf->salt;
18408
18409 /**
18410 * parse line
18411 */
18412
18413 char *salt_pos = input_buf + 10 + 2 + 2; // skip over "0$" and "1$"
18414
18415 char *hash_pos = strchr (salt_pos, '$');
18416
18417 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18418
18419 u32 salt_len = hash_pos - salt_pos;
18420
18421 if (salt_len != 16) return (PARSER_SALT_LENGTH);
18422
18423 hash_pos++;
18424
18425 u32 hash_len = input_len - 10 - 2 - 2 - salt_len - 1;
18426
18427 if (hash_len != 16) return (PARSER_HASH_LENGTH);
18428
18429 // decode hash
18430
18431 digest[ 0] = hex_to_u32 ((const u8 *) &hash_pos[0]);
18432 digest[ 1] = hex_to_u32 ((const u8 *) &hash_pos[8]);
18433 digest[ 2] = 0;
18434 digest[ 3] = 0;
18435 digest[ 4] = 0;
18436 digest[ 5] = 0;
18437 digest[ 6] = 0;
18438 digest[ 7] = 0;
18439 digest[ 8] = 0;
18440 digest[ 9] = 0;
18441 digest[10] = 0;
18442 digest[11] = 0;
18443 digest[12] = 0;
18444 digest[13] = 0;
18445 digest[14] = 0;
18446 digest[15] = 0;
18447
18448 // decode salt
18449
18450 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[0]);
18451 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[8]);
18452
18453 salt->salt_iter = ROUNDS_ECRYPTFS;
18454 salt->salt_len = 8;
18455
18456 return (PARSER_OK);
18457 }
18458
18459 int bsdicrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18460 {
18461 if ((input_len < DISPLAY_LEN_MIN_12400) || (input_len > DISPLAY_LEN_MAX_12400)) return (PARSER_GLOBAL_LENGTH);
18462
18463 if (memcmp (SIGNATURE_BSDICRYPT, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
18464
18465 unsigned char c19 = itoa64_to_int (input_buf[19]);
18466
18467 if (c19 & 3) return (PARSER_HASH_VALUE);
18468
18469 salt_t *salt = hash_buf->salt;
18470
18471 u32 *digest = (u32 *) hash_buf->digest;
18472
18473 // iteration count
18474
18475 salt->salt_iter = itoa64_to_int (input_buf[1])
18476 | itoa64_to_int (input_buf[2]) << 6
18477 | itoa64_to_int (input_buf[3]) << 12
18478 | itoa64_to_int (input_buf[4]) << 18;
18479
18480 // set salt
18481
18482 salt->salt_buf[0] = itoa64_to_int (input_buf[5])
18483 | itoa64_to_int (input_buf[6]) << 6
18484 | itoa64_to_int (input_buf[7]) << 12
18485 | itoa64_to_int (input_buf[8]) << 18;
18486
18487 salt->salt_len = 4;
18488
18489 u8 tmp_buf[100] = { 0 };
18490
18491 base64_decode (itoa64_to_int, (const u8 *) input_buf + 9, 11, tmp_buf);
18492
18493 memcpy (digest, tmp_buf, 8);
18494
18495 uint tt;
18496
18497 IP (digest[0], digest[1], tt);
18498
18499 digest[0] = rotr32 (digest[0], 31);
18500 digest[1] = rotr32 (digest[1], 31);
18501 digest[2] = 0;
18502 digest[3] = 0;
18503
18504 return (PARSER_OK);
18505 }
18506
18507 int rar3hp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18508 {
18509 if ((input_len < DISPLAY_LEN_MIN_12500) || (input_len > DISPLAY_LEN_MAX_12500)) return (PARSER_GLOBAL_LENGTH);
18510
18511 if (memcmp (SIGNATURE_RAR3, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
18512
18513 u32 *digest = (u32 *) hash_buf->digest;
18514
18515 salt_t *salt = hash_buf->salt;
18516
18517 /**
18518 * parse line
18519 */
18520
18521 char *type_pos = input_buf + 6 + 1;
18522
18523 char *salt_pos = strchr (type_pos, '*');
18524
18525 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18526
18527 u32 type_len = salt_pos - type_pos;
18528
18529 if (type_len != 1) return (PARSER_SALT_LENGTH);
18530
18531 salt_pos++;
18532
18533 char *crypted_pos = strchr (salt_pos, '*');
18534
18535 if (crypted_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18536
18537 u32 salt_len = crypted_pos - salt_pos;
18538
18539 if (salt_len != 16) return (PARSER_SALT_LENGTH);
18540
18541 crypted_pos++;
18542
18543 u32 crypted_len = input_len - 6 - 1 - type_len - 1 - salt_len - 1;
18544
18545 if (crypted_len != 32) return (PARSER_SALT_LENGTH);
18546
18547 /**
18548 * copy data
18549 */
18550
18551 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[0]);
18552 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[8]);
18553
18554 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
18555 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
18556
18557 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &crypted_pos[ 0]);
18558 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &crypted_pos[ 8]);
18559 salt->salt_buf[4] = hex_to_u32 ((const u8 *) &crypted_pos[16]);
18560 salt->salt_buf[5] = hex_to_u32 ((const u8 *) &crypted_pos[24]);
18561
18562 salt->salt_len = 24;
18563 salt->salt_iter = ROUNDS_RAR3;
18564
18565 // there's no hash for rar3. the data which is in crypted_pos is some encrypted data and
18566 // if it matches the value \xc4\x3d\x7b\x00\x40\x07\x00 after decrypt we know that we successfully cracked it.
18567
18568 digest[0] = 0xc43d7b00;
18569 digest[1] = 0x40070000;
18570 digest[2] = 0;
18571 digest[3] = 0;
18572
18573 return (PARSER_OK);
18574 }
18575
18576 int rar5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18577 {
18578 if ((input_len < DISPLAY_LEN_MIN_13000) || (input_len > DISPLAY_LEN_MAX_13000)) return (PARSER_GLOBAL_LENGTH);
18579
18580 if (memcmp (SIGNATURE_RAR5, input_buf, 1 + 4 + 1)) return (PARSER_SIGNATURE_UNMATCHED);
18581
18582 u32 *digest = (u32 *) hash_buf->digest;
18583
18584 salt_t *salt = hash_buf->salt;
18585
18586 rar5_t *rar5 = (rar5_t *) hash_buf->esalt;
18587
18588 /**
18589 * parse line
18590 */
18591
18592 char *param0_pos = input_buf + 1 + 4 + 1;
18593
18594 char *param1_pos = strchr (param0_pos, '$');
18595
18596 if (param1_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18597
18598 u32 param0_len = param1_pos - param0_pos;
18599
18600 param1_pos++;
18601
18602 char *param2_pos = strchr (param1_pos, '$');
18603
18604 if (param2_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18605
18606 u32 param1_len = param2_pos - param1_pos;
18607
18608 param2_pos++;
18609
18610 char *param3_pos = strchr (param2_pos, '$');
18611
18612 if (param3_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18613
18614 u32 param2_len = param3_pos - param2_pos;
18615
18616 param3_pos++;
18617
18618 char *param4_pos = strchr (param3_pos, '$');
18619
18620 if (param4_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18621
18622 u32 param3_len = param4_pos - param3_pos;
18623
18624 param4_pos++;
18625
18626 char *param5_pos = strchr (param4_pos, '$');
18627
18628 if (param5_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18629
18630 u32 param4_len = param5_pos - param4_pos;
18631
18632 param5_pos++;
18633
18634 u32 param5_len = input_len - 1 - 4 - 1 - param0_len - 1 - param1_len - 1 - param2_len - 1 - param3_len - 1 - param4_len - 1;
18635
18636 char *salt_buf = param1_pos;
18637 char *iv = param3_pos;
18638 char *pswcheck = param5_pos;
18639
18640 const uint salt_len = atoi (param0_pos);
18641 const uint iterations = atoi (param2_pos);
18642 const uint pswcheck_len = atoi (param4_pos);
18643
18644 /**
18645 * verify some data
18646 */
18647
18648 if (param1_len != 32) return (PARSER_SALT_VALUE);
18649 if (param3_len != 32) return (PARSER_SALT_VALUE);
18650 if (param5_len != 16) return (PARSER_SALT_VALUE);
18651
18652 if (salt_len != 16) return (PARSER_SALT_VALUE);
18653 if (iterations == 0) return (PARSER_SALT_VALUE);
18654 if (pswcheck_len != 8) return (PARSER_SALT_VALUE);
18655
18656 /**
18657 * store data
18658 */
18659
18660 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
18661 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
18662 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
18663 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf[24]);
18664
18665 rar5->iv[0] = hex_to_u32 ((const u8 *) &iv[ 0]);
18666 rar5->iv[1] = hex_to_u32 ((const u8 *) &iv[ 8]);
18667 rar5->iv[2] = hex_to_u32 ((const u8 *) &iv[16]);
18668 rar5->iv[3] = hex_to_u32 ((const u8 *) &iv[24]);
18669
18670 salt->salt_len = 16;
18671
18672 salt->salt_sign[0] = iterations;
18673
18674 salt->salt_iter = ((1 << iterations) + 32) - 1;
18675
18676 /**
18677 * digest buf
18678 */
18679
18680 digest[0] = hex_to_u32 ((const u8 *) &pswcheck[ 0]);
18681 digest[1] = hex_to_u32 ((const u8 *) &pswcheck[ 8]);
18682 digest[2] = 0;
18683 digest[3] = 0;
18684
18685 return (PARSER_OK);
18686 }
18687
18688 int cf10_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18689 {
18690 if ((input_len < DISPLAY_LEN_MIN_12600) || (input_len > DISPLAY_LEN_MAX_12600)) return (PARSER_GLOBAL_LENGTH);
18691
18692 u32 *digest = (u32 *) hash_buf->digest;
18693
18694 salt_t *salt = hash_buf->salt;
18695
18696 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
18697 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
18698 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
18699 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
18700 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
18701 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
18702 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
18703 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
18704
18705 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
18706
18707 uint salt_len = input_len - 64 - 1;
18708
18709 char *salt_buf = input_buf + 64 + 1;
18710
18711 char *salt_buf_ptr = (char *) salt->salt_buf;
18712
18713 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
18714
18715 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18716
18717 salt->salt_len = salt_len;
18718
18719 /**
18720 * we can precompute the first sha256 transform
18721 */
18722
18723 uint w[16] = { 0 };
18724
18725 w[ 0] = byte_swap_32 (salt->salt_buf[ 0]);
18726 w[ 1] = byte_swap_32 (salt->salt_buf[ 1]);
18727 w[ 2] = byte_swap_32 (salt->salt_buf[ 2]);
18728 w[ 3] = byte_swap_32 (salt->salt_buf[ 3]);
18729 w[ 4] = byte_swap_32 (salt->salt_buf[ 4]);
18730 w[ 5] = byte_swap_32 (salt->salt_buf[ 5]);
18731 w[ 6] = byte_swap_32 (salt->salt_buf[ 6]);
18732 w[ 7] = byte_swap_32 (salt->salt_buf[ 7]);
18733 w[ 8] = byte_swap_32 (salt->salt_buf[ 8]);
18734 w[ 9] = byte_swap_32 (salt->salt_buf[ 9]);
18735 w[10] = byte_swap_32 (salt->salt_buf[10]);
18736 w[11] = byte_swap_32 (salt->salt_buf[11]);
18737 w[12] = byte_swap_32 (salt->salt_buf[12]);
18738 w[13] = byte_swap_32 (salt->salt_buf[13]);
18739 w[14] = byte_swap_32 (salt->salt_buf[14]);
18740 w[15] = byte_swap_32 (salt->salt_buf[15]);
18741
18742 uint pc256[8] = { SHA256M_A, SHA256M_B, SHA256M_C, SHA256M_D, SHA256M_E, SHA256M_F, SHA256M_G, SHA256M_H };
18743
18744 sha256_64 (w, pc256);
18745
18746 salt->salt_buf_pc[0] = pc256[0];
18747 salt->salt_buf_pc[1] = pc256[1];
18748 salt->salt_buf_pc[2] = pc256[2];
18749 salt->salt_buf_pc[3] = pc256[3];
18750 salt->salt_buf_pc[4] = pc256[4];
18751 salt->salt_buf_pc[5] = pc256[5];
18752 salt->salt_buf_pc[6] = pc256[6];
18753 salt->salt_buf_pc[7] = pc256[7];
18754
18755 digest[0] -= pc256[0];
18756 digest[1] -= pc256[1];
18757 digest[2] -= pc256[2];
18758 digest[3] -= pc256[3];
18759 digest[4] -= pc256[4];
18760 digest[5] -= pc256[5];
18761 digest[6] -= pc256[6];
18762 digest[7] -= pc256[7];
18763
18764 return (PARSER_OK);
18765 }
18766
18767 int mywallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18768 {
18769 if ((input_len < DISPLAY_LEN_MIN_12700) || (input_len > DISPLAY_LEN_MAX_12700)) return (PARSER_GLOBAL_LENGTH);
18770
18771 if (memcmp (SIGNATURE_MYWALLET, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
18772
18773 u32 *digest = (u32 *) hash_buf->digest;
18774
18775 salt_t *salt = hash_buf->salt;
18776
18777 /**
18778 * parse line
18779 */
18780
18781 char *data_len_pos = input_buf + 1 + 10 + 1;
18782
18783 char *data_buf_pos = strchr (data_len_pos, '$');
18784
18785 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18786
18787 u32 data_len_len = data_buf_pos - data_len_pos;
18788
18789 if (data_len_len < 1) return (PARSER_SALT_LENGTH);
18790 if (data_len_len > 5) return (PARSER_SALT_LENGTH);
18791
18792 data_buf_pos++;
18793
18794 u32 data_buf_len = input_len - 1 - 10 - 1 - data_len_len - 1;
18795
18796 if (data_buf_len < 64) return (PARSER_HASH_LENGTH);
18797
18798 if (data_buf_len % 16) return (PARSER_HASH_LENGTH);
18799
18800 u32 data_len = atoi (data_len_pos);
18801
18802 if ((data_len * 2) != data_buf_len) return (PARSER_HASH_LENGTH);
18803
18804 /**
18805 * salt
18806 */
18807
18808 char *salt_pos = data_buf_pos;
18809
18810 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
18811 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
18812 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
18813 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
18814
18815 // this is actually the CT, which is also the hash later (if matched)
18816
18817 salt->salt_buf[4] = hex_to_u32 ((const u8 *) &salt_pos[32]);
18818 salt->salt_buf[5] = hex_to_u32 ((const u8 *) &salt_pos[40]);
18819 salt->salt_buf[6] = hex_to_u32 ((const u8 *) &salt_pos[48]);
18820 salt->salt_buf[7] = hex_to_u32 ((const u8 *) &salt_pos[56]);
18821
18822 salt->salt_len = 32; // note we need to fix this to 16 in kernel
18823
18824 salt->salt_iter = 10 - 1;
18825
18826 /**
18827 * digest buf
18828 */
18829
18830 digest[0] = salt->salt_buf[4];
18831 digest[1] = salt->salt_buf[5];
18832 digest[2] = salt->salt_buf[6];
18833 digest[3] = salt->salt_buf[7];
18834
18835 return (PARSER_OK);
18836 }
18837
18838 int ms_drsr_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18839 {
18840 if ((input_len < DISPLAY_LEN_MIN_12800) || (input_len > DISPLAY_LEN_MAX_12800)) return (PARSER_GLOBAL_LENGTH);
18841
18842 if (memcmp (SIGNATURE_MS_DRSR, input_buf, 11)) return (PARSER_SIGNATURE_UNMATCHED);
18843
18844 u32 *digest = (u32 *) hash_buf->digest;
18845
18846 salt_t *salt = hash_buf->salt;
18847
18848 /**
18849 * parse line
18850 */
18851
18852 char *salt_pos = input_buf + 11 + 1;
18853
18854 char *iter_pos = strchr (salt_pos, ',');
18855
18856 if (iter_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18857
18858 u32 salt_len = iter_pos - salt_pos;
18859
18860 if (salt_len != 20) return (PARSER_SALT_LENGTH);
18861
18862 iter_pos++;
18863
18864 char *hash_pos = strchr (iter_pos, ',');
18865
18866 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18867
18868 u32 iter_len = hash_pos - iter_pos;
18869
18870 if (iter_len > 5) return (PARSER_SALT_LENGTH);
18871
18872 hash_pos++;
18873
18874 u32 hash_len = input_len - 11 - 1 - salt_len - 1 - iter_len - 1;
18875
18876 if (hash_len != 64) return (PARSER_HASH_LENGTH);
18877
18878 /**
18879 * salt
18880 */
18881
18882 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
18883 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
18884 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]) & 0xffff0000;
18885 salt->salt_buf[3] = 0x00018000;
18886
18887 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
18888 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
18889 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
18890 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
18891
18892 salt->salt_len = salt_len / 2;
18893
18894 salt->salt_iter = atoi (iter_pos) - 1;
18895
18896 /**
18897 * digest buf
18898 */
18899
18900 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
18901 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
18902 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
18903 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
18904 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
18905 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
18906 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
18907 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
18908
18909 return (PARSER_OK);
18910 }
18911
18912 int androidfde_samsung_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18913 {
18914 if ((input_len < DISPLAY_LEN_MIN_12900) || (input_len > DISPLAY_LEN_MAX_12900)) return (PARSER_GLOBAL_LENGTH);
18915
18916 u32 *digest = (u32 *) hash_buf->digest;
18917
18918 salt_t *salt = hash_buf->salt;
18919
18920 /**
18921 * parse line
18922 */
18923
18924 char *hash_pos = input_buf + 64;
18925 char *salt1_pos = input_buf + 128;
18926 char *salt2_pos = input_buf;
18927
18928 /**
18929 * salt
18930 */
18931
18932 salt->salt_buf[ 0] = hex_to_u32 ((const u8 *) &salt1_pos[ 0]);
18933 salt->salt_buf[ 1] = hex_to_u32 ((const u8 *) &salt1_pos[ 8]);
18934 salt->salt_buf[ 2] = hex_to_u32 ((const u8 *) &salt1_pos[16]);
18935 salt->salt_buf[ 3] = hex_to_u32 ((const u8 *) &salt1_pos[24]);
18936
18937 salt->salt_buf[ 4] = hex_to_u32 ((const u8 *) &salt2_pos[ 0]);
18938 salt->salt_buf[ 5] = hex_to_u32 ((const u8 *) &salt2_pos[ 8]);
18939 salt->salt_buf[ 6] = hex_to_u32 ((const u8 *) &salt2_pos[16]);
18940 salt->salt_buf[ 7] = hex_to_u32 ((const u8 *) &salt2_pos[24]);
18941
18942 salt->salt_buf[ 8] = hex_to_u32 ((const u8 *) &salt2_pos[32]);
18943 salt->salt_buf[ 9] = hex_to_u32 ((const u8 *) &salt2_pos[40]);
18944 salt->salt_buf[10] = hex_to_u32 ((const u8 *) &salt2_pos[48]);
18945 salt->salt_buf[11] = hex_to_u32 ((const u8 *) &salt2_pos[56]);
18946
18947 salt->salt_len = 48;
18948
18949 salt->salt_iter = ROUNDS_ANDROIDFDE_SAMSUNG - 1;
18950
18951 /**
18952 * digest buf
18953 */
18954
18955 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
18956 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
18957 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
18958 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
18959 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
18960 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
18961 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
18962 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
18963
18964 return (PARSER_OK);
18965 }
18966
18967 /**
18968 * parallel running threads
18969 */
18970
18971 #ifdef WIN
18972
18973 BOOL WINAPI sigHandler_default (DWORD sig)
18974 {
18975 switch (sig)
18976 {
18977 case CTRL_CLOSE_EVENT:
18978
18979 /*
18980 * special case see: https://stackoverflow.com/questions/3640633/c-setconsolectrlhandler-routine-issue/5610042#5610042
18981 * if the user interacts w/ the user-interface (GUI/cmd), we need to do the finalization job within this signal handler
18982 * function otherwise it is too late (e.g. after returning from this function)
18983 */
18984
18985 myabort ();
18986
18987 SetConsoleCtrlHandler (NULL, TRUE);
18988
18989 hc_sleep (10);
18990
18991 return TRUE;
18992
18993 case CTRL_C_EVENT:
18994 case CTRL_LOGOFF_EVENT:
18995 case CTRL_SHUTDOWN_EVENT:
18996
18997 myabort ();
18998
18999 SetConsoleCtrlHandler (NULL, TRUE);
19000
19001 return TRUE;
19002 }
19003
19004 return FALSE;
19005 }
19006
19007 BOOL WINAPI sigHandler_benchmark (DWORD sig)
19008 {
19009 switch (sig)
19010 {
19011 case CTRL_CLOSE_EVENT:
19012
19013 myabort ();
19014
19015 SetConsoleCtrlHandler (NULL, TRUE);
19016
19017 hc_sleep (10);
19018
19019 return TRUE;
19020
19021 case CTRL_C_EVENT:
19022 case CTRL_LOGOFF_EVENT:
19023 case CTRL_SHUTDOWN_EVENT:
19024
19025 myquit ();
19026
19027 SetConsoleCtrlHandler (NULL, TRUE);
19028
19029 return TRUE;
19030 }
19031
19032 return FALSE;
19033 }
19034
19035 void hc_signal (BOOL WINAPI (callback) (DWORD))
19036 {
19037 if (callback == NULL)
19038 {
19039 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, FALSE);
19040 }
19041 else
19042 {
19043 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, TRUE);
19044 }
19045 }
19046
19047 #else
19048
19049 void sigHandler_default (int sig)
19050 {
19051 myabort ();
19052
19053 signal (sig, NULL);
19054 }
19055
19056 void sigHandler_benchmark (int sig)
19057 {
19058 myquit ();
19059
19060 signal (sig, NULL);
19061 }
19062
19063 void hc_signal (void (callback) (int))
19064 {
19065 if (callback == NULL) callback = SIG_DFL;
19066
19067 signal (SIGINT, callback);
19068 signal (SIGTERM, callback);
19069 signal (SIGABRT, callback);
19070 }
19071
19072 #endif
19073
19074 void status_display ();
19075
19076 void *thread_keypress (void *p)
19077 {
19078 int benchmark = *((int *) p);
19079
19080 uint quiet = data.quiet;
19081
19082 tty_break();
19083
19084 while ((data.devices_status != STATUS_EXHAUSTED) && (data.devices_status != STATUS_CRACKED) && (data.devices_status != STATUS_ABORTED) && (data.devices_status != STATUS_QUIT))
19085 {
19086 int ch = tty_getchar();
19087
19088 if (ch == -1) break;
19089
19090 if (ch == 0) continue;
19091
19092 #ifdef _POSIX
19093 if (ch != '\n')
19094 #endif
19095
19096 hc_thread_mutex_lock (mux_display);
19097
19098 log_info ("");
19099
19100 switch (ch)
19101 {
19102 case 's':
19103 case '\n':
19104
19105 log_info ("");
19106
19107 status_display ();
19108
19109 log_info ("");
19110
19111 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19112 if (quiet == 0) fflush (stdout);
19113
19114 break;
19115
19116 case 'b':
19117
19118 log_info ("");
19119
19120 bypass ();
19121
19122 log_info ("");
19123
19124 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19125 if (quiet == 0) fflush (stdout);
19126
19127 break;
19128
19129 case 'p':
19130
19131 log_info ("");
19132
19133 SuspendThreads ();
19134
19135 log_info ("");
19136
19137 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19138 if (quiet == 0) fflush (stdout);
19139
19140 break;
19141
19142 case 'r':
19143
19144 log_info ("");
19145
19146 ResumeThreads ();
19147
19148 log_info ("");
19149
19150 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19151 if (quiet == 0) fflush (stdout);
19152
19153 break;
19154
19155 case 'c':
19156
19157 log_info ("");
19158
19159 if (benchmark == 1) break;
19160
19161 stop_at_checkpoint ();
19162
19163 log_info ("");
19164
19165 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19166 if (quiet == 0) fflush (stdout);
19167
19168 break;
19169
19170 case 'q':
19171
19172 log_info ("");
19173
19174 if (benchmark == 1)
19175 {
19176 myquit ();
19177 }
19178 else
19179 {
19180 myabort ();
19181 }
19182
19183 break;
19184 }
19185
19186 hc_thread_mutex_unlock (mux_display);
19187 }
19188
19189 tty_fix();
19190
19191 return (p);
19192 }
19193
19194 /**
19195 * rules common
19196 */
19197
19198 bool class_num (const u8 c)
19199 {
19200 return ((c >= '0') && (c <= '9'));
19201 }
19202
19203 bool class_lower (const u8 c)
19204 {
19205 return ((c >= 'a') && (c <= 'z'));
19206 }
19207
19208 bool class_upper (const u8 c)
19209 {
19210 return ((c >= 'A') && (c <= 'Z'));
19211 }
19212
19213 bool class_alpha (const u8 c)
19214 {
19215 return (class_lower (c) || class_upper (c));
19216 }
19217
19218 int conv_ctoi (const u8 c)
19219 {
19220 if (class_num (c))
19221 {
19222 return c - '0';
19223 }
19224 else if (class_upper (c))
19225 {
19226 return c - 'A' + 10;
19227 }
19228
19229 return -1;
19230 }
19231
19232 int conv_itoc (const u8 c)
19233 {
19234 if (c < 10)
19235 {
19236 return c + '0';
19237 }
19238 else if (c < 37)
19239 {
19240 return c + 'A' - 10;
19241 }
19242
19243 return -1;
19244 }
19245
19246 /**
19247 * device rules
19248 */
19249
19250 #define INCR_POS if (++rule_pos == rule_len) return (-1)
19251 #define SET_NAME(rule,val) (rule)->cmds[rule_cnt] = ((val) & 0xff) << 0
19252 #define SET_P0(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 8
19253 #define SET_P1(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 16
19254 #define MAX_KERNEL_RULES 255
19255 #define GET_NAME(rule) rule_cmd = (((rule)->cmds[rule_cnt] >> 0) & 0xff)
19256 #define GET_P0(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 8) & 0xff)
19257 #define GET_P1(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 16) & 0xff)
19258
19259 #define SET_P0_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 8
19260 #define SET_P1_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 16
19261 #define GET_P0_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 8) & 0xff)
19262 #define GET_P1_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 16) & 0xff)
19263
19264 int cpu_rule_to_kernel_rule (char rule_buf[BUFSIZ], uint rule_len, kernel_rule_t *rule)
19265 {
19266 uint rule_pos;
19267 uint rule_cnt;
19268
19269 for (rule_pos = 0, rule_cnt = 0; rule_pos < rule_len && rule_cnt < MAX_KERNEL_RULES; rule_pos++, rule_cnt++)
19270 {
19271 switch (rule_buf[rule_pos])
19272 {
19273 case ' ':
19274 rule_cnt--;
19275 break;
19276
19277 case RULE_OP_MANGLE_NOOP:
19278 SET_NAME (rule, rule_buf[rule_pos]);
19279 break;
19280
19281 case RULE_OP_MANGLE_LREST:
19282 SET_NAME (rule, rule_buf[rule_pos]);
19283 break;
19284
19285 case RULE_OP_MANGLE_UREST:
19286 SET_NAME (rule, rule_buf[rule_pos]);
19287 break;
19288
19289 case RULE_OP_MANGLE_LREST_UFIRST:
19290 SET_NAME (rule, rule_buf[rule_pos]);
19291 break;
19292
19293 case RULE_OP_MANGLE_UREST_LFIRST:
19294 SET_NAME (rule, rule_buf[rule_pos]);
19295 break;
19296
19297 case RULE_OP_MANGLE_TREST:
19298 SET_NAME (rule, rule_buf[rule_pos]);
19299 break;
19300
19301 case RULE_OP_MANGLE_TOGGLE_AT:
19302 SET_NAME (rule, rule_buf[rule_pos]);
19303 SET_P0_CONV (rule, rule_buf[rule_pos]);
19304 break;
19305
19306 case RULE_OP_MANGLE_REVERSE:
19307 SET_NAME (rule, rule_buf[rule_pos]);
19308 break;
19309
19310 case RULE_OP_MANGLE_DUPEWORD:
19311 SET_NAME (rule, rule_buf[rule_pos]);
19312 break;
19313
19314 case RULE_OP_MANGLE_DUPEWORD_TIMES:
19315 SET_NAME (rule, rule_buf[rule_pos]);
19316 SET_P0_CONV (rule, rule_buf[rule_pos]);
19317 break;
19318
19319 case RULE_OP_MANGLE_REFLECT:
19320 SET_NAME (rule, rule_buf[rule_pos]);
19321 break;
19322
19323 case RULE_OP_MANGLE_ROTATE_LEFT:
19324 SET_NAME (rule, rule_buf[rule_pos]);
19325 break;
19326
19327 case RULE_OP_MANGLE_ROTATE_RIGHT:
19328 SET_NAME (rule, rule_buf[rule_pos]);
19329 break;
19330
19331 case RULE_OP_MANGLE_APPEND:
19332 SET_NAME (rule, rule_buf[rule_pos]);
19333 SET_P0 (rule, rule_buf[rule_pos]);
19334 break;
19335
19336 case RULE_OP_MANGLE_PREPEND:
19337 SET_NAME (rule, rule_buf[rule_pos]);
19338 SET_P0 (rule, rule_buf[rule_pos]);
19339 break;
19340
19341 case RULE_OP_MANGLE_DELETE_FIRST:
19342 SET_NAME (rule, rule_buf[rule_pos]);
19343 break;
19344
19345 case RULE_OP_MANGLE_DELETE_LAST:
19346 SET_NAME (rule, rule_buf[rule_pos]);
19347 break;
19348
19349 case RULE_OP_MANGLE_DELETE_AT:
19350 SET_NAME (rule, rule_buf[rule_pos]);
19351 SET_P0_CONV (rule, rule_buf[rule_pos]);
19352 break;
19353
19354 case RULE_OP_MANGLE_EXTRACT:
19355 SET_NAME (rule, rule_buf[rule_pos]);
19356 SET_P0_CONV (rule, rule_buf[rule_pos]);
19357 SET_P1_CONV (rule, rule_buf[rule_pos]);
19358 break;
19359
19360 case RULE_OP_MANGLE_OMIT:
19361 SET_NAME (rule, rule_buf[rule_pos]);
19362 SET_P0_CONV (rule, rule_buf[rule_pos]);
19363 SET_P1_CONV (rule, rule_buf[rule_pos]);
19364 break;
19365
19366 case RULE_OP_MANGLE_INSERT:
19367 SET_NAME (rule, rule_buf[rule_pos]);
19368 SET_P0_CONV (rule, rule_buf[rule_pos]);
19369 SET_P1 (rule, rule_buf[rule_pos]);
19370 break;
19371
19372 case RULE_OP_MANGLE_OVERSTRIKE:
19373 SET_NAME (rule, rule_buf[rule_pos]);
19374 SET_P0_CONV (rule, rule_buf[rule_pos]);
19375 SET_P1 (rule, rule_buf[rule_pos]);
19376 break;
19377
19378 case RULE_OP_MANGLE_TRUNCATE_AT:
19379 SET_NAME (rule, rule_buf[rule_pos]);
19380 SET_P0_CONV (rule, rule_buf[rule_pos]);
19381 break;
19382
19383 case RULE_OP_MANGLE_REPLACE:
19384 SET_NAME (rule, rule_buf[rule_pos]);
19385 SET_P0 (rule, rule_buf[rule_pos]);
19386 SET_P1 (rule, rule_buf[rule_pos]);
19387 break;
19388
19389 case RULE_OP_MANGLE_PURGECHAR:
19390 return (-1);
19391 break;
19392
19393 case RULE_OP_MANGLE_TOGGLECASE_REC:
19394 return (-1);
19395 break;
19396
19397 case RULE_OP_MANGLE_DUPECHAR_FIRST:
19398 SET_NAME (rule, rule_buf[rule_pos]);
19399 SET_P0_CONV (rule, rule_buf[rule_pos]);
19400 break;
19401
19402 case RULE_OP_MANGLE_DUPECHAR_LAST:
19403 SET_NAME (rule, rule_buf[rule_pos]);
19404 SET_P0_CONV (rule, rule_buf[rule_pos]);
19405 break;
19406
19407 case RULE_OP_MANGLE_DUPECHAR_ALL:
19408 SET_NAME (rule, rule_buf[rule_pos]);
19409 break;
19410
19411 case RULE_OP_MANGLE_SWITCH_FIRST:
19412 SET_NAME (rule, rule_buf[rule_pos]);
19413 break;
19414
19415 case RULE_OP_MANGLE_SWITCH_LAST:
19416 SET_NAME (rule, rule_buf[rule_pos]);
19417 break;
19418
19419 case RULE_OP_MANGLE_SWITCH_AT:
19420 SET_NAME (rule, rule_buf[rule_pos]);
19421 SET_P0_CONV (rule, rule_buf[rule_pos]);
19422 SET_P1_CONV (rule, rule_buf[rule_pos]);
19423 break;
19424
19425 case RULE_OP_MANGLE_CHR_SHIFTL:
19426 SET_NAME (rule, rule_buf[rule_pos]);
19427 SET_P0_CONV (rule, rule_buf[rule_pos]);
19428 break;
19429
19430 case RULE_OP_MANGLE_CHR_SHIFTR:
19431 SET_NAME (rule, rule_buf[rule_pos]);
19432 SET_P0_CONV (rule, rule_buf[rule_pos]);
19433 break;
19434
19435 case RULE_OP_MANGLE_CHR_INCR:
19436 SET_NAME (rule, rule_buf[rule_pos]);
19437 SET_P0_CONV (rule, rule_buf[rule_pos]);
19438 break;
19439
19440 case RULE_OP_MANGLE_CHR_DECR:
19441 SET_NAME (rule, rule_buf[rule_pos]);
19442 SET_P0_CONV (rule, rule_buf[rule_pos]);
19443 break;
19444
19445 case RULE_OP_MANGLE_REPLACE_NP1:
19446 SET_NAME (rule, rule_buf[rule_pos]);
19447 SET_P0_CONV (rule, rule_buf[rule_pos]);
19448 break;
19449
19450 case RULE_OP_MANGLE_REPLACE_NM1:
19451 SET_NAME (rule, rule_buf[rule_pos]);
19452 SET_P0_CONV (rule, rule_buf[rule_pos]);
19453 break;
19454
19455 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
19456 SET_NAME (rule, rule_buf[rule_pos]);
19457 SET_P0_CONV (rule, rule_buf[rule_pos]);
19458 break;
19459
19460 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
19461 SET_NAME (rule, rule_buf[rule_pos]);
19462 SET_P0_CONV (rule, rule_buf[rule_pos]);
19463 break;
19464
19465 case RULE_OP_MANGLE_TITLE:
19466 SET_NAME (rule, rule_buf[rule_pos]);
19467 break;
19468
19469 default:
19470 return (-1);
19471 break;
19472 }
19473 }
19474
19475 if (rule_pos < rule_len) return (-1);
19476
19477 return (0);
19478 }
19479
19480 int kernel_rule_to_cpu_rule (char rule_buf[BUFSIZ], kernel_rule_t *rule)
19481 {
19482 uint rule_cnt;
19483 uint rule_pos;
19484 uint rule_len = BUFSIZ - 1; // maximum possible len
19485
19486 char rule_cmd;
19487
19488 for (rule_cnt = 0, rule_pos = 0; rule_pos < rule_len && rule_cnt < MAX_KERNEL_RULES; rule_pos++, rule_cnt++)
19489 {
19490 GET_NAME (rule);
19491
19492 if (rule_cnt > 0) rule_buf[rule_pos++] = ' ';
19493
19494 switch (rule_cmd)
19495 {
19496 case RULE_OP_MANGLE_NOOP:
19497 rule_buf[rule_pos] = rule_cmd;
19498 break;
19499
19500 case RULE_OP_MANGLE_LREST:
19501 rule_buf[rule_pos] = rule_cmd;
19502 break;
19503
19504 case RULE_OP_MANGLE_UREST:
19505 rule_buf[rule_pos] = rule_cmd;
19506 break;
19507
19508 case RULE_OP_MANGLE_LREST_UFIRST:
19509 rule_buf[rule_pos] = rule_cmd;
19510 break;
19511
19512 case RULE_OP_MANGLE_UREST_LFIRST:
19513 rule_buf[rule_pos] = rule_cmd;
19514 break;
19515
19516 case RULE_OP_MANGLE_TREST:
19517 rule_buf[rule_pos] = rule_cmd;
19518 break;
19519
19520 case RULE_OP_MANGLE_TOGGLE_AT:
19521 rule_buf[rule_pos] = rule_cmd;
19522 GET_P0_CONV (rule);
19523 break;
19524
19525 case RULE_OP_MANGLE_REVERSE:
19526 rule_buf[rule_pos] = rule_cmd;
19527 break;
19528
19529 case RULE_OP_MANGLE_DUPEWORD:
19530 rule_buf[rule_pos] = rule_cmd;
19531 break;
19532
19533 case RULE_OP_MANGLE_DUPEWORD_TIMES:
19534 rule_buf[rule_pos] = rule_cmd;
19535 GET_P0_CONV (rule);
19536 break;
19537
19538 case RULE_OP_MANGLE_REFLECT:
19539 rule_buf[rule_pos] = rule_cmd;
19540 break;
19541
19542 case RULE_OP_MANGLE_ROTATE_LEFT:
19543 rule_buf[rule_pos] = rule_cmd;
19544 break;
19545
19546 case RULE_OP_MANGLE_ROTATE_RIGHT:
19547 rule_buf[rule_pos] = rule_cmd;
19548 break;
19549
19550 case RULE_OP_MANGLE_APPEND:
19551 rule_buf[rule_pos] = rule_cmd;
19552 GET_P0 (rule);
19553 break;
19554
19555 case RULE_OP_MANGLE_PREPEND:
19556 rule_buf[rule_pos] = rule_cmd;
19557 GET_P0 (rule);
19558 break;
19559
19560 case RULE_OP_MANGLE_DELETE_FIRST:
19561 rule_buf[rule_pos] = rule_cmd;
19562 break;
19563
19564 case RULE_OP_MANGLE_DELETE_LAST:
19565 rule_buf[rule_pos] = rule_cmd;
19566 break;
19567
19568 case RULE_OP_MANGLE_DELETE_AT:
19569 rule_buf[rule_pos] = rule_cmd;
19570 GET_P0_CONV (rule);
19571 break;
19572
19573 case RULE_OP_MANGLE_EXTRACT:
19574 rule_buf[rule_pos] = rule_cmd;
19575 GET_P0_CONV (rule);
19576 GET_P1_CONV (rule);
19577 break;
19578
19579 case RULE_OP_MANGLE_OMIT:
19580 rule_buf[rule_pos] = rule_cmd;
19581 GET_P0_CONV (rule);
19582 GET_P1_CONV (rule);
19583 break;
19584
19585 case RULE_OP_MANGLE_INSERT:
19586 rule_buf[rule_pos] = rule_cmd;
19587 GET_P0_CONV (rule);
19588 GET_P1 (rule);
19589 break;
19590
19591 case RULE_OP_MANGLE_OVERSTRIKE:
19592 rule_buf[rule_pos] = rule_cmd;
19593 GET_P0_CONV (rule);
19594 GET_P1 (rule);
19595 break;
19596
19597 case RULE_OP_MANGLE_TRUNCATE_AT:
19598 rule_buf[rule_pos] = rule_cmd;
19599 GET_P0_CONV (rule);
19600 break;
19601
19602 case RULE_OP_MANGLE_REPLACE:
19603 rule_buf[rule_pos] = rule_cmd;
19604 GET_P0 (rule);
19605 GET_P1 (rule);
19606 break;
19607
19608 case RULE_OP_MANGLE_PURGECHAR:
19609 return (-1);
19610 break;
19611
19612 case RULE_OP_MANGLE_TOGGLECASE_REC:
19613 return (-1);
19614 break;
19615
19616 case RULE_OP_MANGLE_DUPECHAR_FIRST:
19617 rule_buf[rule_pos] = rule_cmd;
19618 GET_P0_CONV (rule);
19619 break;
19620
19621 case RULE_OP_MANGLE_DUPECHAR_LAST:
19622 rule_buf[rule_pos] = rule_cmd;
19623 GET_P0_CONV (rule);
19624 break;
19625
19626 case RULE_OP_MANGLE_DUPECHAR_ALL:
19627 rule_buf[rule_pos] = rule_cmd;
19628 break;
19629
19630 case RULE_OP_MANGLE_SWITCH_FIRST:
19631 rule_buf[rule_pos] = rule_cmd;
19632 break;
19633
19634 case RULE_OP_MANGLE_SWITCH_LAST:
19635 rule_buf[rule_pos] = rule_cmd;
19636 break;
19637
19638 case RULE_OP_MANGLE_SWITCH_AT:
19639 rule_buf[rule_pos] = rule_cmd;
19640 GET_P0_CONV (rule);
19641 GET_P1_CONV (rule);
19642 break;
19643
19644 case RULE_OP_MANGLE_CHR_SHIFTL:
19645 rule_buf[rule_pos] = rule_cmd;
19646 GET_P0_CONV (rule);
19647 break;
19648
19649 case RULE_OP_MANGLE_CHR_SHIFTR:
19650 rule_buf[rule_pos] = rule_cmd;
19651 GET_P0_CONV (rule);
19652 break;
19653
19654 case RULE_OP_MANGLE_CHR_INCR:
19655 rule_buf[rule_pos] = rule_cmd;
19656 GET_P0_CONV (rule);
19657 break;
19658
19659 case RULE_OP_MANGLE_CHR_DECR:
19660 rule_buf[rule_pos] = rule_cmd;
19661 GET_P0_CONV (rule);
19662 break;
19663
19664 case RULE_OP_MANGLE_REPLACE_NP1:
19665 rule_buf[rule_pos] = rule_cmd;
19666 GET_P0_CONV (rule);
19667 break;
19668
19669 case RULE_OP_MANGLE_REPLACE_NM1:
19670 rule_buf[rule_pos] = rule_cmd;
19671 GET_P0_CONV (rule);
19672 break;
19673
19674 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
19675 rule_buf[rule_pos] = rule_cmd;
19676 GET_P0_CONV (rule);
19677 break;
19678
19679 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
19680 rule_buf[rule_pos] = rule_cmd;
19681 GET_P0_CONV (rule);
19682 break;
19683
19684 case RULE_OP_MANGLE_TITLE:
19685 rule_buf[rule_pos] = rule_cmd;
19686 break;
19687
19688 case 0:
19689 return rule_pos - 1;
19690 break;
19691
19692 default:
19693 return (-1);
19694 break;
19695 }
19696 }
19697
19698 if (rule_cnt > 0)
19699 {
19700 return rule_pos;
19701 }
19702
19703 return (-1);
19704 }
19705
19706 /**
19707 * CPU rules : this is from hashcat sources, cpu based rules
19708 */
19709
19710 #define NEXT_RULEPOS(rp) if (++(rp) == rule_len) return (RULE_RC_SYNTAX_ERROR)
19711 #define NEXT_RPTOI(r,rp,up) if (((up) = conv_ctoi ((r)[(rp)])) == -1) return (RULE_RC_SYNTAX_ERROR)
19712
19713 #define MANGLE_TOGGLE_AT(a,p) if (class_alpha ((a)[(p)])) (a)[(p)] ^= 0x20
19714 #define MANGLE_LOWER_AT(a,p) if (class_upper ((a)[(p)])) (a)[(p)] ^= 0x20
19715 #define MANGLE_UPPER_AT(a,p) if (class_lower ((a)[(p)])) (a)[(p)] ^= 0x20
19716
19717 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); arr[(r)] = arr[(l)]; arr[(l)] = c; } */
19718 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); (a)[(r)] = (a)[(l)]; (a)[(l)] = c; } */
19719 #define MANGLE_SWITCH(a,l,r) { char c = (a)[(r)]; (a)[(r)] = (a)[(l)]; (a)[(l)] = c; }
19720
19721 int mangle_lrest (char arr[BLOCK_SIZE], int arr_len)
19722 {
19723 int pos;
19724
19725 for (pos = 0; pos < arr_len; pos++) MANGLE_LOWER_AT (arr, pos);
19726
19727 return (arr_len);
19728 }
19729
19730 int mangle_urest (char arr[BLOCK_SIZE], int arr_len)
19731 {
19732 int pos;
19733
19734 for (pos = 0; pos < arr_len; pos++) MANGLE_UPPER_AT (arr, pos);
19735
19736 return (arr_len);
19737 }
19738
19739 int mangle_trest (char arr[BLOCK_SIZE], int arr_len)
19740 {
19741 int pos;
19742
19743 for (pos = 0; pos < arr_len; pos++) MANGLE_TOGGLE_AT (arr, pos);
19744
19745 return (arr_len);
19746 }
19747
19748 int mangle_reverse (char arr[BLOCK_SIZE], int arr_len)
19749 {
19750 int l;
19751 int r;
19752
19753 for (l = 0; l < arr_len; l++)
19754 {
19755 r = arr_len - 1 - l;
19756
19757 if (l >= r) break;
19758
19759 MANGLE_SWITCH (arr, l, r);
19760 }
19761
19762 return (arr_len);
19763 }
19764
19765 int mangle_double (char arr[BLOCK_SIZE], int arr_len)
19766 {
19767 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
19768
19769 memcpy (&arr[arr_len], arr, (size_t) arr_len);
19770
19771 return (arr_len * 2);
19772 }
19773
19774 int mangle_double_times (char arr[BLOCK_SIZE], int arr_len, int times)
19775 {
19776 if (((arr_len * times) + arr_len) >= BLOCK_SIZE) return (arr_len);
19777
19778 int orig_len = arr_len;
19779
19780 int i;
19781
19782 for (i = 0; i < times; i++)
19783 {
19784 memcpy (&arr[arr_len], arr, orig_len);
19785
19786 arr_len += orig_len;
19787 }
19788
19789 return (arr_len);
19790 }
19791
19792 int mangle_reflect (char arr[BLOCK_SIZE], int arr_len)
19793 {
19794 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
19795
19796 mangle_double (arr, arr_len);
19797
19798 mangle_reverse (arr + arr_len, arr_len);
19799
19800 return (arr_len * 2);
19801 }
19802
19803 int mangle_rotate_left (char arr[BLOCK_SIZE], int arr_len)
19804 {
19805 int l;
19806 int r;
19807
19808 for (l = 0, r = arr_len - 1; r > 0; r--)
19809 {
19810 MANGLE_SWITCH (arr, l, r);
19811 }
19812
19813 return (arr_len);
19814 }
19815
19816 int mangle_rotate_right (char arr[BLOCK_SIZE], int arr_len)
19817 {
19818 int l;
19819 int r;
19820
19821 for (l = 0, r = arr_len - 1; l < r; l++)
19822 {
19823 MANGLE_SWITCH (arr, l, r);
19824 }
19825
19826 return (arr_len);
19827 }
19828
19829 int mangle_append (char arr[BLOCK_SIZE], int arr_len, char c)
19830 {
19831 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
19832
19833 arr[arr_len] = c;
19834
19835 return (arr_len + 1);
19836 }
19837
19838 int mangle_prepend (char arr[BLOCK_SIZE], int arr_len, char c)
19839 {
19840 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
19841
19842 int arr_pos;
19843
19844 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
19845 {
19846 arr[arr_pos + 1] = arr[arr_pos];
19847 }
19848
19849 arr[0] = c;
19850
19851 return (arr_len + 1);
19852 }
19853
19854 int mangle_delete_at (char arr[BLOCK_SIZE], int arr_len, int upos)
19855 {
19856 if (upos >= arr_len) return (arr_len);
19857
19858 int arr_pos;
19859
19860 for (arr_pos = upos; arr_pos < arr_len - 1; arr_pos++)
19861 {
19862 arr[arr_pos] = arr[arr_pos + 1];
19863 }
19864
19865 return (arr_len - 1);
19866 }
19867
19868 int mangle_extract (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
19869 {
19870 if (upos >= arr_len) return (arr_len);
19871
19872 if ((upos + ulen) > arr_len) return (arr_len);
19873
19874 int arr_pos;
19875
19876 for (arr_pos = 0; arr_pos < ulen; arr_pos++)
19877 {
19878 arr[arr_pos] = arr[upos + arr_pos];
19879 }
19880
19881 return (ulen);
19882 }
19883
19884 int mangle_omit (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
19885 {
19886 if (upos >= arr_len) return (arr_len);
19887
19888 if ((upos + ulen) >= arr_len) return (arr_len);
19889
19890 int arr_pos;
19891
19892 for (arr_pos = upos; arr_pos < arr_len - ulen; arr_pos++)
19893 {
19894 arr[arr_pos] = arr[arr_pos + ulen];
19895 }
19896
19897 return (arr_len - ulen);
19898 }
19899
19900 int mangle_insert (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
19901 {
19902 if (upos >= arr_len) return (arr_len);
19903
19904 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
19905
19906 int arr_pos;
19907
19908 for (arr_pos = arr_len - 1; arr_pos > upos - 1; arr_pos--)
19909 {
19910 arr[arr_pos + 1] = arr[arr_pos];
19911 }
19912
19913 arr[upos] = c;
19914
19915 return (arr_len + 1);
19916 }
19917
19918 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)
19919 {
19920 if ((arr_len + arr2_cpy) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
19921
19922 if (arr_pos > arr_len) return (RULE_RC_REJECT_ERROR);
19923
19924 if (arr2_pos > arr2_len) return (RULE_RC_REJECT_ERROR);
19925
19926 if ((arr2_pos + arr2_cpy) > arr2_len) return (RULE_RC_REJECT_ERROR);
19927
19928 if (arr2_cpy < 1) return (RULE_RC_SYNTAX_ERROR);
19929
19930 memcpy (arr2, arr2 + arr2_pos, arr2_len - arr2_pos);
19931
19932 memcpy (arr2 + arr2_cpy, arr + arr_pos, arr_len - arr_pos);
19933
19934 memcpy (arr + arr_pos, arr2, arr_len - arr_pos + arr2_cpy);
19935
19936 return (arr_len + arr2_cpy);
19937 }
19938
19939 int mangle_overstrike (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
19940 {
19941 if (upos >= arr_len) return (arr_len);
19942
19943 arr[upos] = c;
19944
19945 return (arr_len);
19946 }
19947
19948 int mangle_truncate_at (char arr[BLOCK_SIZE], int arr_len, int upos)
19949 {
19950 if (upos >= arr_len) return (arr_len);
19951
19952 memset (arr + upos, 0, arr_len - upos);
19953
19954 return (upos);
19955 }
19956
19957 int mangle_replace (char arr[BLOCK_SIZE], int arr_len, char oldc, char newc)
19958 {
19959 int arr_pos;
19960
19961 for (arr_pos = 0; arr_pos < arr_len; arr_pos++)
19962 {
19963 if (arr[arr_pos] != oldc) continue;
19964
19965 arr[arr_pos] = newc;
19966 }
19967
19968 return (arr_len);
19969 }
19970
19971 int mangle_purgechar (char arr[BLOCK_SIZE], int arr_len, char c)
19972 {
19973 int arr_pos;
19974
19975 int ret_len;
19976
19977 for (ret_len = 0, arr_pos = 0; arr_pos < arr_len; arr_pos++)
19978 {
19979 if (arr[arr_pos] == c) continue;
19980
19981 arr[ret_len] = arr[arr_pos];
19982
19983 ret_len++;
19984 }
19985
19986 return (ret_len);
19987 }
19988
19989 int mangle_dupeblock_prepend (char arr[BLOCK_SIZE], int arr_len, int ulen)
19990 {
19991 if (ulen > arr_len) return (arr_len);
19992
19993 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
19994
19995 char cs[100] = { 0 };
19996
19997 memcpy (cs, arr, ulen);
19998
19999 int i;
20000
20001 for (i = 0; i < ulen; i++)
20002 {
20003 char c = cs[i];
20004
20005 arr_len = mangle_insert (arr, arr_len, i, c);
20006 }
20007
20008 return (arr_len);
20009 }
20010
20011 int mangle_dupeblock_append (char arr[BLOCK_SIZE], int arr_len, int ulen)
20012 {
20013 if (ulen > arr_len) return (arr_len);
20014
20015 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
20016
20017 int upos = arr_len - ulen;
20018
20019 int i;
20020
20021 for (i = 0; i < ulen; i++)
20022 {
20023 char c = arr[upos + i];
20024
20025 arr_len = mangle_append (arr, arr_len, c);
20026 }
20027
20028 return (arr_len);
20029 }
20030
20031 int mangle_dupechar_at (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
20032 {
20033 if ( arr_len == 0) return (arr_len);
20034 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
20035
20036 char c = arr[upos];
20037
20038 int i;
20039
20040 for (i = 0; i < ulen; i++)
20041 {
20042 arr_len = mangle_insert (arr, arr_len, upos, c);
20043 }
20044
20045 return (arr_len);
20046 }
20047
20048 int mangle_dupechar (char arr[BLOCK_SIZE], int arr_len)
20049 {
20050 if ( arr_len == 0) return (arr_len);
20051 if ((arr_len + arr_len) >= BLOCK_SIZE) return (arr_len);
20052
20053 int arr_pos;
20054
20055 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
20056 {
20057 int new_pos = arr_pos * 2;
20058
20059 arr[new_pos] = arr[arr_pos];
20060
20061 arr[new_pos + 1] = arr[arr_pos];
20062 }
20063
20064 return (arr_len * 2);
20065 }
20066
20067 int mangle_switch_at_check (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
20068 {
20069 if (upos >= arr_len) return (arr_len);
20070 if (upos2 >= arr_len) return (arr_len);
20071
20072 MANGLE_SWITCH (arr, upos, upos2);
20073
20074 return (arr_len);
20075 }
20076
20077 int mangle_switch_at (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
20078 {
20079 MANGLE_SWITCH (arr, upos, upos2);
20080
20081 return (arr_len);
20082 }
20083
20084 int mangle_chr_shiftl (char arr[BLOCK_SIZE], int arr_len, int upos)
20085 {
20086 if (upos >= arr_len) return (arr_len);
20087
20088 arr[upos] <<= 1;
20089
20090 return (arr_len);
20091 }
20092
20093 int mangle_chr_shiftr (char arr[BLOCK_SIZE], int arr_len, int upos)
20094 {
20095 if (upos >= arr_len) return (arr_len);
20096
20097 arr[upos] >>= 1;
20098
20099 return (arr_len);
20100 }
20101
20102 int mangle_chr_incr (char arr[BLOCK_SIZE], int arr_len, int upos)
20103 {
20104 if (upos >= arr_len) return (arr_len);
20105
20106 arr[upos] += 1;
20107
20108 return (arr_len);
20109 }
20110
20111 int mangle_chr_decr (char arr[BLOCK_SIZE], int arr_len, int upos)
20112 {
20113 if (upos >= arr_len) return (arr_len);
20114
20115 arr[upos] -= 1;
20116
20117 return (arr_len);
20118 }
20119
20120 int mangle_title (char arr[BLOCK_SIZE], int arr_len)
20121 {
20122 int upper_next = 1;
20123
20124 int pos;
20125
20126 for (pos = 0; pos < arr_len; pos++)
20127 {
20128 if (arr[pos] == ' ')
20129 {
20130 upper_next = 1;
20131
20132 continue;
20133 }
20134
20135 if (upper_next)
20136 {
20137 upper_next = 0;
20138
20139 MANGLE_UPPER_AT (arr, pos);
20140 }
20141 else
20142 {
20143 MANGLE_LOWER_AT (arr, pos);
20144 }
20145 }
20146
20147 return (arr_len);
20148 }
20149
20150 int generate_random_rule (char rule_buf[RP_RULE_BUFSIZ], u32 rp_gen_func_min, u32 rp_gen_func_max)
20151 {
20152 u32 rp_gen_num = get_random_num (rp_gen_func_min, rp_gen_func_max);
20153
20154 u32 j;
20155
20156 u32 rule_pos = 0;
20157
20158 for (j = 0; j < rp_gen_num; j++)
20159 {
20160 u32 r = 0;
20161 u32 p1 = 0;
20162 u32 p2 = 0;
20163 u32 p3 = 0;
20164
20165 switch ((char) get_random_num (0, 9))
20166 {
20167 case 0:
20168 r = get_random_num (0, sizeof (grp_op_nop));
20169 rule_buf[rule_pos++] = grp_op_nop[r];
20170 break;
20171
20172 case 1:
20173 r = get_random_num (0, sizeof (grp_op_pos_p0));
20174 rule_buf[rule_pos++] = grp_op_pos_p0[r];
20175 p1 = get_random_num (0, sizeof (grp_pos));
20176 rule_buf[rule_pos++] = grp_pos[p1];
20177 break;
20178
20179 case 2:
20180 r = get_random_num (0, sizeof (grp_op_pos_p1));
20181 rule_buf[rule_pos++] = grp_op_pos_p1[r];
20182 p1 = get_random_num (1, 6);
20183 rule_buf[rule_pos++] = grp_pos[p1];
20184 break;
20185
20186 case 3:
20187 r = get_random_num (0, sizeof (grp_op_chr));
20188 rule_buf[rule_pos++] = grp_op_chr[r];
20189 p1 = get_random_num (0x20, 0x7e);
20190 rule_buf[rule_pos++] = (char) p1;
20191 break;
20192
20193 case 4:
20194 r = get_random_num (0, sizeof (grp_op_chr_chr));
20195 rule_buf[rule_pos++] = grp_op_chr_chr[r];
20196 p1 = get_random_num (0x20, 0x7e);
20197 rule_buf[rule_pos++] = (char) p1;
20198 p2 = get_random_num (0x20, 0x7e);
20199 while (p1 == p2)
20200 p2 = get_random_num (0x20, 0x7e);
20201 rule_buf[rule_pos++] = (char) p2;
20202 break;
20203
20204 case 5:
20205 r = get_random_num (0, sizeof (grp_op_pos_chr));
20206 rule_buf[rule_pos++] = grp_op_pos_chr[r];
20207 p1 = get_random_num (0, sizeof (grp_pos));
20208 rule_buf[rule_pos++] = grp_pos[p1];
20209 p2 = get_random_num (0x20, 0x7e);
20210 rule_buf[rule_pos++] = (char) p2;
20211 break;
20212
20213 case 6:
20214 r = get_random_num (0, sizeof (grp_op_pos_pos0));
20215 rule_buf[rule_pos++] = grp_op_pos_pos0[r];
20216 p1 = get_random_num (0, sizeof (grp_pos));
20217 rule_buf[rule_pos++] = grp_pos[p1];
20218 p2 = get_random_num (0, sizeof (grp_pos));
20219 while (p1 == p2)
20220 p2 = get_random_num (0, sizeof (grp_pos));
20221 rule_buf[rule_pos++] = grp_pos[p2];
20222 break;
20223
20224 case 7:
20225 r = get_random_num (0, sizeof (grp_op_pos_pos1));
20226 rule_buf[rule_pos++] = grp_op_pos_pos1[r];
20227 p1 = get_random_num (0, sizeof (grp_pos));
20228 rule_buf[rule_pos++] = grp_pos[p1];
20229 p2 = get_random_num (1, sizeof (grp_pos));
20230 while (p1 == p2)
20231 p2 = get_random_num (1, sizeof (grp_pos));
20232 rule_buf[rule_pos++] = grp_pos[p2];
20233 break;
20234
20235 case 8:
20236 r = get_random_num (0, sizeof (grp_op_pos1_pos2_pos3));
20237 rule_buf[rule_pos++] = grp_op_pos1_pos2_pos3[r];
20238 p1 = get_random_num (0, sizeof (grp_pos));
20239 rule_buf[rule_pos++] = grp_pos[p1];
20240 p2 = get_random_num (1, sizeof (grp_pos));
20241 rule_buf[rule_pos++] = grp_pos[p1];
20242 p3 = get_random_num (0, sizeof (grp_pos));
20243 rule_buf[rule_pos++] = grp_pos[p3];
20244 break;
20245 }
20246 }
20247
20248 return (rule_pos);
20249 }
20250
20251 int _old_apply_rule (char *rule, int rule_len, char in[BLOCK_SIZE], int in_len, char out[BLOCK_SIZE])
20252 {
20253 char mem[BLOCK_SIZE] = { 0 };
20254
20255 if (in == NULL) return (RULE_RC_REJECT_ERROR);
20256
20257 if (out == NULL) return (RULE_RC_REJECT_ERROR);
20258
20259 if (in_len < 1 || in_len > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
20260
20261 if (rule_len < 1) return (RULE_RC_REJECT_ERROR);
20262
20263 int out_len = in_len;
20264 int mem_len = in_len;
20265
20266 memcpy (out, in, out_len);
20267
20268 int rule_pos;
20269
20270 for (rule_pos = 0; rule_pos < rule_len; rule_pos++)
20271 {
20272 int upos, upos2;
20273 int ulen;
20274
20275 switch (rule[rule_pos])
20276 {
20277 case ' ':
20278 break;
20279
20280 case RULE_OP_MANGLE_NOOP:
20281 break;
20282
20283 case RULE_OP_MANGLE_LREST:
20284 out_len = mangle_lrest (out, out_len);
20285 break;
20286
20287 case RULE_OP_MANGLE_UREST:
20288 out_len = mangle_urest (out, out_len);
20289 break;
20290
20291 case RULE_OP_MANGLE_LREST_UFIRST:
20292 out_len = mangle_lrest (out, out_len);
20293 if (out_len) MANGLE_UPPER_AT (out, 0);
20294 break;
20295
20296 case RULE_OP_MANGLE_UREST_LFIRST:
20297 out_len = mangle_urest (out, out_len);
20298 if (out_len) MANGLE_LOWER_AT (out, 0);
20299 break;
20300
20301 case RULE_OP_MANGLE_TREST:
20302 out_len = mangle_trest (out, out_len);
20303 break;
20304
20305 case RULE_OP_MANGLE_TOGGLE_AT:
20306 NEXT_RULEPOS (rule_pos);
20307 NEXT_RPTOI (rule, rule_pos, upos);
20308 if (upos < out_len) MANGLE_TOGGLE_AT (out, upos);
20309 break;
20310
20311 case RULE_OP_MANGLE_REVERSE:
20312 out_len = mangle_reverse (out, out_len);
20313 break;
20314
20315 case RULE_OP_MANGLE_DUPEWORD:
20316 out_len = mangle_double (out, out_len);
20317 break;
20318
20319 case RULE_OP_MANGLE_DUPEWORD_TIMES:
20320 NEXT_RULEPOS (rule_pos);
20321 NEXT_RPTOI (rule, rule_pos, ulen);
20322 out_len = mangle_double_times (out, out_len, ulen);
20323 break;
20324
20325 case RULE_OP_MANGLE_REFLECT:
20326 out_len = mangle_reflect (out, out_len);
20327 break;
20328
20329 case RULE_OP_MANGLE_ROTATE_LEFT:
20330 mangle_rotate_left (out, out_len);
20331 break;
20332
20333 case RULE_OP_MANGLE_ROTATE_RIGHT:
20334 mangle_rotate_right (out, out_len);
20335 break;
20336
20337 case RULE_OP_MANGLE_APPEND:
20338 NEXT_RULEPOS (rule_pos);
20339 out_len = mangle_append (out, out_len, rule[rule_pos]);
20340 break;
20341
20342 case RULE_OP_MANGLE_PREPEND:
20343 NEXT_RULEPOS (rule_pos);
20344 out_len = mangle_prepend (out, out_len, rule[rule_pos]);
20345 break;
20346
20347 case RULE_OP_MANGLE_DELETE_FIRST:
20348 out_len = mangle_delete_at (out, out_len, 0);
20349 break;
20350
20351 case RULE_OP_MANGLE_DELETE_LAST:
20352 out_len = mangle_delete_at (out, out_len, (out_len) ? out_len - 1 : 0);
20353 break;
20354
20355 case RULE_OP_MANGLE_DELETE_AT:
20356 NEXT_RULEPOS (rule_pos);
20357 NEXT_RPTOI (rule, rule_pos, upos);
20358 out_len = mangle_delete_at (out, out_len, upos);
20359 break;
20360
20361 case RULE_OP_MANGLE_EXTRACT:
20362 NEXT_RULEPOS (rule_pos);
20363 NEXT_RPTOI (rule, rule_pos, upos);
20364 NEXT_RULEPOS (rule_pos);
20365 NEXT_RPTOI (rule, rule_pos, ulen);
20366 out_len = mangle_extract (out, out_len, upos, ulen);
20367 break;
20368
20369 case RULE_OP_MANGLE_OMIT:
20370 NEXT_RULEPOS (rule_pos);
20371 NEXT_RPTOI (rule, rule_pos, upos);
20372 NEXT_RULEPOS (rule_pos);
20373 NEXT_RPTOI (rule, rule_pos, ulen);
20374 out_len = mangle_omit (out, out_len, upos, ulen);
20375 break;
20376
20377 case RULE_OP_MANGLE_INSERT:
20378 NEXT_RULEPOS (rule_pos);
20379 NEXT_RPTOI (rule, rule_pos, upos);
20380 NEXT_RULEPOS (rule_pos);
20381 out_len = mangle_insert (out, out_len, upos, rule[rule_pos]);
20382 break;
20383
20384 case RULE_OP_MANGLE_OVERSTRIKE:
20385 NEXT_RULEPOS (rule_pos);
20386 NEXT_RPTOI (rule, rule_pos, upos);
20387 NEXT_RULEPOS (rule_pos);
20388 out_len = mangle_overstrike (out, out_len, upos, rule[rule_pos]);
20389 break;
20390
20391 case RULE_OP_MANGLE_TRUNCATE_AT:
20392 NEXT_RULEPOS (rule_pos);
20393 NEXT_RPTOI (rule, rule_pos, upos);
20394 out_len = mangle_truncate_at (out, out_len, upos);
20395 break;
20396
20397 case RULE_OP_MANGLE_REPLACE:
20398 NEXT_RULEPOS (rule_pos);
20399 NEXT_RULEPOS (rule_pos);
20400 out_len = mangle_replace (out, out_len, rule[rule_pos - 1], rule[rule_pos]);
20401 break;
20402
20403 case RULE_OP_MANGLE_PURGECHAR:
20404 NEXT_RULEPOS (rule_pos);
20405 out_len = mangle_purgechar (out, out_len, rule[rule_pos]);
20406 break;
20407
20408 case RULE_OP_MANGLE_TOGGLECASE_REC:
20409 /* todo */
20410 break;
20411
20412 case RULE_OP_MANGLE_DUPECHAR_FIRST:
20413 NEXT_RULEPOS (rule_pos);
20414 NEXT_RPTOI (rule, rule_pos, ulen);
20415 out_len = mangle_dupechar_at (out, out_len, 0, ulen);
20416 break;
20417
20418 case RULE_OP_MANGLE_DUPECHAR_LAST:
20419 NEXT_RULEPOS (rule_pos);
20420 NEXT_RPTOI (rule, rule_pos, ulen);
20421 out_len = mangle_dupechar_at (out, out_len, out_len - 1, ulen);
20422 break;
20423
20424 case RULE_OP_MANGLE_DUPECHAR_ALL:
20425 out_len = mangle_dupechar (out, out_len);
20426 break;
20427
20428 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
20429 NEXT_RULEPOS (rule_pos);
20430 NEXT_RPTOI (rule, rule_pos, ulen);
20431 out_len = mangle_dupeblock_prepend (out, out_len, ulen);
20432 break;
20433
20434 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
20435 NEXT_RULEPOS (rule_pos);
20436 NEXT_RPTOI (rule, rule_pos, ulen);
20437 out_len = mangle_dupeblock_append (out, out_len, ulen);
20438 break;
20439
20440 case RULE_OP_MANGLE_SWITCH_FIRST:
20441 if (out_len >= 2) mangle_switch_at (out, out_len, 0, 1);
20442 break;
20443
20444 case RULE_OP_MANGLE_SWITCH_LAST:
20445 if (out_len >= 2) mangle_switch_at (out, out_len, out_len - 1, out_len - 2);
20446 break;
20447
20448 case RULE_OP_MANGLE_SWITCH_AT:
20449 NEXT_RULEPOS (rule_pos);
20450 NEXT_RPTOI (rule, rule_pos, upos);
20451 NEXT_RULEPOS (rule_pos);
20452 NEXT_RPTOI (rule, rule_pos, upos2);
20453 out_len = mangle_switch_at_check (out, out_len, upos, upos2);
20454 break;
20455
20456 case RULE_OP_MANGLE_CHR_SHIFTL:
20457 NEXT_RULEPOS (rule_pos);
20458 NEXT_RPTOI (rule, rule_pos, upos);
20459 mangle_chr_shiftl (out, out_len, upos);
20460 break;
20461
20462 case RULE_OP_MANGLE_CHR_SHIFTR:
20463 NEXT_RULEPOS (rule_pos);
20464 NEXT_RPTOI (rule, rule_pos, upos);
20465 mangle_chr_shiftr (out, out_len, upos);
20466 break;
20467
20468 case RULE_OP_MANGLE_CHR_INCR:
20469 NEXT_RULEPOS (rule_pos);
20470 NEXT_RPTOI (rule, rule_pos, upos);
20471 mangle_chr_incr (out, out_len, upos);
20472 break;
20473
20474 case RULE_OP_MANGLE_CHR_DECR:
20475 NEXT_RULEPOS (rule_pos);
20476 NEXT_RPTOI (rule, rule_pos, upos);
20477 mangle_chr_decr (out, out_len, upos);
20478 break;
20479
20480 case RULE_OP_MANGLE_REPLACE_NP1:
20481 NEXT_RULEPOS (rule_pos);
20482 NEXT_RPTOI (rule, rule_pos, upos);
20483 if ((upos >= 0) && ((upos + 1) < out_len)) mangle_overstrike (out, out_len, upos, out[upos + 1]);
20484 break;
20485
20486 case RULE_OP_MANGLE_REPLACE_NM1:
20487 NEXT_RULEPOS (rule_pos);
20488 NEXT_RPTOI (rule, rule_pos, upos);
20489 if ((upos >= 1) && ((upos + 0) < out_len)) mangle_overstrike (out, out_len, upos, out[upos - 1]);
20490 break;
20491
20492 case RULE_OP_MANGLE_TITLE:
20493 out_len = mangle_title (out, out_len);
20494 break;
20495
20496 case RULE_OP_MANGLE_EXTRACT_MEMORY:
20497 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20498 NEXT_RULEPOS (rule_pos);
20499 NEXT_RPTOI (rule, rule_pos, upos);
20500 NEXT_RULEPOS (rule_pos);
20501 NEXT_RPTOI (rule, rule_pos, ulen);
20502 NEXT_RULEPOS (rule_pos);
20503 NEXT_RPTOI (rule, rule_pos, upos2);
20504 if ((out_len = mangle_insert_multi (out, out_len, upos2, mem, mem_len, upos, ulen)) < 1) return (out_len);
20505 break;
20506
20507 case RULE_OP_MANGLE_APPEND_MEMORY:
20508 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20509 if ((out_len + mem_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
20510 memcpy (out + out_len, mem, mem_len);
20511 out_len += mem_len;
20512 break;
20513
20514 case RULE_OP_MANGLE_PREPEND_MEMORY:
20515 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20516 if ((mem_len + out_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
20517 memcpy (mem + mem_len, out, out_len);
20518 out_len += mem_len;
20519 memcpy (out, mem, out_len);
20520 break;
20521
20522 case RULE_OP_MEMORIZE_WORD:
20523 memcpy (mem, out, out_len);
20524 mem_len = out_len;
20525 break;
20526
20527 case RULE_OP_REJECT_LESS:
20528 NEXT_RULEPOS (rule_pos);
20529 NEXT_RPTOI (rule, rule_pos, upos);
20530 if (out_len > upos) return (RULE_RC_REJECT_ERROR);
20531 break;
20532
20533 case RULE_OP_REJECT_GREATER:
20534 NEXT_RULEPOS (rule_pos);
20535 NEXT_RPTOI (rule, rule_pos, upos);
20536 if (out_len < upos) return (RULE_RC_REJECT_ERROR);
20537 break;
20538
20539 case RULE_OP_REJECT_CONTAIN:
20540 NEXT_RULEPOS (rule_pos);
20541 if (strchr (out, rule[rule_pos]) != NULL) return (RULE_RC_REJECT_ERROR);
20542 break;
20543
20544 case RULE_OP_REJECT_NOT_CONTAIN:
20545 NEXT_RULEPOS (rule_pos);
20546 if (strchr (out, rule[rule_pos]) == NULL) return (RULE_RC_REJECT_ERROR);
20547 break;
20548
20549 case RULE_OP_REJECT_EQUAL_FIRST:
20550 NEXT_RULEPOS (rule_pos);
20551 if (out[0] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20552 break;
20553
20554 case RULE_OP_REJECT_EQUAL_LAST:
20555 NEXT_RULEPOS (rule_pos);
20556 if (out[out_len - 1] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20557 break;
20558
20559 case RULE_OP_REJECT_EQUAL_AT:
20560 NEXT_RULEPOS (rule_pos);
20561 NEXT_RPTOI (rule, rule_pos, upos);
20562 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
20563 NEXT_RULEPOS (rule_pos);
20564 if (out[upos] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20565 break;
20566
20567 case RULE_OP_REJECT_CONTAINS:
20568 NEXT_RULEPOS (rule_pos);
20569 NEXT_RPTOI (rule, rule_pos, upos);
20570 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
20571 NEXT_RULEPOS (rule_pos);
20572 int c; int cnt; for (c = 0, cnt = 0; c < out_len; c++) if (out[c] == rule[rule_pos]) cnt++;
20573 if (cnt < upos) return (RULE_RC_REJECT_ERROR);
20574 break;
20575
20576 case RULE_OP_REJECT_MEMORY:
20577 if ((out_len == mem_len) && (memcmp (out, mem, out_len) == 0)) return (RULE_RC_REJECT_ERROR);
20578 break;
20579
20580 default:
20581 return (RULE_RC_SYNTAX_ERROR);
20582 break;
20583 }
20584 }
20585
20586 memset (out + out_len, 0, BLOCK_SIZE - out_len);
20587
20588 return (out_len);
20589 }