implements the enhancement mentioned in issue #10 (cancel on next checkpoint)
[hashcat.git] / src / shared.c
1 /**
2 * Author......: Jens Steube <jens.steube@gmail.com>
3 * License.....: MIT
4 */
5
6 #include <shared.h>
7 #include <limits.h>
8
9 #define MIN(a,b) (((a) < (b)) ? (a) : (b))
10 #define MAX(a,b) (((a) > (b)) ? (a) : (b))
11
12 /**
13 * tuning tools
14 */
15
16 #ifdef _CUDA
17 #define GET_ACCEL(x) GPU_ACCEL_NV_ ## x
18 #define GET_LOOPS(x) GPU_LOOPS_NV_ ## x
19 #elif _OCL
20 #define GET_ACCEL(x) GPU_ACCEL_AMD_ ## x
21 #define GET_LOOPS(x) GPU_LOOPS_AMD_ ## x
22 #endif
23
24 /**
25 * bit rotate
26 */
27
28 uint32_t rotl32 (const uint32_t a, const uint n)
29 {
30 return ((a << n) | (a >> (32 - n)));
31 }
32
33 uint32_t rotr32 (const uint32_t a, const uint n)
34 {
35 return ((a >> n) | (a << (32 - n)));
36 }
37
38 uint64_t rotl64 (const uint64_t a, const uint n)
39 {
40 return ((a << n) | (a >> (64 - n)));
41 }
42
43 uint64_t rotr64 (const uint64_t a, const uint n)
44 {
45 return ((a >> n) | (a << (64 - n)));
46 }
47
48 /**
49 * ciphers for use on cpu
50 */
51
52 #include "cpu-des.c"
53 #include "cpu-aes.c"
54
55 /**
56 * hashes for use on cpu
57 */
58
59 #include "cpu-md5.c"
60 #include "cpu-sha256.c"
61
62 /**
63 * logging
64 */
65
66 int last_len = 0;
67
68 void log_final (FILE *fp, const char *fmt, va_list ap)
69 {
70 if (last_len)
71 {
72 fputc ('\r', fp);
73
74 for (int i = 0; i < last_len; i++)
75 {
76 fputc (' ', fp);
77 }
78
79 fputc ('\r', fp);
80 }
81
82 char s[4096];
83
84 int max_len = (int) sizeof (s);
85
86 int len = vsnprintf (s, max_len, fmt, ap);
87
88 if (len > max_len) len = max_len;
89
90 fwrite (s, len, 1, fp);
91
92 fflush (fp);
93
94 last_len = len;
95 }
96
97 void log_out_nn (FILE *fp, const char *fmt, ...)
98 {
99 if (SUPPRESS_OUTPUT) return;
100
101 va_list ap;
102
103 va_start (ap, fmt);
104
105 log_final (fp, fmt, ap);
106
107 va_end (ap);
108 }
109
110 void log_info_nn (const char *fmt, ...)
111 {
112 if (SUPPRESS_OUTPUT) return;
113
114 va_list ap;
115
116 va_start (ap, fmt);
117
118 log_final (stdout, fmt, ap);
119
120 va_end (ap);
121 }
122
123 void log_error_nn (const char *fmt, ...)
124 {
125 if (SUPPRESS_OUTPUT) return;
126
127 va_list ap;
128
129 va_start (ap, fmt);
130
131 log_final (stderr, fmt, ap);
132
133 va_end (ap);
134 }
135
136 void log_out (FILE *fp, const char *fmt, ...)
137 {
138 if (SUPPRESS_OUTPUT) return;
139
140 va_list ap;
141
142 va_start (ap, fmt);
143
144 log_final (fp, fmt, ap);
145
146 va_end (ap);
147
148 fputc ('\n', fp);
149
150 last_len = 0;
151 }
152
153 void log_info (const char *fmt, ...)
154 {
155 if (SUPPRESS_OUTPUT) return;
156
157 va_list ap;
158
159 va_start (ap, fmt);
160
161 log_final (stdout, fmt, ap);
162
163 va_end (ap);
164
165 fputc ('\n', stdout);
166
167 last_len = 0;
168 }
169
170 void log_error (const char *fmt, ...)
171 {
172 if (SUPPRESS_OUTPUT) return;
173
174 fputc ('\n', stderr);
175 fputc ('\n', stderr);
176
177 va_list ap;
178
179 va_start (ap, fmt);
180
181 log_final (stderr, fmt, ap);
182
183 va_end (ap);
184
185 fputc ('\n', stderr);
186 fputc ('\n', stderr);
187
188 last_len = 0;
189 }
190
191 /**
192 * converter
193 */
194
195 uint byte_swap_32 (const uint n)
196 {
197 return (n & 0xff000000) >> 24
198 | (n & 0x00ff0000) >> 8
199 | (n & 0x0000ff00) << 8
200 | (n & 0x000000ff) << 24;
201 }
202
203 uint64_t byte_swap_64 (const uint64_t n)
204 {
205 return (n & 0xff00000000000000ULL) >> 56
206 | (n & 0x00ff000000000000ULL) >> 40
207 | (n & 0x0000ff0000000000ULL) >> 24
208 | (n & 0x000000ff00000000ULL) >> 8
209 | (n & 0x00000000ff000000ULL) << 8
210 | (n & 0x0000000000ff0000ULL) << 24
211 | (n & 0x000000000000ff00ULL) << 40
212 | (n & 0x00000000000000ffULL) << 56;
213 }
214
215 char int_to_base32 (const char c)
216 {
217 static const char tbl[0x20] =
218 {
219 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50,
220 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
221 };
222
223 return tbl[(const uint8_t) c];
224 }
225
226 char base32_to_int (const char c)
227 {
228 if ((c >= 'A') && (c <= 'Z')) return c - 'A';
229 else if ((c >= '2') && (c <= '7')) return c - '2' + 26;
230
231 return 0;
232 }
233
234 char int_to_itoa32 (const char c)
235 {
236 static const char tbl[0x20] =
237 {
238 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66,
239 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76,
240 };
241
242 return tbl[(const uint8_t) c];
243 }
244
245 char itoa32_to_int (const char c)
246 {
247 if ((c >= '0') && (c <= '9')) return c - '0';
248 else if ((c >= 'a') && (c <= 'v')) return c - 'a' + 10;
249
250 return 0;
251 }
252
253 char int_to_itoa64 (const char c)
254 {
255 static const char tbl[0x40] =
256 {
257 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44,
258 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54,
259 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a,
260 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a,
261 };
262
263 return tbl[(const uint8_t) c];
264 }
265
266 char itoa64_to_int (const char c)
267 {
268 static const char tbl[0x100] =
269 {
270 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21,
271 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31,
272 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01,
273 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a,
274 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a,
275 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x20, 0x21, 0x22, 0x23, 0x24,
276 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34,
277 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01, 0x02, 0x03, 0x04,
278 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14,
279 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24,
280 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34,
281 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01, 0x02, 0x03, 0x04,
282 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14,
283 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24,
284 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34,
285 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01, 0x02, 0x03, 0x04,
286 };
287
288 return tbl[(const uint8_t) c];
289 }
290
291 char int_to_base64 (const char c)
292 {
293 static const char tbl[0x40] =
294 {
295 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50,
296 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66,
297 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76,
298 0x77, 0x78, 0x79, 0x7a, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x2b, 0x2f,
299 };
300
301 return tbl[(const uint8_t) c];
302 }
303
304 char base64_to_int (const char c)
305 {
306 static const char tbl[0x100] =
307 {
308 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
309 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
310 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x3f,
311 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
312 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
313 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00,
314 0x00, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,
315 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 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 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
323 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
324 };
325
326 return tbl[(const uint8_t) c];
327 }
328
329 char int_to_bf64 (const char c)
330 {
331 static const char tbl[0x40] =
332 {
333 0x2e, 0x2f, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e,
334 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64,
335 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74,
336 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
337 };
338
339 return tbl[(const uint8_t) c];
340 }
341
342 char bf64_to_int (const char c)
343 {
344 static const char tbl[0x100] =
345 {
346 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
347 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
348 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
349 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
350 0x00, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
351 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00,
352 0x00, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a,
353 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 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 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
361 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
362 };
363
364 return tbl[(const uint8_t) c];
365 }
366
367 char int_to_lotus64 (const char c)
368 {
369 if (c < 10) return '0' + c;
370 else if (c < 36) return 'A' + c - 10;
371 else if (c < 62) return 'a' + c - 36;
372 else if (c == 62) return '+';
373 else if (c == 63) return '/';
374
375 return 0;
376 }
377
378 char lotus64_to_int (const char c)
379 {
380 if ((c >= '0') && (c <= '9')) return c - '0';
381 else if ((c >= 'A') && (c <= 'Z')) return c - 'A' + 10;
382 else if ((c >= 'a') && (c <= 'z')) return c - 'a' + 36;
383 else if (c == '+') return 62;
384 else if (c == '/') return 63;
385 else
386
387 return 0;
388 }
389
390 int base32_decode (char (*f) (const char), char *in_buf, int in_len, char *out_buf)
391 {
392 char *in_ptr = in_buf;
393
394 char *out_ptr = out_buf;
395
396 for (int i = 0; i < in_len; i += 8)
397 {
398 char out_val0 = f (in_ptr[0] & 0x7f);
399 char out_val1 = f (in_ptr[1] & 0x7f);
400 char out_val2 = f (in_ptr[2] & 0x7f);
401 char out_val3 = f (in_ptr[3] & 0x7f);
402 char out_val4 = f (in_ptr[4] & 0x7f);
403 char out_val5 = f (in_ptr[5] & 0x7f);
404 char out_val6 = f (in_ptr[6] & 0x7f);
405 char out_val7 = f (in_ptr[7] & 0x7f);
406
407 out_ptr[0] = ((out_val0 << 3) & 0xf8) | ((out_val1 >> 2) & 0x07);
408 out_ptr[1] = ((out_val1 << 6) & 0xc0) | ((out_val2 << 1) & 0x3e) | ((out_val3 >> 4) & 0x01);
409 out_ptr[2] = ((out_val3 << 4) & 0xf0) | ((out_val4 >> 1) & 0x0f);
410 out_ptr[3] = ((out_val4 << 7) & 0x80) | ((out_val5 << 2) & 0x7c) | ((out_val6 >> 3) & 0x03);
411 out_ptr[4] = ((out_val6 << 5) & 0xe0) | ((out_val7 >> 0) & 0x1f);
412
413 in_ptr += 8;
414 out_ptr += 5;
415 }
416
417 for (int i = 0; i < in_len; i++)
418 {
419 if (in_buf[i] != '=') continue;
420
421 in_len = i;
422 }
423
424 int out_len = (in_len * 5) / 8;
425
426 return out_len;
427 }
428
429 int base32_encode (char (*f) (const char), char *in_buf, int in_len, char *out_buf)
430 {
431 char *in_ptr = in_buf;
432
433 char *out_ptr = out_buf;
434
435 for (int i = 0; i < in_len; i += 5)
436 {
437 char out_val0 = f ( ((in_ptr[0] >> 3) & 0x1f));
438 char out_val1 = f (((in_ptr[0] << 2) & 0x1c) | ((in_ptr[1] >> 6) & 0x03));
439 char out_val2 = f ( ((in_ptr[1] >> 1) & 0x1f));
440 char out_val3 = f (((in_ptr[1] << 4) & 0x10) | ((in_ptr[2] >> 4) & 0x0f));
441 char out_val4 = f (((in_ptr[2] << 1) & 0x1e) | ((in_ptr[3] >> 7) & 0x01));
442 char out_val5 = f ( ((in_ptr[3] >> 2) & 0x1f));
443 char out_val6 = f (((in_ptr[3] << 3) & 0x18) | ((in_ptr[4] >> 5) & 0x07));
444 char out_val7 = f ( ((in_ptr[4] >> 0) & 0x1f));
445
446 out_ptr[0] = out_val0 & 0x7f;
447 out_ptr[1] = out_val1 & 0x7f;
448 out_ptr[2] = out_val2 & 0x7f;
449 out_ptr[3] = out_val3 & 0x7f;
450 out_ptr[4] = out_val4 & 0x7f;
451 out_ptr[5] = out_val5 & 0x7f;
452 out_ptr[6] = out_val6 & 0x7f;
453 out_ptr[7] = out_val7 & 0x7f;
454
455 in_ptr += 5;
456 out_ptr += 8;
457 }
458
459 int out_len = (in_len * 8) / 5;
460
461 for (int i = 0; i < (7 - (in_len % 7)); i++)
462 {
463 out_len++;
464
465 out_buf[out_len] = '=';
466 }
467
468 return out_len;
469 }
470
471 int base64_decode (char (*f) (const char), char *in_buf, int in_len, char *out_buf)
472 {
473 char *in_ptr = in_buf;
474
475 char *out_ptr = out_buf;
476
477 for (int i = 0; i < in_len; i += 4)
478 {
479 char out_val0 = f (in_ptr[0] & 0x7f);
480 char out_val1 = f (in_ptr[1] & 0x7f);
481 char out_val2 = f (in_ptr[2] & 0x7f);
482 char out_val3 = f (in_ptr[3] & 0x7f);
483
484 out_ptr[0] = ((out_val0 << 2) & 0xfc) | ((out_val1 >> 4) & 0x03);
485 out_ptr[1] = ((out_val1 << 4) & 0xf0) | ((out_val2 >> 2) & 0x0f);
486 out_ptr[2] = ((out_val2 << 6) & 0xc0) | ((out_val3 >> 0) & 0x3f);
487
488 in_ptr += 4;
489 out_ptr += 3;
490 }
491
492 for (int i = 0; i < in_len; i++)
493 {
494 if (in_buf[i] != '=') continue;
495
496 in_len = i;
497 }
498
499 int out_len = (in_len * 6) / 8;
500
501 return out_len;
502 }
503
504 int base64_encode (char (*f) (const char), char *in_buf, int in_len, char *out_buf)
505 {
506 char *in_ptr = in_buf;
507
508 char *out_ptr = out_buf;
509
510 for (int i = 0; i < in_len; i += 3)
511 {
512 char out_val0 = f ( ((in_ptr[0] >> 2) & 0x3f));
513 char out_val1 = f (((in_ptr[0] << 4) & 0x30) | ((in_ptr[1] >> 4) & 0x0f));
514 char out_val2 = f (((in_ptr[1] << 2) & 0x3c) | ((in_ptr[2] >> 6) & 0x03));
515 char out_val3 = f ( ((in_ptr[2] >> 0) & 0x3f));
516
517 out_ptr[0] = out_val0 & 0x7f;
518 out_ptr[1] = out_val1 & 0x7f;
519 out_ptr[2] = out_val2 & 0x7f;
520 out_ptr[3] = out_val3 & 0x7f;
521
522 in_ptr += 3;
523 out_ptr += 4;
524 }
525
526 int out_len = (in_len * 8) / 6;
527
528 for (int i = 0; i < (3 - (in_len % 3)); i++)
529 {
530 out_len++;
531
532 out_buf[out_len] = '=';
533 }
534
535 return out_len;
536 }
537
538 static void AES128_decrypt_cbc (const uint key[4], const uint iv[4], const uint in[16], uint out[16])
539 {
540 AES_KEY skey;
541
542 AES_set_decrypt_key ((unsigned char *) key, 128, &skey);
543
544 uint _iv[4];
545
546 _iv[0] = iv[0];
547 _iv[1] = iv[1];
548 _iv[2] = iv[2];
549 _iv[3] = iv[3];
550
551 for (int i = 0; i < 16; i += 4)
552 {
553 uint _in[4];
554 uint _out[4];
555
556 _in[0] = in[i + 0];
557 _in[1] = in[i + 1];
558 _in[2] = in[i + 2];
559 _in[3] = in[i + 3];
560
561 AES_decrypt (&skey, (char *) _in, (char *) _out);
562
563 _out[0] ^= _iv[0];
564 _out[1] ^= _iv[1];
565 _out[2] ^= _iv[2];
566 _out[3] ^= _iv[3];
567
568 out[i + 0] = _out[0];
569 out[i + 1] = _out[1];
570 out[i + 2] = _out[2];
571 out[i + 3] = _out[3];
572
573 _iv[0] = _in[0];
574 _iv[1] = _in[1];
575 _iv[2] = _in[2];
576 _iv[3] = _in[3];
577 }
578 }
579
580 static void juniper_decrypt_hash (char *in, char *out)
581 {
582 // base64 decode
583
584 char base64_buf[100];
585
586 memset (base64_buf, 0, sizeof (base64_buf));
587
588 base64_decode (base64_to_int, in, DISPLAY_LEN_MIN_501, base64_buf);
589
590 // iv stuff
591
592 uint juniper_iv[4] = { 0 };
593
594 memcpy (juniper_iv, base64_buf, 12);
595
596 memcpy (out, juniper_iv, 12);
597
598 // reversed key
599
600 uint juniper_key[4];
601
602 juniper_key[0] = byte_swap_32 (0xa6707a7e);
603 juniper_key[1] = byte_swap_32 (0x8df91059);
604 juniper_key[2] = byte_swap_32 (0xdea70ae5);
605 juniper_key[3] = byte_swap_32 (0x2f9c2442);
606
607 // AES decrypt
608
609 uint *in_ptr = (uint *) (base64_buf + 12);
610 uint *out_ptr = (uint *) (out + 12);
611
612 AES128_decrypt_cbc (juniper_key, juniper_iv, in_ptr, out_ptr);
613 }
614
615 uint is_valid_hex_char (const char c)
616 {
617 if ((c >= '0') && (c <= '9')) return 1;
618 if ((c >= 'A') && (c <= 'F')) return 1;
619 if ((c >= 'a') && (c <= 'f')) return 1;
620
621 return 0;
622 }
623
624 char hex_convert (const char c)
625 {
626 return (c & 15) + (c >> 6) * 9;
627 }
628
629 char hex_to_char (const char hex[2])
630 {
631 char v = 0;
632
633 v |= (hex_convert (hex[1]) << 0);
634 v |= (hex_convert (hex[0]) << 4);
635
636 return (v);
637 }
638
639 uint hex_to_uint (const char hex[8])
640 {
641 uint v = 0;
642
643 v |= hex_convert (hex[7]) << 0;
644 v |= hex_convert (hex[6]) << 4;
645 v |= hex_convert (hex[5]) << 8;
646 v |= hex_convert (hex[4]) << 12;
647 v |= hex_convert (hex[3]) << 16;
648 v |= hex_convert (hex[2]) << 20;
649 v |= hex_convert (hex[1]) << 24;
650 v |= hex_convert (hex[0]) << 28;
651
652 return (v);
653 }
654
655 uint64_t hex_to_uint64_t (const char hex[16])
656 {
657 uint64_t v = 0;
658
659 v |= ((uint64_t) hex_convert (hex[15]) << 0);
660 v |= ((uint64_t) hex_convert (hex[14]) << 4);
661 v |= ((uint64_t) hex_convert (hex[13]) << 8);
662 v |= ((uint64_t) hex_convert (hex[12]) << 12);
663 v |= ((uint64_t) hex_convert (hex[11]) << 16);
664 v |= ((uint64_t) hex_convert (hex[10]) << 20);
665 v |= ((uint64_t) hex_convert (hex[ 9]) << 24);
666 v |= ((uint64_t) hex_convert (hex[ 8]) << 28);
667 v |= ((uint64_t) hex_convert (hex[ 7]) << 32);
668 v |= ((uint64_t) hex_convert (hex[ 6]) << 36);
669 v |= ((uint64_t) hex_convert (hex[ 5]) << 40);
670 v |= ((uint64_t) hex_convert (hex[ 4]) << 44);
671 v |= ((uint64_t) hex_convert (hex[ 3]) << 48);
672 v |= ((uint64_t) hex_convert (hex[ 2]) << 52);
673 v |= ((uint64_t) hex_convert (hex[ 1]) << 56);
674 v |= ((uint64_t) hex_convert (hex[ 0]) << 60);
675
676 return (v);
677 }
678
679 void bin_to_hex_lower (uint v, char hex[8])
680 {
681 hex[0] = v >> 28 & 15;
682 hex[1] = v >> 24 & 15;
683 hex[2] = v >> 20 & 15;
684 hex[3] = v >> 16 & 15;
685 hex[4] = v >> 12 & 15;
686 hex[5] = v >> 8 & 15;
687 hex[6] = v >> 4 & 15;
688 hex[7] = v >> 0 & 15;
689
690 uint add;
691
692 hex[0] += 6; add = ((hex[0] & 0x10) >> 4) * 39; hex[0] += 42 + add;
693 hex[1] += 6; add = ((hex[1] & 0x10) >> 4) * 39; hex[1] += 42 + add;
694 hex[2] += 6; add = ((hex[2] & 0x10) >> 4) * 39; hex[2] += 42 + add;
695 hex[3] += 6; add = ((hex[3] & 0x10) >> 4) * 39; hex[3] += 42 + add;
696 hex[4] += 6; add = ((hex[4] & 0x10) >> 4) * 39; hex[4] += 42 + add;
697 hex[5] += 6; add = ((hex[5] & 0x10) >> 4) * 39; hex[5] += 42 + add;
698 hex[6] += 6; add = ((hex[6] & 0x10) >> 4) * 39; hex[6] += 42 + add;
699 hex[7] += 6; add = ((hex[7] & 0x10) >> 4) * 39; hex[7] += 42 + add;
700 }
701
702 void phpass_decode (unsigned char digest[16], unsigned char 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 (unsigned char digest[16], unsigned char 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 (unsigned char digest[16], unsigned char 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 (unsigned char digest[16], unsigned char 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 (unsigned char digest[64], unsigned char 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 (unsigned char digest[64], unsigned char 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 (unsigned char digest[20], unsigned char 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 (unsigned char digest[20], unsigned char 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 (unsigned char digest[32], unsigned char 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 (unsigned char digest[32], unsigned char 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 (unsigned char digest[64], unsigned char 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 (unsigned char digest[64], unsigned char 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 (unsigned char digest[32], unsigned char 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 (unsigned char digest[32], unsigned char 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 (unsigned char digest[64], unsigned char 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 (unsigned char digest[64], unsigned char 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 ReadConsoleInput (stdinHandle, buf, 100, &num);
2454
2455 FlushConsoleInputBuffer (stdinHandle);
2456
2457 for (uint i = 0; i < num; i++)
2458 {
2459 if (buf[i].EventType != KEY_EVENT) continue;
2460
2461 KEY_EVENT_RECORD KeyEvent = buf[i].Event.KeyEvent;
2462
2463 if (KeyEvent.bKeyDown != TRUE) continue;
2464
2465 return KeyEvent.uChar.AsciiChar;
2466 }
2467
2468 return 0;
2469 }
2470
2471 int tty_fix()
2472 {
2473 HANDLE stdinHandle = GetStdHandle (STD_INPUT_HANDLE);
2474
2475 SetConsoleMode (stdinHandle, saveMode);
2476
2477 return 0;
2478 }
2479 #endif
2480
2481 /**
2482 * mem alloc
2483 */
2484
2485 #define MSG_ENOMEM "Insufficient memory available"
2486
2487 void *mycalloc (size_t nmemb, size_t size)
2488 {
2489 void *p = calloc (nmemb, size);
2490
2491 if (p == NULL)
2492 {
2493 log_error ("ERROR: %s", MSG_ENOMEM);
2494
2495 exit (-1);
2496 }
2497
2498 return (p);
2499 }
2500
2501 void *mymalloc (size_t size)
2502 {
2503 void *p = malloc (size);
2504
2505 if (p == NULL)
2506 {
2507 log_error ("ERROR: %s", MSG_ENOMEM);
2508
2509 exit (-1);
2510 }
2511
2512 memset (p, 0, size);
2513
2514 return (p);
2515 }
2516
2517 void myfree (void *ptr)
2518 {
2519 if (ptr == NULL) return;
2520
2521 free (ptr);
2522 }
2523
2524 void *myrealloc (void *ptr, size_t oldsz, size_t add)
2525 {
2526 void *p = realloc (ptr, oldsz + add);
2527
2528 if (p == NULL)
2529 {
2530 log_error ("ERROR: %s", MSG_ENOMEM);
2531
2532 exit (-1);
2533 }
2534
2535 memset ((char *) p + oldsz, 0, add);
2536
2537 return (p);
2538 }
2539
2540 char *mystrdup (const char *s)
2541 {
2542 const size_t len = strlen (s);
2543
2544 char *b = (char *) mymalloc (len + 1);
2545
2546 memcpy (b, s, len);
2547
2548 return (b);
2549 }
2550
2551 FILE *logfile_open (char *logfile)
2552 {
2553 FILE *fp = fopen (logfile, "ab");
2554
2555 if (fp == NULL)
2556 {
2557 fp = stdout;
2558 }
2559
2560 return fp;
2561 }
2562
2563 void logfile_close (FILE *fp)
2564 {
2565 if (fp == stdout) return;
2566
2567 fclose (fp);
2568 }
2569
2570 void logfile_append (const char *fmt, ...)
2571 {
2572 if (data.logfile_disable == 1) return;
2573
2574 FILE *fp = logfile_open (data.logfile);
2575
2576 va_list ap;
2577
2578 va_start (ap, fmt);
2579
2580 vfprintf (fp, fmt, ap);
2581
2582 va_end (ap);
2583
2584 fputc ('\n', fp);
2585
2586 fflush (fp);
2587
2588 logfile_close (fp);
2589 }
2590
2591 int logfile_generate_id ()
2592 {
2593 const int n = rand ();
2594
2595 time_t t;
2596
2597 time (&t);
2598
2599 return t + n;
2600 }
2601
2602 char *logfile_generate_topid ()
2603 {
2604 const int id = logfile_generate_id ();
2605
2606 char *topid = (char *) mymalloc (1 + 16 + 1);
2607
2608 sprintf (topid, "TOP%08x", id);
2609
2610 return topid;
2611 }
2612
2613 char *logfile_generate_subid ()
2614 {
2615 const int id = logfile_generate_id ();
2616
2617 char *subid = (char *) mymalloc (1 + 16 + 1);
2618
2619 sprintf (subid, "SUB%08x", id);
2620
2621 return subid;
2622 }
2623
2624 /**
2625 * system
2626 */
2627
2628 #ifdef _WIN
2629 void fsync (int fd)
2630 {
2631 HANDLE h = (HANDLE) _get_osfhandle (fd);
2632
2633 FlushFileBuffers (h);
2634 }
2635 #endif
2636
2637 /**
2638 * thermal
2639 */
2640
2641 #ifdef _CUDA
2642 #ifdef _WIN
2643 int hm_get_adapter_index (HM_ADAPTER nvGPUHandle[DEVICES_MAX])
2644 {
2645 NvU32 pGpuCount;
2646
2647 if (hc_NvAPI_EnumPhysicalGPUs (nvGPUHandle, &pGpuCount) != NVAPI_OK) return (0);
2648
2649 if (pGpuCount == 0)
2650 {
2651 log_info ("WARN: No NvAPI adapters found");
2652
2653 return (0);
2654 }
2655
2656 return (pGpuCount);
2657 }
2658 #endif
2659
2660 #ifdef LINUX
2661 int hm_get_adapter_index (HM_ADAPTER nvGPUHandle[DEVICES_MAX])
2662 {
2663 int pGpuCount = 0;
2664
2665 for (uint i = 0; i < DEVICES_MAX; i++)
2666 {
2667 /* do not use wrapper function to omit warning message */
2668 if (nvmlDeviceGetHandleByIndex (i, &nvGPUHandle[i]) != NVML_SUCCESS) break;
2669
2670 //can be used to determine if the device by index matches the cuda device by index
2671 //char name[100]; memset (name, 0, sizeof (name));
2672 //hc_NVML_nvmlDeviceGetName (nvGPUHandle[i], name, sizeof (name) - 1);
2673
2674 pGpuCount++;
2675 }
2676
2677 if (pGpuCount == 0)
2678 {
2679 log_info ("WARN: No NVML adapters found");
2680
2681 return (0);
2682 }
2683
2684 return (pGpuCount);
2685 }
2686 #endif
2687 #endif
2688
2689 #ifdef _OCL
2690 #ifndef OSX
2691 void hm_close (HM_LIB hm_dll)
2692 {
2693 #ifdef _POSIX
2694 dlclose (hm_dll);
2695
2696 #elif _WIN
2697 FreeLibrary (hm_dll);
2698
2699 #endif
2700 }
2701
2702 HM_LIB hm_init ()
2703 {
2704 #ifdef _POSIX
2705 HM_LIB hm_dll = dlopen ("libatiadlxx.so", RTLD_LAZY | RTLD_GLOBAL);
2706
2707 #elif _WIN
2708 HM_LIB hm_dll = LoadLibrary ("atiadlxx.dll");
2709
2710 if (hm_dll == NULL)
2711 hm_dll = LoadLibrary ("atiadlxy.dll");
2712
2713 #endif
2714
2715 return hm_dll;
2716 }
2717
2718 int get_adapters_num (HM_LIB hm_dll, int *iNumberAdapters)
2719 {
2720 if (hc_ADL_Adapter_NumberOfAdapters_Get (hm_dll, iNumberAdapters) != ADL_OK) return -1;
2721
2722 if (iNumberAdapters == 0)
2723 {
2724 log_info ("WARN: No ADL adapters found.");
2725
2726 return -1;
2727 }
2728
2729 return 0;
2730 }
2731
2732 int hm_show_performance_level (HM_LIB hm_dll, int iAdapterIndex)
2733 {
2734 ADLODPerformanceLevels *lpOdPerformanceLevels = NULL;
2735 ADLODParameters lpOdParameters;
2736
2737 lpOdParameters.iSize = sizeof (ADLODParameters);
2738 size_t plevels_size = 0;
2739
2740 if (hc_ADL_Overdrive_ODParameters_Get (hm_dll, iAdapterIndex, &lpOdParameters) != ADL_OK) return -1;
2741
2742 log_info ("[DEBUG] %s, adapter %d performance level (%d) : %s %s",
2743 __func__, iAdapterIndex,
2744 lpOdParameters.iNumberOfPerformanceLevels,
2745 (lpOdParameters.iActivityReportingSupported) ? "activity reporting" : "",
2746 (lpOdParameters.iDiscretePerformanceLevels) ? "discrete performance levels" : "performance ranges");
2747
2748 plevels_size = sizeof (ADLODPerformanceLevels) + sizeof (ADLODPerformanceLevel) * (lpOdParameters.iNumberOfPerformanceLevels - 1);
2749
2750 lpOdPerformanceLevels = (ADLODPerformanceLevels *) mymalloc (plevels_size);
2751
2752 lpOdPerformanceLevels->iSize = sizeof (ADLODPerformanceLevels) + sizeof (ADLODPerformanceLevel) * (lpOdParameters.iNumberOfPerformanceLevels - 1);
2753
2754 if (hc_ADL_Overdrive_ODPerformanceLevels_Get (hm_dll, iAdapterIndex, 0, lpOdPerformanceLevels) != ADL_OK) return -1;
2755
2756 for (int j = 0; j < lpOdParameters.iNumberOfPerformanceLevels; j++)
2757 log_info ("[DEBUG] %s, adapter %d, level %d : engine %d, memory %d, voltage: %d",
2758 __func__, iAdapterIndex, j,
2759 lpOdPerformanceLevels->aLevels[j].iEngineClock / 100, lpOdPerformanceLevels->aLevels[j].iMemoryClock / 100, lpOdPerformanceLevels->aLevels[j].iVddc);
2760
2761 myfree (lpOdPerformanceLevels);
2762
2763 return 0;
2764 }
2765
2766 LPAdapterInfo hm_get_adapter_info (HM_LIB hm_dll, int iNumberAdapters)
2767 {
2768 size_t AdapterInfoSize = iNumberAdapters * sizeof (AdapterInfo);
2769
2770 LPAdapterInfo lpAdapterInfo = (LPAdapterInfo) mymalloc (AdapterInfoSize);
2771
2772 if (hc_ADL_Adapter_AdapterInfo_Get (hm_dll, lpAdapterInfo, AdapterInfoSize) != ADL_OK) return NULL;
2773
2774 return lpAdapterInfo;
2775 }
2776
2777 /*
2778 * does not help at all, since AMD does not assign different bus id, device id when we have multi GPU setups
2779 *
2780
2781 int hm_get_opencl_device_index (hm_attrs_t *hm_device, uint num_adl_adapters, int bus_num, int dev_num)
2782 {
2783 uint32_t idx = -1;
2784
2785 for (uint i = 0; i < num_adl_adapters; i++)
2786 {
2787 int opencl_bus_num = hm_device[i].busid;
2788 int opencl_dev_num = hm_device[i].devid;
2789
2790 if ((opencl_bus_num == bus_num) && (opencl_dev_num == dev_num))
2791 {
2792 idx = i;
2793
2794 break;
2795 }
2796 }
2797
2798 if (idx >= DEVICES_MAX) return -1;
2799
2800 return idx;
2801 }
2802
2803 void hm_get_opencl_busid_devid (hm_attrs_t *hm_device, uint opencl_num_devices, cl_device_id *devices)
2804 {
2805 for (uint i = 0; i < opencl_num_devices; i++)
2806 {
2807 cl_device_topology_amd device_topology;
2808
2809 hc_clGetDeviceInfo (devices[i], CL_DEVICE_TOPOLOGY_AMD, sizeof (device_topology), &device_topology, NULL);
2810
2811 hm_device[i].busid = device_topology.pcie.bus;
2812 hm_device[i].devid = device_topology.pcie.device;
2813 }
2814 }
2815 */
2816
2817 void hm_sort_adl_adapters_by_busid_devid (uint32_t *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2818 {
2819 // basically bubble sort
2820
2821 for (int i = 0; i < num_adl_adapters; i++)
2822 {
2823 for (int j = 0; j < num_adl_adapters - 1; j++)
2824 {
2825 // get info of adapter [x]
2826
2827 uint32_t adapter_index_x = valid_adl_device_list[j];
2828 AdapterInfo info_x = lpAdapterInfo[adapter_index_x];
2829
2830 uint32_t bus_num_x = info_x.iBusNumber;
2831 uint32_t dev_num_x = info_x.iDeviceNumber;
2832
2833 // get info of adapter [y]
2834
2835 uint32_t adapter_index_y = valid_adl_device_list[j + 1];
2836 AdapterInfo info_y = lpAdapterInfo[adapter_index_y];
2837
2838 uint32_t bus_num_y = info_y.iBusNumber;
2839 uint32_t dev_num_y = info_y.iDeviceNumber;
2840
2841 uint need_swap = 0;
2842
2843 if (bus_num_y < bus_num_x)
2844 {
2845 need_swap = 1;
2846 }
2847 else if (bus_num_y == bus_num_x)
2848 {
2849 if (dev_num_y < dev_num_x)
2850 {
2851 need_swap = 1;
2852 }
2853 }
2854
2855 if (need_swap == 1)
2856 {
2857 uint32_t temp = valid_adl_device_list[j + 1];
2858
2859 valid_adl_device_list[j + 1] = valid_adl_device_list[j];
2860 valid_adl_device_list[j + 0] = temp;
2861 }
2862 }
2863 }
2864 }
2865
2866 uint32_t *hm_get_list_valid_adl_adapters (int iNumberAdapters, int *num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2867 {
2868 *num_adl_adapters = 0;
2869
2870 uint32_t *adl_adapters = NULL;
2871
2872 int *bus_numbers = NULL;
2873 int *device_numbers = NULL;
2874
2875 for (int i = 0; i < iNumberAdapters; i++)
2876 {
2877 AdapterInfo info = lpAdapterInfo[i];
2878
2879 if ((info.strUDID == NULL) || (strlen (info.strUDID) < 1)) continue;
2880
2881 #ifdef WIN
2882 if (info.iVendorID != 1002) continue;
2883 #else
2884 if (info.iVendorID != 0x1002) continue;
2885 #endif
2886
2887 if (info.iBusNumber < 0) continue;
2888 if (info.iDeviceNumber < 0) continue;
2889
2890 int found = 0;
2891
2892 for (int pos = 0; pos < *num_adl_adapters; pos++)
2893 {
2894 if ((bus_numbers[pos] == info.iBusNumber) && (device_numbers[pos] == info.iDeviceNumber))
2895 {
2896 found = 1;
2897 break;
2898 }
2899 }
2900
2901 if (found) continue;
2902
2903 // add it to the list
2904
2905 adl_adapters = (uint32_t *) myrealloc (adl_adapters, (*num_adl_adapters) * sizeof (int), sizeof (int));
2906
2907 adl_adapters[*num_adl_adapters] = i;
2908
2909 // rest is just bookkeeping
2910
2911 bus_numbers = (int*) myrealloc (bus_numbers, (*num_adl_adapters) * sizeof (int), sizeof (int));
2912 device_numbers = (int*) myrealloc (device_numbers, (*num_adl_adapters) * sizeof (int), sizeof (int));
2913
2914 bus_numbers[*num_adl_adapters] = info.iBusNumber;
2915 device_numbers[*num_adl_adapters] = info.iDeviceNumber;
2916
2917 (*num_adl_adapters)++;
2918 }
2919
2920 myfree (bus_numbers);
2921 myfree (device_numbers);
2922
2923 // sort the list by increasing bus id, device id number
2924
2925 hm_sort_adl_adapters_by_busid_devid (adl_adapters, *num_adl_adapters, lpAdapterInfo);
2926
2927 return adl_adapters;
2928 }
2929
2930 int hm_check_fanspeed_control (HM_LIB hm_dll, hm_attrs_t *hm_device, uint32_t *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2931 {
2932 // loop through all valid devices
2933
2934 for (int i = 0; i < num_adl_adapters; i++)
2935 {
2936 uint32_t adapter_index = valid_adl_device_list[i];
2937
2938 // get AdapterInfo
2939
2940 AdapterInfo info = lpAdapterInfo[adapter_index];
2941
2942 // unfortunately this doesn't work since bus id and dev id are not unique
2943 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
2944 // if (opencl_device_index == -1) continue;
2945
2946 int opencl_device_index = i;
2947
2948 // if (hm_show_performance_level (hm_dll, info.iAdapterIndex) != 0) return -1;
2949
2950 // get fanspeed info
2951
2952 if (hm_device[opencl_device_index].od_version == 5)
2953 {
2954 ADLFanSpeedInfo FanSpeedInfo;
2955
2956 memset (&FanSpeedInfo, 0, sizeof (ADLFanSpeedInfo));
2957
2958 FanSpeedInfo.iSize = sizeof (ADLFanSpeedInfo);
2959
2960 if (hc_ADL_Overdrive5_FanSpeedInfo_Get (hm_dll, info.iAdapterIndex, 0, &FanSpeedInfo) != ADL_OK) return -1;
2961
2962 // check read and write capability in fanspeedinfo
2963
2964 if ((FanSpeedInfo.iFlags & ADL_DL_FANCTRL_SUPPORTS_PERCENT_READ) &&
2965 (FanSpeedInfo.iFlags & ADL_DL_FANCTRL_SUPPORTS_PERCENT_WRITE))
2966 {
2967 hm_device[opencl_device_index].fan_supported = 1;
2968 }
2969 else
2970 {
2971 hm_device[opencl_device_index].fan_supported = 0;
2972 }
2973 }
2974 else // od_version == 6
2975 {
2976 ADLOD6FanSpeedInfo faninfo;
2977
2978 memset (&faninfo, 0, sizeof (faninfo));
2979
2980 if (hc_ADL_Overdrive6_FanSpeed_Get (hm_dll, info.iAdapterIndex, &faninfo) != ADL_OK) return -1;
2981
2982 // check read capability in fanspeedinfo
2983
2984 if (faninfo.iSpeedType & ADL_OD6_FANSPEED_TYPE_PERCENT)
2985 {
2986 hm_device[opencl_device_index].fan_supported = 1;
2987 }
2988 else
2989 {
2990 hm_device[opencl_device_index].fan_supported = 0;
2991 }
2992 }
2993 }
2994
2995 return 0;
2996 }
2997
2998 int hm_get_overdrive_version (HM_LIB hm_dll, hm_attrs_t *hm_device, uint32_t *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2999 {
3000 for (int i = 0; i < num_adl_adapters; i++)
3001 {
3002 uint32_t adapter_index = valid_adl_device_list[i];
3003
3004 // get AdapterInfo
3005
3006 AdapterInfo info = lpAdapterInfo[adapter_index];
3007
3008 // get overdrive version
3009
3010 int od_supported = 0;
3011 int od_enabled = 0;
3012 int od_version = 0;
3013
3014 if (hc_ADL_Overdrive_Caps (hm_dll, info.iAdapterIndex, &od_supported, &od_enabled, &od_version) != ADL_OK) return -1;
3015
3016 // store the overdrive version in hm_device
3017
3018 // unfortunately this doesn't work since bus id and dev id are not unique
3019 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
3020 // if (opencl_device_index == -1) continue;
3021
3022 int opencl_device_index = i;
3023
3024 hm_device[opencl_device_index].od_version = od_version;
3025 }
3026
3027 return 0;
3028 }
3029
3030 int hm_get_adapter_index (hm_attrs_t *hm_device, uint32_t *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
3031 {
3032 for (int i = 0; i < num_adl_adapters; i++)
3033 {
3034 uint32_t adapter_index = valid_adl_device_list[i];
3035
3036 // get AdapterInfo
3037
3038 AdapterInfo info = lpAdapterInfo[adapter_index];
3039
3040 // store the iAdapterIndex in hm_device
3041
3042 // unfortunately this doesn't work since bus id and dev id are not unique
3043 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
3044 // if (opencl_device_index == -1) continue;
3045
3046 int opencl_device_index = i;
3047
3048 hm_device[opencl_device_index].adapter_index = info.iAdapterIndex;
3049 }
3050
3051 return num_adl_adapters;
3052 }
3053 #endif
3054 #endif
3055
3056 int hm_get_temperature_with_device_id (const uint device_id)
3057 {
3058 #ifdef _OCL
3059 #ifndef OSX
3060 if (data.hm_dll)
3061 {
3062 if (data.hm_device[device_id].od_version == 5)
3063 {
3064 ADLTemperature Temperature;
3065
3066 Temperature.iSize = sizeof (ADLTemperature);
3067
3068 if (hc_ADL_Overdrive5_Temperature_Get (data.hm_dll, data.hm_device[device_id].adapter_index, 0, &Temperature) != ADL_OK) return -1;
3069
3070 return Temperature.iTemperature / 1000;
3071 }
3072 else if (data.hm_device[device_id].od_version == 6)
3073 {
3074 int Temperature = 0;
3075
3076 if (hc_ADL_Overdrive6_Temperature_Get (data.hm_dll, data.hm_device[device_id].adapter_index, &Temperature) != ADL_OK) return -1;
3077
3078 return Temperature / 1000;
3079 }
3080 }
3081 #endif
3082 #endif
3083
3084 #ifdef _CUDA
3085 #ifdef LINUX
3086 int temperature = 0;
3087
3088 hc_NVML_nvmlDeviceGetTemperature (data.hm_device[device_id].adapter_index, NVML_TEMPERATURE_GPU, (unsigned int *) &temperature);
3089
3090 return temperature;
3091 #endif
3092
3093 #ifdef WIN
3094 NV_GPU_THERMAL_SETTINGS pThermalSettings;
3095
3096 pThermalSettings.version = NV_GPU_THERMAL_SETTINGS_VER;
3097 pThermalSettings.count = NVAPI_MAX_THERMAL_SENSORS_PER_GPU;
3098 pThermalSettings.sensor[0].controller = NVAPI_THERMAL_CONTROLLER_UNKNOWN;
3099 pThermalSettings.sensor[0].target = NVAPI_THERMAL_TARGET_GPU;
3100
3101 if (hc_NvAPI_GPU_GetThermalSettings (data.hm_device[device_id].adapter_index, 0, &pThermalSettings) != NVAPI_OK) return -1;
3102
3103 return pThermalSettings.sensor[0].currentTemp;
3104 #endif
3105 #endif
3106
3107 return -1;
3108 }
3109
3110 int hm_get_fanspeed_with_device_id (const uint device_id)
3111 {
3112 if (data.hm_device[device_id].fan_supported == 1)
3113 {
3114 #ifdef _OCL
3115 #ifndef OSX
3116 if (data.hm_dll)
3117 {
3118 if (data.hm_device[device_id].od_version == 5)
3119 {
3120 ADLFanSpeedValue lpFanSpeedValue;
3121
3122 memset (&lpFanSpeedValue, 0, sizeof (lpFanSpeedValue));
3123
3124 lpFanSpeedValue.iSize = sizeof (lpFanSpeedValue);
3125 lpFanSpeedValue.iSpeedType = ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
3126 lpFanSpeedValue.iFlags = ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED;
3127
3128 if (hc_ADL_Overdrive5_FanSpeed_Get (data.hm_dll, data.hm_device[device_id].adapter_index, 0, &lpFanSpeedValue) != ADL_OK) return -1;
3129
3130 return lpFanSpeedValue.iFanSpeed;
3131 }
3132 else // od_version == 6
3133 {
3134 ADLOD6FanSpeedInfo faninfo;
3135
3136 memset (&faninfo, 0, sizeof (faninfo));
3137
3138 if (hc_ADL_Overdrive6_FanSpeed_Get (data.hm_dll, data.hm_device[device_id].adapter_index, &faninfo) != ADL_OK) return -1;
3139
3140 return faninfo.iFanSpeedPercent;
3141 }
3142 }
3143 #endif
3144 #endif
3145
3146 #ifdef _CUDA
3147 #ifdef LINUX
3148 int speed = 0;
3149
3150 hc_NVML_nvmlDeviceGetFanSpeed (data.hm_device[device_id].adapter_index, (unsigned int *) &speed);
3151
3152 return speed;
3153 #endif
3154
3155 #ifdef WIN
3156 NvU32 speed = 0;
3157
3158 hc_NvAPI_GPU_GetTachReading (data.hm_device[device_id].adapter_index, &speed);
3159
3160 return speed;
3161 #endif
3162 #endif
3163 }
3164
3165 return -1;
3166 }
3167
3168 int hm_get_utilization_with_device_id (const uint device_id)
3169 {
3170 #ifdef _OCL
3171 #ifndef OSX
3172 if (data.hm_dll)
3173 {
3174 ADLPMActivity PMActivity;
3175
3176 PMActivity.iSize = sizeof (ADLPMActivity);
3177
3178 if (hc_ADL_Overdrive_CurrentActivity_Get (data.hm_dll, data.hm_device[device_id].adapter_index, &PMActivity) != ADL_OK) return -1;
3179
3180 return PMActivity.iActivityPercent;
3181 }
3182 #endif
3183 #endif
3184
3185 #ifdef _CUDA
3186 #ifdef LINUX
3187 nvmlUtilization_t utilization;
3188
3189 hc_NVML_nvmlDeviceGetUtilizationRates (data.hm_device[device_id].adapter_index, &utilization);
3190
3191 return utilization.gpu;
3192 #endif
3193
3194 #ifdef WIN
3195 NV_GPU_DYNAMIC_PSTATES_INFO_EX pDynamicPstatesInfoEx;
3196
3197 pDynamicPstatesInfoEx.version = NV_GPU_DYNAMIC_PSTATES_INFO_EX_VER;
3198
3199 if (hc_NvAPI_GPU_GetDynamicPstatesInfoEx (data.hm_device[device_id].adapter_index, &pDynamicPstatesInfoEx) != NVAPI_OK) return -1;
3200
3201 return pDynamicPstatesInfoEx.utilization[0].percentage;
3202 #endif
3203 #endif
3204
3205 return -1;
3206 }
3207
3208 #ifdef _OCL
3209 #ifndef OSX
3210 int hm_set_fanspeed_with_device_id (const uint device_id, const int fanspeed)
3211 {
3212 if (data.hm_device[device_id].fan_supported == 1)
3213 {
3214 if (data.hm_dll)
3215 {
3216 if (data.hm_device[device_id].od_version == 5)
3217 {
3218 ADLFanSpeedValue lpFanSpeedValue;
3219
3220 memset (&lpFanSpeedValue, 0, sizeof (lpFanSpeedValue));
3221
3222 lpFanSpeedValue.iSize = sizeof (lpFanSpeedValue);
3223 lpFanSpeedValue.iSpeedType = ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
3224 lpFanSpeedValue.iFlags = ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED;
3225 lpFanSpeedValue.iFanSpeed = fanspeed;
3226
3227 if (hc_ADL_Overdrive5_FanSpeed_Set (data.hm_dll, data.hm_device[device_id].adapter_index, 0, &lpFanSpeedValue) != ADL_OK) return -1;
3228
3229 return 0;
3230 }
3231 else // od_version == 6
3232 {
3233 ADLOD6FanSpeedValue fan_speed_value;
3234
3235 memset (&fan_speed_value, 0, sizeof (fan_speed_value));
3236
3237 fan_speed_value.iSpeedType = ADL_OD6_FANSPEED_TYPE_PERCENT;
3238 fan_speed_value.iFanSpeed = fanspeed;
3239
3240 if (hc_ADL_Overdrive6_FanSpeed_Set (data.hm_dll, data.hm_device[device_id].adapter_index, &fan_speed_value) != ADL_OK) return -1;
3241
3242 return 0;
3243 }
3244 }
3245 }
3246
3247 return -1;
3248 }
3249 #endif
3250 #endif
3251
3252 /**
3253 * maskprocessor
3254 */
3255
3256 void mp_css_to_uniq_tbl (uint css_cnt, cs_t *css, uint uniq_tbls[SP_PW_MAX][CHARSIZ])
3257 {
3258 /* generates a lookup table where key is the char itself for fastest possible lookup performance */
3259
3260 if (css_cnt > SP_PW_MAX)
3261 {
3262 log_error ("ERROR: mask length is too long");
3263
3264 exit (-1);
3265 }
3266
3267 for (uint css_pos = 0; css_pos < css_cnt; css_pos++)
3268 {
3269 uint *uniq_tbl = uniq_tbls[css_pos];
3270
3271 uint *cs_buf = css[css_pos].cs_buf;
3272 uint cs_len = css[css_pos].cs_len;
3273
3274 for (uint cs_pos = 0; cs_pos < cs_len; cs_pos++)
3275 {
3276 uint c = cs_buf[cs_pos] & 0xff;
3277
3278 uniq_tbl[c] = 1;
3279 }
3280 }
3281 }
3282
3283 void mp_add_cs_buf (uint *in_buf, size_t in_len, cs_t *css, int css_cnt)
3284 {
3285 cs_t *cs = &css[css_cnt];
3286
3287 size_t css_uniq_sz = CHARSIZ * sizeof (uint);
3288
3289 uint *css_uniq = (uint *) mymalloc (css_uniq_sz);
3290
3291 memset (css_uniq, 0, css_uniq_sz);
3292
3293 size_t i;
3294
3295 for (i = 0; i < cs->cs_len; i++)
3296 {
3297 const uint u = cs->cs_buf[i];
3298
3299 css_uniq[u] = 1;
3300 }
3301
3302 for (i = 0; i < in_len; i++)
3303 {
3304 uint u = in_buf[i] & 0xff;
3305
3306 if (data.opts_type & OPTS_TYPE_PT_UPPER) u = toupper (u);
3307
3308 if (css_uniq[u] == 1) continue;
3309
3310 css_uniq[u] = 1;
3311
3312 cs->cs_buf[cs->cs_len] = u;
3313
3314 cs->cs_len++;
3315 }
3316
3317 myfree (css_uniq);
3318 }
3319
3320 void mp_expand (char *in_buf, size_t in_len, cs_t *mp_sys, cs_t *mp_usr, int mp_usr_offset, int interpret)
3321 {
3322 size_t in_pos;
3323
3324 for (in_pos = 0; in_pos < in_len; in_pos++)
3325 {
3326 uint p0 = in_buf[in_pos] & 0xff;
3327
3328 if (interpret == 1 && p0 == '?')
3329 {
3330 in_pos++;
3331
3332 if (in_pos == in_len) break;
3333
3334 uint p1 = in_buf[in_pos] & 0xff;
3335
3336 switch (p1)
3337 {
3338 case 'l': mp_add_cs_buf (mp_sys[0].cs_buf, mp_sys[0].cs_len, mp_usr, mp_usr_offset);
3339 break;
3340 case 'u': mp_add_cs_buf (mp_sys[1].cs_buf, mp_sys[1].cs_len, mp_usr, mp_usr_offset);
3341 break;
3342 case 'd': mp_add_cs_buf (mp_sys[2].cs_buf, mp_sys[2].cs_len, mp_usr, mp_usr_offset);
3343 break;
3344 case 's': mp_add_cs_buf (mp_sys[3].cs_buf, mp_sys[3].cs_len, mp_usr, mp_usr_offset);
3345 break;
3346 case 'a': mp_add_cs_buf (mp_sys[4].cs_buf, mp_sys[4].cs_len, mp_usr, mp_usr_offset);
3347 break;
3348 case 'b': mp_add_cs_buf (mp_sys[5].cs_buf, mp_sys[5].cs_len, mp_usr, mp_usr_offset);
3349 break;
3350 case '1': if (mp_usr[0].cs_len == 0) { log_error ("ERROR: Custom-charset 1 is undefined\n"); exit (-1); }
3351 mp_add_cs_buf (mp_usr[0].cs_buf, mp_usr[0].cs_len, mp_usr, mp_usr_offset);
3352 break;
3353 case '2': if (mp_usr[1].cs_len == 0) { log_error ("ERROR: Custom-charset 2 is undefined\n"); exit (-1); }
3354 mp_add_cs_buf (mp_usr[1].cs_buf, mp_usr[1].cs_len, mp_usr, mp_usr_offset);
3355 break;
3356 case '3': if (mp_usr[2].cs_len == 0) { log_error ("ERROR: Custom-charset 3 is undefined\n"); exit (-1); }
3357 mp_add_cs_buf (mp_usr[2].cs_buf, mp_usr[2].cs_len, mp_usr, mp_usr_offset);
3358 break;
3359 case '4': if (mp_usr[3].cs_len == 0) { log_error ("ERROR: Custom-charset 4 is undefined\n"); exit (-1); }
3360 mp_add_cs_buf (mp_usr[3].cs_buf, mp_usr[3].cs_len, mp_usr, mp_usr_offset);
3361 break;
3362 case '?': mp_add_cs_buf (&p0, 1, mp_usr, mp_usr_offset);
3363 break;
3364 default: log_error ("Syntax error: %s", in_buf);
3365 exit (-1);
3366 }
3367 }
3368 else
3369 {
3370 if (data.hex_charset)
3371 {
3372 in_pos++;
3373
3374 if (in_pos == in_len)
3375 {
3376 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", in_buf);
3377
3378 exit (-1);
3379 }
3380
3381 uint p1 = in_buf[in_pos] & 0xff;
3382
3383 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3384 {
3385 log_error ("ERROR: invalid hex character detected in mask %s", in_buf);
3386
3387 exit (-1);
3388 }
3389
3390 uint chr = 0;
3391
3392 chr = hex_convert (p1) << 0;
3393 chr |= hex_convert (p0) << 4;
3394
3395 mp_add_cs_buf (&chr, 1, mp_usr, mp_usr_offset);
3396 }
3397 else
3398 {
3399 uint chr = p0;
3400
3401 mp_add_cs_buf (&chr, 1, mp_usr, mp_usr_offset);
3402 }
3403 }
3404 }
3405 }
3406
3407 uint64_t mp_get_sum (uint css_cnt, cs_t *css)
3408 {
3409 uint64_t sum = 1;
3410
3411 for (uint css_pos = 0; css_pos < css_cnt; css_pos++)
3412 {
3413 sum *= css[css_pos].cs_len;
3414 }
3415
3416 return (sum);
3417 }
3418
3419 cs_t *mp_gen_css (char *mask_buf, size_t mask_len, cs_t *mp_sys, cs_t *mp_usr, uint *css_cnt)
3420 {
3421 cs_t *css = (cs_t *) mycalloc (256, sizeof (cs_t));
3422
3423 uint mask_pos;
3424 uint css_pos;
3425
3426 for (mask_pos = 0, css_pos = 0; mask_pos < mask_len; mask_pos++, css_pos++)
3427 {
3428 char p0 = mask_buf[mask_pos];
3429
3430 if (p0 == '?')
3431 {
3432 mask_pos++;
3433
3434 if (mask_pos == mask_len) break;
3435
3436 char p1 = mask_buf[mask_pos];
3437
3438 uint chr = p1;
3439
3440 switch (p1)
3441 {
3442 case 'l': mp_add_cs_buf (mp_sys[0].cs_buf, mp_sys[0].cs_len, css, css_pos);
3443 break;
3444 case 'u': mp_add_cs_buf (mp_sys[1].cs_buf, mp_sys[1].cs_len, css, css_pos);
3445 break;
3446 case 'd': mp_add_cs_buf (mp_sys[2].cs_buf, mp_sys[2].cs_len, css, css_pos);
3447 break;
3448 case 's': mp_add_cs_buf (mp_sys[3].cs_buf, mp_sys[3].cs_len, css, css_pos);
3449 break;
3450 case 'a': mp_add_cs_buf (mp_sys[4].cs_buf, mp_sys[4].cs_len, css, css_pos);
3451 break;
3452 case 'b': mp_add_cs_buf (mp_sys[5].cs_buf, mp_sys[5].cs_len, css, css_pos);
3453 break;
3454 case '1': if (mp_usr[0].cs_len == 0) { log_error ("ERROR: Custom-charset 1 is undefined\n"); exit (-1); }
3455 mp_add_cs_buf (mp_usr[0].cs_buf, mp_usr[0].cs_len, css, css_pos);
3456 break;
3457 case '2': if (mp_usr[1].cs_len == 0) { log_error ("ERROR: Custom-charset 2 is undefined\n"); exit (-1); }
3458 mp_add_cs_buf (mp_usr[1].cs_buf, mp_usr[1].cs_len, css, css_pos);
3459 break;
3460 case '3': if (mp_usr[2].cs_len == 0) { log_error ("ERROR: Custom-charset 3 is undefined\n"); exit (-1); }
3461 mp_add_cs_buf (mp_usr[2].cs_buf, mp_usr[2].cs_len, css, css_pos);
3462 break;
3463 case '4': if (mp_usr[3].cs_len == 0) { log_error ("ERROR: Custom-charset 4 is undefined\n"); exit (-1); }
3464 mp_add_cs_buf (mp_usr[3].cs_buf, mp_usr[3].cs_len, css, css_pos);
3465 break;
3466 case '?': mp_add_cs_buf (&chr, 1, css, css_pos);
3467 break;
3468 default: log_error ("ERROR: syntax error: %s", mask_buf);
3469 exit (-1);
3470 }
3471 }
3472 else
3473 {
3474 if (data.hex_charset)
3475 {
3476 mask_pos++;
3477
3478 // if there is no 2nd hex character, show an error:
3479
3480 if (mask_pos == mask_len)
3481 {
3482 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", mask_buf);
3483
3484 exit (-1);
3485 }
3486
3487 char p1 = mask_buf[mask_pos];
3488
3489 // if they are not valid hex character, show an error:
3490
3491 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3492 {
3493 log_error ("ERROR: invalid hex character detected in mask %s", mask_buf);
3494
3495 exit (-1);
3496 }
3497
3498 uint chr = 0;
3499
3500 chr |= hex_convert (p1) << 0;
3501 chr |= hex_convert (p0) << 4;
3502
3503 mp_add_cs_buf (&chr, 1, css, css_pos);
3504 }
3505 else
3506 {
3507 uint chr = p0;
3508
3509 mp_add_cs_buf (&chr, 1, css, css_pos);
3510 }
3511 }
3512 }
3513
3514 if (css_pos == 0)
3515 {
3516 log_error ("ERROR: invalid mask length (0)");
3517
3518 exit (-1);
3519 }
3520
3521 *css_cnt = css_pos;
3522
3523 return (css);
3524 }
3525
3526 void mp_exec (uint64_t val, char *buf, cs_t *css, int css_cnt)
3527 {
3528 for (int i = 0; i < css_cnt; i++)
3529 {
3530 uint len = css[i].cs_len;
3531 uint64_t next = val / len;
3532 uint pos = val % len;
3533 buf[i] = (char) css[i].cs_buf[pos] & 0xff;
3534 val = next;
3535 }
3536 }
3537
3538 void mp_cut_at (char *mask, uint max)
3539 {
3540 uint i;
3541 uint j;
3542 uint mask_len = strlen (mask);
3543
3544 for (i = 0, j = 0; i < mask_len && j < max; i++, j++)
3545 {
3546 if (mask[i] == '?') i++;
3547 }
3548
3549 mask[i] = 0;
3550 }
3551
3552 void mp_setup_sys (cs_t *mp_sys)
3553 {
3554 uint pos;
3555 uint chr;
3556 uint donec[CHARSIZ];
3557
3558 memset (donec, 0, sizeof (donec));
3559
3560 for (pos = 0, chr = 'a'; chr <= 'z'; chr++) { donec[chr] = 1;
3561 mp_sys[0].cs_buf[pos++] = chr;
3562 mp_sys[0].cs_len = pos; }
3563
3564 for (pos = 0, chr = 'A'; chr <= 'Z'; chr++) { donec[chr] = 1;
3565 mp_sys[1].cs_buf[pos++] = chr;
3566 mp_sys[1].cs_len = pos; }
3567
3568 for (pos = 0, chr = '0'; chr <= '9'; chr++) { donec[chr] = 1;
3569 mp_sys[2].cs_buf[pos++] = chr;
3570 mp_sys[2].cs_len = pos; }
3571
3572 for (pos = 0, chr = 0x20; chr <= 0x7e; chr++) { if (donec[chr]) continue;
3573 mp_sys[3].cs_buf[pos++] = chr;
3574 mp_sys[3].cs_len = pos; }
3575
3576 for (pos = 0, chr = 0x20; chr <= 0x7e; chr++) { mp_sys[4].cs_buf[pos++] = chr;
3577 mp_sys[4].cs_len = pos; }
3578
3579 for (pos = 0, chr = 0x00; chr <= 0xff; chr++) { mp_sys[5].cs_buf[pos++] = chr;
3580 mp_sys[5].cs_len = pos; }
3581 }
3582
3583 void mp_setup_usr (cs_t *mp_sys, cs_t *mp_usr, char *buf, uint index)
3584 {
3585 FILE *fp = fopen (buf, "rb");
3586
3587 if (fp == NULL || feof (fp)) // feof() in case if file is empty
3588 {
3589 mp_expand (buf, strlen (buf), mp_sys, mp_usr, index, 1);
3590 }
3591 else
3592 {
3593 char mp_file[1024];
3594
3595 memset (mp_file, 0, sizeof (mp_file));
3596
3597 size_t len = fread (mp_file, 1, sizeof (mp_file) - 1, fp);
3598
3599 fclose (fp);
3600
3601 len = in_superchop (mp_file);
3602
3603 if (len == 0)
3604 {
3605 log_info ("WARNING: charset file corrupted");
3606
3607 mp_expand (buf, strlen (buf), mp_sys, mp_usr, index, 1);
3608 }
3609 else
3610 {
3611 mp_expand (mp_file, len, mp_sys, mp_usr, index, 0);
3612 }
3613 }
3614 }
3615
3616 void mp_reset_usr (cs_t *mp_usr, uint index)
3617 {
3618 mp_usr[index].cs_len = 0;
3619
3620 memset (mp_usr[index].cs_buf, 0, sizeof (mp_usr[index].cs_buf));
3621 }
3622
3623 char *mp_get_truncated_mask (char *mask_buf, size_t mask_len, uint len)
3624 {
3625 char *new_mask_buf = (char *) mymalloc (256);
3626
3627 uint mask_pos;
3628
3629 uint css_pos;
3630
3631 for (mask_pos = 0, css_pos = 0; mask_pos < mask_len; mask_pos++, css_pos++)
3632 {
3633 if (css_pos == len) break;
3634
3635 char p0 = mask_buf[mask_pos];
3636
3637 new_mask_buf[mask_pos] = p0;
3638
3639 if (p0 == '?')
3640 {
3641 mask_pos++;
3642
3643 if (mask_pos == mask_len) break;
3644
3645 new_mask_buf[mask_pos] = mask_buf[mask_pos];
3646 }
3647 else
3648 {
3649 if (data.hex_charset)
3650 {
3651 mask_pos++;
3652
3653 if (mask_pos == mask_len)
3654 {
3655 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", mask_buf);
3656
3657 exit (-1);
3658 }
3659
3660 char p1 = mask_buf[mask_pos];
3661
3662 // if they are not valid hex character, show an error:
3663
3664 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3665 {
3666 log_error ("ERROR: invalid hex character detected in mask: %s", mask_buf);
3667
3668 exit (-1);
3669 }
3670
3671 new_mask_buf[mask_pos] = p1;
3672 }
3673 }
3674 }
3675
3676 if (css_pos == len) return (new_mask_buf);
3677
3678 myfree (new_mask_buf);
3679
3680 return (NULL);
3681 }
3682
3683 /**
3684 * statprocessor
3685 */
3686
3687 uint64_t sp_get_sum (uint start, uint stop, cs_t *root_css_buf)
3688 {
3689 uint64_t sum = 1;
3690
3691 uint i;
3692
3693 for (i = start; i < stop; i++)
3694 {
3695 sum *= root_css_buf[i].cs_len;
3696 }
3697
3698 return (sum);
3699 }
3700
3701 void sp_exec (uint64_t ctx, char *pw_buf, cs_t *root_css_buf, cs_t *markov_css_buf, uint start, uint stop)
3702 {
3703 uint64_t v = ctx;
3704
3705 cs_t *cs = &root_css_buf[start];
3706
3707 uint i;
3708
3709 for (i = start; i < stop; i++)
3710 {
3711 const uint64_t m = v % cs->cs_len;
3712 const uint64_t d = v / cs->cs_len;
3713
3714 v = d;
3715
3716 const uint k = cs->cs_buf[m];
3717
3718 pw_buf[i - start] = (char) k;
3719
3720 cs = &markov_css_buf[(i * CHARSIZ) + k];
3721 }
3722 }
3723
3724 int sp_comp_val (const void *p1, const void *p2)
3725 {
3726 hcstat_table_t *b1 = (hcstat_table_t *) p1;
3727 hcstat_table_t *b2 = (hcstat_table_t *) p2;
3728
3729 return b2->val - b1->val;
3730 }
3731
3732 void sp_setup_tbl (const char *install_dir, char *hcstat, uint disable, uint classic, hcstat_table_t *root_table_buf, hcstat_table_t *markov_table_buf)
3733 {
3734 uint i;
3735 uint j;
3736 uint k;
3737
3738 /**
3739 * Initialize hcstats
3740 */
3741
3742 uint64_t *root_stats_buf = (uint64_t *) mycalloc (SP_ROOT_CNT, sizeof (uint64_t));
3743
3744 uint64_t *root_stats_ptr = root_stats_buf;
3745
3746 uint64_t *root_stats_buf_by_pos[SP_PW_MAX];
3747
3748 for (i = 0; i < SP_PW_MAX; i++)
3749 {
3750 root_stats_buf_by_pos[i] = root_stats_ptr;
3751
3752 root_stats_ptr += CHARSIZ;
3753 }
3754
3755 uint64_t *markov_stats_buf = (uint64_t *) mycalloc (SP_MARKOV_CNT, sizeof (uint64_t));
3756
3757 uint64_t *markov_stats_ptr = markov_stats_buf;
3758
3759 uint64_t *markov_stats_buf_by_key[SP_PW_MAX][CHARSIZ];
3760
3761 for (i = 0; i < SP_PW_MAX; i++)
3762 {
3763 for (j = 0; j < CHARSIZ; j++)
3764 {
3765 markov_stats_buf_by_key[i][j] = markov_stats_ptr;
3766
3767 markov_stats_ptr += CHARSIZ;
3768 }
3769 }
3770
3771 /**
3772 * Load hcstats File
3773 */
3774
3775 if (hcstat == NULL)
3776 {
3777 char hcstat_tmp[256];
3778
3779 memset (hcstat_tmp, 0, sizeof (hcstat_tmp));
3780
3781 snprintf (hcstat_tmp, sizeof (hcstat_tmp) - 1, "%s/%s", install_dir, SP_HCSTAT);
3782
3783 hcstat = hcstat_tmp;
3784 }
3785
3786 FILE *fd = fopen (hcstat, "rb");
3787
3788 if (fd == NULL)
3789 {
3790 log_error ("%s: %s", hcstat, strerror (errno));
3791
3792 exit (-1);
3793 }
3794
3795 if (fread (root_stats_buf, sizeof (uint64_t), SP_ROOT_CNT, fd) != SP_ROOT_CNT)
3796 {
3797 log_error ("%s: Could not load data", hcstat);
3798
3799 exit (-1);
3800 }
3801
3802 if (fread (markov_stats_buf, sizeof (uint64_t), SP_MARKOV_CNT, fd) != SP_MARKOV_CNT)
3803 {
3804 log_error ("%s: Could not load data", hcstat);
3805
3806 exit (-1);
3807 }
3808
3809 fclose (fd);
3810
3811 /**
3812 * Markov modifier of hcstat_table on user request
3813 */
3814
3815 if (disable)
3816 {
3817 memset (root_stats_buf, 0, SP_ROOT_CNT * sizeof (uint64_t));
3818 memset (markov_stats_buf, 0, SP_MARKOV_CNT * sizeof (uint64_t));
3819 }
3820
3821 if (classic)
3822 {
3823 /* Add all stats to first position */
3824
3825 for (i = 1; i < SP_PW_MAX; i++)
3826 {
3827 uint64_t *out = root_stats_buf_by_pos[0];
3828 uint64_t *in = root_stats_buf_by_pos[i];
3829
3830 for (j = 0; j < CHARSIZ; j++)
3831 {
3832 *out++ += *in++;
3833 }
3834 }
3835
3836 for (i = 1; i < SP_PW_MAX; i++)
3837 {
3838 uint64_t *out = markov_stats_buf_by_key[0][0];
3839 uint64_t *in = markov_stats_buf_by_key[i][0];
3840
3841 for (j = 0; j < CHARSIZ; j++)
3842 {
3843 for (k = 0; k < CHARSIZ; k++)
3844 {
3845 *out++ += *in++;
3846 }
3847 }
3848 }
3849
3850 /* copy them to all pw_positions */
3851
3852 for (i = 1; i < SP_PW_MAX; i++)
3853 {
3854 memcpy (root_stats_buf_by_pos[i], root_stats_buf_by_pos[0], CHARSIZ * sizeof (uint64_t));
3855 }
3856
3857 for (i = 1; i < SP_PW_MAX; i++)
3858 {
3859 memcpy (markov_stats_buf_by_key[i][0], markov_stats_buf_by_key[0][0], CHARSIZ * CHARSIZ * sizeof (uint64_t));
3860 }
3861 }
3862
3863 /**
3864 * Initialize tables
3865 */
3866
3867 hcstat_table_t *root_table_ptr = root_table_buf;
3868
3869 hcstat_table_t *root_table_buf_by_pos[SP_PW_MAX];
3870
3871 for (i = 0; i < SP_PW_MAX; i++)
3872 {
3873 root_table_buf_by_pos[i] = root_table_ptr;
3874
3875 root_table_ptr += CHARSIZ;
3876 }
3877
3878 hcstat_table_t *markov_table_ptr = markov_table_buf;
3879
3880 hcstat_table_t *markov_table_buf_by_key[SP_PW_MAX][CHARSIZ];
3881
3882 for (i = 0; i < SP_PW_MAX; i++)
3883 {
3884 for (j = 0; j < CHARSIZ; j++)
3885 {
3886 markov_table_buf_by_key[i][j] = markov_table_ptr;
3887
3888 markov_table_ptr += CHARSIZ;
3889 }
3890 }
3891
3892 /**
3893 * Convert hcstat to tables
3894 */
3895
3896 for (i = 0; i < SP_ROOT_CNT; i++)
3897 {
3898 uint key = i % CHARSIZ;
3899
3900 root_table_buf[i].key = key;
3901 root_table_buf[i].val = root_stats_buf[i];
3902 }
3903
3904 for (i = 0; i < SP_MARKOV_CNT; i++)
3905 {
3906 uint key = i % CHARSIZ;
3907
3908 markov_table_buf[i].key = key;
3909 markov_table_buf[i].val = markov_stats_buf[i];
3910 }
3911
3912 myfree (root_stats_buf);
3913 myfree (markov_stats_buf);
3914
3915 /**
3916 * Finally sort them
3917 */
3918
3919 for (i = 0; i < SP_PW_MAX; i++)
3920 {
3921 qsort (root_table_buf_by_pos[i], CHARSIZ, sizeof (hcstat_table_t), sp_comp_val);
3922 }
3923
3924 for (i = 0; i < SP_PW_MAX; i++)
3925 {
3926 for (j = 0; j < CHARSIZ; j++)
3927 {
3928 qsort (markov_table_buf_by_key[i][j], CHARSIZ, sizeof (hcstat_table_t), sp_comp_val);
3929 }
3930 }
3931 }
3932
3933 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])
3934 {
3935 /**
3936 * Convert tables to css
3937 */
3938
3939 for (uint i = 0; i < SP_ROOT_CNT; i++)
3940 {
3941 uint pw_pos = i / CHARSIZ;
3942
3943 cs_t *cs = &root_css_buf[pw_pos];
3944
3945 if (cs->cs_len == threshold) continue;
3946
3947 uint key = root_table_buf[i].key;
3948
3949 if (uniq_tbls[pw_pos][key] == 0) continue;
3950
3951 cs->cs_buf[cs->cs_len] = key;
3952
3953 cs->cs_len++;
3954 }
3955
3956 /**
3957 * Convert table to css
3958 */
3959
3960 for (uint i = 0; i < SP_MARKOV_CNT; i++)
3961 {
3962 uint c = i / CHARSIZ;
3963
3964 cs_t *cs = &markov_css_buf[c];
3965
3966 if (cs->cs_len == threshold) continue;
3967
3968 uint pw_pos = c / CHARSIZ;
3969
3970 uint key = markov_table_buf[i].key;
3971
3972 if ((pw_pos + 1) < SP_PW_MAX) if (uniq_tbls[pw_pos + 1][key] == 0) continue;
3973
3974 cs->cs_buf[cs->cs_len] = key;
3975
3976 cs->cs_len++;
3977 }
3978
3979 /*
3980 for (uint i = 0; i < 8; i++)
3981 {
3982 for (uint j = 0x20; j < 0x80; j++)
3983 {
3984 cs_t *ptr = &markov_css_buf[(i * CHARSIZ) + j];
3985
3986 printf ("pos:%u key:%u len:%u\n", i, j, ptr->cs_len);
3987
3988 for (uint k = 0; k < 10; k++)
3989 {
3990 printf (" %u\n", ptr->cs_buf[k]);
3991 }
3992 }
3993 }
3994 */
3995 }
3996
3997 void sp_stretch_root (hcstat_table_t *in, hcstat_table_t *out)
3998 {
3999 for (uint i = 0; i < SP_PW_MAX; i += 2)
4000 {
4001 memcpy (out, in, CHARSIZ * sizeof (hcstat_table_t));
4002
4003 out += CHARSIZ;
4004 in += CHARSIZ;
4005
4006 out->key = 0;
4007 out->val = 1;
4008
4009 out++;
4010
4011 for (uint j = 1; j < CHARSIZ; j++)
4012 {
4013 out->key = j;
4014 out->val = 0;
4015
4016 out++;
4017 }
4018 }
4019 }
4020
4021 void sp_stretch_markov (hcstat_table_t *in, hcstat_table_t *out)
4022 {
4023 for (uint i = 0; i < SP_PW_MAX; i += 2)
4024 {
4025 memcpy (out, in, CHARSIZ * CHARSIZ * sizeof (hcstat_table_t));
4026
4027 out += CHARSIZ * CHARSIZ;
4028 in += CHARSIZ * CHARSIZ;
4029
4030 for (uint j = 0; j < CHARSIZ; j++)
4031 {
4032 out->key = 0;
4033 out->val = 1;
4034
4035 out++;
4036
4037 for (uint k = 1; k < CHARSIZ; k++)
4038 {
4039 out->key = k;
4040 out->val = 0;
4041
4042 out++;
4043 }
4044 }
4045 }
4046 }
4047
4048 /**
4049 * mixed shared functions
4050 */
4051
4052 void dump_hex (const char *s, size_t size)
4053 {
4054 size_t i;
4055
4056 for (i = 0; i < size; i++)
4057 {
4058 log_info_nn ("%02x ", (unsigned char) s[i]);
4059 }
4060
4061 log_info ("");
4062 }
4063
4064 void usage_mini_print (const char *progname)
4065 {
4066 for (uint i = 0; USAGE_MINI[i] != NULL; i++) log_info (USAGE_MINI[i], progname);
4067 }
4068
4069 void usage_big_print (const char *progname)
4070 {
4071 for (uint i = 0; USAGE_BIG[i] != NULL; i++) log_info (USAGE_BIG[i], progname);
4072 }
4073
4074 char *get_install_dir (const char *progname)
4075 {
4076 char *install_dir = mystrdup (progname);
4077 char *last_slash = NULL;
4078
4079 if ((last_slash = strrchr (install_dir, '/')) != NULL)
4080 {
4081 *last_slash = 0;
4082 }
4083 else if ((last_slash = strrchr (install_dir, '\\')) != NULL)
4084 {
4085 *last_slash = 0;
4086 }
4087 else
4088 {
4089 install_dir[0] = '.';
4090 install_dir[1] = 0;
4091 }
4092
4093 return (install_dir);
4094 }
4095
4096 void truecrypt_crc32 (char *file, unsigned char keytab[64])
4097 {
4098 uint crc = ~0;
4099
4100 FILE *fd = fopen (file, "rb");
4101
4102 if (fd == NULL)
4103 {
4104 log_error ("%s: %s", file, strerror (errno));
4105
4106 exit (-1);
4107 }
4108
4109 #define MAX_KEY_SIZE (1024 * 1024)
4110
4111 char *buf = (char *) mymalloc (MAX_KEY_SIZE);
4112
4113 int nread = fread (buf, 1, MAX_KEY_SIZE, fd);
4114
4115 int kpos = 0;
4116
4117 for (int fpos = 0; fpos < nread; fpos++)
4118 {
4119 crc = crc32tab[(crc ^ buf[fpos]) & 0xff] ^ (crc >> 8);
4120
4121 keytab[kpos++] += (crc >> 24) & 0xff;
4122 keytab[kpos++] += (crc >> 16) & 0xff;
4123 keytab[kpos++] += (crc >> 8) & 0xff;
4124 keytab[kpos++] += (crc >> 0) & 0xff;
4125
4126 if (kpos >= 64) kpos = 0;
4127 }
4128
4129 myfree (buf);
4130
4131 fclose(fd);
4132 }
4133
4134 void set_cpu_affinity (char *cpu_affinity)
4135 {
4136 #ifdef WIN
4137 DWORD_PTR aff_mask = 0;
4138 #endif
4139
4140 #ifdef LINUX
4141 cpu_set_t cpuset;
4142
4143 CPU_ZERO (&cpuset);
4144 #endif
4145
4146 if (cpu_affinity)
4147 {
4148 char *devices = strdup (cpu_affinity);
4149
4150 char *next = strtok (devices, ",");
4151
4152 do
4153 {
4154 uint cpu_id = atoi (next);
4155
4156 if (cpu_id == 0)
4157 {
4158 #ifdef WIN
4159 aff_mask = 0;
4160 #endif
4161
4162 #ifdef LINUX
4163 CPU_ZERO (&cpuset);
4164 #endif
4165
4166 break;
4167 }
4168
4169 if (cpu_id > 32)
4170 {
4171 log_error ("ERROR: invalid cpu_id %u specified", cpu_id);
4172
4173 exit (-1);
4174 }
4175
4176 #ifdef WIN
4177 aff_mask |= 1 << (cpu_id - 1);
4178 #endif
4179
4180 #ifdef LINUX
4181 CPU_SET ((cpu_id - 1), &cpuset);
4182 #endif
4183
4184 } while ((next = strtok (NULL, ",")) != NULL);
4185
4186 free (devices);
4187 }
4188
4189 #ifdef WIN
4190 SetProcessAffinityMask (GetCurrentProcess (), aff_mask);
4191 SetThreadAffinityMask (GetCurrentThread (), aff_mask);
4192 #endif
4193
4194 #ifdef LINUX
4195 pthread_t thread = pthread_self ();
4196 pthread_setaffinity_np (thread, sizeof (cpu_set_t), &cpuset);
4197 #endif
4198 }
4199
4200 void *rulefind (const void *key, void *base, int nmemb, size_t size, int (*compar) (const void *, const void *))
4201 {
4202 char *element, *end;
4203
4204 end = (char *) base + nmemb * size;
4205
4206 for (element = (char *) base; element < end; element += size)
4207 if (!compar (element, key))
4208 return element;
4209
4210 return NULL;
4211 }
4212
4213 int sort_by_salt (const void *v1, const void *v2)
4214 {
4215 const salt_t *s1 = (const salt_t *) v1;
4216 const salt_t *s2 = (const salt_t *) v2;
4217
4218 const int res1 = s1->salt_len - s2->salt_len;
4219
4220 if (res1 != 0) return (res1);
4221
4222 const int res2 = s1->salt_iter - s2->salt_iter;
4223
4224 if (res2 != 0) return (res2);
4225
4226 uint n;
4227
4228 n = 12;
4229
4230 while (n--)
4231 {
4232 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4233 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4234 }
4235
4236 n = 8;
4237
4238 while (n--)
4239 {
4240 if (s1->salt_buf_pc[n] > s2->salt_buf_pc[n]) return ( 1);
4241 if (s1->salt_buf_pc[n] < s2->salt_buf_pc[n]) return (-1);
4242 }
4243
4244 return (0);
4245 }
4246
4247 int sort_by_salt_buf (const void *v1, const void *v2)
4248 {
4249 const pot_t *p1 = (const pot_t *) v1;
4250 const pot_t *p2 = (const pot_t *) v2;
4251
4252 const hash_t *h1 = &p1->hash;
4253 const hash_t *h2 = &p2->hash;
4254
4255 const salt_t *s1 = h1->salt;
4256 const salt_t *s2 = h2->salt;
4257
4258 uint n = 12;
4259
4260 while (n--)
4261 {
4262 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4263 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4264 }
4265
4266 return 0;
4267 }
4268
4269 int sort_by_hash_t_salt (const void *v1, const void *v2)
4270 {
4271 const hash_t *h1 = (const hash_t *) v1;
4272 const hash_t *h2 = (const hash_t *) v2;
4273
4274 const salt_t *s1 = h1->salt;
4275 const salt_t *s2 = h2->salt;
4276
4277 // testphase: this should work
4278 uint n = 12;
4279
4280 while (n--)
4281 {
4282 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4283 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4284 }
4285
4286 /* original code, seems buggy since salt_len can be very big (had a case with 131 len)
4287 also it thinks salt_buf[x] is a char but its a uint so salt_len should be / 4
4288 if (s1->salt_len > s2->salt_len) return ( 1);
4289 if (s1->salt_len < s2->salt_len) return (-1);
4290
4291 uint n = s1->salt_len;
4292
4293 while (n--)
4294 {
4295 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4296 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4297 }
4298 */
4299
4300 return 0;
4301 }
4302
4303 int sort_by_hash_t_salt_hccap (const void *v1, const void *v2)
4304 {
4305 const hash_t *h1 = (const hash_t *) v1;
4306 const hash_t *h2 = (const hash_t *) v2;
4307
4308 const salt_t *s1 = h1->salt;
4309 const salt_t *s2 = h2->salt;
4310
4311 // 12 - 2 (since last 2 uints contain the digest)
4312 uint n = 10;
4313
4314 while (n--)
4315 {
4316 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4317 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4318 }
4319
4320 return 0;
4321 }
4322
4323 int sort_by_hash_no_salt (const void *v1, const void *v2)
4324 {
4325 const hash_t *h1 = (const hash_t *) v1;
4326 const hash_t *h2 = (const hash_t *) v2;
4327
4328 const void *d1 = h1->digest;
4329 const void *d2 = h2->digest;
4330
4331 return data.sort_by_digest (d1, d2);
4332 }
4333
4334 int sort_by_hash (const void *v1, const void *v2)
4335 {
4336 const hash_t *h1 = (const hash_t *) v1;
4337 const hash_t *h2 = (const hash_t *) v2;
4338
4339 if (data.isSalted)
4340 {
4341 const salt_t *s1 = h1->salt;
4342 const salt_t *s2 = h2->salt;
4343
4344 int res = sort_by_salt (s1, s2);
4345
4346 if (res != 0) return (res);
4347 }
4348
4349 const void *d1 = h1->digest;
4350 const void *d2 = h2->digest;
4351
4352 return data.sort_by_digest (d1, d2);
4353 }
4354
4355 int sort_by_pot (const void *v1, const void *v2)
4356 {
4357 const pot_t *p1 = (const pot_t *) v1;
4358 const pot_t *p2 = (const pot_t *) v2;
4359
4360 const hash_t *h1 = &p1->hash;
4361 const hash_t *h2 = &p2->hash;
4362
4363 return sort_by_hash (h1, h2);
4364 }
4365
4366 int sort_by_mtime (const void *p1, const void *p2)
4367 {
4368 const char **f1 = (const char **) p1;
4369 const char **f2 = (const char **) p2;
4370
4371 struct stat s1; stat (*f1, &s1);
4372 struct stat s2; stat (*f2, &s2);
4373
4374 return s2.st_mtime - s1.st_mtime;
4375 }
4376
4377 int sort_by_cpu_rule (const void *p1, const void *p2)
4378 {
4379 const cpu_rule_t *r1 = (const cpu_rule_t *) p1;
4380 const cpu_rule_t *r2 = (const cpu_rule_t *) p2;
4381
4382 return memcmp (r1, r2, sizeof (cpu_rule_t));
4383 }
4384
4385 int sort_by_gpu_rule (const void *p1, const void *p2)
4386 {
4387 const gpu_rule_t *r1 = (const gpu_rule_t *) p1;
4388 const gpu_rule_t *r2 = (const gpu_rule_t *) p2;
4389
4390 return memcmp (r1, r2, sizeof (gpu_rule_t));
4391 }
4392
4393 int sort_by_stringptr (const void *p1, const void *p2)
4394 {
4395 const char **s1 = (const char **) p1;
4396 const char **s2 = (const char **) p2;
4397
4398 return strcmp (*s1, *s2);
4399 }
4400
4401 int sort_by_dictstat (const void *s1, const void *s2)
4402 {
4403 dictstat_t *d1 = (dictstat_t *) s1;
4404 dictstat_t *d2 = (dictstat_t *) s2;
4405
4406 #ifdef _POSIX
4407 d2->stat.st_atim = d1->stat.st_atim;
4408 #else
4409 d2->stat.st_atime = d1->stat.st_atime;
4410 #endif
4411
4412 return memcmp (&d1->stat, &d2->stat, sizeof (struct stat));
4413 }
4414
4415 int sort_by_bitmap (const void *p1, const void *p2)
4416 {
4417 const bitmap_result_t *b1 = (const bitmap_result_t *) p1;
4418 const bitmap_result_t *b2 = (const bitmap_result_t *) p2;
4419
4420 return b1->collisions - b2->collisions;
4421 }
4422
4423 int sort_by_digest_4_2 (const void *v1, const void *v2)
4424 {
4425 const uint32_t *d1 = (const uint32_t *) v1;
4426 const uint32_t *d2 = (const uint32_t *) v2;
4427
4428 uint n = 2;
4429
4430 while (n--)
4431 {
4432 if (d1[n] > d2[n]) return ( 1);
4433 if (d1[n] < d2[n]) return (-1);
4434 }
4435
4436 return (0);
4437 }
4438
4439 int sort_by_digest_4_4 (const void *v1, const void *v2)
4440 {
4441 const uint32_t *d1 = (const uint32_t *) v1;
4442 const uint32_t *d2 = (const uint32_t *) v2;
4443
4444 uint n = 4;
4445
4446 while (n--)
4447 {
4448 if (d1[n] > d2[n]) return ( 1);
4449 if (d1[n] < d2[n]) return (-1);
4450 }
4451
4452 return (0);
4453 }
4454
4455 int sort_by_digest_4_5 (const void *v1, const void *v2)
4456 {
4457 const uint32_t *d1 = (const uint32_t *) v1;
4458 const uint32_t *d2 = (const uint32_t *) v2;
4459
4460 uint n = 5;
4461
4462 while (n--)
4463 {
4464 if (d1[n] > d2[n]) return ( 1);
4465 if (d1[n] < d2[n]) return (-1);
4466 }
4467
4468 return (0);
4469 }
4470
4471 int sort_by_digest_4_6 (const void *v1, const void *v2)
4472 {
4473 const uint32_t *d1 = (const uint32_t *) v1;
4474 const uint32_t *d2 = (const uint32_t *) v2;
4475
4476 uint n = 6;
4477
4478 while (n--)
4479 {
4480 if (d1[n] > d2[n]) return ( 1);
4481 if (d1[n] < d2[n]) return (-1);
4482 }
4483
4484 return (0);
4485 }
4486
4487 int sort_by_digest_4_8 (const void *v1, const void *v2)
4488 {
4489 const uint32_t *d1 = (const uint32_t *) v1;
4490 const uint32_t *d2 = (const uint32_t *) v2;
4491
4492 uint n = 8;
4493
4494 while (n--)
4495 {
4496 if (d1[n] > d2[n]) return ( 1);
4497 if (d1[n] < d2[n]) return (-1);
4498 }
4499
4500 return (0);
4501 }
4502
4503 int sort_by_digest_4_16 (const void *v1, const void *v2)
4504 {
4505 const uint32_t *d1 = (const uint32_t *) v1;
4506 const uint32_t *d2 = (const uint32_t *) v2;
4507
4508 uint n = 16;
4509
4510 while (n--)
4511 {
4512 if (d1[n] > d2[n]) return ( 1);
4513 if (d1[n] < d2[n]) return (-1);
4514 }
4515
4516 return (0);
4517 }
4518
4519 int sort_by_digest_4_32 (const void *v1, const void *v2)
4520 {
4521 const uint32_t *d1 = (const uint32_t *) v1;
4522 const uint32_t *d2 = (const uint32_t *) v2;
4523
4524 uint n = 32;
4525
4526 while (n--)
4527 {
4528 if (d1[n] > d2[n]) return ( 1);
4529 if (d1[n] < d2[n]) return (-1);
4530 }
4531
4532 return (0);
4533 }
4534
4535 int sort_by_digest_4_64 (const void *v1, const void *v2)
4536 {
4537 const uint32_t *d1 = (const uint32_t *) v1;
4538 const uint32_t *d2 = (const uint32_t *) v2;
4539
4540 uint n = 64;
4541
4542 while (n--)
4543 {
4544 if (d1[n] > d2[n]) return ( 1);
4545 if (d1[n] < d2[n]) return (-1);
4546 }
4547
4548 return (0);
4549 }
4550
4551 int sort_by_digest_8_8 (const void *v1, const void *v2)
4552 {
4553 const uint64_t *d1 = (const uint64_t *) v1;
4554 const uint64_t *d2 = (const uint64_t *) v2;
4555
4556 uint n = 8;
4557
4558 while (n--)
4559 {
4560 if (d1[n] > d2[n]) return ( 1);
4561 if (d1[n] < d2[n]) return (-1);
4562 }
4563
4564 return (0);
4565 }
4566
4567 int sort_by_digest_8_16 (const void *v1, const void *v2)
4568 {
4569 const uint64_t *d1 = (const uint64_t *) v1;
4570 const uint64_t *d2 = (const uint64_t *) v2;
4571
4572 uint n = 16;
4573
4574 while (n--)
4575 {
4576 if (d1[n] > d2[n]) return ( 1);
4577 if (d1[n] < d2[n]) return (-1);
4578 }
4579
4580 return (0);
4581 }
4582
4583 int sort_by_digest_8_25 (const void *v1, const void *v2)
4584 {
4585 const uint64_t *d1 = (const uint64_t *) v1;
4586 const uint64_t *d2 = (const uint64_t *) v2;
4587
4588 uint n = 25;
4589
4590 while (n--)
4591 {
4592 if (d1[n] > d2[n]) return ( 1);
4593 if (d1[n] < d2[n]) return (-1);
4594 }
4595
4596 return (0);
4597 }
4598
4599 int sort_by_digest_p0p1 (const void *v1, const void *v2)
4600 {
4601 const uint32_t *d1 = (const uint32_t *) v1;
4602 const uint32_t *d2 = (const uint32_t *) v2;
4603
4604 const uint dgst_pos0 = data.dgst_pos0;
4605 const uint dgst_pos1 = data.dgst_pos1;
4606 const uint dgst_pos2 = data.dgst_pos2;
4607 const uint dgst_pos3 = data.dgst_pos3;
4608
4609 if (d1[dgst_pos3] > d2[dgst_pos3]) return ( 1);
4610 if (d1[dgst_pos3] < d2[dgst_pos3]) return (-1);
4611 if (d1[dgst_pos2] > d2[dgst_pos2]) return ( 1);
4612 if (d1[dgst_pos2] < d2[dgst_pos2]) return (-1);
4613 if (d1[dgst_pos1] > d2[dgst_pos1]) return ( 1);
4614 if (d1[dgst_pos1] < d2[dgst_pos1]) return (-1);
4615 if (d1[dgst_pos0] > d2[dgst_pos0]) return ( 1);
4616 if (d1[dgst_pos0] < d2[dgst_pos0]) return (-1);
4617
4618 return (0);
4619 }
4620
4621 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)
4622 {
4623 uint outfile_autohex = data.outfile_autohex;
4624
4625 unsigned char *rule_ptr = (unsigned char *) rule_buf;
4626
4627 FILE *debug_fp = NULL;
4628
4629 if (debug_file != NULL)
4630 {
4631 debug_fp = fopen (debug_file, "ab");
4632 }
4633 else
4634 {
4635 debug_fp = stderr;
4636 }
4637
4638 if (debug_fp == NULL)
4639 {
4640 log_info ("WARNING: Could not open debug-file for writing");
4641 }
4642 else
4643 {
4644 if ((debug_mode == 2) || (debug_mode == 3) || (debug_mode == 4))
4645 {
4646 format_plain (debug_fp, orig_plain_ptr, orig_plain_len, outfile_autohex);
4647
4648 if ((debug_mode == 3) || (debug_mode == 4)) fputc (':', debug_fp);
4649 }
4650
4651 fwrite (rule_ptr, rule_len, 1, debug_fp);
4652
4653 if (debug_mode == 4)
4654 {
4655 fputc (':', debug_fp);
4656
4657 format_plain (debug_fp, mod_plain_ptr, mod_plain_len, outfile_autohex);
4658 }
4659
4660 fputc ('\n', debug_fp);
4661
4662 if (debug_file != NULL) fclose (debug_fp);
4663 }
4664 }
4665
4666 void format_plain (FILE *fp, unsigned char *plain_ptr, uint plain_len, uint outfile_autohex)
4667 {
4668 int needs_hexify = 0;
4669
4670 if (outfile_autohex == 1)
4671 {
4672 for (uint i = 0; i < plain_len; i++)
4673 {
4674 if (plain_ptr[i] < 0x20)
4675 {
4676 needs_hexify = 1;
4677
4678 break;
4679 }
4680
4681 if (plain_ptr[i] > 0x7f)
4682 {
4683 needs_hexify = 1;
4684
4685 break;
4686 }
4687 }
4688 }
4689
4690 if (needs_hexify == 1)
4691 {
4692 fprintf (fp, "$HEX[");
4693
4694 for (uint i = 0; i < plain_len; i++)
4695 {
4696 fprintf (fp, "%02x", plain_ptr[i]);
4697 }
4698
4699 fprintf (fp, "]");
4700 }
4701 else
4702 {
4703 fwrite (plain_ptr, plain_len, 1, fp);
4704 }
4705 }
4706
4707 void format_output (FILE *out_fp, char *out_buf, unsigned char *plain_ptr, const uint plain_len, const uint64_t crackpos, unsigned char *username, const uint user_len)
4708 {
4709 uint outfile_format = data.outfile_format;
4710
4711 char separator = data.separator;
4712
4713 if (outfile_format & OUTFILE_FMT_HASH)
4714 {
4715 fprintf (out_fp, "%s", out_buf);
4716
4717 if (outfile_format & (OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
4718 {
4719 fputc (separator, out_fp);
4720 }
4721 }
4722 else if (data.username)
4723 {
4724 if (username != NULL)
4725 {
4726 for (uint i = 0; i < user_len; i++)
4727 {
4728 fprintf (out_fp, "%c", username[i]);
4729 }
4730
4731 if (outfile_format & (OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
4732 {
4733 fputc (separator, out_fp);
4734 }
4735 }
4736 }
4737
4738 if (outfile_format & OUTFILE_FMT_PLAIN)
4739 {
4740 format_plain (out_fp, plain_ptr, plain_len, data.outfile_autohex);
4741
4742 if (outfile_format & (OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
4743 {
4744 fputc (separator, out_fp);
4745 }
4746 }
4747
4748 if (outfile_format & OUTFILE_FMT_HEXPLAIN)
4749 {
4750 for (uint i = 0; i < plain_len; i++)
4751 {
4752 fprintf (out_fp, "%02x", plain_ptr[i]);
4753 }
4754
4755 if (outfile_format & (OUTFILE_FMT_CRACKPOS))
4756 {
4757 fputc (separator, out_fp);
4758 }
4759 }
4760
4761 if (outfile_format & OUTFILE_FMT_CRACKPOS)
4762 {
4763 #ifdef _WIN
4764 __mingw_fprintf (out_fp, "%llu", crackpos);
4765 #endif
4766
4767 #ifdef _POSIX
4768 #ifdef __x86_64__
4769 fprintf (out_fp, "%lu", crackpos);
4770 #else
4771 fprintf (out_fp, "%llu", crackpos);
4772 #endif
4773 #endif
4774 }
4775
4776 fputc ('\n', out_fp);
4777 }
4778
4779 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)
4780 {
4781 pot_t pot_key;
4782
4783 pot_key.hash.salt = hashes_buf->salt;
4784 pot_key.hash.digest = hashes_buf->digest;
4785
4786 pot_t *pot_ptr = (pot_t *) bsearch (&pot_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
4787
4788 if (pot_ptr)
4789 {
4790 log_info_nn ("");
4791
4792 input_buf[input_len] = 0;
4793
4794 // user
4795 unsigned char *username = NULL;
4796 uint user_len = 0;
4797
4798 if (data.username)
4799 {
4800 user_t *user = hashes_buf->hash_info->user;
4801
4802 if (user)
4803 {
4804 username = (unsigned char *) (user->user_name);
4805
4806 user_len = user->user_len;
4807 }
4808 }
4809
4810 // do output the line
4811 format_output (out_fp, input_buf, (unsigned char *) pot_ptr->plain_buf, pot_ptr->plain_len, 0, username, user_len);
4812 }
4813 }
4814
4815 #define LM_WEAK_HASH "\x4e\xcf\x0d\x0c\x0a\xe2\xfb\xc1"
4816 #define LM_MASKED_PLAIN "[notfound]"
4817
4818 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)
4819 {
4820 // left
4821
4822 pot_t pot_left_key;
4823
4824 pot_left_key.hash.salt = hash_left->salt;
4825 pot_left_key.hash.digest = hash_left->digest;
4826
4827 pot_t *pot_left_ptr = (pot_t *) bsearch (&pot_left_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
4828
4829 // right
4830
4831 uint weak_hash_found = 0;
4832
4833 pot_t pot_right_key;
4834
4835 pot_right_key.hash.salt = hash_right->salt;
4836 pot_right_key.hash.digest = hash_right->digest;
4837
4838 pot_t *pot_right_ptr = (pot_t *) bsearch (&pot_right_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
4839
4840 if (pot_right_ptr == NULL)
4841 {
4842 // special case, if "weak hash"
4843
4844 if (memcmp (hash_right->digest, LM_WEAK_HASH, 8) == 0)
4845 {
4846 weak_hash_found = 1;
4847
4848 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
4849
4850 // in theory this is not needed, but we are paranoia:
4851
4852 memset (pot_right_ptr->plain_buf, 0, sizeof (pot_right_ptr->plain_buf));
4853 pot_right_ptr->plain_len = 0;
4854 }
4855 }
4856
4857 if ((pot_left_ptr == NULL) && (pot_right_ptr == NULL))
4858 {
4859 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
4860
4861 return;
4862 }
4863
4864 // at least one half was found:
4865
4866 log_info_nn ("");
4867
4868 input_buf[input_len] = 0;
4869
4870 // user
4871
4872 unsigned char *username = NULL;
4873 uint user_len = 0;
4874
4875 if (data.username)
4876 {
4877 user_t *user = hash_left->hash_info->user;
4878
4879 if (user)
4880 {
4881 username = (unsigned char *) (user->user_name);
4882
4883 user_len = user->user_len;
4884 }
4885 }
4886
4887 // mask the part which was not found
4888
4889 uint left_part_masked = 0;
4890 uint right_part_masked = 0;
4891
4892 uint mask_plain_len = strlen (LM_MASKED_PLAIN);
4893
4894 if (pot_left_ptr == NULL)
4895 {
4896 left_part_masked = 1;
4897
4898 pot_left_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
4899
4900 memset (pot_left_ptr->plain_buf, 0, sizeof (pot_left_ptr->plain_buf));
4901
4902 memcpy (pot_left_ptr->plain_buf, LM_MASKED_PLAIN, mask_plain_len);
4903 pot_left_ptr->plain_len = mask_plain_len;
4904 }
4905
4906 if (pot_right_ptr == NULL)
4907 {
4908 right_part_masked = 1;
4909
4910 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
4911
4912 memset (pot_right_ptr->plain_buf, 0, sizeof (pot_right_ptr->plain_buf));
4913
4914 memcpy (pot_right_ptr->plain_buf, LM_MASKED_PLAIN, mask_plain_len);
4915 pot_right_ptr->plain_len = mask_plain_len;
4916 }
4917
4918 // create the pot_ptr out of pot_left_ptr and pot_right_ptr
4919
4920 pot_t pot_ptr;
4921
4922 pot_ptr.plain_len = pot_left_ptr->plain_len + pot_right_ptr->plain_len;
4923
4924 memcpy (pot_ptr.plain_buf, pot_left_ptr->plain_buf, pot_left_ptr->plain_len);
4925
4926 memcpy (pot_ptr.plain_buf + pot_left_ptr->plain_len, pot_right_ptr->plain_buf, pot_right_ptr->plain_len);
4927
4928 // do output the line
4929
4930 format_output (out_fp, input_buf, (unsigned char *) pot_ptr.plain_buf, pot_ptr.plain_len, 0, username, user_len);
4931
4932 if (weak_hash_found == 1) myfree (pot_right_ptr);
4933
4934 if (left_part_masked == 1) myfree (pot_left_ptr);
4935 if (right_part_masked == 1) myfree (pot_right_ptr);
4936 }
4937
4938 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)
4939 {
4940 pot_t pot_key;
4941
4942 memcpy (&pot_key.hash, hashes_buf, sizeof (hash_t));
4943
4944 pot_t *pot_ptr = (pot_t *) bsearch (&pot_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
4945
4946 if (pot_ptr == NULL)
4947 {
4948 log_info_nn ("");
4949
4950 input_buf[input_len] = 0;
4951
4952 format_output (out_fp, input_buf, NULL, 0, 0, NULL, 0);
4953 }
4954 }
4955
4956 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)
4957 {
4958 // left
4959
4960 pot_t pot_left_key;
4961
4962 memcpy (&pot_left_key.hash, hash_left, sizeof (hash_t));
4963
4964 pot_t *pot_left_ptr = (pot_t *) bsearch (&pot_left_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
4965
4966 // right
4967
4968 pot_t pot_right_key;
4969
4970 memcpy (&pot_right_key.hash, hash_right, sizeof (hash_t));
4971
4972 pot_t *pot_right_ptr = (pot_t *) bsearch (&pot_right_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
4973
4974 uint weak_hash_found = 0;
4975
4976 if (pot_right_ptr == NULL)
4977 {
4978 // special case, if "weak hash"
4979
4980 if (memcmp (hash_right->digest, LM_WEAK_HASH, 8) == 0)
4981 {
4982 weak_hash_found = 1;
4983
4984 // we just need that pot_right_ptr is not a NULL pointer
4985
4986 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
4987 }
4988 }
4989
4990 if ((pot_left_ptr != NULL) && (pot_right_ptr != NULL))
4991 {
4992 if (weak_hash_found == 1) myfree (pot_right_ptr);
4993
4994 return;
4995 }
4996
4997 // ... at least one part was not cracked
4998
4999 log_info_nn ("");
5000
5001 input_buf[input_len] = 0;
5002
5003 // only show the hash part which is still not cracked
5004
5005 uint user_len = input_len - 32;
5006
5007 char hash_output[user_len + 33];
5008
5009 memset (hash_output, 0, sizeof (hash_output));
5010
5011 memcpy (hash_output, input_buf, input_len);
5012
5013 if (pot_left_ptr != NULL)
5014 {
5015 // only show right part (because left part was already found)
5016
5017 memcpy (hash_output + user_len, input_buf + user_len + 16, 16);
5018
5019 hash_output[user_len + 16] = 0;
5020 }
5021
5022 if (pot_right_ptr != NULL)
5023 {
5024 // only show left part (because right part was already found)
5025
5026 memcpy (hash_output + user_len, input_buf + user_len, 16);
5027
5028 hash_output[user_len + 16] = 0;
5029 }
5030
5031 format_output (out_fp, hash_output, NULL, 0, 0, NULL, 0);
5032
5033 if (weak_hash_found == 1) myfree (pot_right_ptr);
5034 }
5035
5036 uint devices_to_devicemask (char *gpu_devices)
5037 {
5038 uint gpu_devicemask = 0;
5039
5040 if (gpu_devices)
5041 {
5042 char *devices = strdup (gpu_devices);
5043
5044 char *next = strtok (devices, ",");
5045
5046 do
5047 {
5048 uint gpu_id = atoi (next);
5049
5050 if (gpu_id < 1 || gpu_id > 8)
5051 {
5052 log_error ("ERROR: invalid gpu_id %u specified", gpu_id);
5053
5054 exit (-1);
5055 }
5056
5057 gpu_devicemask |= 1 << (gpu_id - 1);
5058
5059 } while ((next = strtok (NULL, ",")) != NULL);
5060
5061 free (devices);
5062 }
5063
5064 return gpu_devicemask;
5065 }
5066
5067 uint get_random_num (uint min, uint max)
5068 {
5069 if (min == max) return (min);
5070
5071 return (uint) ((rand () % (max - min)) + min);
5072 }
5073
5074 uint32_t mydivc32 (const uint32_t dividend, const uint32_t divisor)
5075 {
5076 uint32_t quotient = dividend / divisor;
5077
5078 if (dividend % divisor) quotient++;
5079
5080 return quotient;
5081 }
5082
5083 uint64_t mydivc64 (const uint64_t dividend, const uint64_t divisor)
5084 {
5085 uint64_t quotient = dividend / divisor;
5086
5087 if (dividend % divisor) quotient++;
5088
5089 return quotient;
5090 }
5091
5092 void format_timer_display (struct tm *tm, char *buf, size_t len)
5093 {
5094 const char *time_entities_s[] = { "year", "day", "hour", "min", "sec" };
5095 const char *time_entities_m[] = { "years", "days", "hours", "mins", "secs" };
5096
5097 if (tm->tm_year - 70)
5098 {
5099 char *time_entity1 = ((tm->tm_year - 70) == 1) ? (char *) time_entities_s[0] : (char *) time_entities_m[0];
5100 char *time_entity2 = ( tm->tm_yday == 1) ? (char *) time_entities_s[1] : (char *) time_entities_m[1];
5101
5102 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_year - 70, time_entity1, tm->tm_yday, time_entity2);
5103 }
5104 else if (tm->tm_yday)
5105 {
5106 char *time_entity1 = (tm->tm_yday == 1) ? (char *) time_entities_s[1] : (char *) time_entities_m[1];
5107 char *time_entity2 = (tm->tm_hour == 1) ? (char *) time_entities_s[2] : (char *) time_entities_m[2];
5108
5109 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_yday, time_entity1, tm->tm_hour, time_entity2);
5110 }
5111 else if (tm->tm_hour)
5112 {
5113 char *time_entity1 = (tm->tm_hour == 1) ? (char *) time_entities_s[2] : (char *) time_entities_m[2];
5114 char *time_entity2 = (tm->tm_min == 1) ? (char *) time_entities_s[3] : (char *) time_entities_m[3];
5115
5116 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_hour, time_entity1, tm->tm_min, time_entity2);
5117 }
5118 else if (tm->tm_min)
5119 {
5120 char *time_entity1 = (tm->tm_min == 1) ? (char *) time_entities_s[3] : (char *) time_entities_m[3];
5121 char *time_entity2 = (tm->tm_sec == 1) ? (char *) time_entities_s[4] : (char *) time_entities_m[4];
5122
5123 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_min, time_entity1, tm->tm_sec, time_entity2);
5124 }
5125 else
5126 {
5127 char *time_entity1 = (tm->tm_sec == 1) ? (char *) time_entities_s[4] : (char *) time_entities_m[4];
5128
5129 snprintf (buf, len - 1, "%d %s", tm->tm_sec, time_entity1);
5130 }
5131 }
5132
5133 void format_speed_display (float val, char *buf, size_t len)
5134 {
5135 if (val <= 0)
5136 {
5137 buf[0] = '0';
5138 buf[1] = ' ';
5139 buf[2] = 0;
5140
5141 return;
5142 }
5143
5144 char units[7] = { ' ', 'k', 'M', 'G', 'T', 'P', 'E' };
5145
5146 uint level = 0;
5147
5148 while (val > 99999)
5149 {
5150 val /= 1000;
5151
5152 level++;
5153 }
5154
5155 /* generate output */
5156
5157 if (level == 0)
5158 {
5159 snprintf (buf, len - 1, "%.0f ", val);
5160 }
5161 else
5162 {
5163 snprintf (buf, len - 1, "%.1f %c", val, units[level]);
5164 }
5165 }
5166
5167 void lowercase (char *buf, int len)
5168 {
5169 for (int i = 0; i < len; i++) buf[i] = tolower (buf[i]);
5170 }
5171
5172 void uppercase (char *buf, int len)
5173 {
5174 for (int i = 0; i < len; i++) buf[i] = toupper (buf[i]);
5175 }
5176
5177 int fgetl (FILE *fp, char *line_buf)
5178 {
5179 int line_len = 0;
5180
5181 while (!feof (fp))
5182 {
5183 const int c = fgetc (fp);
5184
5185 if (c == EOF) break;
5186
5187 line_buf[line_len] = (char) c;
5188
5189 line_len++;
5190
5191 if (line_len == BUFSIZ) line_len--;
5192
5193 if (c == '\n') break;
5194 }
5195
5196 if (line_len == 0) return 0;
5197
5198 if (line_buf[line_len - 1] == '\n')
5199 {
5200 line_len--;
5201
5202 line_buf[line_len] = 0;
5203 }
5204
5205 if (line_len == 0) return 0;
5206
5207 if (line_buf[line_len - 1] == '\r')
5208 {
5209 line_len--;
5210
5211 line_buf[line_len] = 0;
5212 }
5213
5214 return (line_len);
5215 }
5216
5217 int in_superchop (char *buf)
5218 {
5219 int len = strlen (buf);
5220
5221 while (len)
5222 {
5223 if (buf[len - 1] == '\n')
5224 {
5225 len--;
5226
5227 continue;
5228 }
5229
5230 if (buf[len - 1] == '\r')
5231 {
5232 len--;
5233
5234 continue;
5235 }
5236
5237 break;
5238 }
5239
5240 buf[len] = 0;
5241
5242 return len;
5243 }
5244
5245 char **scan_directory (const char *path)
5246 {
5247 char *tmp_path = mystrdup (path);
5248
5249 size_t tmp_path_len = strlen (tmp_path);
5250
5251 while (tmp_path[tmp_path_len - 1] == '/' || tmp_path[tmp_path_len - 1] == '\\')
5252 {
5253 tmp_path[tmp_path_len - 1] = 0;
5254
5255 tmp_path_len = strlen (tmp_path);
5256 }
5257
5258 char **files = NULL;
5259
5260 int num_files = 0;
5261
5262 DIR *d;
5263
5264 if ((d = opendir (tmp_path)) != NULL)
5265 {
5266 struct dirent *de;
5267
5268 while ((de = readdir (d)) != NULL)
5269 {
5270 if ((strcmp (de->d_name, ".") == 0) || (strcmp (de->d_name, "..") == 0)) continue;
5271
5272 int path_size = strlen (tmp_path) + 1 + strlen (de->d_name);
5273
5274 char *path_file = (char *) mymalloc (path_size + 1);
5275
5276 snprintf (path_file, path_size + 1, "%s/%s", tmp_path, de->d_name);
5277
5278 path_file[path_size] = 0;
5279
5280 DIR *d_test;
5281
5282 if ((d_test = opendir (path_file)) != NULL)
5283 {
5284 closedir (d_test);
5285
5286 myfree (path_file);
5287 }
5288 else
5289 {
5290 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5291
5292 num_files++;
5293
5294 files[num_files - 1] = path_file;
5295 }
5296 }
5297
5298 closedir (d);
5299 }
5300 else if (errno == ENOTDIR)
5301 {
5302 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5303
5304 num_files++;
5305
5306 files[num_files - 1] = mystrdup (path);
5307 }
5308
5309 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5310
5311 num_files++;
5312
5313 files[num_files - 1] = NULL;
5314
5315 myfree (tmp_path);
5316
5317 return (files);
5318 }
5319
5320 int count_dictionaries (char **dictionary_files)
5321 {
5322 if (dictionary_files == NULL) return 0;
5323
5324 int cnt = 0;
5325
5326 for (int d = 0; dictionary_files[d] != NULL; d++)
5327 {
5328 cnt++;
5329 }
5330
5331 return (cnt);
5332 }
5333
5334 char *stroptitype (const uint opti_type)
5335 {
5336 switch (opti_type)
5337 {
5338 case OPTI_TYPE_ZERO_BYTE: return ((char *) OPTI_STR_ZERO_BYTE); break;
5339 case OPTI_TYPE_PRECOMPUTE_INIT: return ((char *) OPTI_STR_PRECOMPUTE_INIT); break;
5340 case OPTI_TYPE_PRECOMPUTE_MERKLE: return ((char *) OPTI_STR_PRECOMPUTE_MERKLE); break;
5341 case OPTI_TYPE_PRECOMPUTE_PERMUT: return ((char *) OPTI_STR_PRECOMPUTE_PERMUT); break;
5342 case OPTI_TYPE_MEET_IN_MIDDLE: return ((char *) OPTI_STR_MEET_IN_MIDDLE); break;
5343 case OPTI_TYPE_EARLY_SKIP: return ((char *) OPTI_STR_EARLY_SKIP); break;
5344 case OPTI_TYPE_NOT_SALTED: return ((char *) OPTI_STR_NOT_SALTED); break;
5345 case OPTI_TYPE_NOT_ITERATED: return ((char *) OPTI_STR_NOT_ITERATED); break;
5346 case OPTI_TYPE_PREPENDED_SALT: return ((char *) OPTI_STR_PREPENDED_SALT); break;
5347 case OPTI_TYPE_APPENDED_SALT: return ((char *) OPTI_STR_APPENDED_SALT); break;
5348 case OPTI_TYPE_SINGLE_HASH: return ((char *) OPTI_STR_SINGLE_HASH); break;
5349 case OPTI_TYPE_SINGLE_SALT: return ((char *) OPTI_STR_SINGLE_SALT); break;
5350 case OPTI_TYPE_BRUTE_FORCE: return ((char *) OPTI_STR_BRUTE_FORCE); break;
5351 case OPTI_TYPE_SCALAR_MODE: return ((char *) OPTI_STR_SCALAR_MODE); break;
5352 case OPTI_TYPE_RAW_HASH: return ((char *) OPTI_STR_RAW_HASH); break;
5353 }
5354
5355 return (NULL);
5356 }
5357
5358 char *strparser (const uint parser_status)
5359 {
5360 switch (parser_status)
5361 {
5362 case PARSER_OK: return ((char *) PA_000); break;
5363 case PARSER_COMMENT: return ((char *) PA_001); break;
5364 case PARSER_GLOBAL_ZERO: return ((char *) PA_002); break;
5365 case PARSER_GLOBAL_LENGTH: return ((char *) PA_003); break;
5366 case PARSER_HASH_LENGTH: return ((char *) PA_004); break;
5367 case PARSER_HASH_VALUE: return ((char *) PA_005); break;
5368 case PARSER_SALT_LENGTH: return ((char *) PA_006); break;
5369 case PARSER_SALT_VALUE: return ((char *) PA_007); break;
5370 case PARSER_SALT_ITERATION: return ((char *) PA_008); break;
5371 case PARSER_SEPARATOR_UNMATCHED: return ((char *) PA_009); break;
5372 case PARSER_SIGNATURE_UNMATCHED: return ((char *) PA_010); break;
5373 case PARSER_HCCAP_FILE_SIZE: return ((char *) PA_011); break;
5374 case PARSER_HCCAP_EAPOL_SIZE: return ((char *) PA_012); break;
5375 case PARSER_PSAFE2_FILE_SIZE: return ((char *) PA_013); break;
5376 case PARSER_PSAFE3_FILE_SIZE: return ((char *) PA_014); break;
5377 case PARSER_TC_FILE_SIZE: return ((char *) PA_015); break;
5378 case PARSER_SIP_AUTH_DIRECTIVE: return ((char *) PA_016); break;
5379 }
5380
5381 return ((char *) PA_255);
5382 }
5383
5384 char *strhashtype (const uint hash_mode)
5385 {
5386 switch (hash_mode)
5387 {
5388 case 0: return ((char *) HT_00000); break;
5389 case 10: return ((char *) HT_00010); break;
5390 case 11: return ((char *) HT_00011); break;
5391 case 12: return ((char *) HT_00012); break;
5392 case 20: return ((char *) HT_00020); break;
5393 case 21: return ((char *) HT_00021); break;
5394 case 22: return ((char *) HT_00022); break;
5395 case 23: return ((char *) HT_00023); break;
5396 case 30: return ((char *) HT_00030); break;
5397 case 40: return ((char *) HT_00040); break;
5398 case 50: return ((char *) HT_00050); break;
5399 case 60: return ((char *) HT_00060); break;
5400 case 100: return ((char *) HT_00100); break;
5401 case 101: return ((char *) HT_00101); break;
5402 case 110: return ((char *) HT_00110); break;
5403 case 111: return ((char *) HT_00111); break;
5404 case 112: return ((char *) HT_00112); break;
5405 case 120: return ((char *) HT_00120); break;
5406 case 121: return ((char *) HT_00121); break;
5407 case 122: return ((char *) HT_00122); break;
5408 case 124: return ((char *) HT_00124); break;
5409 case 130: return ((char *) HT_00130); break;
5410 case 131: return ((char *) HT_00131); break;
5411 case 132: return ((char *) HT_00132); break;
5412 case 133: return ((char *) HT_00133); break;
5413 case 140: return ((char *) HT_00140); break;
5414 case 141: return ((char *) HT_00141); break;
5415 case 150: return ((char *) HT_00150); break;
5416 case 160: return ((char *) HT_00160); break;
5417 case 190: return ((char *) HT_00190); break;
5418 case 200: return ((char *) HT_00200); break;
5419 case 300: return ((char *) HT_00300); break;
5420 case 400: return ((char *) HT_00400); break;
5421 case 500: return ((char *) HT_00500); break;
5422 case 501: return ((char *) HT_00501); break;
5423 case 900: return ((char *) HT_00900); break;
5424 case 910: return ((char *) HT_00910); break;
5425 case 1000: return ((char *) HT_01000); break;
5426 case 1100: return ((char *) HT_01100); break;
5427 case 1400: return ((char *) HT_01400); break;
5428 case 1410: return ((char *) HT_01410); break;
5429 case 1420: return ((char *) HT_01420); break;
5430 case 1421: return ((char *) HT_01421); break;
5431 case 1430: return ((char *) HT_01430); break;
5432 case 1440: return ((char *) HT_01440); break;
5433 case 1441: return ((char *) HT_01441); break;
5434 case 1450: return ((char *) HT_01450); break;
5435 case 1460: return ((char *) HT_01460); break;
5436 case 1500: return ((char *) HT_01500); break;
5437 case 1600: return ((char *) HT_01600); break;
5438 case 1700: return ((char *) HT_01700); break;
5439 case 1710: return ((char *) HT_01710); break;
5440 case 1711: return ((char *) HT_01711); break;
5441 case 1720: return ((char *) HT_01720); break;
5442 case 1722: return ((char *) HT_01722); break;
5443 case 1730: return ((char *) HT_01730); break;
5444 case 1731: return ((char *) HT_01731); break;
5445 case 1740: return ((char *) HT_01740); break;
5446 case 1750: return ((char *) HT_01750); break;
5447 case 1760: return ((char *) HT_01760); break;
5448 case 1800: return ((char *) HT_01800); break;
5449 case 2100: return ((char *) HT_02100); break;
5450 case 2400: return ((char *) HT_02400); break;
5451 case 2410: return ((char *) HT_02410); break;
5452 case 2500: return ((char *) HT_02500); break;
5453 case 2600: return ((char *) HT_02600); break;
5454 case 2611: return ((char *) HT_02611); break;
5455 case 2612: return ((char *) HT_02612); break;
5456 case 2711: return ((char *) HT_02711); break;
5457 case 2811: return ((char *) HT_02811); break;
5458 case 3000: return ((char *) HT_03000); break;
5459 case 3100: return ((char *) HT_03100); break;
5460 case 3200: return ((char *) HT_03200); break;
5461 case 3710: return ((char *) HT_03710); break;
5462 case 3711: return ((char *) HT_03711); break;
5463 case 3800: return ((char *) HT_03800); break;
5464 case 4300: return ((char *) HT_04300); break;
5465 case 4400: return ((char *) HT_04400); break;
5466 case 4500: return ((char *) HT_04500); break;
5467 case 4700: return ((char *) HT_04700); break;
5468 case 4800: return ((char *) HT_04800); break;
5469 case 4900: return ((char *) HT_04900); break;
5470 case 5000: return ((char *) HT_05000); break;
5471 case 5100: return ((char *) HT_05100); break;
5472 case 5200: return ((char *) HT_05200); break;
5473 case 5300: return ((char *) HT_05300); break;
5474 case 5400: return ((char *) HT_05400); break;
5475 case 5500: return ((char *) HT_05500); break;
5476 case 5600: return ((char *) HT_05600); break;
5477 case 5700: return ((char *) HT_05700); break;
5478 case 5800: return ((char *) HT_05800); break;
5479 case 6000: return ((char *) HT_06000); break;
5480 case 6100: return ((char *) HT_06100); break;
5481 case 6211: return ((char *) HT_06211); break;
5482 case 6212: return ((char *) HT_06212); break;
5483 case 6213: return ((char *) HT_06213); break;
5484 case 6221: return ((char *) HT_06221); break;
5485 case 6222: return ((char *) HT_06222); break;
5486 case 6223: return ((char *) HT_06223); break;
5487 case 6231: return ((char *) HT_06231); break;
5488 case 6232: return ((char *) HT_06232); break;
5489 case 6233: return ((char *) HT_06233); break;
5490 case 6241: return ((char *) HT_06241); break;
5491 case 6242: return ((char *) HT_06242); break;
5492 case 6243: return ((char *) HT_06243); break;
5493 case 6300: return ((char *) HT_06300); break;
5494 case 6400: return ((char *) HT_06400); break;
5495 case 6500: return ((char *) HT_06500); break;
5496 case 6600: return ((char *) HT_06600); break;
5497 case 6700: return ((char *) HT_06700); break;
5498 case 6800: return ((char *) HT_06800); break;
5499 case 6900: return ((char *) HT_06900); break;
5500 case 7100: return ((char *) HT_07100); break;
5501 case 7200: return ((char *) HT_07200); break;
5502 case 7300: return ((char *) HT_07300); break;
5503 case 7400: return ((char *) HT_07400); break;
5504 case 7500: return ((char *) HT_07500); break;
5505 case 7600: return ((char *) HT_07600); break;
5506 case 7700: return ((char *) HT_07700); break;
5507 case 7800: return ((char *) HT_07800); break;
5508 case 7900: return ((char *) HT_07900); break;
5509 case 8000: return ((char *) HT_08000); break;
5510 case 8100: return ((char *) HT_08100); break;
5511 case 8200: return ((char *) HT_08200); break;
5512 case 8300: return ((char *) HT_08300); break;
5513 case 8400: return ((char *) HT_08400); break;
5514 case 8500: return ((char *) HT_08500); break;
5515 case 8600: return ((char *) HT_08600); break;
5516 case 8700: return ((char *) HT_08700); break;
5517 case 8800: return ((char *) HT_08800); break;
5518 case 8900: return ((char *) HT_08900); break;
5519 case 9000: return ((char *) HT_09000); break;
5520 case 9100: return ((char *) HT_09100); break;
5521 case 9200: return ((char *) HT_09200); break;
5522 case 9300: return ((char *) HT_09300); break;
5523 case 9400: return ((char *) HT_09400); break;
5524 case 9500: return ((char *) HT_09500); break;
5525 case 9600: return ((char *) HT_09600); break;
5526 case 9700: return ((char *) HT_09700); break;
5527 case 9710: return ((char *) HT_09710); break;
5528 case 9720: return ((char *) HT_09720); break;
5529 case 9800: return ((char *) HT_09800); break;
5530 case 9810: return ((char *) HT_09810); break;
5531 case 9820: return ((char *) HT_09820); break;
5532 case 9900: return ((char *) HT_09900); break;
5533 case 10000: return ((char *) HT_10000); break;
5534 case 10100: return ((char *) HT_10100); break;
5535 case 10200: return ((char *) HT_10200); break;
5536 case 10300: return ((char *) HT_10300); break;
5537 case 10400: return ((char *) HT_10400); break;
5538 case 10410: return ((char *) HT_10410); break;
5539 case 10420: return ((char *) HT_10420); break;
5540 case 10500: return ((char *) HT_10500); break;
5541 case 10600: return ((char *) HT_10600); break;
5542 case 10700: return ((char *) HT_10700); break;
5543 case 10800: return ((char *) HT_10800); break;
5544 case 10900: return ((char *) HT_10900); break;
5545 case 11000: return ((char *) HT_11000); break;
5546 case 11100: return ((char *) HT_11100); break;
5547 case 11200: return ((char *) HT_11200); break;
5548 case 11300: return ((char *) HT_11300); break;
5549 case 11400: return ((char *) HT_11400); break;
5550 case 11500: return ((char *) HT_11500); break;
5551 case 11600: return ((char *) HT_11600); break;
5552 case 11700: return ((char *) HT_11700); break;
5553 case 11800: return ((char *) HT_11800); break;
5554 case 11900: return ((char *) HT_11900); break;
5555 case 12000: return ((char *) HT_12000); break;
5556 case 12100: return ((char *) HT_12100); break;
5557 case 12200: return ((char *) HT_12200); break;
5558 case 12300: return ((char *) HT_12300); break;
5559 case 12400: return ((char *) HT_12400); break;
5560 case 12500: return ((char *) HT_12500); break;
5561 case 12600: return ((char *) HT_12600); break;
5562 case 12700: return ((char *) HT_12700); break;
5563 case 12800: return ((char *) HT_12800); break;
5564 }
5565
5566 return ((char *) "Unknown");
5567 }
5568
5569 char *strstatus (const uint devices_status)
5570 {
5571 switch (devices_status)
5572 {
5573 case STATUS_INIT: return ((char *) ST_0000); break;
5574 case STATUS_STARTING: return ((char *) ST_0001); break;
5575 case STATUS_RUNNING: return ((char *) ST_0002); break;
5576 case STATUS_PAUSED: return ((char *) ST_0003); break;
5577 case STATUS_EXHAUSTED: return ((char *) ST_0004); break;
5578 case STATUS_CRACKED: return ((char *) ST_0005); break;
5579 case STATUS_ABORTED: return ((char *) ST_0006); break;
5580 case STATUS_QUIT: return ((char *) ST_0007); break;
5581 case STATUS_BYPASS: return ((char *) ST_0008); break;
5582 case STATUS_STOP_AT_CHECKPOINT: return ((char *) ST_0009); break;
5583 }
5584
5585 return ((char *) "Unknown");
5586 }
5587
5588 void ascii_digest (char out_buf[4096], uint salt_pos, uint digest_pos)
5589 {
5590 uint hash_type = data.hash_type;
5591 uint hash_mode = data.hash_mode;
5592 uint salt_type = data.salt_type;
5593 uint opts_type = data.opts_type;
5594 uint opti_type = data.opti_type;
5595 uint dgst_size = data.dgst_size;
5596
5597 char *hashfile = data.hashfile;
5598
5599 uint len = 4096;
5600
5601 uint digest_buf[64];
5602
5603 uint64_t *digest_buf64 = (uint64_t *) digest_buf;
5604
5605 char *digests_buf_ptr = (char *) data.digests_buf;
5606
5607 memcpy (digest_buf, digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size), dgst_size);
5608
5609 if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT)
5610 {
5611 uint tt;
5612
5613 switch (hash_type)
5614 {
5615 case HASH_TYPE_DESCRYPT:
5616 FP (digest_buf[1], digest_buf[0], tt);
5617 break;
5618
5619 case HASH_TYPE_DESRACF:
5620 digest_buf[0] = ROTATE_LEFT (digest_buf[0], 29);
5621 digest_buf[1] = ROTATE_LEFT (digest_buf[1], 29);
5622
5623 FP (digest_buf[1], digest_buf[0], tt);
5624 break;
5625
5626 case HASH_TYPE_LM:
5627 FP (digest_buf[1], digest_buf[0], tt);
5628 break;
5629
5630 case HASH_TYPE_NETNTLM:
5631 digest_buf[0] = ROTATE_LEFT (digest_buf[0], 29);
5632 digest_buf[1] = ROTATE_LEFT (digest_buf[1], 29);
5633 digest_buf[2] = ROTATE_LEFT (digest_buf[2], 29);
5634 digest_buf[3] = ROTATE_LEFT (digest_buf[3], 29);
5635
5636 FP (digest_buf[1], digest_buf[0], tt);
5637 FP (digest_buf[3], digest_buf[2], tt);
5638 break;
5639
5640 case HASH_TYPE_BSDICRYPT:
5641 digest_buf[0] = ROTATE_LEFT (digest_buf[0], 31);
5642 digest_buf[1] = ROTATE_LEFT (digest_buf[1], 31);
5643
5644 FP (digest_buf[1], digest_buf[0], tt);
5645 break;
5646 }
5647 }
5648
5649 if (opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE)
5650 {
5651 switch (hash_type)
5652 {
5653 case HASH_TYPE_MD4:
5654 digest_buf[0] += MD4M_A;
5655 digest_buf[1] += MD4M_B;
5656 digest_buf[2] += MD4M_C;
5657 digest_buf[3] += MD4M_D;
5658 break;
5659
5660 case HASH_TYPE_MD5:
5661 digest_buf[0] += MD5M_A;
5662 digest_buf[1] += MD5M_B;
5663 digest_buf[2] += MD5M_C;
5664 digest_buf[3] += MD5M_D;
5665 break;
5666
5667 case HASH_TYPE_SHA1:
5668 digest_buf[0] += SHA1M_A;
5669 digest_buf[1] += SHA1M_B;
5670 digest_buf[2] += SHA1M_C;
5671 digest_buf[3] += SHA1M_D;
5672 digest_buf[4] += SHA1M_E;
5673 break;
5674
5675 case HASH_TYPE_SHA256:
5676 digest_buf[0] += SHA256M_A;
5677 digest_buf[1] += SHA256M_B;
5678 digest_buf[2] += SHA256M_C;
5679 digest_buf[3] += SHA256M_D;
5680 digest_buf[4] += SHA256M_E;
5681 digest_buf[5] += SHA256M_F;
5682 digest_buf[6] += SHA256M_G;
5683 digest_buf[7] += SHA256M_H;
5684 break;
5685
5686 case HASH_TYPE_SHA384:
5687 digest_buf64[0] += SHA384M_A;
5688 digest_buf64[1] += SHA384M_B;
5689 digest_buf64[2] += SHA384M_C;
5690 digest_buf64[3] += SHA384M_D;
5691 digest_buf64[4] += SHA384M_E;
5692 digest_buf64[5] += SHA384M_F;
5693 digest_buf64[6] += 0;
5694 digest_buf64[7] += 0;
5695 break;
5696
5697 case HASH_TYPE_SHA512:
5698 digest_buf64[0] += SHA512M_A;
5699 digest_buf64[1] += SHA512M_B;
5700 digest_buf64[2] += SHA512M_C;
5701 digest_buf64[3] += SHA512M_D;
5702 digest_buf64[4] += SHA512M_E;
5703 digest_buf64[5] += SHA512M_F;
5704 digest_buf64[6] += SHA512M_G;
5705 digest_buf64[7] += SHA512M_H;
5706 break;
5707 }
5708 }
5709
5710 if (opts_type & OPTS_TYPE_PT_GENERATE_LE)
5711 {
5712 if (dgst_size == DGST_SIZE_4_2)
5713 {
5714 for (int i = 0; i < 2; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5715 }
5716 else if (dgst_size == DGST_SIZE_4_4)
5717 {
5718 for (int i = 0; i < 4; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5719 }
5720 else if (dgst_size == DGST_SIZE_4_5)
5721 {
5722 for (int i = 0; i < 5; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5723 }
5724 else if (dgst_size == DGST_SIZE_4_6)
5725 {
5726 for (int i = 0; i < 6; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5727 }
5728 else if (dgst_size == DGST_SIZE_4_8)
5729 {
5730 for (int i = 0; i < 8; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5731 }
5732 else if ((dgst_size == DGST_SIZE_4_16) || (dgst_size == DGST_SIZE_8_8)) // same size, same result :)
5733 {
5734 if (hash_type == HASH_TYPE_WHIRLPOOL)
5735 {
5736 for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5737 }
5738 else if (hash_type == HASH_TYPE_SHA384)
5739 {
5740 for (int i = 0; i < 8; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
5741 }
5742 else if (hash_type == HASH_TYPE_SHA512)
5743 {
5744 for (int i = 0; i < 8; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
5745 }
5746 else if (hash_type == HASH_TYPE_GOST)
5747 {
5748 for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5749 }
5750 }
5751 else if (dgst_size == DGST_SIZE_4_64)
5752 {
5753 for (int i = 0; i < 64; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5754 }
5755 else if (dgst_size == DGST_SIZE_8_25)
5756 {
5757 for (int i = 0; i < 25; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
5758 }
5759 }
5760
5761 uint isSalted = ((data.salt_type == SALT_TYPE_INTERN)
5762 | (data.salt_type == SALT_TYPE_EXTERN)
5763 | (data.salt_type == SALT_TYPE_EMBEDDED));
5764
5765 salt_t salt;
5766
5767 if (isSalted)
5768 {
5769 memset (&salt, 0, sizeof (salt_t));
5770
5771 memcpy (&salt, &data.salts_buf[salt_pos], sizeof (salt_t));
5772
5773 char *ptr = (char *) salt.salt_buf;
5774
5775 uint len = salt.salt_len;
5776
5777 if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT)
5778 {
5779 uint tt;
5780
5781 switch (hash_type)
5782 {
5783 case HASH_TYPE_NETNTLM:
5784
5785 salt.salt_buf[0] = ROTATE_RIGHT (salt.salt_buf[0], 3);
5786 salt.salt_buf[1] = ROTATE_RIGHT (salt.salt_buf[1], 3);
5787
5788 FP (salt.salt_buf[1], salt.salt_buf[0], tt);
5789
5790 break;
5791 }
5792 }
5793
5794 if (opts_type & OPTS_TYPE_ST_UNICODE)
5795 {
5796 for (uint i = 0, j = 0; i < len; i += 1, j += 2)
5797 {
5798 ptr[i] = ptr[j];
5799 }
5800
5801 len = len / 2;
5802 }
5803
5804 if (opts_type & OPTS_TYPE_ST_GENERATE_LE)
5805 {
5806 uint max = salt.salt_len / 4;
5807
5808 if (len % 4) max++;
5809
5810 for (uint i = 0; i < max; i++)
5811 {
5812 salt.salt_buf[i] = byte_swap_32 (salt.salt_buf[i]);
5813 }
5814 }
5815
5816 if (opts_type & OPTS_TYPE_ST_HEX)
5817 {
5818 char tmp[64];
5819
5820 memset (tmp, 0, sizeof (tmp));
5821
5822 for (uint i = 0, j = 0; i < len; i += 1, j += 2)
5823 {
5824 sprintf (tmp + j, "%02x", (unsigned char) ptr[i]);
5825 }
5826
5827 len = len * 2;
5828
5829 memcpy (ptr, tmp, len);
5830 }
5831
5832 uint memset_size = ((48 - (int) len) > 0) ? (48 - len) : 0;
5833
5834 memset (ptr + len, 0, memset_size);
5835
5836 salt.salt_len = len;
5837 }
5838
5839 //
5840 // some modes require special encoding
5841 //
5842
5843 uint out_buf_plain[256];
5844 uint out_buf_salt[256];
5845
5846 char tmp_buf[1024];
5847
5848 memset (out_buf_plain, 0, sizeof (out_buf_plain));
5849 memset (out_buf_salt, 0, sizeof (out_buf_salt));
5850
5851 memset (tmp_buf, 0, sizeof (tmp_buf));
5852
5853 char *ptr_plain = (char *) out_buf_plain;
5854 char *ptr_salt = (char *) out_buf_salt;
5855
5856 if (hash_mode == 22)
5857 {
5858 char username[30];
5859
5860 memset (username, 0, sizeof (username));
5861
5862 memcpy (username, salt.salt_buf, salt.salt_len - 22);
5863
5864 char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' };
5865
5866 uint16_t *ptr = (uint16_t *) digest_buf;
5867
5868 tmp_buf[ 0] = sig[0];
5869 tmp_buf[ 1] = int_to_base64 (((ptr[1]) >> 12) & 0x3f);
5870 tmp_buf[ 2] = int_to_base64 (((ptr[1]) >> 6) & 0x3f);
5871 tmp_buf[ 3] = int_to_base64 (((ptr[1]) >> 0) & 0x3f);
5872 tmp_buf[ 4] = int_to_base64 (((ptr[0]) >> 12) & 0x3f);
5873 tmp_buf[ 5] = int_to_base64 (((ptr[0]) >> 6) & 0x3f);
5874 tmp_buf[ 6] = sig[1];
5875 tmp_buf[ 7] = int_to_base64 (((ptr[0]) >> 0) & 0x3f);
5876 tmp_buf[ 8] = int_to_base64 (((ptr[3]) >> 12) & 0x3f);
5877 tmp_buf[ 9] = int_to_base64 (((ptr[3]) >> 6) & 0x3f);
5878 tmp_buf[10] = int_to_base64 (((ptr[3]) >> 0) & 0x3f);
5879 tmp_buf[11] = int_to_base64 (((ptr[2]) >> 12) & 0x3f);
5880 tmp_buf[12] = sig[2];
5881 tmp_buf[13] = int_to_base64 (((ptr[2]) >> 6) & 0x3f);
5882 tmp_buf[14] = int_to_base64 (((ptr[2]) >> 0) & 0x3f);
5883 tmp_buf[15] = int_to_base64 (((ptr[5]) >> 12) & 0x3f);
5884 tmp_buf[16] = int_to_base64 (((ptr[5]) >> 6) & 0x3f);
5885 tmp_buf[17] = sig[3];
5886 tmp_buf[18] = int_to_base64 (((ptr[5]) >> 0) & 0x3f);
5887 tmp_buf[19] = int_to_base64 (((ptr[4]) >> 12) & 0x3f);
5888 tmp_buf[20] = int_to_base64 (((ptr[4]) >> 6) & 0x3f);
5889 tmp_buf[21] = int_to_base64 (((ptr[4]) >> 0) & 0x3f);
5890 tmp_buf[22] = int_to_base64 (((ptr[7]) >> 12) & 0x3f);
5891 tmp_buf[23] = sig[4];
5892 tmp_buf[24] = int_to_base64 (((ptr[7]) >> 6) & 0x3f);
5893 tmp_buf[25] = int_to_base64 (((ptr[7]) >> 0) & 0x3f);
5894 tmp_buf[26] = int_to_base64 (((ptr[6]) >> 12) & 0x3f);
5895 tmp_buf[27] = int_to_base64 (((ptr[6]) >> 6) & 0x3f);
5896 tmp_buf[28] = int_to_base64 (((ptr[6]) >> 0) & 0x3f);
5897 tmp_buf[29] = sig[5];
5898
5899 snprintf (out_buf, len-1, "%s:%s",
5900 tmp_buf,
5901 username);
5902 }
5903 else if (hash_mode == 23)
5904 {
5905 // do not show the \nskyper\n part in output
5906
5907 char *salt_buf_ptr = (char *) salt.salt_buf;
5908
5909 salt_buf_ptr[salt.salt_len - 8] = 0;
5910
5911 snprintf (out_buf, len-1, "%08x%08x%08x%08x:%s",
5912 digest_buf[0],
5913 digest_buf[1],
5914 digest_buf[2],
5915 digest_buf[3],
5916 salt_buf_ptr);
5917 }
5918 else if (hash_mode == 101)
5919 {
5920 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
5921
5922 digest_buf[0] = byte_swap_32 (digest_buf[0]);
5923 digest_buf[1] = byte_swap_32 (digest_buf[1]);
5924 digest_buf[2] = byte_swap_32 (digest_buf[2]);
5925 digest_buf[3] = byte_swap_32 (digest_buf[3]);
5926 digest_buf[4] = byte_swap_32 (digest_buf[4]);
5927
5928 memcpy (tmp_buf, digest_buf, 20);
5929
5930 base64_encode (int_to_base64, tmp_buf, 20, ptr_plain);
5931
5932 snprintf (out_buf, len-1, "{SHA}%s", ptr_plain);
5933 }
5934 else if (hash_mode == 111)
5935 {
5936 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
5937
5938 digest_buf[0] = byte_swap_32 (digest_buf[0]);
5939 digest_buf[1] = byte_swap_32 (digest_buf[1]);
5940 digest_buf[2] = byte_swap_32 (digest_buf[2]);
5941 digest_buf[3] = byte_swap_32 (digest_buf[3]);
5942 digest_buf[4] = byte_swap_32 (digest_buf[4]);
5943
5944 memcpy (tmp_buf, digest_buf, 20);
5945 memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len);
5946
5947 base64_encode (int_to_base64, tmp_buf, 20 + salt.salt_len, ptr_plain);
5948
5949 snprintf (out_buf, len-1, "{SSHA}%s", ptr_plain);
5950 }
5951 else if (hash_mode == 122)
5952 {
5953 snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x",
5954 (unsigned char *) salt.salt_buf,
5955 digest_buf[0],
5956 digest_buf[1],
5957 digest_buf[2],
5958 digest_buf[3],
5959 digest_buf[4]);
5960 }
5961 else if (hash_mode == 124)
5962 {
5963 snprintf (out_buf, len-1, "sha1$%s$%08x%08x%08x%08x%08x",
5964 (unsigned char *) salt.salt_buf,
5965 digest_buf[0],
5966 digest_buf[1],
5967 digest_buf[2],
5968 digest_buf[3],
5969 digest_buf[4]);
5970 }
5971 else if (hash_mode == 131)
5972 {
5973 snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
5974 (unsigned char *) salt.salt_buf,
5975 0, 0, 0, 0, 0,
5976 digest_buf[0],
5977 digest_buf[1],
5978 digest_buf[2],
5979 digest_buf[3],
5980 digest_buf[4]);
5981 }
5982 else if (hash_mode == 132)
5983 {
5984 snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x",
5985 (unsigned char *) salt.salt_buf,
5986 digest_buf[0],
5987 digest_buf[1],
5988 digest_buf[2],
5989 digest_buf[3],
5990 digest_buf[4]);
5991 }
5992 else if (hash_mode == 133)
5993 {
5994 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
5995
5996 digest_buf[0] = byte_swap_32 (digest_buf[0]);
5997 digest_buf[1] = byte_swap_32 (digest_buf[1]);
5998 digest_buf[2] = byte_swap_32 (digest_buf[2]);
5999 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6000 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6001
6002 memcpy (tmp_buf, digest_buf, 20);
6003
6004 base64_encode (int_to_base64, tmp_buf, 20, ptr_plain);
6005
6006 snprintf (out_buf, len-1, "%s", ptr_plain);
6007 }
6008 else if (hash_mode == 141)
6009 {
6010 memcpy (tmp_buf, salt.salt_buf, salt.salt_len);
6011
6012 base64_encode (int_to_base64, tmp_buf, salt.salt_len, ptr_salt);
6013
6014 memset (tmp_buf, 0, sizeof (tmp_buf));
6015
6016 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
6017
6018 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6019 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6020 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6021 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6022 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6023
6024 memcpy (tmp_buf, digest_buf, 20);
6025
6026 base64_encode (int_to_base64, tmp_buf, 20, ptr_plain);
6027
6028 ptr_plain[27] = 0;
6029
6030 snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER, ptr_salt, ptr_plain);
6031 }
6032 else if (hash_mode == 400)
6033 {
6034 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
6035
6036 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6037 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6038 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6039 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6040
6041 phpass_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6042
6043 snprintf (out_buf, len-1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, (char *) ptr_plain);
6044 }
6045 else if (hash_mode == 500)
6046 {
6047 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
6048
6049 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6050 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6051 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6052 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6053
6054 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6055
6056 if (salt.salt_iter == ROUNDS_MD5CRYPT)
6057 {
6058 snprintf (out_buf, len-1, "$1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6059 }
6060 else
6061 {
6062 snprintf (out_buf, len-1, "$1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6063 }
6064 }
6065 else if (hash_mode == 501)
6066 {
6067 uint digest_idx = salt.digests_offset + digest_pos;
6068
6069 hashinfo_t **hashinfo_ptr = data.hash_info;
6070 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
6071
6072 snprintf (out_buf, len-1, "%s", hash_buf);
6073 }
6074 else if (hash_mode == 1421)
6075 {
6076 uint8_t *salt_ptr = (uint8_t *) salt.salt_buf;
6077
6078 snprintf (out_buf, len-1, "%c%c%c%c%c%c%08x%08x%08x%08x%08x%08x%08x%08x",
6079 salt_ptr[0],
6080 salt_ptr[1],
6081 salt_ptr[2],
6082 salt_ptr[3],
6083 salt_ptr[4],
6084 salt_ptr[5],
6085 digest_buf[0],
6086 digest_buf[1],
6087 digest_buf[2],
6088 digest_buf[3],
6089 digest_buf[4],
6090 digest_buf[5],
6091 digest_buf[6],
6092 digest_buf[7]);
6093 }
6094 else if (hash_mode == 1441)
6095 {
6096 memcpy (tmp_buf, salt.salt_buf, salt.salt_len);
6097
6098 base64_encode (int_to_base64, tmp_buf, salt.salt_len, ptr_salt);
6099
6100 memset (tmp_buf, 0, sizeof (tmp_buf));
6101
6102 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
6103
6104 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6105 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6106 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6107 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6108 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6109 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6110 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6111 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6112
6113 memcpy (tmp_buf, digest_buf, 32);
6114
6115 base64_encode (int_to_base64, tmp_buf, 32, ptr_plain);
6116
6117 ptr_plain[43] = 0;
6118
6119 snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER4, ptr_salt, ptr_plain);
6120 }
6121 else if (hash_mode == 1500)
6122 {
6123 out_buf[0] = salt.salt_sign[0] & 0xff;
6124 out_buf[1] = salt.salt_sign[1] & 0xff;
6125 //original method, but changed because of this ticket: https://hashcat.net/trac/ticket/269
6126 //out_buf[0] = int_to_itoa64 ((salt.salt_buf[0] >> 0) & 0x3f);
6127 //out_buf[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f);
6128
6129 memset (tmp_buf, 0, sizeof (tmp_buf));
6130
6131 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
6132
6133 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6134 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6135
6136 memcpy (tmp_buf, digest_buf, 8);
6137
6138 base64_encode (int_to_itoa64, tmp_buf, 8, ptr_plain);
6139
6140 snprintf (out_buf + 2, len-1-2, "%s", ptr_plain);
6141
6142 out_buf[13] = 0;
6143 }
6144 else if (hash_mode == 1600)
6145 {
6146 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
6147
6148 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6149 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6150 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6151 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6152
6153 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6154
6155 if (salt.salt_iter == ROUNDS_MD5CRYPT)
6156 {
6157 snprintf (out_buf, len-1, "$apr1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6158 }
6159 else
6160 {
6161 snprintf (out_buf, len-1, "$apr1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6162 }
6163 }
6164 else if (hash_mode == 1711)
6165 {
6166 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6167
6168 digest_buf64[0] = byte_swap_64 (digest_buf64[0]);
6169 digest_buf64[1] = byte_swap_64 (digest_buf64[1]);
6170 digest_buf64[2] = byte_swap_64 (digest_buf64[2]);
6171 digest_buf64[3] = byte_swap_64 (digest_buf64[3]);
6172 digest_buf64[4] = byte_swap_64 (digest_buf64[4]);
6173 digest_buf64[5] = byte_swap_64 (digest_buf64[5]);
6174 digest_buf64[6] = byte_swap_64 (digest_buf64[6]);
6175 digest_buf64[7] = byte_swap_64 (digest_buf64[7]);
6176
6177 memcpy (tmp_buf, digest_buf, 64);
6178 memcpy (tmp_buf + 64, salt.salt_buf, salt.salt_len);
6179
6180 base64_encode (int_to_base64, tmp_buf, 64 + salt.salt_len, ptr_plain);
6181
6182 snprintf (out_buf, len-1, "%s%s", SIGNATURE_SHA512B64S, ptr_plain);
6183 }
6184 else if (hash_mode == 1722)
6185 {
6186 uint *ptr = digest_buf;
6187
6188 snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6189 (unsigned char *) salt.salt_buf,
6190 ptr[ 1], ptr[ 0],
6191 ptr[ 3], ptr[ 2],
6192 ptr[ 5], ptr[ 4],
6193 ptr[ 7], ptr[ 6],
6194 ptr[ 9], ptr[ 8],
6195 ptr[11], ptr[10],
6196 ptr[13], ptr[12],
6197 ptr[15], ptr[14]);
6198 }
6199 else if (hash_mode == 1731)
6200 {
6201 uint *ptr = digest_buf;
6202
6203 snprintf (out_buf, len-1, "0x0200%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6204 (unsigned char *) salt.salt_buf,
6205 ptr[ 1], ptr[ 0],
6206 ptr[ 3], ptr[ 2],
6207 ptr[ 5], ptr[ 4],
6208 ptr[ 7], ptr[ 6],
6209 ptr[ 9], ptr[ 8],
6210 ptr[11], ptr[10],
6211 ptr[13], ptr[12],
6212 ptr[15], ptr[14]);
6213 }
6214 else if (hash_mode == 1800)
6215 {
6216 // temp workaround
6217
6218 digest_buf64[0] = byte_swap_64 (digest_buf64[0]);
6219 digest_buf64[1] = byte_swap_64 (digest_buf64[1]);
6220 digest_buf64[2] = byte_swap_64 (digest_buf64[2]);
6221 digest_buf64[3] = byte_swap_64 (digest_buf64[3]);
6222 digest_buf64[4] = byte_swap_64 (digest_buf64[4]);
6223 digest_buf64[5] = byte_swap_64 (digest_buf64[5]);
6224 digest_buf64[6] = byte_swap_64 (digest_buf64[6]);
6225 digest_buf64[7] = byte_swap_64 (digest_buf64[7]);
6226
6227 sha512crypt_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
6228
6229 if (salt.salt_iter == ROUNDS_SHA512CRYPT)
6230 {
6231 snprintf (out_buf, len-1, "$6$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6232 }
6233 else
6234 {
6235 snprintf (out_buf, len-1, "$6$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6236 }
6237 }
6238 else if (hash_mode == 2100)
6239 {
6240 uint pos = 0;
6241
6242 snprintf (out_buf + pos, len-1, "%s%i#",
6243 SIGNATURE_DCC2,
6244 salt.salt_iter + 1);
6245
6246 uint signature_len = strlen (out_buf);
6247
6248 pos += signature_len;
6249 len -= signature_len;
6250
6251 char *salt_ptr = (char *) salt.salt_buf;
6252
6253 for (uint i = 0; i < salt.salt_len; i++, pos++, len--) snprintf (out_buf + pos, len-1, "%c", salt_ptr[i]);
6254
6255 snprintf (out_buf + pos, len-1, "#%08x%08x%08x%08x",
6256 byte_swap_32 (digest_buf[0]),
6257 byte_swap_32 (digest_buf[1]),
6258 byte_swap_32 (digest_buf[2]),
6259 byte_swap_32 (digest_buf[3]));
6260 }
6261 else if ((hash_mode == 2400) || (hash_mode == 2410))
6262 {
6263 memcpy (tmp_buf, digest_buf, 16);
6264
6265 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6266
6267 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6268 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6269 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6270 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6271
6272 out_buf[ 0] = int_to_itoa64 ((digest_buf[0] >> 0) & 0x3f);
6273 out_buf[ 1] = int_to_itoa64 ((digest_buf[0] >> 6) & 0x3f);
6274 out_buf[ 2] = int_to_itoa64 ((digest_buf[0] >> 12) & 0x3f);
6275 out_buf[ 3] = int_to_itoa64 ((digest_buf[0] >> 18) & 0x3f);
6276
6277 out_buf[ 4] = int_to_itoa64 ((digest_buf[1] >> 0) & 0x3f);
6278 out_buf[ 5] = int_to_itoa64 ((digest_buf[1] >> 6) & 0x3f);
6279 out_buf[ 6] = int_to_itoa64 ((digest_buf[1] >> 12) & 0x3f);
6280 out_buf[ 7] = int_to_itoa64 ((digest_buf[1] >> 18) & 0x3f);
6281
6282 out_buf[ 8] = int_to_itoa64 ((digest_buf[2] >> 0) & 0x3f);
6283 out_buf[ 9] = int_to_itoa64 ((digest_buf[2] >> 6) & 0x3f);
6284 out_buf[10] = int_to_itoa64 ((digest_buf[2] >> 12) & 0x3f);
6285 out_buf[11] = int_to_itoa64 ((digest_buf[2] >> 18) & 0x3f);
6286
6287 out_buf[12] = int_to_itoa64 ((digest_buf[3] >> 0) & 0x3f);
6288 out_buf[13] = int_to_itoa64 ((digest_buf[3] >> 6) & 0x3f);
6289 out_buf[14] = int_to_itoa64 ((digest_buf[3] >> 12) & 0x3f);
6290 out_buf[15] = int_to_itoa64 ((digest_buf[3] >> 18) & 0x3f);
6291
6292 out_buf[16] = 0;
6293 }
6294 else if (hash_mode == 2500)
6295 {
6296 wpa_t *wpas = (wpa_t *) data.esalts_buf;
6297
6298 wpa_t *wpa = &wpas[salt_pos];
6299
6300 uint pke[25];
6301
6302 char *pke_ptr = (char *) pke;
6303
6304 for (uint i = 0; i < 25; i++)
6305 {
6306 pke[i] = byte_swap_32 (wpa->pke[i]);
6307 }
6308
6309 unsigned char mac1[6];
6310 unsigned char mac2[6];
6311
6312 memcpy (mac1, pke_ptr + 23, 6);
6313 memcpy (mac2, pke_ptr + 29, 6);
6314
6315 snprintf (out_buf, len-1, "%s:%02x%02x%02x%02x%02x%02x:%02x%02x%02x%02x%02x%02x",
6316 (char *) salt.salt_buf,
6317 mac1[0],
6318 mac1[1],
6319 mac1[2],
6320 mac1[3],
6321 mac1[4],
6322 mac1[5],
6323 mac2[0],
6324 mac2[1],
6325 mac2[2],
6326 mac2[3],
6327 mac2[4],
6328 mac2[5]);
6329 }
6330 else if (hash_mode == 4400)
6331 {
6332 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
6333 byte_swap_32 (digest_buf[0]),
6334 byte_swap_32 (digest_buf[1]),
6335 byte_swap_32 (digest_buf[2]),
6336 byte_swap_32 (digest_buf[3]));
6337 }
6338 else if (hash_mode == 4700)
6339 {
6340 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6341 byte_swap_32 (digest_buf[0]),
6342 byte_swap_32 (digest_buf[1]),
6343 byte_swap_32 (digest_buf[2]),
6344 byte_swap_32 (digest_buf[3]),
6345 byte_swap_32 (digest_buf[4]));
6346 }
6347 else if (hash_mode == 4800)
6348 {
6349 uint8_t chap_id_byte = (uint8_t) salt.salt_buf[4];
6350
6351 snprintf (out_buf, len-1, "%08x%08x%08x%08x:%08x%08x%08x%08x:%02x",
6352 digest_buf[0],
6353 digest_buf[1],
6354 digest_buf[2],
6355 digest_buf[3],
6356 byte_swap_32 (salt.salt_buf[0]),
6357 byte_swap_32 (salt.salt_buf[1]),
6358 byte_swap_32 (salt.salt_buf[2]),
6359 byte_swap_32 (salt.salt_buf[3]),
6360 chap_id_byte);
6361 }
6362 else if (hash_mode == 4900)
6363 {
6364 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6365 byte_swap_32 (digest_buf[0]),
6366 byte_swap_32 (digest_buf[1]),
6367 byte_swap_32 (digest_buf[2]),
6368 byte_swap_32 (digest_buf[3]),
6369 byte_swap_32 (digest_buf[4]));
6370 }
6371 else if (hash_mode == 5100)
6372 {
6373 snprintf (out_buf, len-1, "%08x%08x",
6374 digest_buf[0],
6375 digest_buf[1]);
6376 }
6377 else if (hash_mode == 5200)
6378 {
6379 snprintf (out_buf, len-1, "%s", hashfile);
6380 }
6381 else if (hash_mode == 5300)
6382 {
6383 ikepsk_t *ikepsks = (ikepsk_t *) data.esalts_buf;
6384
6385 ikepsk_t *ikepsk = &ikepsks[salt_pos];
6386
6387 int buf_len = len -1;
6388
6389 // msg_buf
6390
6391 uint ikepsk_msg_len = ikepsk->msg_len / 4;
6392
6393 for (uint i = 0; i < ikepsk_msg_len; i++)
6394 {
6395 if ((i == 32) || (i == 64) || (i == 66) || (i == 68) || (i == 108))
6396 {
6397 snprintf (out_buf, buf_len, ":");
6398
6399 buf_len--;
6400 out_buf++;
6401 }
6402
6403 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->msg_buf[i]));
6404
6405 buf_len -= 8;
6406 out_buf += 8;
6407 }
6408
6409 // nr_buf
6410
6411 uint ikepsk_nr_len = ikepsk->nr_len / 4;
6412
6413 for (uint i = 0; i < ikepsk_nr_len; i++)
6414 {
6415 if ((i == 0) || (i == 5))
6416 {
6417 snprintf (out_buf, buf_len, ":");
6418
6419 buf_len--;
6420 out_buf++;
6421 }
6422
6423 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->nr_buf[i]));
6424
6425 buf_len -= 8;
6426 out_buf += 8;
6427 }
6428
6429 // digest_buf
6430
6431 for (uint i = 0; i < 4; i++)
6432 {
6433 if (i == 0)
6434 {
6435 snprintf (out_buf, buf_len, ":");
6436
6437 buf_len--;
6438 out_buf++;
6439 }
6440
6441 snprintf (out_buf, buf_len, "%08x", digest_buf[i]);
6442
6443 buf_len -= 8;
6444 out_buf += 8;
6445 }
6446 }
6447 else if (hash_mode == 5400)
6448 {
6449 ikepsk_t *ikepsks = (ikepsk_t *) data.esalts_buf;
6450
6451 ikepsk_t *ikepsk = &ikepsks[salt_pos];
6452
6453 int buf_len = len -1;
6454
6455 // msg_buf
6456
6457 uint ikepsk_msg_len = ikepsk->msg_len / 4;
6458
6459 for (uint i = 0; i < ikepsk_msg_len; i++)
6460 {
6461 if ((i == 32) || (i == 64) || (i == 66) || (i == 68) || (i == 108))
6462 {
6463 snprintf (out_buf, buf_len, ":");
6464
6465 buf_len--;
6466 out_buf++;
6467 }
6468
6469 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->msg_buf[i]));
6470
6471 buf_len -= 8;
6472 out_buf += 8;
6473 }
6474
6475 // nr_buf
6476
6477 uint ikepsk_nr_len = ikepsk->nr_len / 4;
6478
6479 for (uint i = 0; i < ikepsk_nr_len; i++)
6480 {
6481 if ((i == 0) || (i == 5))
6482 {
6483 snprintf (out_buf, buf_len, ":");
6484
6485 buf_len--;
6486 out_buf++;
6487 }
6488
6489 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->nr_buf[i]));
6490
6491 buf_len -= 8;
6492 out_buf += 8;
6493 }
6494
6495 // digest_buf
6496
6497 for (uint i = 0; i < 5; i++)
6498 {
6499 if (i == 0)
6500 {
6501 snprintf (out_buf, buf_len, ":");
6502
6503 buf_len--;
6504 out_buf++;
6505 }
6506
6507 snprintf (out_buf, buf_len, "%08x", digest_buf[i]);
6508
6509 buf_len -= 8;
6510 out_buf += 8;
6511 }
6512 }
6513 else if (hash_mode == 5500)
6514 {
6515 netntlm_t *netntlms = (netntlm_t *) data.esalts_buf;
6516
6517 netntlm_t *netntlm = &netntlms[salt_pos];
6518
6519 char user_buf[64];
6520 char domain_buf[64];
6521 char srvchall_buf[1024];
6522 char clichall_buf[1024];
6523
6524 memset (user_buf, 0, sizeof (user_buf));
6525 memset (domain_buf, 0, sizeof (domain_buf));
6526 memset (srvchall_buf, 0, sizeof (srvchall_buf));
6527 memset (clichall_buf, 0, sizeof (clichall_buf));
6528
6529 for (uint i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2)
6530 {
6531 char *ptr = (char *) netntlm->userdomain_buf;
6532
6533 user_buf[i] = ptr[j];
6534 }
6535
6536 for (uint i = 0, j = 0; j < netntlm->domain_len; i += 1, j += 2)
6537 {
6538 char *ptr = (char *) netntlm->userdomain_buf;
6539
6540 domain_buf[i] = ptr[netntlm->user_len + j];
6541 }
6542
6543 for (uint i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2)
6544 {
6545 char *ptr = (char *) netntlm->chall_buf;
6546
6547 sprintf (srvchall_buf + j, "%02x", (uint8_t) ptr[i]);
6548 }
6549
6550 for (uint i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2)
6551 {
6552 char *ptr = (char *) netntlm->chall_buf;
6553
6554 sprintf (clichall_buf + j, "%02x", (uint8_t) ptr[netntlm->srvchall_len + i]);
6555 }
6556
6557 snprintf (out_buf, len-1, "%s::%s:%s:%08x%08x%08x%08x%08x%08x:%s",
6558 user_buf,
6559 domain_buf,
6560 srvchall_buf,
6561 digest_buf[0],
6562 digest_buf[1],
6563 digest_buf[2],
6564 digest_buf[3],
6565 byte_swap_32 (salt.salt_buf_pc[0]),
6566 byte_swap_32 (salt.salt_buf_pc[1]),
6567 clichall_buf);
6568 }
6569 else if (hash_mode == 5600)
6570 {
6571 netntlm_t *netntlms = (netntlm_t *) data.esalts_buf;
6572
6573 netntlm_t *netntlm = &netntlms[salt_pos];
6574
6575 char user_buf[64];
6576 char domain_buf[64];
6577 char srvchall_buf[1024];
6578 char clichall_buf[1024];
6579
6580 memset (user_buf, 0, sizeof (user_buf));
6581 memset (domain_buf, 0, sizeof (domain_buf));
6582 memset (srvchall_buf, 0, sizeof (srvchall_buf));
6583 memset (clichall_buf, 0, sizeof (clichall_buf));
6584
6585 for (uint i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2)
6586 {
6587 char *ptr = (char *) netntlm->userdomain_buf;
6588
6589 user_buf[i] = ptr[j];
6590 }
6591
6592 for (uint i = 0, j = 0; j < netntlm->domain_len; i += 1, j += 2)
6593 {
6594 char *ptr = (char *) netntlm->userdomain_buf;
6595
6596 domain_buf[i] = ptr[netntlm->user_len + j];
6597 }
6598
6599 for (uint i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2)
6600 {
6601 char *ptr = (char *) netntlm->chall_buf;
6602
6603 sprintf (srvchall_buf + j, "%02x", (uint8_t) ptr[i]);
6604 }
6605
6606 for (uint i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2)
6607 {
6608 char *ptr = (char *) netntlm->chall_buf;
6609
6610 sprintf (clichall_buf + j, "%02x", (uint8_t) ptr[netntlm->srvchall_len + i]);
6611 }
6612
6613 snprintf (out_buf, len-1, "%s::%s:%s:%08x%08x%08x%08x:%s",
6614 user_buf,
6615 domain_buf,
6616 srvchall_buf,
6617 digest_buf[0],
6618 digest_buf[1],
6619 digest_buf[2],
6620 digest_buf[3],
6621 clichall_buf);
6622 }
6623 else if (hash_mode == 5700)
6624 {
6625 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6626
6627 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6628 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6629 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6630 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6631 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6632 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6633 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6634 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6635
6636 memcpy (tmp_buf, digest_buf, 32);
6637
6638 base64_encode (int_to_itoa64, tmp_buf, 32, ptr_plain);
6639
6640 ptr_plain[43] = 0;
6641
6642 snprintf (out_buf, len-1, "%s", ptr_plain);
6643 }
6644 else if (hash_mode == 5800)
6645 {
6646 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6647 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6648 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6649 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6650 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6651
6652 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6653 digest_buf[0],
6654 digest_buf[1],
6655 digest_buf[2],
6656 digest_buf[3],
6657 digest_buf[4]);
6658 }
6659 else if ((hash_mode >= 6200) && (hash_mode <= 6299))
6660 {
6661 snprintf (out_buf, len-1, "%s", hashfile);
6662 }
6663 else if (hash_mode == 6300)
6664 {
6665 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
6666
6667 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6668 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6669 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6670 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6671
6672 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6673
6674 snprintf (out_buf, len-1, "{smd5}%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6675 }
6676 else if (hash_mode == 6400)
6677 {
6678 sha256aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6679
6680 snprintf (out_buf, len-1, "{ssha256}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
6681 }
6682 else if (hash_mode == 6500)
6683 {
6684 sha512aix_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
6685
6686 snprintf (out_buf, len-1, "{ssha512}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
6687 }
6688 else if (hash_mode == 6600)
6689 {
6690 agilekey_t *agilekeys = (agilekey_t *) data.esalts_buf;
6691
6692 agilekey_t *agilekey = &agilekeys[salt_pos];
6693
6694 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
6695 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
6696
6697 uint buf_len = len - 1;
6698
6699 uint off = snprintf (out_buf, buf_len, "%d:%08x%08x:", salt.salt_iter + 1, salt.salt_buf[0], salt.salt_buf[1]);
6700 buf_len -= 22;
6701
6702 for (uint i = 0, j = off; i < 1040; i++, j += 2)
6703 {
6704 snprintf (out_buf + j, buf_len, "%02x", agilekey->cipher[i]);
6705
6706 buf_len -= 2;
6707 }
6708 }
6709 else if (hash_mode == 6700)
6710 {
6711 sha1aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6712
6713 snprintf (out_buf, len-1, "{ssha1}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
6714 }
6715 else if (hash_mode == 6800)
6716 {
6717 snprintf (out_buf, len-1, "%s", (char *) salt.salt_buf);
6718 }
6719 else if (hash_mode == 7100)
6720 {
6721 uint *ptr = digest_buf;
6722
6723 pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) data.esalts_buf;
6724
6725 pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[salt_pos];
6726
6727 uint esalt[16];
6728
6729 esalt[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]);
6730 esalt[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]);
6731 esalt[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]);
6732 esalt[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]);
6733 esalt[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]);
6734 esalt[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]);
6735 esalt[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]);
6736 esalt[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]);
6737
6738 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",
6739 SIGNATURE_SHA512OSX,
6740 salt.salt_iter + 1,
6741 esalt[ 0], esalt[ 1],
6742 esalt[ 2], esalt[ 3],
6743 esalt[ 4], esalt[ 5],
6744 esalt[ 6], esalt[ 7],
6745 ptr [ 1], ptr [ 0],
6746 ptr [ 3], ptr [ 2],
6747 ptr [ 5], ptr [ 4],
6748 ptr [ 7], ptr [ 6],
6749 ptr [ 9], ptr [ 8],
6750 ptr [11], ptr [10],
6751 ptr [13], ptr [12],
6752 ptr [15], ptr [14]);
6753 }
6754 else if (hash_mode == 7200)
6755 {
6756 uint *ptr = digest_buf;
6757
6758 pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) data.esalts_buf;
6759
6760 pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[salt_pos];
6761
6762 uint len_used = 0;
6763
6764 snprintf (out_buf + len_used, len - len_used - 1, "%s%i.", SIGNATURE_SHA512GRUB, salt.salt_iter + 1);
6765
6766 len_used = strlen (out_buf);
6767
6768 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha512->salt_buf;
6769
6770 for (uint i = 0; i < salt.salt_len; i++, len_used += 2)
6771 {
6772 snprintf (out_buf + len_used, len - len_used - 1, "%02x", salt_buf_ptr[i]);
6773 }
6774
6775 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",
6776 ptr [ 1], ptr [ 0],
6777 ptr [ 3], ptr [ 2],
6778 ptr [ 5], ptr [ 4],
6779 ptr [ 7], ptr [ 6],
6780 ptr [ 9], ptr [ 8],
6781 ptr [11], ptr [10],
6782 ptr [13], ptr [12],
6783 ptr [15], ptr [14]);
6784 }
6785 else if (hash_mode == 7300)
6786 {
6787 rakp_t *rakps = (rakp_t *) data.esalts_buf;
6788
6789 rakp_t *rakp = &rakps[salt_pos];
6790
6791 for (uint i = 0, j = 0; (i * 4) < rakp->salt_len; i += 1, j += 8)
6792 {
6793 sprintf (out_buf + j, "%08x", rakp->salt_buf[i]);
6794 }
6795
6796 snprintf (out_buf + rakp->salt_len * 2, len - 1, ":%08x%08x%08x%08x%08x",
6797 digest_buf[0],
6798 digest_buf[1],
6799 digest_buf[2],
6800 digest_buf[3],
6801 digest_buf[4]);
6802 }
6803 else if (hash_mode == 7400)
6804 {
6805 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6806
6807 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6808 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6809 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6810 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6811 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6812 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6813 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6814 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6815
6816 sha256crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6817
6818 if (salt.salt_iter == ROUNDS_SHA256CRYPT)
6819 {
6820 snprintf (out_buf, len-1, "$5$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6821 }
6822 else
6823 {
6824 snprintf (out_buf, len-1, "$5$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6825 }
6826 }
6827 else if (hash_mode == 7500)
6828 {
6829 krb5pa_t *krb5pas = (krb5pa_t *) data.esalts_buf;
6830
6831 krb5pa_t *krb5pa = &krb5pas[salt_pos];
6832
6833 uint8_t *ptr_timestamp = (uint8_t *) krb5pa->timestamp;
6834 uint8_t *ptr_checksum = (uint8_t *) krb5pa->checksum;
6835
6836 char data[128];
6837
6838 char *ptr_data = data;
6839
6840 for (uint i = 0; i < 36; i++, ptr_data += 2)
6841 {
6842 sprintf (ptr_data, "%02x", ptr_timestamp[i]);
6843 }
6844
6845 for (uint i = 0; i < 16; i++, ptr_data += 2)
6846 {
6847 sprintf (ptr_data, "%02x", ptr_checksum[i]);
6848 }
6849
6850 *ptr_data = 0;
6851
6852 snprintf (out_buf, len-1, "%s$%s$%s$%s$%s",
6853 SIGNATURE_KRB5PA,
6854 (char *) krb5pa->user,
6855 (char *) krb5pa->realm,
6856 (char *) krb5pa->salt,
6857 data);
6858 }
6859 else if (hash_mode == 7700)
6860 {
6861 snprintf (out_buf, len-1, "%s$%08X%08X",
6862 (char *) salt.salt_buf,
6863 digest_buf[0],
6864 digest_buf[1]);
6865 }
6866 else if (hash_mode == 7800)
6867 {
6868 snprintf (out_buf, len-1, "%s$%08X%08X%08X%08X%08X",
6869 (char *) salt.salt_buf,
6870 digest_buf[0],
6871 digest_buf[1],
6872 digest_buf[2],
6873 digest_buf[3],
6874 digest_buf[4]);
6875 }
6876 else if (hash_mode == 7900)
6877 {
6878 drupal7_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
6879
6880 // ugly hack start
6881
6882 char *tmp = (char *) salt.salt_buf_pc;
6883
6884 ptr_plain[42] = tmp[0];
6885
6886 // ugly hack end
6887
6888 ptr_plain[43] = 0;
6889
6890 snprintf (out_buf, len-1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, (char *) ptr_plain);
6891 }
6892 else if (hash_mode == 8000)
6893 {
6894 snprintf (out_buf, len-1, "0xc007%s%08x%08x%08x%08x%08x%08x%08x%08x",
6895 (unsigned char *) salt.salt_buf,
6896 digest_buf[0],
6897 digest_buf[1],
6898 digest_buf[2],
6899 digest_buf[3],
6900 digest_buf[4],
6901 digest_buf[5],
6902 digest_buf[6],
6903 digest_buf[7]);
6904 }
6905 else if (hash_mode == 8100)
6906 {
6907 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
6908 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
6909
6910 snprintf (out_buf, len-1, "1%s%08x%08x%08x%08x%08x",
6911 (unsigned char *) salt.salt_buf,
6912 digest_buf[0],
6913 digest_buf[1],
6914 digest_buf[2],
6915 digest_buf[3],
6916 digest_buf[4]);
6917 }
6918 else if (hash_mode == 8200)
6919 {
6920 cloudkey_t *cloudkeys = (cloudkey_t *) data.esalts_buf;
6921
6922 cloudkey_t *cloudkey = &cloudkeys[salt_pos];
6923
6924 char data_buf[4096];
6925
6926 for (int i = 0, j = 0; i < 512; i += 1, j += 8)
6927 {
6928 sprintf (data_buf + j, "%08x", cloudkey->data_buf[i]);
6929 }
6930
6931 data_buf[cloudkey->data_len * 2] = 0;
6932
6933 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6934 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6935 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6936 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6937 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6938 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6939 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6940 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6941
6942 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
6943 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
6944 salt.salt_buf[2] = byte_swap_32 (salt.salt_buf[2]);
6945 salt.salt_buf[3] = byte_swap_32 (salt.salt_buf[3]);
6946
6947 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x:%08x%08x%08x%08x:%u:%s",
6948 digest_buf[0],
6949 digest_buf[1],
6950 digest_buf[2],
6951 digest_buf[3],
6952 digest_buf[4],
6953 digest_buf[5],
6954 digest_buf[6],
6955 digest_buf[7],
6956 salt.salt_buf[0],
6957 salt.salt_buf[1],
6958 salt.salt_buf[2],
6959 salt.salt_buf[3],
6960 salt.salt_iter + 1,
6961 data_buf);
6962 }
6963 else if (hash_mode == 8300)
6964 {
6965 // todo
6966
6967 char digest_buf_c[33];
6968
6969 base32_encode (int_to_itoa32, (char *) digest_buf, 32, digest_buf_c);
6970
6971 digest_buf_c[32] = 0;
6972
6973 // domain
6974
6975 const uint salt_pc_len = salt.salt_buf_pc[7]; // what a hack
6976
6977 char domain_buf_c[33];
6978
6979 memcpy (domain_buf_c, (char *) salt.salt_buf_pc, salt_pc_len);
6980
6981 for (uint i = 0; i < salt_pc_len; i++)
6982 {
6983 const char next = domain_buf_c[i];
6984
6985 domain_buf_c[i] = '.';
6986
6987 i += next;
6988 }
6989
6990 domain_buf_c[salt_pc_len] = 0;
6991
6992 // final
6993
6994 snprintf (out_buf, len-1, "%s:%s:%s:%u", digest_buf_c, domain_buf_c, (char *) salt.salt_buf, salt.salt_iter);
6995 }
6996 else if (hash_mode == 8500)
6997 {
6998 snprintf (out_buf, len-1, "%s*%s*%08X%08X", SIGNATURE_RACF, (char *) salt.salt_buf, digest_buf[0], digest_buf[1]);
6999 }
7000 else if (hash_mode == 2612)
7001 {
7002 snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x",
7003 SIGNATURE_PHPS,
7004 (char *) salt.salt_buf,
7005 digest_buf[0],
7006 digest_buf[1],
7007 digest_buf[2],
7008 digest_buf[3]);
7009 }
7010 else if (hash_mode == 3711)
7011 {
7012 char *salt_ptr = (char *) salt.salt_buf;
7013
7014 salt_ptr[salt.salt_len - 1] = 0;
7015
7016 snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x",
7017 SIGNATURE_MEDIAWIKI_B,
7018 salt_ptr,
7019 digest_buf[0],
7020 digest_buf[1],
7021 digest_buf[2],
7022 digest_buf[3]);
7023 }
7024 else if (hash_mode == 8800)
7025 {
7026 androidfde_t *androidfdes = (androidfde_t *) data.esalts_buf;
7027
7028 androidfde_t *androidfde = &androidfdes[salt_pos];
7029
7030 char tmp[3073];
7031
7032 for (uint i = 0, j = 0; i < 384; i += 1, j += 8)
7033 {
7034 sprintf (tmp + j, "%08x", androidfde->data[i]);
7035 }
7036
7037 tmp[3072] = 0;
7038
7039 snprintf (out_buf, len-1, "%s16$%08x%08x%08x%08x$16$%08x%08x%08x%08x$%s",
7040 SIGNATURE_ANDROIDFDE,
7041 byte_swap_32 (salt.salt_buf[0]),
7042 byte_swap_32 (salt.salt_buf[1]),
7043 byte_swap_32 (salt.salt_buf[2]),
7044 byte_swap_32 (salt.salt_buf[3]),
7045 byte_swap_32 (digest_buf[0]),
7046 byte_swap_32 (digest_buf[1]),
7047 byte_swap_32 (digest_buf[2]),
7048 byte_swap_32 (digest_buf[3]),
7049 tmp);
7050 }
7051 else if (hash_mode == 8900)
7052 {
7053 uint N = salt.scrypt_N;
7054 uint r = salt.scrypt_r;
7055 uint p = salt.scrypt_p;
7056
7057 char base64_salt[32];
7058
7059 memset (base64_salt, 0, 32);
7060
7061 base64_encode (int_to_base64, (char *) salt.salt_buf, salt.salt_len, base64_salt + 0);
7062
7063 memset (tmp_buf, 0, 46);
7064
7065 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7066 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7067 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7068 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7069 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7070 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7071 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7072 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7073 digest_buf[8] = 0; // needed for base64_encode ()
7074
7075 base64_encode (int_to_base64, (char *) digest_buf, 32, tmp_buf + 0);
7076
7077 snprintf (out_buf, len-1, "%s:%i:%i:%i:%s:%s",
7078 SIGNATURE_SCRYPT,
7079 N,
7080 r,
7081 p,
7082 base64_salt,
7083 tmp_buf);
7084 }
7085 else if (hash_mode == 9000)
7086 {
7087 snprintf (out_buf, len-1, "%s", hashfile);
7088 }
7089 else if (hash_mode == 9200)
7090 {
7091 // salt
7092
7093 pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) data.esalts_buf;
7094
7095 pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[salt_pos];
7096
7097 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf;
7098
7099 // hash
7100
7101 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7102 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7103 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7104 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7105 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7106 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7107 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7108 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7109 digest_buf[8] = 0; // needed for base64_encode ()
7110
7111 char tmp_buf[64];
7112 memset (tmp_buf, 0, sizeof (tmp_buf));
7113
7114 base64_encode (int_to_itoa64, (char *) digest_buf, 32, tmp_buf);
7115 tmp_buf[43] = 0; // cut it here
7116
7117 // output
7118
7119 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO8, salt_buf_ptr, tmp_buf);
7120 }
7121 else if (hash_mode == 9300)
7122 {
7123 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7124 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7125 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7126 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7127 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7128 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7129 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7130 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7131 digest_buf[8] = 0; // needed for base64_encode ()
7132
7133 char tmp_buf[64];
7134 memset (tmp_buf, 0, sizeof (tmp_buf));
7135
7136 base64_encode (int_to_itoa64, (char *) digest_buf, 32, tmp_buf);
7137 tmp_buf[43] = 0; // cut it here
7138
7139 unsigned char *salt_buf_ptr = (unsigned char *) salt.salt_buf;
7140
7141 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO9, salt_buf_ptr, tmp_buf);
7142 }
7143 else if (hash_mode == 9400)
7144 {
7145 office2007_t *office2007s = (office2007_t *) data.esalts_buf;
7146
7147 office2007_t *office2007 = &office2007s[salt_pos];
7148
7149 snprintf (out_buf, len-1, "%s*%u*%u*%u*%u*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7150 SIGNATURE_OFFICE2007,
7151 2007,
7152 20,
7153 office2007->keySize,
7154 16,
7155 salt.salt_buf[0],
7156 salt.salt_buf[1],
7157 salt.salt_buf[2],
7158 salt.salt_buf[3],
7159 office2007->encryptedVerifier[0],
7160 office2007->encryptedVerifier[1],
7161 office2007->encryptedVerifier[2],
7162 office2007->encryptedVerifier[3],
7163 office2007->encryptedVerifierHash[0],
7164 office2007->encryptedVerifierHash[1],
7165 office2007->encryptedVerifierHash[2],
7166 office2007->encryptedVerifierHash[3],
7167 office2007->encryptedVerifierHash[4]);
7168 }
7169 else if (hash_mode == 9500)
7170 {
7171 office2010_t *office2010s = (office2010_t *) data.esalts_buf;
7172
7173 office2010_t *office2010 = &office2010s[salt_pos];
7174
7175 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,
7176
7177 salt.salt_buf[0],
7178 salt.salt_buf[1],
7179 salt.salt_buf[2],
7180 salt.salt_buf[3],
7181 office2010->encryptedVerifier[0],
7182 office2010->encryptedVerifier[1],
7183 office2010->encryptedVerifier[2],
7184 office2010->encryptedVerifier[3],
7185 office2010->encryptedVerifierHash[0],
7186 office2010->encryptedVerifierHash[1],
7187 office2010->encryptedVerifierHash[2],
7188 office2010->encryptedVerifierHash[3],
7189 office2010->encryptedVerifierHash[4],
7190 office2010->encryptedVerifierHash[5],
7191 office2010->encryptedVerifierHash[6],
7192 office2010->encryptedVerifierHash[7]);
7193 }
7194 else if (hash_mode == 9600)
7195 {
7196 office2013_t *office2013s = (office2013_t *) data.esalts_buf;
7197
7198 office2013_t *office2013 = &office2013s[salt_pos];
7199
7200 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,
7201
7202 salt.salt_buf[0],
7203 salt.salt_buf[1],
7204 salt.salt_buf[2],
7205 salt.salt_buf[3],
7206 office2013->encryptedVerifier[0],
7207 office2013->encryptedVerifier[1],
7208 office2013->encryptedVerifier[2],
7209 office2013->encryptedVerifier[3],
7210 office2013->encryptedVerifierHash[0],
7211 office2013->encryptedVerifierHash[1],
7212 office2013->encryptedVerifierHash[2],
7213 office2013->encryptedVerifierHash[3],
7214 office2013->encryptedVerifierHash[4],
7215 office2013->encryptedVerifierHash[5],
7216 office2013->encryptedVerifierHash[6],
7217 office2013->encryptedVerifierHash[7]);
7218 }
7219 else if (hash_mode == 9700)
7220 {
7221 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7222
7223 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7224
7225 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7226 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7227 byte_swap_32 (salt.salt_buf[0]),
7228 byte_swap_32 (salt.salt_buf[1]),
7229 byte_swap_32 (salt.salt_buf[2]),
7230 byte_swap_32 (salt.salt_buf[3]),
7231 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7232 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7233 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7234 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7235 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7236 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7237 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7238 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]));
7239 }
7240 else if (hash_mode == 9710)
7241 {
7242 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7243
7244 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7245
7246 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7247 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7248 byte_swap_32 (salt.salt_buf[0]),
7249 byte_swap_32 (salt.salt_buf[1]),
7250 byte_swap_32 (salt.salt_buf[2]),
7251 byte_swap_32 (salt.salt_buf[3]),
7252 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7253 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7254 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7255 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7256 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7257 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7258 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7259 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]));
7260 }
7261 else if (hash_mode == 9720)
7262 {
7263 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7264
7265 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7266
7267 uint8_t *rc4key = (uint8_t *) oldoffice01->rc4key;
7268
7269 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7270 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7271 byte_swap_32 (salt.salt_buf[0]),
7272 byte_swap_32 (salt.salt_buf[1]),
7273 byte_swap_32 (salt.salt_buf[2]),
7274 byte_swap_32 (salt.salt_buf[3]),
7275 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7276 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7277 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7278 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7279 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7280 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7281 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7282 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]),
7283 rc4key[0],
7284 rc4key[1],
7285 rc4key[2],
7286 rc4key[3],
7287 rc4key[4]);
7288 }
7289 else if (hash_mode == 9800)
7290 {
7291 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7292
7293 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7294
7295 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7296 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7297 salt.salt_buf[0],
7298 salt.salt_buf[1],
7299 salt.salt_buf[2],
7300 salt.salt_buf[3],
7301 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7302 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7303 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7304 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7305 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7306 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7307 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7308 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7309 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]));
7310 }
7311 else if (hash_mode == 9810)
7312 {
7313 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7314
7315 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7316
7317 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7318 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7319 salt.salt_buf[0],
7320 salt.salt_buf[1],
7321 salt.salt_buf[2],
7322 salt.salt_buf[3],
7323 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7324 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7325 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7326 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7327 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7328 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7329 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7330 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7331 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]));
7332 }
7333 else if (hash_mode == 9820)
7334 {
7335 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7336
7337 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7338
7339 uint8_t *rc4key = (uint8_t *) oldoffice34->rc4key;
7340
7341 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7342 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7343 salt.salt_buf[0],
7344 salt.salt_buf[1],
7345 salt.salt_buf[2],
7346 salt.salt_buf[3],
7347 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7348 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7349 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7350 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7351 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7352 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7353 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7354 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7355 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]),
7356 rc4key[0],
7357 rc4key[1],
7358 rc4key[2],
7359 rc4key[3],
7360 rc4key[4]);
7361 }
7362 else if (hash_mode == 10000)
7363 {
7364 // salt
7365
7366 pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) data.esalts_buf;
7367
7368 pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[salt_pos];
7369
7370 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf;
7371
7372 // hash
7373
7374 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7375 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7376 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7377 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7378 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7379 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7380 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7381 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7382 digest_buf[8] = 0; // needed for base64_encode ()
7383
7384 char tmp_buf[64];
7385 memset (tmp_buf, 0, sizeof (tmp_buf));
7386
7387 base64_encode (int_to_base64, (char *) digest_buf, 32, tmp_buf);
7388
7389 // output
7390
7391 snprintf (out_buf, len-1, "%s%i$%s$%s", SIGNATURE_DJANGOPBKDF2, salt.salt_iter + 1, salt_buf_ptr, tmp_buf);
7392 }
7393 else if (hash_mode == 10100)
7394 {
7395 snprintf (out_buf, len-1, "%08x%08x:%u:%u:%08x%08x%08x%08x",
7396 digest_buf[0],
7397 digest_buf[1],
7398 2,
7399 4,
7400 byte_swap_32 (salt.salt_buf[0]),
7401 byte_swap_32 (salt.salt_buf[1]),
7402 byte_swap_32 (salt.salt_buf[2]),
7403 byte_swap_32 (salt.salt_buf[3]));
7404 }
7405 else if (hash_mode == 10200)
7406 {
7407 cram_md5_t *cram_md5s = (cram_md5_t *) data.esalts_buf;
7408
7409 cram_md5_t *cram_md5 = &cram_md5s[salt_pos];
7410
7411 // challenge
7412
7413 char challenge[100];
7414
7415 memset (challenge, 0, sizeof (challenge));
7416
7417 base64_encode (int_to_base64, (char *) salt.salt_buf, salt.salt_len, challenge);
7418
7419 // response
7420
7421 char tmp_buf[100];
7422
7423 uint tmp_len = snprintf (tmp_buf, 100, "%s %08x%08x%08x%08x",
7424 (char *) cram_md5->user,
7425 digest_buf[0],
7426 digest_buf[1],
7427 digest_buf[2],
7428 digest_buf[3]);
7429
7430 char response[100];
7431
7432 memset (response, 0, sizeof (response));
7433
7434 base64_encode (int_to_base64, (char *) tmp_buf, tmp_len, response);
7435
7436 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CRAM_MD5, challenge, response);
7437 }
7438 else if (hash_mode == 10300)
7439 {
7440 char tmp_buf[100];
7441
7442 memset (tmp_buf, 0, sizeof (tmp_buf));
7443
7444 memcpy (tmp_buf + 0, digest_buf, 20);
7445 memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len);
7446
7447 uint tmp_len = 20 + salt.salt_len;
7448
7449 // base64 encode it
7450
7451 char base64_encoded[100];
7452
7453 memset (base64_encoded, 0, sizeof (base64_encoded));
7454
7455 base64_encode (int_to_base64, (char *) tmp_buf, tmp_len, base64_encoded);
7456
7457 snprintf (out_buf, len-1, "%s%i}%s", SIGNATURE_SAPH_SHA1, salt.salt_iter + 1, base64_encoded);
7458 }
7459 else if (hash_mode == 10400)
7460 {
7461 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7462
7463 pdf_t *pdf = &pdfs[salt_pos];
7464
7465 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",
7466
7467 pdf->V,
7468 pdf->R,
7469 40,
7470 pdf->P,
7471 pdf->enc_md,
7472 pdf->id_len,
7473 byte_swap_32 (pdf->id_buf[0]),
7474 byte_swap_32 (pdf->id_buf[1]),
7475 byte_swap_32 (pdf->id_buf[2]),
7476 byte_swap_32 (pdf->id_buf[3]),
7477 pdf->u_len,
7478 byte_swap_32 (pdf->u_buf[0]),
7479 byte_swap_32 (pdf->u_buf[1]),
7480 byte_swap_32 (pdf->u_buf[2]),
7481 byte_swap_32 (pdf->u_buf[3]),
7482 byte_swap_32 (pdf->u_buf[4]),
7483 byte_swap_32 (pdf->u_buf[5]),
7484 byte_swap_32 (pdf->u_buf[6]),
7485 byte_swap_32 (pdf->u_buf[7]),
7486 pdf->o_len,
7487 byte_swap_32 (pdf->o_buf[0]),
7488 byte_swap_32 (pdf->o_buf[1]),
7489 byte_swap_32 (pdf->o_buf[2]),
7490 byte_swap_32 (pdf->o_buf[3]),
7491 byte_swap_32 (pdf->o_buf[4]),
7492 byte_swap_32 (pdf->o_buf[5]),
7493 byte_swap_32 (pdf->o_buf[6]),
7494 byte_swap_32 (pdf->o_buf[7])
7495 );
7496 }
7497 else if (hash_mode == 10410)
7498 {
7499 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7500
7501 pdf_t *pdf = &pdfs[salt_pos];
7502
7503 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",
7504
7505 pdf->V,
7506 pdf->R,
7507 40,
7508 pdf->P,
7509 pdf->enc_md,
7510 pdf->id_len,
7511 byte_swap_32 (pdf->id_buf[0]),
7512 byte_swap_32 (pdf->id_buf[1]),
7513 byte_swap_32 (pdf->id_buf[2]),
7514 byte_swap_32 (pdf->id_buf[3]),
7515 pdf->u_len,
7516 byte_swap_32 (pdf->u_buf[0]),
7517 byte_swap_32 (pdf->u_buf[1]),
7518 byte_swap_32 (pdf->u_buf[2]),
7519 byte_swap_32 (pdf->u_buf[3]),
7520 byte_swap_32 (pdf->u_buf[4]),
7521 byte_swap_32 (pdf->u_buf[5]),
7522 byte_swap_32 (pdf->u_buf[6]),
7523 byte_swap_32 (pdf->u_buf[7]),
7524 pdf->o_len,
7525 byte_swap_32 (pdf->o_buf[0]),
7526 byte_swap_32 (pdf->o_buf[1]),
7527 byte_swap_32 (pdf->o_buf[2]),
7528 byte_swap_32 (pdf->o_buf[3]),
7529 byte_swap_32 (pdf->o_buf[4]),
7530 byte_swap_32 (pdf->o_buf[5]),
7531 byte_swap_32 (pdf->o_buf[6]),
7532 byte_swap_32 (pdf->o_buf[7])
7533 );
7534 }
7535 else if (hash_mode == 10420)
7536 {
7537 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7538
7539 pdf_t *pdf = &pdfs[salt_pos];
7540
7541 uint8_t *rc4key = (uint8_t *) pdf->rc4key;
7542
7543 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",
7544
7545 pdf->V,
7546 pdf->R,
7547 40,
7548 pdf->P,
7549 pdf->enc_md,
7550 pdf->id_len,
7551 byte_swap_32 (pdf->id_buf[0]),
7552 byte_swap_32 (pdf->id_buf[1]),
7553 byte_swap_32 (pdf->id_buf[2]),
7554 byte_swap_32 (pdf->id_buf[3]),
7555 pdf->u_len,
7556 byte_swap_32 (pdf->u_buf[0]),
7557 byte_swap_32 (pdf->u_buf[1]),
7558 byte_swap_32 (pdf->u_buf[2]),
7559 byte_swap_32 (pdf->u_buf[3]),
7560 byte_swap_32 (pdf->u_buf[4]),
7561 byte_swap_32 (pdf->u_buf[5]),
7562 byte_swap_32 (pdf->u_buf[6]),
7563 byte_swap_32 (pdf->u_buf[7]),
7564 pdf->o_len,
7565 byte_swap_32 (pdf->o_buf[0]),
7566 byte_swap_32 (pdf->o_buf[1]),
7567 byte_swap_32 (pdf->o_buf[2]),
7568 byte_swap_32 (pdf->o_buf[3]),
7569 byte_swap_32 (pdf->o_buf[4]),
7570 byte_swap_32 (pdf->o_buf[5]),
7571 byte_swap_32 (pdf->o_buf[6]),
7572 byte_swap_32 (pdf->o_buf[7]),
7573 rc4key[0],
7574 rc4key[1],
7575 rc4key[2],
7576 rc4key[3],
7577 rc4key[4]
7578 );
7579 }
7580 else if (hash_mode == 10500)
7581 {
7582 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7583
7584 pdf_t *pdf = &pdfs[salt_pos];
7585
7586 if (pdf->id_len == 32)
7587 {
7588 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",
7589
7590 pdf->V,
7591 pdf->R,
7592 128,
7593 pdf->P,
7594 pdf->enc_md,
7595 pdf->id_len,
7596 byte_swap_32 (pdf->id_buf[0]),
7597 byte_swap_32 (pdf->id_buf[1]),
7598 byte_swap_32 (pdf->id_buf[2]),
7599 byte_swap_32 (pdf->id_buf[3]),
7600 byte_swap_32 (pdf->id_buf[4]),
7601 byte_swap_32 (pdf->id_buf[5]),
7602 byte_swap_32 (pdf->id_buf[6]),
7603 byte_swap_32 (pdf->id_buf[7]),
7604 pdf->u_len,
7605 byte_swap_32 (pdf->u_buf[0]),
7606 byte_swap_32 (pdf->u_buf[1]),
7607 byte_swap_32 (pdf->u_buf[2]),
7608 byte_swap_32 (pdf->u_buf[3]),
7609 byte_swap_32 (pdf->u_buf[4]),
7610 byte_swap_32 (pdf->u_buf[5]),
7611 byte_swap_32 (pdf->u_buf[6]),
7612 byte_swap_32 (pdf->u_buf[7]),
7613 pdf->o_len,
7614 byte_swap_32 (pdf->o_buf[0]),
7615 byte_swap_32 (pdf->o_buf[1]),
7616 byte_swap_32 (pdf->o_buf[2]),
7617 byte_swap_32 (pdf->o_buf[3]),
7618 byte_swap_32 (pdf->o_buf[4]),
7619 byte_swap_32 (pdf->o_buf[5]),
7620 byte_swap_32 (pdf->o_buf[6]),
7621 byte_swap_32 (pdf->o_buf[7])
7622 );
7623 }
7624 else
7625 {
7626 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",
7627
7628 pdf->V,
7629 pdf->R,
7630 128,
7631 pdf->P,
7632 pdf->enc_md,
7633 pdf->id_len,
7634 byte_swap_32 (pdf->id_buf[0]),
7635 byte_swap_32 (pdf->id_buf[1]),
7636 byte_swap_32 (pdf->id_buf[2]),
7637 byte_swap_32 (pdf->id_buf[3]),
7638 pdf->u_len,
7639 byte_swap_32 (pdf->u_buf[0]),
7640 byte_swap_32 (pdf->u_buf[1]),
7641 byte_swap_32 (pdf->u_buf[2]),
7642 byte_swap_32 (pdf->u_buf[3]),
7643 byte_swap_32 (pdf->u_buf[4]),
7644 byte_swap_32 (pdf->u_buf[5]),
7645 byte_swap_32 (pdf->u_buf[6]),
7646 byte_swap_32 (pdf->u_buf[7]),
7647 pdf->o_len,
7648 byte_swap_32 (pdf->o_buf[0]),
7649 byte_swap_32 (pdf->o_buf[1]),
7650 byte_swap_32 (pdf->o_buf[2]),
7651 byte_swap_32 (pdf->o_buf[3]),
7652 byte_swap_32 (pdf->o_buf[4]),
7653 byte_swap_32 (pdf->o_buf[5]),
7654 byte_swap_32 (pdf->o_buf[6]),
7655 byte_swap_32 (pdf->o_buf[7])
7656 );
7657 }
7658 }
7659 else if (hash_mode == 10600)
7660 {
7661 uint digest_idx = salt.digests_offset + digest_pos;
7662
7663 hashinfo_t **hashinfo_ptr = data.hash_info;
7664 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7665
7666 snprintf (out_buf, len-1, "%s", hash_buf);
7667 }
7668 else if (hash_mode == 10700)
7669 {
7670 uint digest_idx = salt.digests_offset + digest_pos;
7671
7672 hashinfo_t **hashinfo_ptr = data.hash_info;
7673 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7674
7675 snprintf (out_buf, len-1, "%s", hash_buf);
7676 }
7677 else if (hash_mode == 10900)
7678 {
7679 uint digest_idx = salt.digests_offset + digest_pos;
7680
7681 hashinfo_t **hashinfo_ptr = data.hash_info;
7682 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7683
7684 snprintf (out_buf, len-1, "%s", hash_buf);
7685 }
7686 else if (hash_mode == 11100)
7687 {
7688 uint32_t salt_challenge = salt.salt_buf[0];
7689
7690 salt_challenge = byte_swap_32 (salt_challenge);
7691
7692 unsigned char *user_name = (unsigned char *) (salt.salt_buf + 1);
7693
7694 snprintf (out_buf, len-1, "%s%s*%08x*%08x%08x%08x%08x",
7695 SIGNATURE_POSTGRESQL_AUTH,
7696 user_name,
7697 salt_challenge,
7698 digest_buf[0],
7699 digest_buf[1],
7700 digest_buf[2],
7701 digest_buf[3]);
7702 }
7703 else if (hash_mode == 11200)
7704 {
7705 snprintf (out_buf, len-1, "%s%s*%08x%08x%08x%08x%08x",
7706 SIGNATURE_MYSQL_AUTH,
7707 (unsigned char *) salt.salt_buf,
7708 digest_buf[0],
7709 digest_buf[1],
7710 digest_buf[2],
7711 digest_buf[3],
7712 digest_buf[4]);
7713 }
7714 else if (hash_mode == 11300)
7715 {
7716 bitcoin_wallet_t *bitcoin_wallets = (bitcoin_wallet_t *) data.esalts_buf;
7717
7718 bitcoin_wallet_t *bitcoin_wallet = &bitcoin_wallets[salt_pos];
7719
7720 const uint cry_master_len = bitcoin_wallet->cry_master_len;
7721 const uint ckey_len = bitcoin_wallet->ckey_len;
7722 const uint public_key_len = bitcoin_wallet->public_key_len;
7723
7724 char *cry_master_buf = (char *) mymalloc ((cry_master_len * 2) + 1);
7725 char *ckey_buf = (char *) mymalloc ((ckey_len * 2) + 1);
7726 char *public_key_buf = (char *) mymalloc ((public_key_len * 2) + 1);
7727
7728 for (uint i = 0, j = 0; i < cry_master_len; i += 1, j += 2)
7729 {
7730 const uint8_t *ptr = (const uint8_t *) bitcoin_wallet->cry_master_buf;
7731
7732 sprintf (cry_master_buf + j, "%02x", ptr[i]);
7733 }
7734
7735 for (uint i = 0, j = 0; i < ckey_len; i += 1, j += 2)
7736 {
7737 const uint8_t *ptr = (const uint8_t *) bitcoin_wallet->ckey_buf;
7738
7739 sprintf (ckey_buf + j, "%02x", ptr[i]);
7740 }
7741
7742 for (uint i = 0, j = 0; i < public_key_len; i += 1, j += 2)
7743 {
7744 const uint8_t *ptr = (const uint8_t *) bitcoin_wallet->public_key_buf;
7745
7746 sprintf (public_key_buf + j, "%02x", ptr[i]);
7747 }
7748
7749 snprintf (out_buf, len-1, "%s%d$%s$%d$%s$%d$%d$%s$%d$%s",
7750 SIGNATURE_BITCOIN_WALLET,
7751 cry_master_len * 2,
7752 cry_master_buf,
7753 salt.salt_len,
7754 (unsigned char *) salt.salt_buf,
7755 salt.salt_iter + 1,
7756 ckey_len * 2,
7757 ckey_buf,
7758 public_key_len * 2,
7759 public_key_buf
7760 );
7761
7762 free (cry_master_buf);
7763 free (ckey_buf);
7764 free (public_key_buf);
7765 }
7766 else if (hash_mode == 11400)
7767 {
7768 uint digest_idx = salt.digests_offset + digest_pos;
7769
7770 hashinfo_t **hashinfo_ptr = data.hash_info;
7771 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7772
7773 snprintf (out_buf, len-1, "%s", hash_buf);
7774 }
7775 else if (hash_mode == 11600)
7776 {
7777 seven_zip_t *seven_zips = (seven_zip_t *) data.esalts_buf;
7778
7779 seven_zip_t *seven_zip = &seven_zips[salt_pos];
7780
7781 const uint data_len = seven_zip->data_len;
7782
7783 char *data_buf = (char *) mymalloc ((data_len * 2) + 1);
7784
7785 for (uint i = 0, j = 0; i < data_len; i += 1, j += 2)
7786 {
7787 const uint8_t *ptr = (const uint8_t *) seven_zip->data_buf;
7788
7789 sprintf (data_buf + j, "%02x", ptr[i]);
7790 }
7791
7792 snprintf (out_buf, len-1, "%s%u$%u$%u$%s$%u$%08x%08x%08x%08x$%u$%u$%u$%s",
7793 SIGNATURE_SEVEN_ZIP,
7794 0,
7795 salt.salt_sign[0],
7796 0,
7797 (char *) seven_zip->salt_buf,
7798 seven_zip->iv_len,
7799 seven_zip->iv_buf[0],
7800 seven_zip->iv_buf[1],
7801 seven_zip->iv_buf[2],
7802 seven_zip->iv_buf[3],
7803 seven_zip->crc,
7804 seven_zip->data_len,
7805 seven_zip->unpack_size,
7806 data_buf);
7807
7808 free (data_buf);
7809 }
7810 else if (hash_mode == 11700)
7811 {
7812 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
7813 digest_buf[0],
7814 digest_buf[1],
7815 digest_buf[2],
7816 digest_buf[3],
7817 digest_buf[4],
7818 digest_buf[5],
7819 digest_buf[6],
7820 digest_buf[7]);
7821 }
7822 else if (hash_mode == 11800)
7823 {
7824 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
7825 digest_buf[ 0],
7826 digest_buf[ 1],
7827 digest_buf[ 2],
7828 digest_buf[ 3],
7829 digest_buf[ 4],
7830 digest_buf[ 5],
7831 digest_buf[ 6],
7832 digest_buf[ 7],
7833 digest_buf[ 8],
7834 digest_buf[ 9],
7835 digest_buf[10],
7836 digest_buf[11],
7837 digest_buf[12],
7838 digest_buf[13],
7839 digest_buf[14],
7840 digest_buf[15]);
7841 }
7842 else if (hash_mode == 11900)
7843 {
7844 uint digest_idx = salt.digests_offset + digest_pos;
7845
7846 hashinfo_t **hashinfo_ptr = data.hash_info;
7847 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7848
7849 snprintf (out_buf, len-1, "%s", hash_buf);
7850 }
7851 else if (hash_mode == 12000)
7852 {
7853 uint digest_idx = salt.digests_offset + digest_pos;
7854
7855 hashinfo_t **hashinfo_ptr = data.hash_info;
7856 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7857
7858 snprintf (out_buf, len-1, "%s", hash_buf);
7859 }
7860 else if (hash_mode == 12100)
7861 {
7862 uint digest_idx = salt.digests_offset + digest_pos;
7863
7864 hashinfo_t **hashinfo_ptr = data.hash_info;
7865 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7866
7867 snprintf (out_buf, len-1, "%s", hash_buf);
7868 }
7869 else if (hash_mode == 12200)
7870 {
7871 uint *ptr_digest = digest_buf;
7872 uint *ptr_salt = salt.salt_buf;
7873
7874 snprintf (out_buf, len-1, "%s0$1$%08x%08x$%08x%08x",
7875 SIGNATURE_ECRYPTFS,
7876 ptr_salt[0],
7877 ptr_salt[1],
7878 ptr_digest[0],
7879 ptr_digest[1]);
7880 }
7881 else if (hash_mode == 12300)
7882 {
7883 uint *ptr_digest = digest_buf;
7884 uint *ptr_salt = salt.salt_buf;
7885
7886 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",
7887 ptr_digest[ 0], ptr_digest[ 1],
7888 ptr_digest[ 2], ptr_digest[ 3],
7889 ptr_digest[ 4], ptr_digest[ 5],
7890 ptr_digest[ 6], ptr_digest[ 7],
7891 ptr_digest[ 8], ptr_digest[ 9],
7892 ptr_digest[10], ptr_digest[11],
7893 ptr_digest[12], ptr_digest[13],
7894 ptr_digest[14], ptr_digest[15],
7895 ptr_salt[0],
7896 ptr_salt[1],
7897 ptr_salt[2],
7898 ptr_salt[3]);
7899 }
7900 else if (hash_mode == 12400)
7901 {
7902 // encode iteration count
7903
7904 char salt_iter[5];
7905
7906 salt_iter[0] = int_to_itoa64 ((salt.salt_iter ) & 0x3f);
7907 salt_iter[1] = int_to_itoa64 ((salt.salt_iter >> 6) & 0x3f);
7908 salt_iter[2] = int_to_itoa64 ((salt.salt_iter >> 12) & 0x3f);
7909 salt_iter[3] = int_to_itoa64 ((salt.salt_iter >> 18) & 0x3f);
7910 salt_iter[4] = 0;
7911
7912 // encode salt
7913
7914 ptr_salt[0] = int_to_itoa64 ((salt.salt_buf[0] ) & 0x3f);
7915 ptr_salt[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f);
7916 ptr_salt[2] = int_to_itoa64 ((salt.salt_buf[0] >> 12) & 0x3f);
7917 ptr_salt[3] = int_to_itoa64 ((salt.salt_buf[0] >> 18) & 0x3f);
7918 ptr_salt[4] = 0;
7919
7920 // encode digest
7921
7922 memset (tmp_buf, 0, sizeof (tmp_buf));
7923
7924 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7925 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7926
7927 memcpy (tmp_buf, digest_buf, 8);
7928
7929 base64_encode (int_to_itoa64, tmp_buf, 8, ptr_plain);
7930
7931 ptr_plain[11] = 0;
7932
7933 // fill the resulting buffer
7934
7935 snprintf (out_buf, len - 1, "_%s%s%s", salt_iter, ptr_salt, ptr_plain);
7936 }
7937 else if (hash_mode == 12500)
7938 {
7939 snprintf (out_buf, len - 1, "%s*0*%08x%08x*%08x%08x%08x%08x",
7940 SIGNATURE_RAR3,
7941 byte_swap_32 (salt.salt_buf[0]),
7942 byte_swap_32 (salt.salt_buf[1]),
7943 salt.salt_buf[2],
7944 salt.salt_buf[3],
7945 salt.salt_buf[4],
7946 salt.salt_buf[5]);
7947 }
7948 else if (hash_mode == 12600)
7949 {
7950 snprintf (out_buf, len - 1, "%08x%08x%08x%08x%08x%08x%08x%08x",
7951 digest_buf[0] + salt.salt_buf_pc[0],
7952 digest_buf[1] + salt.salt_buf_pc[1],
7953 digest_buf[2] + salt.salt_buf_pc[2],
7954 digest_buf[3] + salt.salt_buf_pc[3],
7955 digest_buf[4] + salt.salt_buf_pc[4],
7956 digest_buf[5] + salt.salt_buf_pc[5],
7957 digest_buf[6] + salt.salt_buf_pc[6],
7958 digest_buf[7] + salt.salt_buf_pc[7]);
7959 }
7960 else if (hash_mode == 12700)
7961 {
7962 uint digest_idx = salt.digests_offset + digest_pos;
7963
7964 hashinfo_t **hashinfo_ptr = data.hash_info;
7965 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7966
7967 snprintf (out_buf, len-1, "%s", hash_buf);
7968 }
7969 else if (hash_mode == 12800)
7970 {
7971 const uint8_t *ptr = (const uint8_t *) salt.salt_buf;
7972
7973 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",
7974 SIGNATURE_MS_DRSR,
7975 ptr[0],
7976 ptr[1],
7977 ptr[2],
7978 ptr[3],
7979 ptr[4],
7980 ptr[5],
7981 ptr[6],
7982 ptr[7],
7983 ptr[8],
7984 ptr[9],
7985 salt.salt_iter + 1,
7986 byte_swap_32 (digest_buf[0]),
7987 byte_swap_32 (digest_buf[1]),
7988 byte_swap_32 (digest_buf[2]),
7989 byte_swap_32 (digest_buf[3]),
7990 byte_swap_32 (digest_buf[4]),
7991 byte_swap_32 (digest_buf[5]),
7992 byte_swap_32 (digest_buf[6]),
7993 byte_swap_32 (digest_buf[7])
7994 );
7995 }
7996 else
7997 {
7998 if (hash_type == HASH_TYPE_MD4)
7999 {
8000 snprintf (out_buf, 255, "%08x%08x%08x%08x",
8001 digest_buf[0],
8002 digest_buf[1],
8003 digest_buf[2],
8004 digest_buf[3]);
8005 }
8006 else if (hash_type == HASH_TYPE_MD5)
8007 {
8008 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
8009 digest_buf[0],
8010 digest_buf[1],
8011 digest_buf[2],
8012 digest_buf[3]);
8013 }
8014 else if (hash_type == HASH_TYPE_SHA1)
8015 {
8016 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
8017 digest_buf[0],
8018 digest_buf[1],
8019 digest_buf[2],
8020 digest_buf[3],
8021 digest_buf[4]);
8022 }
8023 else if (hash_type == HASH_TYPE_SHA256)
8024 {
8025 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8026 digest_buf[0],
8027 digest_buf[1],
8028 digest_buf[2],
8029 digest_buf[3],
8030 digest_buf[4],
8031 digest_buf[5],
8032 digest_buf[6],
8033 digest_buf[7]);
8034 }
8035 else if (hash_type == HASH_TYPE_SHA384)
8036 {
8037 uint *ptr = digest_buf;
8038
8039 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8040 ptr[ 1], ptr[ 0],
8041 ptr[ 3], ptr[ 2],
8042 ptr[ 5], ptr[ 4],
8043 ptr[ 7], ptr[ 6],
8044 ptr[ 9], ptr[ 8],
8045 ptr[11], ptr[10]);
8046 }
8047 else if (hash_type == HASH_TYPE_SHA512)
8048 {
8049 uint *ptr = digest_buf;
8050
8051 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8052 ptr[ 1], ptr[ 0],
8053 ptr[ 3], ptr[ 2],
8054 ptr[ 5], ptr[ 4],
8055 ptr[ 7], ptr[ 6],
8056 ptr[ 9], ptr[ 8],
8057 ptr[11], ptr[10],
8058 ptr[13], ptr[12],
8059 ptr[15], ptr[14]);
8060 }
8061 else if (hash_type == HASH_TYPE_LM)
8062 {
8063 snprintf (out_buf, len-1, "%08x%08x",
8064 digest_buf[0],
8065 digest_buf[1]);
8066 }
8067 else if (hash_type == HASH_TYPE_ORACLEH)
8068 {
8069 snprintf (out_buf, len-1, "%08X%08X",
8070 digest_buf[0],
8071 digest_buf[1]);
8072 }
8073 else if (hash_type == HASH_TYPE_BCRYPT)
8074 {
8075 base64_encode (int_to_bf64, (char *) salt.salt_buf, 16, tmp_buf + 0);
8076 base64_encode (int_to_bf64, (char *) digest_buf, 23, tmp_buf + 22);
8077
8078 tmp_buf[22 + 31] = 0; // base64_encode wants to pad
8079
8080 snprintf (out_buf, len-1, "%s$%s", (char *) salt.salt_sign, tmp_buf);
8081 }
8082 else if (hash_type == HASH_TYPE_KECCAK)
8083 {
8084 uint *ptr = digest_buf;
8085
8086 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",
8087 ptr[ 1], ptr[ 0],
8088 ptr[ 3], ptr[ 2],
8089 ptr[ 5], ptr[ 4],
8090 ptr[ 7], ptr[ 6],
8091 ptr[ 9], ptr[ 8],
8092 ptr[11], ptr[10],
8093 ptr[13], ptr[12],
8094 ptr[15], ptr[14],
8095 ptr[17], ptr[16],
8096 ptr[19], ptr[18],
8097 ptr[21], ptr[20],
8098 ptr[23], ptr[22],
8099 ptr[25], ptr[24],
8100 ptr[27], ptr[26],
8101 ptr[29], ptr[28],
8102 ptr[31], ptr[30],
8103 ptr[33], ptr[32],
8104 ptr[35], ptr[34],
8105 ptr[37], ptr[36],
8106 ptr[39], ptr[38],
8107 ptr[41], ptr[30],
8108 ptr[43], ptr[42],
8109 ptr[45], ptr[44],
8110 ptr[47], ptr[46],
8111 ptr[49], ptr[48]
8112 );
8113
8114 out_buf[salt.keccak_mdlen * 2] = 0;
8115 }
8116 else if (hash_type == HASH_TYPE_RIPEMD160)
8117 {
8118 snprintf (out_buf, 255, "%08x%08x%08x%08x%08x",
8119 digest_buf[0],
8120 digest_buf[1],
8121 digest_buf[2],
8122 digest_buf[3],
8123 digest_buf[4]);
8124 }
8125 else if (hash_type == HASH_TYPE_WHIRLPOOL)
8126 {
8127 digest_buf[ 0] = digest_buf[ 0];
8128 digest_buf[ 1] = digest_buf[ 1];
8129 digest_buf[ 2] = digest_buf[ 2];
8130 digest_buf[ 3] = digest_buf[ 3];
8131 digest_buf[ 4] = digest_buf[ 4];
8132 digest_buf[ 5] = digest_buf[ 5];
8133 digest_buf[ 6] = digest_buf[ 6];
8134 digest_buf[ 7] = digest_buf[ 7];
8135 digest_buf[ 8] = digest_buf[ 8];
8136 digest_buf[ 9] = digest_buf[ 9];
8137 digest_buf[10] = digest_buf[10];
8138 digest_buf[11] = digest_buf[11];
8139 digest_buf[12] = digest_buf[12];
8140 digest_buf[13] = digest_buf[13];
8141 digest_buf[14] = digest_buf[14];
8142 digest_buf[15] = digest_buf[15];
8143
8144 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8145 digest_buf[ 0],
8146 digest_buf[ 1],
8147 digest_buf[ 2],
8148 digest_buf[ 3],
8149 digest_buf[ 4],
8150 digest_buf[ 5],
8151 digest_buf[ 6],
8152 digest_buf[ 7],
8153 digest_buf[ 8],
8154 digest_buf[ 9],
8155 digest_buf[10],
8156 digest_buf[11],
8157 digest_buf[12],
8158 digest_buf[13],
8159 digest_buf[14],
8160 digest_buf[15]);
8161 }
8162 else if (hash_type == HASH_TYPE_GOST)
8163 {
8164 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8165 digest_buf[0],
8166 digest_buf[1],
8167 digest_buf[2],
8168 digest_buf[3],
8169 digest_buf[4],
8170 digest_buf[5],
8171 digest_buf[6],
8172 digest_buf[7]);
8173 }
8174 else if (hash_type == HASH_TYPE_MYSQL)
8175 {
8176 snprintf (out_buf, len-1, "%08x%08x",
8177 digest_buf[0],
8178 digest_buf[1]);
8179 }
8180 else if (hash_type == HASH_TYPE_LOTUS5)
8181 {
8182 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
8183 digest_buf[0],
8184 digest_buf[1],
8185 digest_buf[2],
8186 digest_buf[3]);
8187 }
8188 else if (hash_type == HASH_TYPE_LOTUS6)
8189 {
8190 digest_buf[ 0] = byte_swap_32 (digest_buf[ 0]);
8191 digest_buf[ 1] = byte_swap_32 (digest_buf[ 1]);
8192 digest_buf[ 2] = byte_swap_32 (digest_buf[ 2]);
8193 digest_buf[ 3] = byte_swap_32 (digest_buf[ 3]);
8194
8195 char buf[16];
8196
8197 memcpy (buf + 0, salt.salt_buf, 5);
8198 memcpy (buf + 5, digest_buf, 9);
8199
8200 buf[3] -= -4;
8201
8202 base64_encode (int_to_lotus64, buf, 14, tmp_buf);
8203
8204 tmp_buf[18] = salt.salt_buf_pc[7];
8205 tmp_buf[19] = 0;
8206
8207 snprintf (out_buf, len-1, "(G%s)", tmp_buf);
8208 }
8209 else if (hash_type == HASH_TYPE_LOTUS8)
8210 {
8211 char buf[52];
8212
8213 memset (buf, 0, sizeof (buf));
8214
8215 // salt
8216
8217 memcpy (buf + 0, salt.salt_buf, 16);
8218
8219 buf[3] -= -4;
8220
8221 // iteration
8222
8223 snprintf (buf + 16, 11, "%010i", salt.salt_iter + 1);
8224
8225 // chars
8226
8227 buf[26] = salt.salt_buf_pc[0];
8228 buf[27] = salt.salt_buf_pc[1];
8229
8230 // digest
8231
8232 memcpy (buf + 28, digest_buf, 8);
8233
8234 base64_encode (int_to_lotus64, buf, 36, tmp_buf);
8235
8236 tmp_buf[49] = 0;
8237
8238 snprintf (out_buf, len-1, "(H%s)", tmp_buf);
8239 }
8240 else if (hash_type == HASH_TYPE_CRC32)
8241 {
8242 snprintf (out_buf, len-1, "%08x", byte_swap_32 (digest_buf[0]));
8243 }
8244 }
8245
8246 if (salt_type == SALT_TYPE_INTERN)
8247 {
8248 size_t pos = strlen (out_buf);
8249
8250 out_buf[pos] = data.separator;
8251
8252 char *ptr = (char *) salt.salt_buf;
8253
8254 memcpy (out_buf + pos + 1, ptr, salt.salt_len);
8255
8256 out_buf[pos + 1 + salt.salt_len] = 0;
8257 }
8258 }
8259
8260 void to_hccap_t (hccap_t *hccap, uint salt_pos, uint digest_pos)
8261 {
8262 memset (hccap, 0, sizeof (hccap_t));
8263
8264 salt_t *salt = &data.salts_buf[salt_pos];
8265
8266 memcpy (hccap->essid, salt->salt_buf, salt->salt_len);
8267
8268 wpa_t *wpas = (wpa_t *) data.esalts_buf;
8269 wpa_t *wpa = &wpas[salt_pos];
8270
8271 hccap->keyver = wpa->keyver;
8272
8273 hccap->eapol_size = wpa->eapol_size;
8274
8275 if (wpa->keyver != 1)
8276 {
8277 uint eapol_tmp[64];
8278
8279 for (uint i = 0; i < 64; i++)
8280 {
8281 eapol_tmp[i] = byte_swap_32 (wpa->eapol[i]);
8282 }
8283
8284 memcpy (hccap->eapol, eapol_tmp, wpa->eapol_size);
8285 }
8286 else
8287 {
8288 memcpy (hccap->eapol, wpa->eapol, wpa->eapol_size);
8289 }
8290
8291 uint pke_tmp[25];
8292
8293 for (int i = 5; i < 25; i++)
8294 {
8295 pke_tmp[i] = byte_swap_32 (wpa->pke[i]);
8296 }
8297
8298 char *pke_ptr = (char *) pke_tmp;
8299
8300 memcpy (hccap->mac1, pke_ptr + 23, 6);
8301 memcpy (hccap->mac2, pke_ptr + 29, 6);
8302 memcpy (hccap->nonce1, pke_ptr + 67, 32);
8303 memcpy (hccap->nonce2, pke_ptr + 35, 32);
8304
8305 char *digests_buf_ptr = (char *) data.digests_buf;
8306
8307 uint dgst_size = data.dgst_size;
8308
8309 uint *digest_ptr = (uint *) (digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size));
8310
8311 if (wpa->keyver != 1)
8312 {
8313 uint digest_tmp[4];
8314
8315 digest_tmp[0] = byte_swap_32 (digest_ptr[0]);
8316 digest_tmp[1] = byte_swap_32 (digest_ptr[1]);
8317 digest_tmp[2] = byte_swap_32 (digest_ptr[2]);
8318 digest_tmp[3] = byte_swap_32 (digest_ptr[3]);
8319
8320 memcpy (hccap->keymic, digest_tmp, 16);
8321 }
8322 else
8323 {
8324 memcpy (hccap->keymic, digest_ptr, 16);
8325 }
8326 }
8327
8328 void SuspendThreads ()
8329 {
8330 if (data.devices_status == STATUS_RUNNING)
8331 {
8332 hc_timer_set (&data.timer_paused);
8333
8334 data.devices_status = STATUS_PAUSED;
8335
8336 log_info ("Paused");
8337 }
8338 }
8339
8340 void ResumeThreads ()
8341 {
8342 if (data.devices_status == STATUS_PAUSED)
8343 {
8344 float ms_paused;
8345
8346 hc_timer_get (data.timer_paused, ms_paused);
8347
8348 data.ms_paused += ms_paused;
8349
8350 data.devices_status = STATUS_RUNNING;
8351
8352 log_info ("Resumed");
8353 }
8354 }
8355
8356 void bypass ()
8357 {
8358 if (data.devices_status != STATUS_RUNNING) return;
8359
8360 data.devices_status = STATUS_BYPASS;
8361
8362 log_info ("Next dictionary / mask in queue selected, bypassing current one");
8363 }
8364
8365 void stop_at_checkpoint ()
8366 {
8367 if (data.devices_status != STATUS_RUNNING) return;
8368
8369 // this feature only makes sense if --restore-disable was not specified
8370
8371 if (data.restore_disable == 0)
8372 {
8373 data.devices_status = STATUS_STOP_AT_CHECKPOINT;
8374
8375 // save the current restore point value
8376
8377 data.checkpoint_cur_words = get_lowest_words_done ();
8378
8379 log_info ("Stop at next checkpoint");
8380 }
8381 else
8382 {
8383 log_info ("WARNING: this feature is disabled when --restore-disable was specified");
8384 }
8385 }
8386
8387 void myabort ()
8388 {
8389 if (data.devices_status == STATUS_INIT) return;
8390 if (data.devices_status == STATUS_STARTING) return;
8391
8392 data.devices_status = STATUS_ABORTED;
8393 }
8394
8395 void myquit ()
8396 {
8397 if (data.devices_status == STATUS_INIT) return;
8398 if (data.devices_status == STATUS_STARTING) return;
8399
8400 data.devices_status = STATUS_QUIT;
8401 }
8402
8403 #ifdef _OCL
8404 uint get_vliw_by_device_name (const char *device_name)
8405 {
8406 uint vliw = 0;
8407
8408 if (strcmp (device_name, "Capeverde" ) == 0) vliw = 1;
8409 if (strcmp (device_name, "Pitcairn" ) == 0) vliw = 1;
8410 if (strcmp (device_name, "Tahiti" ) == 0) vliw = 1;
8411 if (strcmp (device_name, "ATI RV710" ) == 0) vliw = 1;
8412 if (strcmp (device_name, "ATI RV730" ) == 0) vliw = 1;
8413 if (strcmp (device_name, "ATI RV770" ) == 0) vliw = 4;
8414 if (strcmp (device_name, "Cayman" ) == 0) vliw = 4;
8415 if (strcmp (device_name, "Devastator" ) == 0) vliw = 4;
8416 if (strcmp (device_name, "Scrapper" ) == 0) vliw = 4;
8417 if (strcmp (device_name, "Barts" ) == 0) vliw = 5;
8418 if (strcmp (device_name, "BeaverCreek" ) == 0) vliw = 5;
8419 if (strcmp (device_name, "Caicos" ) == 0) vliw = 5;
8420 if (strcmp (device_name, "Cedar" ) == 0) vliw = 5;
8421 if (strcmp (device_name, "Cypress" ) == 0) vliw = 5;
8422 if (strcmp (device_name, "Juniper" ) == 0) vliw = 5;
8423 if (strcmp (device_name, "Loveland" ) == 0) vliw = 5;
8424 if (strcmp (device_name, "Redwood" ) == 0) vliw = 5;
8425 if (strcmp (device_name, "Turks" ) == 0) vliw = 5;
8426 if (strcmp (device_name, "WinterPark" ) == 0) vliw = 5;
8427 if (strcmp (device_name, "Oland" ) == 0) vliw = 1;
8428 if (strcmp (device_name, "Cats" ) == 0) vliw = 1;
8429 if (strcmp (device_name, "Raccoons" ) == 0) vliw = 1;
8430 if (strcmp (device_name, "Bonaire" ) == 0) vliw = 1;
8431 if (strcmp (device_name, "Hawaii" ) == 0) vliw = 1;
8432 if (strcmp (device_name, "Spectre" ) == 0) vliw = 1;
8433 if (strcmp (device_name, "Spooky" ) == 0) vliw = 1;
8434 if (strcmp (device_name, "Kalindi" ) == 0) vliw = 1;
8435 if (strcmp (device_name, "Hainan" ) == 0) vliw = 1;
8436 if (strcmp (device_name, "Iceland" ) == 0) vliw = 1;
8437 if (strcmp (device_name, "Tonga" ) == 0) vliw = 1;
8438 if (strcmp (device_name, "Mullins" ) == 0) vliw = 1;
8439 if (strcmp (device_name, "Fiji" ) == 0) vliw = 1;
8440
8441 if (strncmp (device_name, "ATI Radeon HD 4", 15) == 0) vliw = 1;
8442 if (strncmp (device_name, "ATI Radeon HD 5", 15) == 0) vliw = 5;
8443 if (strncmp (device_name, "ATI Radeon HD 6", 15) == 0) vliw = 4;
8444 if (strncmp (device_name, "ATI Radeon HD 7", 15) == 0) vliw = 4;
8445 if (strncmp (device_name, "ATI Radeon HD 79", 16) == 0) vliw = 1;
8446 if (strncmp (device_name, "ATI Radeon HD 8", 15) == 0) vliw = 1;
8447 if (strncmp (device_name, "AMD Radeon R9", 13) == 0) vliw = 1;
8448
8449 return vliw;
8450 }
8451 #else
8452 uint get_vliw_by_compute_capability (const uint major, const uint minor)
8453 {
8454 uint vliw = 0;
8455
8456 if (major == 1 && minor == 0) vliw = 1;
8457 if (major == 1 && minor == 1) vliw = 1;
8458 if (major == 1 && minor == 2) vliw = 1;
8459 if (major == 1 && minor == 3) vliw = 1;
8460 if (major == 2 && minor == 0) vliw = 1;
8461 if (major == 2 && minor == 1) vliw = 2;
8462 if (major == 3 && minor == 0) vliw = 2;
8463 if (major == 3 && minor == 5) vliw = 2;
8464 if (major == 3 && minor == 7) vliw = 2;
8465 if (major == 5 && minor == 0) vliw = 2;
8466 if (major == 5 && minor == 2) vliw = 2;
8467
8468 return vliw;
8469 }
8470 #endif
8471
8472 #ifdef _OCL
8473 void load_kernel (const char *kernel_file, int num_devices, size_t *kernel_lengths, const unsigned char **kernel_sources)
8474 {
8475 FILE *fp;
8476
8477 if ((fp = fopen (kernel_file, "rb")) != NULL)
8478 {
8479 struct stat st;
8480
8481 memset (&st, 0, sizeof (st));
8482
8483 stat (kernel_file, &st);
8484
8485 unsigned char *buf = (unsigned char *) mymalloc (st.st_size + 1);
8486
8487 size_t num_read = fread (buf, sizeof (unsigned char), st.st_size, fp);
8488
8489 if (num_read != (size_t) st.st_size)
8490 {
8491 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
8492
8493 exit (-1);
8494 }
8495
8496 fclose (fp);
8497
8498 buf[st.st_size] = 0;
8499
8500 for (int i = 0; i < num_devices; i++)
8501 {
8502 kernel_lengths[i] = (size_t) st.st_size;
8503
8504 kernel_sources[i] = buf;
8505 }
8506 }
8507 else
8508 {
8509 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
8510
8511 exit (-1);
8512 }
8513
8514 return;
8515 }
8516
8517 void writeProgramBin (char *dst, unsigned char *binary, size_t binary_size)
8518 {
8519 FILE *fp = fopen (dst, "wb");
8520
8521 fwrite (binary, sizeof (unsigned char), binary_size, fp);
8522
8523 fflush (fp);
8524 fclose (fp);
8525 }
8526 #endif
8527
8528 /**
8529 * restore
8530 */
8531
8532 restore_data_t *init_restore (int argc, char **argv)
8533 {
8534 restore_data_t *rd = (restore_data_t *) mymalloc (sizeof (restore_data_t));
8535
8536 if (data.restore_disable == 0)
8537 {
8538 FILE *fp = fopen (data.eff_restore_file, "rb");
8539
8540 if (fp)
8541 {
8542 size_t nread = fread (rd, sizeof (restore_data_t), 1, fp);
8543
8544 if (nread != 1)
8545 {
8546 log_error ("ERROR: cannot read %s", data.eff_restore_file);
8547
8548 exit (-1);
8549 }
8550
8551 fclose (fp);
8552
8553 if (rd->pid)
8554 {
8555 char pidbin[BUFSIZ];
8556
8557 int pidbin_len;
8558
8559 #ifdef _POSIX
8560 memset (pidbin, 0, sizeof (pidbin));
8561
8562 snprintf (pidbin, sizeof (pidbin) - 1, "/proc/%d/cmdline", rd->pid);
8563
8564 FILE *fd = fopen (pidbin, "rb");
8565
8566 if (fd)
8567 {
8568 pidbin_len = fread (pidbin, 1, BUFSIZ, fd);
8569
8570 pidbin[pidbin_len] = 0;
8571
8572 fclose (fd);
8573
8574 char *argv0_r = strrchr (argv[0], '/');
8575
8576 char *pidbin_r = strrchr (pidbin, '/');
8577
8578 if (argv0_r == NULL) argv0_r = argv[0];
8579
8580 if (pidbin_r == NULL) pidbin_r = pidbin;
8581
8582 if (strcmp (argv0_r, pidbin_r) == 0)
8583 {
8584 log_error ("ERROR: already an instance %s running on pid %d", pidbin, rd->pid);
8585
8586 exit (-1);
8587 }
8588 }
8589
8590 #elif _WIN
8591 HANDLE hProcess = OpenProcess (PROCESS_ALL_ACCESS, FALSE, rd->pid);
8592
8593 char pidbin2[BUFSIZ];
8594
8595 int pidbin2_len;
8596
8597 memset (pidbin2, 0, sizeof (pidbin2));
8598
8599 pidbin_len = GetModuleFileName (NULL, pidbin, BUFSIZ);
8600 pidbin2_len = GetModuleFileNameEx (hProcess, NULL, pidbin2, BUFSIZ);
8601
8602 pidbin[pidbin_len] = 0;
8603 pidbin2[pidbin2_len] = 0;
8604
8605 if (pidbin2_len)
8606 {
8607 if (strcmp (pidbin, pidbin2) == 0)
8608 {
8609 log_error ("ERROR: already an instance %s running on pid %d", pidbin2, rd->pid);
8610
8611 exit (-1);
8612 }
8613 }
8614 #endif
8615 }
8616
8617 if (rd->version_bin < RESTORE_MIN)
8618 {
8619 log_error ("ERROR: cannot use outdated %s. Please remove it.", data.eff_restore_file);
8620
8621 exit (-1);
8622 }
8623 }
8624 }
8625
8626 memset (rd, 0, sizeof (restore_data_t));
8627
8628 rd->version_bin = VERSION_BIN;
8629
8630 #ifdef _POSIX
8631 rd->pid = getpid ();
8632 #elif _WIN
8633 rd->pid = GetCurrentProcessId ();
8634 #endif
8635
8636 if (getcwd (rd->cwd, 255) == NULL)
8637 {
8638 myfree (rd);
8639
8640 return (NULL);
8641 }
8642
8643 rd->argc = argc;
8644 rd->argv = argv;
8645
8646 return (rd);
8647 }
8648
8649 void read_restore (const char *eff_restore_file, restore_data_t *rd)
8650 {
8651 FILE *fp = fopen (eff_restore_file, "rb");
8652
8653 if (fp == NULL)
8654 {
8655 log_error ("ERROR: restore file '%s': %s", eff_restore_file, strerror (errno));
8656
8657 exit (-1);
8658 }
8659
8660 if (fread (rd, sizeof (restore_data_t), 1, fp) != 1)
8661 {
8662 log_error ("ERROR: cannot read %s", eff_restore_file);
8663
8664 exit (-1);
8665 }
8666
8667 rd->argv = (char **) mycalloc (rd->argc, sizeof (char *));
8668
8669 for (uint i = 0; i < rd->argc; i++)
8670 {
8671 char buf[BUFSIZ];
8672
8673 if (fgets (buf, BUFSIZ - 1, fp) == NULL)
8674 {
8675 log_error ("ERROR: cannot read %s", eff_restore_file);
8676
8677 exit (-1);
8678 }
8679
8680 size_t len = strlen (buf);
8681
8682 if (len) buf[len - 1] = 0;
8683
8684 rd->argv[i] = mystrdup (buf);
8685 }
8686
8687 fclose (fp);
8688
8689 char new_cwd[256];
8690
8691 char *nwd = getcwd (new_cwd, sizeof (new_cwd));
8692
8693 if (nwd == NULL)
8694 {
8695 log_error ("Restore file is corrupted");
8696 }
8697
8698 if (strncmp (new_cwd, rd->cwd, sizeof (new_cwd)) != 0)
8699 {
8700 if (getcwd (rd->cwd, sizeof (rd->cwd)) == NULL)
8701 {
8702 log_error ("ERROR: could not determine current user path: %s", strerror (errno));
8703
8704 exit (-1);
8705 }
8706
8707 log_info ("WARNING: Found old restore file, updating path to %s...", new_cwd);
8708 }
8709
8710
8711 if (chdir (rd->cwd))
8712 {
8713 log_error ("ERROR: cannot chdir to %s: %s", rd->cwd, strerror (errno));
8714
8715 exit (-1);
8716 }
8717 }
8718
8719 uint64_t get_lowest_words_done ()
8720 {
8721 uint64_t words_cur = -1;
8722
8723 for (uint device_id = 0; device_id < data.devices_cnt; device_id++)
8724 {
8725 hc_device_param_t *device_param = &data.devices_param[device_id];
8726
8727 const uint64_t words_done = device_param->words_done;
8728
8729 if (words_done < words_cur) words_cur = words_done;
8730 }
8731
8732 return words_cur;
8733 }
8734
8735 void write_restore (const char *new_restore_file, restore_data_t *rd)
8736 {
8737 uint64_t words_cur = get_lowest_words_done ();
8738
8739 rd->words_cur = words_cur;
8740
8741 FILE *fp = fopen (new_restore_file, "wb");
8742
8743 if (fp == NULL)
8744 {
8745 log_error ("ERROR: %s: %s", new_restore_file, strerror (errno));
8746
8747 exit (-1);
8748 }
8749
8750 if (setvbuf (fp, NULL, _IONBF, 0))
8751 {
8752 log_error ("ERROR: setvbuf file '%s': %s", new_restore_file, strerror (errno));
8753
8754 exit (-1);
8755 }
8756
8757 fwrite (rd, sizeof (restore_data_t), 1, fp);
8758
8759 for (uint i = 0; i < rd->argc; i++)
8760 {
8761 fprintf (fp, "%s", rd->argv[i]);
8762 fputc ('\n', fp);
8763 }
8764
8765 fflush (fp);
8766
8767 fsync (fileno (fp));
8768
8769 fclose (fp);
8770 }
8771
8772 void cycle_restore ()
8773 {
8774 const char *eff_restore_file = data.eff_restore_file;
8775 const char *new_restore_file = data.new_restore_file;
8776
8777 restore_data_t *rd = data.rd;
8778
8779 write_restore (new_restore_file, rd);
8780
8781 struct stat st;
8782
8783 memset (&st, 0, sizeof(st));
8784
8785 if (stat (eff_restore_file, &st) == 0)
8786 {
8787 if (unlink (eff_restore_file))
8788 {
8789 log_info ("WARN: unlink file '%s': %s", eff_restore_file, strerror (errno));
8790 }
8791 }
8792
8793 if (rename (new_restore_file, eff_restore_file))
8794 {
8795 log_info ("WARN: rename file '%s' to '%s': %s", new_restore_file, eff_restore_file, strerror (errno));
8796 }
8797 }
8798
8799 void check_checkpoint ()
8800 {
8801 // if (data.restore_disable == 1) break; (this is already implied by previous checks)
8802
8803 uint64_t words_cur = get_lowest_words_done ();
8804
8805 if (words_cur != data.checkpoint_cur_words)
8806 {
8807 myabort ();
8808 }
8809 }
8810
8811 /**
8812 * adjustments
8813 */
8814
8815 uint set_gpu_accel (uint hash_mode)
8816 {
8817 switch (hash_mode)
8818 {
8819 case 0: return GET_ACCEL (0);
8820 case 10: return GET_ACCEL (10);
8821 case 11: return GET_ACCEL (11);
8822 case 12: return GET_ACCEL (12);
8823 case 20: return GET_ACCEL (20);
8824 case 21: return GET_ACCEL (21);
8825 case 22: return GET_ACCEL (22);
8826 case 23: return GET_ACCEL (23);
8827 case 30: return GET_ACCEL (30);
8828 case 40: return GET_ACCEL (40);
8829 case 50: return GET_ACCEL (50);
8830 case 60: return GET_ACCEL (60);
8831 case 100: return GET_ACCEL (100);
8832 case 101: return GET_ACCEL (101);
8833 case 110: return GET_ACCEL (110);
8834 case 111: return GET_ACCEL (111);
8835 case 112: return GET_ACCEL (112);
8836 case 120: return GET_ACCEL (120);
8837 case 121: return GET_ACCEL (121);
8838 case 122: return GET_ACCEL (122);
8839 case 124: return GET_ACCEL (124);
8840 case 130: return GET_ACCEL (130);
8841 case 131: return GET_ACCEL (131);
8842 case 132: return GET_ACCEL (132);
8843 case 133: return GET_ACCEL (133);
8844 case 140: return GET_ACCEL (140);
8845 case 141: return GET_ACCEL (141);
8846 case 150: return GET_ACCEL (150);
8847 case 160: return GET_ACCEL (160);
8848 case 190: return GET_ACCEL (190);
8849 case 200: return GET_ACCEL (200);
8850 case 300: return GET_ACCEL (300);
8851 case 400: return GET_ACCEL (400);
8852 case 500: return GET_ACCEL (500);
8853 case 501: return GET_ACCEL (501);
8854 case 900: return GET_ACCEL (900);
8855 case 910: return GET_ACCEL (910);
8856 case 1000: return GET_ACCEL (1000);
8857 case 1100: return GET_ACCEL (1100);
8858 case 1400: return GET_ACCEL (1400);
8859 case 1410: return GET_ACCEL (1410);
8860 case 1420: return GET_ACCEL (1420);
8861 case 1421: return GET_ACCEL (1421);
8862 case 1430: return GET_ACCEL (1430);
8863 case 1440: return GET_ACCEL (1440);
8864 case 1441: return GET_ACCEL (1441);
8865 case 1450: return GET_ACCEL (1450);
8866 case 1460: return GET_ACCEL (1460);
8867 case 1500: return GET_ACCEL (1500);
8868 case 1600: return GET_ACCEL (1600);
8869 case 1700: return GET_ACCEL (1700);
8870 case 1710: return GET_ACCEL (1710);
8871 case 1711: return GET_ACCEL (1711);
8872 case 1720: return GET_ACCEL (1720);
8873 case 1722: return GET_ACCEL (1722);
8874 case 1730: return GET_ACCEL (1730);
8875 case 1731: return GET_ACCEL (1731);
8876 case 1740: return GET_ACCEL (1740);
8877 case 1750: return GET_ACCEL (1750);
8878 case 1760: return GET_ACCEL (1760);
8879 case 1800: return GET_ACCEL (1800);
8880 case 2100: return GET_ACCEL (2100);
8881 case 2400: return GET_ACCEL (2400);
8882 case 2410: return GET_ACCEL (2410);
8883 case 2500: return GET_ACCEL (2500);
8884 case 2600: return GET_ACCEL (2600);
8885 case 2611: return GET_ACCEL (2611);
8886 case 2612: return GET_ACCEL (2612);
8887 case 2711: return GET_ACCEL (2711);
8888 case 2811: return GET_ACCEL (2811);
8889 case 3000: return GET_ACCEL (3000);
8890 case 3100: return GET_ACCEL (3100);
8891 case 3200: return GET_ACCEL (3200);
8892 case 3710: return GET_ACCEL (3710);
8893 case 3711: return GET_ACCEL (3711);
8894 case 3800: return GET_ACCEL (3800);
8895 case 4300: return GET_ACCEL (4300);
8896 case 4400: return GET_ACCEL (4400);
8897 case 4500: return GET_ACCEL (4500);
8898 case 4700: return GET_ACCEL (4700);
8899 case 4800: return GET_ACCEL (4800);
8900 case 4900: return GET_ACCEL (4900);
8901 case 5000: return GET_ACCEL (5000);
8902 case 5100: return GET_ACCEL (5100);
8903 case 5200: return GET_ACCEL (5200);
8904 case 5300: return GET_ACCEL (5300);
8905 case 5400: return GET_ACCEL (5400);
8906 case 5500: return GET_ACCEL (5500);
8907 case 5600: return GET_ACCEL (5600);
8908 case 5700: return GET_ACCEL (5700);
8909 case 5800: return GET_ACCEL (5800);
8910 case 6000: return GET_ACCEL (6000);
8911 case 6100: return GET_ACCEL (6100);
8912 case 6211: return GET_ACCEL (6211);
8913 case 6212: return GET_ACCEL (6212);
8914 case 6213: return GET_ACCEL (6213);
8915 case 6221: return GET_ACCEL (6221);
8916 case 6222: return GET_ACCEL (6222);
8917 case 6223: return GET_ACCEL (6223);
8918 case 6231: return GET_ACCEL (6231);
8919 case 6232: return GET_ACCEL (6232);
8920 case 6233: return GET_ACCEL (6233);
8921 case 6241: return GET_ACCEL (6241);
8922 case 6242: return GET_ACCEL (6242);
8923 case 6243: return GET_ACCEL (6243);
8924 case 6300: return GET_ACCEL (6300);
8925 case 6400: return GET_ACCEL (6400);
8926 case 6500: return GET_ACCEL (6500);
8927 case 6600: return GET_ACCEL (6600);
8928 case 6700: return GET_ACCEL (6700);
8929 case 6800: return GET_ACCEL (6800);
8930 case 6900: return GET_ACCEL (6900);
8931 case 7100: return GET_ACCEL (7100);
8932 case 7200: return GET_ACCEL (7200);
8933 case 7300: return GET_ACCEL (7300);
8934 case 7400: return GET_ACCEL (7400);
8935 case 7500: return GET_ACCEL (7500);
8936 case 7600: return GET_ACCEL (7600);
8937 case 7700: return GET_ACCEL (7700);
8938 case 7800: return GET_ACCEL (7800);
8939 case 7900: return GET_ACCEL (7900);
8940 case 8000: return GET_ACCEL (8000);
8941 case 8100: return GET_ACCEL (8100);
8942 case 8200: return GET_ACCEL (8200);
8943 case 8300: return GET_ACCEL (8300);
8944 case 8400: return GET_ACCEL (8400);
8945 case 8500: return GET_ACCEL (8500);
8946 case 8600: return GET_ACCEL (8600);
8947 case 8700: return GET_ACCEL (8700);
8948 case 8800: return GET_ACCEL (8800);
8949 case 8900: return GET_ACCEL (8900);
8950 case 9000: return GET_ACCEL (9000);
8951 case 9100: return GET_ACCEL (9100);
8952 case 9200: return GET_ACCEL (9200);
8953 case 9300: return GET_ACCEL (9300);
8954 case 9400: return GET_ACCEL (9400);
8955 case 9500: return GET_ACCEL (9500);
8956 case 9600: return GET_ACCEL (9600);
8957 case 9700: return GET_ACCEL (9700);
8958 case 9710: return GET_ACCEL (9710);
8959 case 9720: return GET_ACCEL (9720);
8960 case 9800: return GET_ACCEL (9800);
8961 case 9810: return GET_ACCEL (9810);
8962 case 9820: return GET_ACCEL (9820);
8963 case 9900: return GET_ACCEL (9900);
8964 case 10000: return GET_ACCEL (10000);
8965 case 10100: return GET_ACCEL (10100);
8966 case 10200: return GET_ACCEL (10200);
8967 case 10300: return GET_ACCEL (10300);
8968 case 10400: return GET_ACCEL (10400);
8969 case 10410: return GET_ACCEL (10410);
8970 case 10420: return GET_ACCEL (10420);
8971 case 10500: return GET_ACCEL (10500);
8972 case 10600: return GET_ACCEL (10600);
8973 case 10700: return GET_ACCEL (10700);
8974 case 10800: return GET_ACCEL (10800);
8975 case 10900: return GET_ACCEL (10900);
8976 case 11000: return GET_ACCEL (11000);
8977 case 11100: return GET_ACCEL (11100);
8978 case 11200: return GET_ACCEL (11200);
8979 case 11300: return GET_ACCEL (11300);
8980 case 11400: return GET_ACCEL (11400);
8981 case 11500: return GET_ACCEL (11500);
8982 case 11600: return GET_ACCEL (11600);
8983 case 11700: return GET_ACCEL (11700);
8984 case 11800: return GET_ACCEL (11800);
8985 case 11900: return GET_ACCEL (11900);
8986 case 12000: return GET_ACCEL (12000);
8987 case 12100: return GET_ACCEL (12100);
8988 case 12200: return GET_ACCEL (12200);
8989 case 12300: return GET_ACCEL (12300);
8990 case 12400: return GET_ACCEL (12400);
8991 case 12500: return GET_ACCEL (12500);
8992 case 12600: return GET_ACCEL (12600);
8993 case 12700: return GET_ACCEL (12700);
8994 case 12800: return GET_ACCEL (12800);
8995 }
8996
8997 return 0;
8998 }
8999
9000 uint set_gpu_loops (uint hash_mode)
9001 {
9002 switch (hash_mode)
9003 {
9004 case 0: return GET_LOOPS (0);
9005 case 10: return GET_LOOPS (10);
9006 case 11: return GET_LOOPS (11);
9007 case 12: return GET_LOOPS (12);
9008 case 20: return GET_LOOPS (20);
9009 case 21: return GET_LOOPS (21);
9010 case 22: return GET_LOOPS (22);
9011 case 23: return GET_LOOPS (23);
9012 case 30: return GET_LOOPS (30);
9013 case 40: return GET_LOOPS (40);
9014 case 50: return GET_LOOPS (50);
9015 case 60: return GET_LOOPS (60);
9016 case 100: return GET_LOOPS (100);
9017 case 101: return GET_LOOPS (101);
9018 case 110: return GET_LOOPS (110);
9019 case 111: return GET_LOOPS (111);
9020 case 112: return GET_LOOPS (112);
9021 case 120: return GET_LOOPS (120);
9022 case 121: return GET_LOOPS (121);
9023 case 122: return GET_LOOPS (122);
9024 case 124: return GET_LOOPS (124);
9025 case 130: return GET_LOOPS (130);
9026 case 131: return GET_LOOPS (131);
9027 case 132: return GET_LOOPS (132);
9028 case 133: return GET_LOOPS (133);
9029 case 140: return GET_LOOPS (140);
9030 case 141: return GET_LOOPS (141);
9031 case 150: return GET_LOOPS (150);
9032 case 160: return GET_LOOPS (160);
9033 case 190: return GET_LOOPS (190);
9034 case 200: return GET_LOOPS (200);
9035 case 300: return GET_LOOPS (300);
9036 case 400: return GET_LOOPS (400);
9037 case 500: return GET_LOOPS (500);
9038 case 501: return GET_LOOPS (501);
9039 case 900: return GET_LOOPS (900);
9040 case 910: return GET_LOOPS (910);
9041 case 1000: return GET_LOOPS (1000);
9042 case 1100: return GET_LOOPS (1100);
9043 case 1400: return GET_LOOPS (1400);
9044 case 1410: return GET_LOOPS (1410);
9045 case 1420: return GET_LOOPS (1420);
9046 case 1421: return GET_LOOPS (1421);
9047 case 1430: return GET_LOOPS (1430);
9048 case 1440: return GET_LOOPS (1440);
9049 case 1441: return GET_LOOPS (1441);
9050 case 1450: return GET_LOOPS (1450);
9051 case 1460: return GET_LOOPS (1460);
9052 case 1500: return GET_LOOPS (1500);
9053 case 1600: return GET_LOOPS (1600);
9054 case 1700: return GET_LOOPS (1700);
9055 case 1710: return GET_LOOPS (1710);
9056 case 1711: return GET_LOOPS (1711);
9057 case 1720: return GET_LOOPS (1720);
9058 case 1722: return GET_LOOPS (1722);
9059 case 1730: return GET_LOOPS (1730);
9060 case 1731: return GET_LOOPS (1731);
9061 case 1740: return GET_LOOPS (1740);
9062 case 1750: return GET_LOOPS (1750);
9063 case 1760: return GET_LOOPS (1760);
9064 case 1800: return GET_LOOPS (1800);
9065 case 2100: return GET_LOOPS (2100);
9066 case 2400: return GET_LOOPS (2400);
9067 case 2410: return GET_LOOPS (2410);
9068 case 2500: return GET_LOOPS (2500);
9069 case 2600: return GET_LOOPS (2600);
9070 case 2611: return GET_LOOPS (2611);
9071 case 2612: return GET_LOOPS (2612);
9072 case 2711: return GET_LOOPS (2711);
9073 case 2811: return GET_LOOPS (2811);
9074 case 3000: return GET_LOOPS (3000);
9075 case 3100: return GET_LOOPS (3100);
9076 case 3200: return GET_LOOPS (3200);
9077 case 3710: return GET_LOOPS (3710);
9078 case 3711: return GET_LOOPS (3711);
9079 case 3800: return GET_LOOPS (3800);
9080 case 4300: return GET_LOOPS (4300);
9081 case 4400: return GET_LOOPS (4400);
9082 case 4500: return GET_LOOPS (4500);
9083 case 4700: return GET_LOOPS (4700);
9084 case 4800: return GET_LOOPS (4800);
9085 case 4900: return GET_LOOPS (4900);
9086 case 5000: return GET_LOOPS (5000);
9087 case 5100: return GET_LOOPS (5100);
9088 case 5200: return GET_LOOPS (5200);
9089 case 5300: return GET_LOOPS (5300);
9090 case 5400: return GET_LOOPS (5400);
9091 case 5500: return GET_LOOPS (5500);
9092 case 5600: return GET_LOOPS (5600);
9093 case 5700: return GET_LOOPS (5700);
9094 case 5800: return GET_LOOPS (5800);
9095 case 6000: return GET_LOOPS (6000);
9096 case 6100: return GET_LOOPS (6100);
9097 case 6211: return GET_LOOPS (6211);
9098 case 6212: return GET_LOOPS (6212);
9099 case 6213: return GET_LOOPS (6213);
9100 case 6221: return GET_LOOPS (6221);
9101 case 6222: return GET_LOOPS (6222);
9102 case 6223: return GET_LOOPS (6223);
9103 case 6231: return GET_LOOPS (6231);
9104 case 6232: return GET_LOOPS (6232);
9105 case 6233: return GET_LOOPS (6233);
9106 case 6241: return GET_LOOPS (6241);
9107 case 6242: return GET_LOOPS (6242);
9108 case 6243: return GET_LOOPS (6243);
9109 case 6300: return GET_LOOPS (6300);
9110 case 6400: return GET_LOOPS (6400);
9111 case 6500: return GET_LOOPS (6500);
9112 case 6600: return GET_LOOPS (6600);
9113 case 6700: return GET_LOOPS (6700);
9114 case 6800: return GET_LOOPS (6800);
9115 case 6900: return GET_LOOPS (6900);
9116 case 7100: return GET_LOOPS (7100);
9117 case 7200: return GET_LOOPS (7200);
9118 case 7300: return GET_LOOPS (7300);
9119 case 7400: return GET_LOOPS (7400);
9120 case 7500: return GET_LOOPS (7500);
9121 case 7600: return GET_LOOPS (7600);
9122 case 7700: return GET_LOOPS (7700);
9123 case 7800: return GET_LOOPS (7800);
9124 case 7900: return GET_LOOPS (7900);
9125 case 8000: return GET_LOOPS (8000);
9126 case 8100: return GET_LOOPS (8100);
9127 case 8200: return GET_LOOPS (8200);
9128 case 8300: return GET_LOOPS (8300);
9129 case 8400: return GET_LOOPS (8400);
9130 case 8500: return GET_LOOPS (8500);
9131 case 8600: return GET_LOOPS (8600);
9132 case 8700: return GET_LOOPS (8700);
9133 case 8800: return GET_LOOPS (8800);
9134 case 8900: return GET_LOOPS (8900);
9135 case 9000: return GET_LOOPS (9000);
9136 case 9100: return GET_LOOPS (9100);
9137 case 9200: return GET_LOOPS (9200);
9138 case 9300: return GET_LOOPS (9300);
9139 case 9400: return GET_LOOPS (9400);
9140 case 9500: return GET_LOOPS (9500);
9141 case 9600: return GET_LOOPS (9600);
9142 case 9700: return GET_LOOPS (9700);
9143 case 9710: return GET_LOOPS (9710);
9144 case 9720: return GET_LOOPS (9720);
9145 case 9800: return GET_LOOPS (9800);
9146 case 9810: return GET_LOOPS (9810);
9147 case 9820: return GET_LOOPS (9820);
9148 case 9900: return GET_LOOPS (9900);
9149 case 10000: return GET_LOOPS (10000);
9150 case 10100: return GET_LOOPS (10100);
9151 case 10200: return GET_LOOPS (10200);
9152 case 10300: return GET_LOOPS (10300);
9153 case 10400: return GET_LOOPS (10400);
9154 case 10410: return GET_LOOPS (10410);
9155 case 10420: return GET_LOOPS (10420);
9156 case 10500: return GET_LOOPS (10500);
9157 case 10600: return GET_LOOPS (10600);
9158 case 10700: return GET_LOOPS (10700);
9159 case 10800: return GET_LOOPS (10800);
9160 case 10900: return GET_LOOPS (10900);
9161 case 11000: return GET_LOOPS (11000);
9162 case 11100: return GET_LOOPS (11100);
9163 case 11200: return GET_LOOPS (11200);
9164 case 11300: return GET_LOOPS (11300);
9165 case 11400: return GET_LOOPS (11400);
9166 case 11500: return GET_LOOPS (11500);
9167 case 11600: return GET_LOOPS (11600);
9168 case 11700: return GET_LOOPS (11700);
9169 case 11800: return GET_LOOPS (11800);
9170 case 11900: return GET_LOOPS (11900);
9171 case 12000: return GET_LOOPS (12000);
9172 case 12100: return GET_LOOPS (12100);
9173 case 12200: return GET_LOOPS (12200);
9174 case 12300: return GET_LOOPS (12300);
9175 case 12400: return GET_LOOPS (12400);
9176 case 12500: return GET_LOOPS (12500);
9177 case 12600: return GET_LOOPS (12600);
9178 case 12700: return GET_LOOPS (12700);
9179 case 12800: return GET_LOOPS (12800);
9180 }
9181
9182 return 0;
9183 }
9184
9185 /**
9186 * parser
9187 */
9188
9189 uint parse_and_store_salt (char *out, char *in, uint salt_len)
9190 {
9191 char tmp[256];
9192
9193 if (salt_len > sizeof(tmp))
9194 {
9195 return UINT_MAX;
9196 }
9197
9198 memset (tmp, 0, sizeof (tmp));
9199 memcpy (tmp, in, salt_len);
9200
9201 if (data.opts_type & OPTS_TYPE_ST_HEX)
9202 {
9203 if ((salt_len % 2) == 0)
9204 {
9205 uint new_salt_len = salt_len / 2;
9206
9207 for (uint i = 0, j = 0; i < new_salt_len; i += 1, j += 2)
9208 {
9209 char p0 = tmp[j + 0];
9210 char p1 = tmp[j + 1];
9211
9212 tmp[i] = hex_convert (p1) << 0;
9213 tmp[i] |= hex_convert (p0) << 4;
9214 }
9215
9216 salt_len = new_salt_len;
9217 }
9218 else
9219 {
9220 return UINT_MAX;
9221 }
9222 }
9223 else if (data.opts_type & OPTS_TYPE_ST_BASE64)
9224 {
9225 salt_len = base64_decode (base64_to_int, in, salt_len, tmp);
9226 }
9227
9228 memset (tmp + salt_len, 0, sizeof (tmp) - salt_len);
9229
9230 if (data.opts_type & OPTS_TYPE_ST_UNICODE)
9231 {
9232 if (salt_len < 20)
9233 {
9234 uint *tmp_uint = (uint *) tmp;
9235
9236 tmp_uint[9] = ((tmp_uint[4] >> 8) & 0x00FF0000) | ((tmp_uint[4] >> 16) & 0x000000FF);
9237 tmp_uint[8] = ((tmp_uint[4] << 8) & 0x00FF0000) | ((tmp_uint[4] >> 0) & 0x000000FF);
9238 tmp_uint[7] = ((tmp_uint[3] >> 8) & 0x00FF0000) | ((tmp_uint[3] >> 16) & 0x000000FF);
9239 tmp_uint[6] = ((tmp_uint[3] << 8) & 0x00FF0000) | ((tmp_uint[3] >> 0) & 0x000000FF);
9240 tmp_uint[5] = ((tmp_uint[2] >> 8) & 0x00FF0000) | ((tmp_uint[2] >> 16) & 0x000000FF);
9241 tmp_uint[4] = ((tmp_uint[2] << 8) & 0x00FF0000) | ((tmp_uint[2] >> 0) & 0x000000FF);
9242 tmp_uint[3] = ((tmp_uint[1] >> 8) & 0x00FF0000) | ((tmp_uint[1] >> 16) & 0x000000FF);
9243 tmp_uint[2] = ((tmp_uint[1] << 8) & 0x00FF0000) | ((tmp_uint[1] >> 0) & 0x000000FF);
9244 tmp_uint[1] = ((tmp_uint[0] >> 8) & 0x00FF0000) | ((tmp_uint[0] >> 16) & 0x000000FF);
9245 tmp_uint[0] = ((tmp_uint[0] << 8) & 0x00FF0000) | ((tmp_uint[0] >> 0) & 0x000000FF);
9246
9247 salt_len = salt_len * 2;
9248 }
9249 else
9250 {
9251 return UINT_MAX;
9252 }
9253 }
9254
9255 if (data.opts_type & OPTS_TYPE_ST_LOWER)
9256 {
9257 lowercase (tmp, salt_len);
9258 }
9259
9260 if (data.opts_type & OPTS_TYPE_ST_UPPER)
9261 {
9262 uppercase (tmp, salt_len);
9263 }
9264
9265 uint len = salt_len;
9266
9267 if (data.opts_type & OPTS_TYPE_ST_ADD80)
9268 {
9269 tmp[len++] = 0x80;
9270 }
9271
9272 if (data.opts_type & OPTS_TYPE_ST_ADD01)
9273 {
9274 tmp[len++] = 0x01;
9275 }
9276
9277 if (data.opts_type & OPTS_TYPE_ST_GENERATE_LE)
9278 {
9279 uint *tmp_uint = (uint *) tmp;
9280
9281 uint max = len / 4;
9282
9283 if (len % 4) max++;
9284
9285 for (uint i = 0; i < max; i++)
9286 {
9287 tmp_uint[i] = byte_swap_32 (tmp_uint[i]);
9288 }
9289
9290 // Important: we may need to increase the length of memcpy since
9291 // we don't want to "loose" some swapped bytes (could happen if
9292 // they do not perfectly fit in the 4-byte blocks)
9293 // Memcpy does always copy the bytes in the BE order, but since
9294 // we swapped them, some important bytes could be in positions
9295 // we normally skip with the original len
9296
9297 if (len % 4) len += 4 - (len % 4);
9298 }
9299
9300 memcpy (out, tmp, len);
9301
9302 return (salt_len);
9303 }
9304
9305 int bcrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9306 {
9307 if ((input_len < DISPLAY_LEN_MIN_3200) || (input_len > DISPLAY_LEN_MAX_3200)) return (PARSER_GLOBAL_LENGTH);
9308
9309 if ((memcmp (SIGNATURE_BCRYPT1, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT2, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT3, input_buf, 4))) return (PARSER_SIGNATURE_UNMATCHED);
9310
9311 uint32_t *digest = (uint32_t *) hash_buf->digest;
9312
9313 salt_t *salt = hash_buf->salt;
9314
9315 memcpy ((char *) salt->salt_sign, input_buf, 6);
9316
9317 char *iter_pos = input_buf + 4;
9318
9319 salt->salt_iter = 1 << atoi (iter_pos);
9320
9321 char *salt_pos = strchr (iter_pos, '$');
9322
9323 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9324
9325 salt_pos++;
9326
9327 uint salt_len = 16;
9328
9329 salt->salt_len = salt_len;
9330
9331 char tmp_buf[100];
9332
9333 memset (tmp_buf, 0, sizeof (tmp_buf));
9334
9335 base64_decode (bf64_to_int, salt_pos, 22, tmp_buf);
9336
9337 char *salt_buf_ptr = (char *) salt->salt_buf;
9338
9339 memcpy (salt_buf_ptr, tmp_buf, 16);
9340
9341 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
9342 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
9343 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
9344 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
9345
9346 char *hash_pos = salt_pos + 22;
9347
9348 memset (tmp_buf, 0, sizeof (tmp_buf));
9349
9350 base64_decode (bf64_to_int, hash_pos, 31, tmp_buf);
9351
9352 memcpy (digest, tmp_buf, 24);
9353
9354 digest[0] = byte_swap_32 (digest[0]);
9355 digest[1] = byte_swap_32 (digest[1]);
9356 digest[2] = byte_swap_32 (digest[2]);
9357 digest[3] = byte_swap_32 (digest[3]);
9358 digest[4] = byte_swap_32 (digest[4]);
9359 digest[5] = byte_swap_32 (digest[5]);
9360
9361 digest[5] &= ~0xff; // its just 23 not 24 !
9362
9363 return (PARSER_OK);
9364 }
9365
9366 int cisco4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9367 {
9368 if ((input_len < DISPLAY_LEN_MIN_5700) || (input_len > DISPLAY_LEN_MAX_5700)) return (PARSER_GLOBAL_LENGTH);
9369
9370 uint32_t *digest = (uint32_t *) hash_buf->digest;
9371
9372 char tmp_buf[100];
9373
9374 memset (tmp_buf, 0, sizeof (tmp_buf));
9375
9376 base64_decode (itoa64_to_int, input_buf, 43, tmp_buf);
9377
9378 memcpy (digest, tmp_buf, 32);
9379
9380 digest[0] = byte_swap_32 (digest[0]);
9381 digest[1] = byte_swap_32 (digest[1]);
9382 digest[2] = byte_swap_32 (digest[2]);
9383 digest[3] = byte_swap_32 (digest[3]);
9384 digest[4] = byte_swap_32 (digest[4]);
9385 digest[5] = byte_swap_32 (digest[5]);
9386 digest[6] = byte_swap_32 (digest[6]);
9387 digest[7] = byte_swap_32 (digest[7]);
9388
9389 digest[0] -= SHA256M_A;
9390 digest[1] -= SHA256M_B;
9391 digest[2] -= SHA256M_C;
9392 digest[3] -= SHA256M_D;
9393 digest[4] -= SHA256M_E;
9394 digest[5] -= SHA256M_F;
9395 digest[6] -= SHA256M_G;
9396 digest[7] -= SHA256M_H;
9397
9398 return (PARSER_OK);
9399 }
9400
9401 int lm_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9402 {
9403 if ((input_len < DISPLAY_LEN_MIN_3000) || (input_len > DISPLAY_LEN_MAX_3000)) return (PARSER_GLOBAL_LENGTH);
9404
9405 uint32_t *digest = (uint32_t *) hash_buf->digest;
9406
9407 digest[0] = hex_to_uint (&input_buf[ 0]);
9408 digest[1] = hex_to_uint (&input_buf[ 8]);
9409
9410 digest[0] = byte_swap_32 (digest[0]);
9411 digest[1] = byte_swap_32 (digest[1]);
9412
9413 uint tt;
9414
9415 IP (digest[0], digest[1], tt);
9416
9417 digest[0] = digest[0];
9418 digest[1] = digest[1];
9419 digest[2] = 0;
9420 digest[3] = 0;
9421
9422 return (PARSER_OK);
9423 }
9424
9425 int osx1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9426 {
9427 if ((input_len < DISPLAY_LEN_MIN_122) || (input_len > DISPLAY_LEN_MAX_122)) return (PARSER_GLOBAL_LENGTH);
9428
9429 uint32_t *digest = (uint32_t *) hash_buf->digest;
9430
9431 salt_t *salt = hash_buf->salt;
9432
9433 char *hash_pos = input_buf + 8;
9434
9435 digest[0] = hex_to_uint (&hash_pos[ 0]);
9436 digest[1] = hex_to_uint (&hash_pos[ 8]);
9437 digest[2] = hex_to_uint (&hash_pos[16]);
9438 digest[3] = hex_to_uint (&hash_pos[24]);
9439 digest[4] = hex_to_uint (&hash_pos[32]);
9440
9441 digest[0] -= SHA1M_A;
9442 digest[1] -= SHA1M_B;
9443 digest[2] -= SHA1M_C;
9444 digest[3] -= SHA1M_D;
9445 digest[4] -= SHA1M_E;
9446
9447 uint salt_len = 8;
9448
9449 char *salt_buf_ptr = (char *) salt->salt_buf;
9450
9451 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
9452
9453 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9454
9455 salt->salt_len = salt_len;
9456
9457 return (PARSER_OK);
9458 }
9459
9460 int osx512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9461 {
9462 if ((input_len < DISPLAY_LEN_MIN_1722) || (input_len > DISPLAY_LEN_MAX_1722)) return (PARSER_GLOBAL_LENGTH);
9463
9464 uint64_t *digest = (uint64_t *) hash_buf->digest;
9465
9466 salt_t *salt = hash_buf->salt;
9467
9468 char *hash_pos = input_buf + 8;
9469
9470 digest[0] = hex_to_uint64_t (&hash_pos[ 0]);
9471 digest[1] = hex_to_uint64_t (&hash_pos[ 16]);
9472 digest[2] = hex_to_uint64_t (&hash_pos[ 32]);
9473 digest[3] = hex_to_uint64_t (&hash_pos[ 48]);
9474 digest[4] = hex_to_uint64_t (&hash_pos[ 64]);
9475 digest[5] = hex_to_uint64_t (&hash_pos[ 80]);
9476 digest[6] = hex_to_uint64_t (&hash_pos[ 96]);
9477 digest[7] = hex_to_uint64_t (&hash_pos[112]);
9478
9479 digest[0] -= SHA512M_A;
9480 digest[1] -= SHA512M_B;
9481 digest[2] -= SHA512M_C;
9482 digest[3] -= SHA512M_D;
9483 digest[4] -= SHA512M_E;
9484 digest[5] -= SHA512M_F;
9485 digest[6] -= SHA512M_G;
9486 digest[7] -= SHA512M_H;
9487
9488 uint salt_len = 8;
9489
9490 char *salt_buf_ptr = (char *) salt->salt_buf;
9491
9492 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
9493
9494 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9495
9496 salt->salt_len = salt_len;
9497
9498 return (PARSER_OK);
9499 }
9500
9501 int osc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9502 {
9503 if (data.opts_type & OPTS_TYPE_ST_HEX)
9504 {
9505 if ((input_len < DISPLAY_LEN_MIN_21H) || (input_len > DISPLAY_LEN_MAX_21H)) return (PARSER_GLOBAL_LENGTH);
9506 }
9507 else
9508 {
9509 if ((input_len < DISPLAY_LEN_MIN_21) || (input_len > DISPLAY_LEN_MAX_21)) return (PARSER_GLOBAL_LENGTH);
9510 }
9511
9512 uint32_t *digest = (uint32_t *) hash_buf->digest;
9513
9514 salt_t *salt = hash_buf->salt;
9515
9516 digest[0] = hex_to_uint (&input_buf[ 0]);
9517 digest[1] = hex_to_uint (&input_buf[ 8]);
9518 digest[2] = hex_to_uint (&input_buf[16]);
9519 digest[3] = hex_to_uint (&input_buf[24]);
9520
9521 digest[0] = byte_swap_32 (digest[0]);
9522 digest[1] = byte_swap_32 (digest[1]);
9523 digest[2] = byte_swap_32 (digest[2]);
9524 digest[3] = byte_swap_32 (digest[3]);
9525
9526 digest[0] -= MD5M_A;
9527 digest[1] -= MD5M_B;
9528 digest[2] -= MD5M_C;
9529 digest[3] -= MD5M_D;
9530
9531 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
9532
9533 uint salt_len = input_len - 32 - 1;
9534
9535 char *salt_buf = input_buf + 32 + 1;
9536
9537 char *salt_buf_ptr = (char *) salt->salt_buf;
9538
9539 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
9540
9541 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9542
9543 salt->salt_len = salt_len;
9544
9545 return (PARSER_OK);
9546 }
9547
9548 int netscreen_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9549 {
9550 if (data.opts_type & OPTS_TYPE_ST_HEX)
9551 {
9552 if ((input_len < DISPLAY_LEN_MIN_22H) || (input_len > DISPLAY_LEN_MAX_22H)) return (PARSER_GLOBAL_LENGTH);
9553 }
9554 else
9555 {
9556 if ((input_len < DISPLAY_LEN_MIN_22) || (input_len > DISPLAY_LEN_MAX_22)) return (PARSER_GLOBAL_LENGTH);
9557 }
9558
9559 // unscramble
9560
9561 char clean_input_buf[32];
9562
9563 char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' };
9564 int pos[6] = { 0, 6, 12, 17, 23, 29 };
9565
9566 for (int i = 0, j = 0, k = 0; i < 30; i++)
9567 {
9568 if (i == pos[j])
9569 {
9570 if (sig[j] != input_buf[i]) return (PARSER_SIGNATURE_UNMATCHED);
9571
9572 j++;
9573 }
9574 else
9575 {
9576 clean_input_buf[k] = input_buf[i];
9577
9578 k++;
9579 }
9580 }
9581
9582 // base64 decode
9583
9584 uint32_t *digest = (uint32_t *) hash_buf->digest;
9585
9586 salt_t *salt = hash_buf->salt;
9587
9588 char a, b, c, d, e, f;
9589
9590 a = base64_to_int (clean_input_buf[ 0] & 0x7f);
9591 b = base64_to_int (clean_input_buf[ 1] & 0x7f);
9592 c = base64_to_int (clean_input_buf[ 2] & 0x7f);
9593 d = base64_to_int (clean_input_buf[ 3] & 0x7f);
9594 e = base64_to_int (clean_input_buf[ 4] & 0x7f);
9595 f = base64_to_int (clean_input_buf[ 5] & 0x7f);
9596
9597 digest[0] = (((a << 12) | (b << 6) | (c)) << 16)
9598 | (((d << 12) | (e << 6) | (f)) << 0);
9599
9600 a = base64_to_int (clean_input_buf[ 6] & 0x7f);
9601 b = base64_to_int (clean_input_buf[ 7] & 0x7f);
9602 c = base64_to_int (clean_input_buf[ 8] & 0x7f);
9603 d = base64_to_int (clean_input_buf[ 9] & 0x7f);
9604 e = base64_to_int (clean_input_buf[10] & 0x7f);
9605 f = base64_to_int (clean_input_buf[11] & 0x7f);
9606
9607 digest[1] = (((a << 12) | (b << 6) | (c)) << 16)
9608 | (((d << 12) | (e << 6) | (f)) << 0);
9609
9610 a = base64_to_int (clean_input_buf[12] & 0x7f);
9611 b = base64_to_int (clean_input_buf[13] & 0x7f);
9612 c = base64_to_int (clean_input_buf[14] & 0x7f);
9613 d = base64_to_int (clean_input_buf[15] & 0x7f);
9614 e = base64_to_int (clean_input_buf[16] & 0x7f);
9615 f = base64_to_int (clean_input_buf[17] & 0x7f);
9616
9617 digest[2] = (((a << 12) | (b << 6) | (c)) << 16)
9618 | (((d << 12) | (e << 6) | (f)) << 0);
9619
9620 a = base64_to_int (clean_input_buf[18] & 0x7f);
9621 b = base64_to_int (clean_input_buf[19] & 0x7f);
9622 c = base64_to_int (clean_input_buf[20] & 0x7f);
9623 d = base64_to_int (clean_input_buf[21] & 0x7f);
9624 e = base64_to_int (clean_input_buf[22] & 0x7f);
9625 f = base64_to_int (clean_input_buf[23] & 0x7f);
9626
9627 digest[3] = (((a << 12) | (b << 6) | (c)) << 16)
9628 | (((d << 12) | (e << 6) | (f)) << 0);
9629
9630 digest[0] = byte_swap_32 (digest[0]);
9631 digest[1] = byte_swap_32 (digest[1]);
9632 digest[2] = byte_swap_32 (digest[2]);
9633 digest[3] = byte_swap_32 (digest[3]);
9634
9635 digest[0] -= MD5M_A;
9636 digest[1] -= MD5M_B;
9637 digest[2] -= MD5M_C;
9638 digest[3] -= MD5M_D;
9639
9640 if (input_buf[30] != ':') return (PARSER_SEPARATOR_UNMATCHED);
9641
9642 uint salt_len = input_len - 30 - 1;
9643
9644 char *salt_buf = input_buf + 30 + 1;
9645
9646 char *salt_buf_ptr = (char *) salt->salt_buf;
9647
9648 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
9649
9650 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9651
9652 salt->salt_len = salt_len;
9653
9654 memcpy (salt_buf_ptr + salt_len, ":Administration Tools:", 22);
9655
9656 salt->salt_len += 22;
9657
9658 return (PARSER_OK);
9659 }
9660
9661 int smf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9662 {
9663 if (data.opts_type & OPTS_TYPE_ST_HEX)
9664 {
9665 if ((input_len < DISPLAY_LEN_MIN_121H) || (input_len > DISPLAY_LEN_MAX_121H)) return (PARSER_GLOBAL_LENGTH);
9666 }
9667 else
9668 {
9669 if ((input_len < DISPLAY_LEN_MIN_121) || (input_len > DISPLAY_LEN_MAX_121)) return (PARSER_GLOBAL_LENGTH);
9670 }
9671
9672 uint32_t *digest = (uint32_t *) hash_buf->digest;
9673
9674 salt_t *salt = hash_buf->salt;
9675
9676 digest[0] = hex_to_uint (&input_buf[ 0]);
9677 digest[1] = hex_to_uint (&input_buf[ 8]);
9678 digest[2] = hex_to_uint (&input_buf[16]);
9679 digest[3] = hex_to_uint (&input_buf[24]);
9680 digest[4] = hex_to_uint (&input_buf[32]);
9681
9682 digest[0] -= SHA1M_A;
9683 digest[1] -= SHA1M_B;
9684 digest[2] -= SHA1M_C;
9685 digest[3] -= SHA1M_D;
9686 digest[4] -= SHA1M_E;
9687
9688 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
9689
9690 uint salt_len = input_len - 40 - 1;
9691
9692 char *salt_buf = input_buf + 40 + 1;
9693
9694 char *salt_buf_ptr = (char *) salt->salt_buf;
9695
9696 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
9697
9698 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9699
9700 salt->salt_len = salt_len;
9701
9702 return (PARSER_OK);
9703 }
9704
9705 int dcc2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9706 {
9707 if (data.opts_type & OPTS_TYPE_ST_HEX)
9708 {
9709 if ((input_len < DISPLAY_LEN_MIN_2100H) || (input_len > DISPLAY_LEN_MAX_2100H)) return (PARSER_GLOBAL_LENGTH);
9710 }
9711 else
9712 {
9713 if ((input_len < DISPLAY_LEN_MIN_2100) || (input_len > DISPLAY_LEN_MAX_2100)) return (PARSER_GLOBAL_LENGTH);
9714 }
9715
9716 if (memcmp (SIGNATURE_DCC2, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
9717
9718 char *iter_pos = input_buf + 6;
9719
9720 salt_t *salt = hash_buf->salt;
9721
9722 salt->salt_iter = atoi (iter_pos) - 1;
9723
9724 char *salt_pos = strchr (iter_pos, '#');
9725
9726 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9727
9728 salt_pos++;
9729
9730 char *digest_pos = strchr (salt_pos, '#');
9731
9732 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9733
9734 digest_pos++;
9735
9736 uint salt_len = digest_pos - salt_pos - 1;
9737
9738 uint32_t *digest = (uint32_t *) hash_buf->digest;
9739
9740 digest[0] = hex_to_uint (&digest_pos[ 0]);
9741 digest[1] = hex_to_uint (&digest_pos[ 8]);
9742 digest[2] = hex_to_uint (&digest_pos[16]);
9743 digest[3] = hex_to_uint (&digest_pos[24]);
9744
9745 char *salt_buf_ptr = (char *) salt->salt_buf;
9746
9747 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
9748
9749 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9750
9751 salt->salt_len = salt_len;
9752
9753 return (PARSER_OK);
9754 }
9755
9756 int wpa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9757 {
9758 uint32_t *digest = (uint32_t *) hash_buf->digest;
9759
9760 salt_t *salt = hash_buf->salt;
9761
9762 wpa_t *wpa = (wpa_t *) hash_buf->esalt;
9763
9764 hccap_t in;
9765
9766 memcpy (&in, input_buf, input_len);
9767
9768 if (in.eapol_size < 1 || in.eapol_size > 255) return (PARSER_HCCAP_EAPOL_SIZE);
9769
9770 memcpy (digest, in.keymic, 16);
9771
9772 /*
9773 http://www.one-net.eu/jsw/j_sec/m_ptype.html
9774 The phrase "Pairwise key expansion"
9775 Access Point Address (Referred to as Authenticator Address AA)
9776 Supplicant Address (referred to as Supplicant Address SA)
9777 Access Point Nonce (referred to as Authenticator Anonce)
9778 Wireless Device Nonce (referred to as Supplicant Nonce Snonce)
9779 */
9780
9781 uint salt_len = strlen (in.essid);
9782
9783 memcpy (salt->salt_buf, in.essid, salt_len);
9784
9785 salt->salt_len = salt_len;
9786
9787 salt->salt_iter = ROUNDS_WPA2 - 1;
9788
9789 unsigned char *pke_ptr = (unsigned char *) wpa->pke;
9790
9791 memcpy (pke_ptr, "Pairwise key expansion", 23);
9792
9793 if (memcmp (in.mac1, in.mac2, 6) < 0)
9794 {
9795 memcpy (pke_ptr + 23, in.mac1, 6);
9796 memcpy (pke_ptr + 29, in.mac2, 6);
9797 }
9798 else
9799 {
9800 memcpy (pke_ptr + 23, in.mac2, 6);
9801 memcpy (pke_ptr + 29, in.mac1, 6);
9802 }
9803
9804 if (memcmp (in.nonce1, in.nonce2, 32) < 0)
9805 {
9806 memcpy (pke_ptr + 35, in.nonce1, 32);
9807 memcpy (pke_ptr + 67, in.nonce2, 32);
9808 }
9809 else
9810 {
9811 memcpy (pke_ptr + 35, in.nonce2, 32);
9812 memcpy (pke_ptr + 67, in.nonce1, 32);
9813 }
9814
9815 for (int i = 0; i < 25; i++)
9816 {
9817 wpa->pke[i] = byte_swap_32 (wpa->pke[i]);
9818 }
9819
9820 wpa->keyver = in.keyver;
9821
9822 if (wpa->keyver > 255)
9823 {
9824 log_info ("ATTENTION!");
9825 log_info (" The WPA/WPA2 key version in your .hccap file is invalid!");
9826 log_info (" This could be due to a recent aircrack-ng bug.");
9827 log_info (" The key version was automatically reset to a reasonable value.");
9828 log_info ("");
9829
9830 wpa->keyver &= 0xff;
9831 }
9832
9833 wpa->eapol_size = in.eapol_size;
9834
9835 unsigned char *eapol_ptr = (unsigned char *) wpa->eapol;
9836
9837 memcpy (eapol_ptr, in.eapol, wpa->eapol_size);
9838
9839 memset (eapol_ptr + wpa->eapol_size, 0, 256 - wpa->eapol_size);
9840
9841 eapol_ptr[wpa->eapol_size] = (unsigned char) 0x80;
9842
9843 if (wpa->keyver == 1)
9844 {
9845 // nothing to do
9846 }
9847 else
9848 {
9849 digest[0] = byte_swap_32 (digest[0]);
9850 digest[1] = byte_swap_32 (digest[1]);
9851 digest[2] = byte_swap_32 (digest[2]);
9852 digest[3] = byte_swap_32 (digest[3]);
9853
9854 for (int i = 0; i < 64; i++)
9855 {
9856 wpa->eapol[i] = byte_swap_32 (wpa->eapol[i]);
9857 }
9858 }
9859
9860 salt->salt_buf[10] = digest[1];
9861 salt->salt_buf[11] = digest[2];
9862
9863 return (PARSER_OK);
9864 }
9865
9866 int psafe2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9867 {
9868 uint32_t *digest = (uint32_t *) hash_buf->digest;
9869
9870 salt_t *salt = hash_buf->salt;
9871
9872 if (input_len == 0)
9873 {
9874 log_error ("Password Safe v2 container not specified");
9875
9876 exit (-1);
9877 }
9878
9879 FILE *fp = fopen (input_buf, "rb");
9880
9881 if (fp == NULL)
9882 {
9883 log_error ("%s: %s", input_buf, strerror (errno));
9884
9885 exit (-1);
9886 }
9887
9888 typedef struct
9889 {
9890 uint32_t random[2];
9891 uint32_t hash[5];
9892 uint32_t salt[5]; // unused, but makes better valid check
9893 uint32_t iv[2]; // unused, but makes better valid check
9894
9895 } psafe2_hdr;
9896
9897 psafe2_hdr buf;
9898
9899 int n = fread (&buf, sizeof (psafe2_hdr), 1, fp);
9900
9901 fclose (fp);
9902
9903 if (n != 1) return (PARSER_PSAFE2_FILE_SIZE);
9904
9905 salt->salt_buf[0] = buf.random[0];
9906 salt->salt_buf[1] = buf.random[1];
9907
9908 salt->salt_len = 8;
9909 salt->salt_iter = 1000;
9910
9911 digest[0] = byte_swap_32 (buf.hash[0]);
9912 digest[1] = byte_swap_32 (buf.hash[1]);
9913 digest[2] = byte_swap_32 (buf.hash[2]);
9914 digest[3] = byte_swap_32 (buf.hash[3]);
9915 digest[4] = byte_swap_32 (buf.hash[4]);
9916
9917 return (PARSER_OK);
9918 }
9919
9920 int psafe3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9921 {
9922 uint32_t *digest = (uint32_t *) hash_buf->digest;
9923
9924 salt_t *salt = hash_buf->salt;
9925
9926 if (input_len == 0)
9927 {
9928 log_error (".psafe3 not specified");
9929
9930 exit (-1);
9931 }
9932
9933 FILE *fp = fopen (input_buf, "rb");
9934
9935 if (fp == NULL)
9936 {
9937 log_error ("%s: %s", input_buf, strerror (errno));
9938
9939 exit (-1);
9940 }
9941
9942 psafe3_t in;
9943
9944 int n = fread (&in, sizeof (psafe3_t), 1, fp);
9945
9946 fclose (fp);
9947
9948 data.hashfile = input_buf; // we will need this in case it gets cracked
9949
9950 if (memcmp (SIGNATURE_PSAFE3, in.signature, 4)) return (PARSER_SIGNATURE_UNMATCHED);
9951
9952 if (n != 1) return (PARSER_PSAFE3_FILE_SIZE);
9953
9954 salt->salt_iter = in.iterations + 1;
9955
9956 salt->salt_buf[0] = in.salt_buf[0];
9957 salt->salt_buf[1] = in.salt_buf[1];
9958 salt->salt_buf[2] = in.salt_buf[2];
9959 salt->salt_buf[3] = in.salt_buf[3];
9960 salt->salt_buf[4] = in.salt_buf[4];
9961 salt->salt_buf[5] = in.salt_buf[5];
9962 salt->salt_buf[6] = in.salt_buf[6];
9963 salt->salt_buf[7] = in.salt_buf[7];
9964
9965 salt->salt_len = 32;
9966
9967 digest[0] = in.hash_buf[0];
9968 digest[1] = in.hash_buf[1];
9969 digest[2] = in.hash_buf[2];
9970 digest[3] = in.hash_buf[3];
9971 digest[4] = in.hash_buf[4];
9972 digest[5] = in.hash_buf[5];
9973 digest[6] = in.hash_buf[6];
9974 digest[7] = in.hash_buf[7];
9975
9976 digest[0] = byte_swap_32 (digest[0]);
9977 digest[1] = byte_swap_32 (digest[1]);
9978 digest[2] = byte_swap_32 (digest[2]);
9979 digest[3] = byte_swap_32 (digest[3]);
9980 digest[4] = byte_swap_32 (digest[4]);
9981 digest[5] = byte_swap_32 (digest[5]);
9982 digest[6] = byte_swap_32 (digest[6]);
9983 digest[7] = byte_swap_32 (digest[7]);
9984
9985 return (PARSER_OK);
9986 }
9987
9988 int phpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9989 {
9990 if ((input_len < DISPLAY_LEN_MIN_400) || (input_len > DISPLAY_LEN_MAX_400)) return (PARSER_GLOBAL_LENGTH);
9991
9992 if ((memcmp (SIGNATURE_PHPASS1, input_buf, 3)) && (memcmp (SIGNATURE_PHPASS2, input_buf, 3))) return (PARSER_SIGNATURE_UNMATCHED);
9993
9994 uint32_t *digest = (uint32_t *) hash_buf->digest;
9995
9996 salt_t *salt = hash_buf->salt;
9997
9998 char *iter_pos = input_buf + 3;
9999
10000 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
10001
10002 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
10003
10004 memcpy ((char *) salt->salt_sign, input_buf, 4);
10005
10006 salt->salt_iter = salt_iter;
10007
10008 char *salt_pos = iter_pos + 1;
10009
10010 uint salt_len = 8;
10011
10012 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10013
10014 salt->salt_len = salt_len;
10015
10016 char *hash_pos = salt_pos + salt_len;
10017
10018 phpass_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10019
10020 return (PARSER_OK);
10021 }
10022
10023 int md5crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10024 {
10025 if (memcmp (SIGNATURE_MD5CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
10026
10027 uint32_t *digest = (uint32_t *) hash_buf->digest;
10028
10029 salt_t *salt = hash_buf->salt;
10030
10031 char *salt_pos = input_buf + 3;
10032
10033 uint iterations_len = 0;
10034
10035 if (memcmp (salt_pos, "rounds=", 7) == 0)
10036 {
10037 salt_pos += 7;
10038
10039 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10040
10041 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10042 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10043
10044 salt_pos[0] = 0x0;
10045
10046 salt->salt_iter = atoi (salt_pos - iterations_len);
10047
10048 salt_pos += 1;
10049
10050 iterations_len += 8;
10051 }
10052 else
10053 {
10054 salt->salt_iter = ROUNDS_MD5CRYPT;
10055 }
10056
10057 if ((input_len < DISPLAY_LEN_MIN_500) || (input_len > (DISPLAY_LEN_MAX_500 + iterations_len))) return (PARSER_GLOBAL_LENGTH);
10058
10059 char *hash_pos = strchr (salt_pos, '$');
10060
10061 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10062
10063 uint salt_len = hash_pos - salt_pos;
10064
10065 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10066
10067 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10068
10069 salt->salt_len = salt_len;
10070
10071 hash_pos++;
10072
10073 uint hash_len = input_len - 3 - iterations_len - salt_len - 1;
10074
10075 if (hash_len != 22) return (PARSER_HASH_LENGTH);
10076
10077 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10078
10079 return (PARSER_OK);
10080 }
10081
10082 int md5apr1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10083 {
10084 if (memcmp (SIGNATURE_MD5APR1, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
10085
10086 uint32_t *digest = (uint32_t *) hash_buf->digest;
10087
10088 salt_t *salt = hash_buf->salt;
10089
10090 char *salt_pos = input_buf + 6;
10091
10092 uint iterations_len = 0;
10093
10094 if (memcmp (salt_pos, "rounds=", 7) == 0)
10095 {
10096 salt_pos += 7;
10097
10098 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10099
10100 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10101 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10102
10103 salt_pos[0] = 0x0;
10104
10105 salt->salt_iter = atoi (salt_pos - iterations_len);
10106
10107 salt_pos += 1;
10108
10109 iterations_len += 8;
10110 }
10111 else
10112 {
10113 salt->salt_iter = ROUNDS_MD5CRYPT;
10114 }
10115
10116 if ((input_len < DISPLAY_LEN_MIN_1600) || (input_len > DISPLAY_LEN_MAX_1600 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
10117
10118 char *hash_pos = strchr (salt_pos, '$');
10119
10120 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10121
10122 uint salt_len = hash_pos - salt_pos;
10123
10124 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10125
10126 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10127
10128 salt->salt_len = salt_len;
10129
10130 hash_pos++;
10131
10132 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10133
10134 return (PARSER_OK);
10135 }
10136
10137 int episerver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10138 {
10139 if ((input_len < DISPLAY_LEN_MIN_141) || (input_len > DISPLAY_LEN_MAX_141)) return (PARSER_GLOBAL_LENGTH);
10140
10141 if (memcmp (SIGNATURE_EPISERVER, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
10142
10143 uint32_t *digest = (uint32_t *) hash_buf->digest;
10144
10145 salt_t *salt = hash_buf->salt;
10146
10147 char *salt_pos = input_buf + 14;
10148
10149 char *hash_pos = strchr (salt_pos, '*');
10150
10151 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10152
10153 hash_pos++;
10154
10155 uint salt_len = hash_pos - salt_pos - 1;
10156
10157 char *salt_buf_ptr = (char *) salt->salt_buf;
10158
10159 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
10160
10161 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10162
10163 salt->salt_len = salt_len;
10164
10165 char tmp_buf[100]; memset (tmp_buf, 0, sizeof (tmp_buf));
10166
10167 base64_decode (base64_to_int, hash_pos, 27, tmp_buf);
10168
10169 memcpy (digest, tmp_buf, 20);
10170
10171 digest[0] = byte_swap_32 (digest[0]);
10172 digest[1] = byte_swap_32 (digest[1]);
10173 digest[2] = byte_swap_32 (digest[2]);
10174 digest[3] = byte_swap_32 (digest[3]);
10175 digest[4] = byte_swap_32 (digest[4]);
10176
10177 digest[0] -= SHA1M_A;
10178 digest[1] -= SHA1M_B;
10179 digest[2] -= SHA1M_C;
10180 digest[3] -= SHA1M_D;
10181 digest[4] -= SHA1M_E;
10182
10183 return (PARSER_OK);
10184 }
10185
10186 int descrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10187 {
10188 if ((input_len < DISPLAY_LEN_MIN_1500) || (input_len > DISPLAY_LEN_MAX_1500)) return (PARSER_GLOBAL_LENGTH);
10189
10190 unsigned char c12 = itoa64_to_int (input_buf[12]);
10191
10192 if (c12 & 3) return (PARSER_HASH_VALUE);
10193
10194 uint32_t *digest = (uint32_t *) hash_buf->digest;
10195
10196 salt_t *salt = hash_buf->salt;
10197
10198 // for ascii_digest
10199 salt->salt_sign[0] = input_buf[0];
10200 salt->salt_sign[1] = input_buf[1];
10201
10202 salt->salt_buf[0] = itoa64_to_int (input_buf[0])
10203 | itoa64_to_int (input_buf[1]) << 6;
10204
10205 salt->salt_len = 2;
10206
10207 char tmp_buf[100];
10208
10209 memset (tmp_buf, 0, sizeof (tmp_buf));
10210
10211 base64_decode (itoa64_to_int, input_buf + 2, 11, tmp_buf);
10212
10213 memcpy (digest, tmp_buf, 8);
10214
10215 uint tt;
10216
10217 IP (digest[0], digest[1], tt);
10218
10219 digest[2] = 0;
10220 digest[3] = 0;
10221
10222 return (PARSER_OK);
10223 }
10224
10225 int md4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10226 {
10227 if ((input_len < DISPLAY_LEN_MIN_900) || (input_len > DISPLAY_LEN_MAX_900)) return (PARSER_GLOBAL_LENGTH);
10228
10229 uint32_t *digest = (uint32_t *) hash_buf->digest;
10230
10231 digest[0] = hex_to_uint (&input_buf[ 0]);
10232 digest[1] = hex_to_uint (&input_buf[ 8]);
10233 digest[2] = hex_to_uint (&input_buf[16]);
10234 digest[3] = hex_to_uint (&input_buf[24]);
10235
10236 digest[0] = byte_swap_32 (digest[0]);
10237 digest[1] = byte_swap_32 (digest[1]);
10238 digest[2] = byte_swap_32 (digest[2]);
10239 digest[3] = byte_swap_32 (digest[3]);
10240
10241 digest[0] -= MD4M_A;
10242 digest[1] -= MD4M_B;
10243 digest[2] -= MD4M_C;
10244 digest[3] -= MD4M_D;
10245
10246 return (PARSER_OK);
10247 }
10248
10249 int md4s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10250 {
10251 if (data.opts_type & OPTS_TYPE_ST_HEX)
10252 {
10253 if ((input_len < DISPLAY_LEN_MIN_910H) || (input_len > DISPLAY_LEN_MAX_910H)) return (PARSER_GLOBAL_LENGTH);
10254 }
10255 else
10256 {
10257 if ((input_len < DISPLAY_LEN_MIN_910) || (input_len > DISPLAY_LEN_MAX_910)) return (PARSER_GLOBAL_LENGTH);
10258 }
10259
10260 uint32_t *digest = (uint32_t *) hash_buf->digest;
10261
10262 salt_t *salt = hash_buf->salt;
10263
10264 digest[0] = hex_to_uint (&input_buf[ 0]);
10265 digest[1] = hex_to_uint (&input_buf[ 8]);
10266 digest[2] = hex_to_uint (&input_buf[16]);
10267 digest[3] = hex_to_uint (&input_buf[24]);
10268
10269 digest[0] = byte_swap_32 (digest[0]);
10270 digest[1] = byte_swap_32 (digest[1]);
10271 digest[2] = byte_swap_32 (digest[2]);
10272 digest[3] = byte_swap_32 (digest[3]);
10273
10274 digest[0] -= MD4M_A;
10275 digest[1] -= MD4M_B;
10276 digest[2] -= MD4M_C;
10277 digest[3] -= MD4M_D;
10278
10279 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10280
10281 uint salt_len = input_len - 32 - 1;
10282
10283 char *salt_buf = input_buf + 32 + 1;
10284
10285 char *salt_buf_ptr = (char *) salt->salt_buf;
10286
10287 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10288
10289 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10290
10291 salt->salt_len = salt_len;
10292
10293 return (PARSER_OK);
10294 }
10295
10296 int md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10297 {
10298 if ((input_len < DISPLAY_LEN_MIN_0) || (input_len > DISPLAY_LEN_MAX_0)) return (PARSER_GLOBAL_LENGTH);
10299
10300 uint32_t *digest = (uint32_t *) hash_buf->digest;
10301
10302 digest[0] = hex_to_uint (&input_buf[ 0]);
10303 digest[1] = hex_to_uint (&input_buf[ 8]);
10304 digest[2] = hex_to_uint (&input_buf[16]);
10305 digest[3] = hex_to_uint (&input_buf[24]);
10306
10307 digest[0] = byte_swap_32 (digest[0]);
10308 digest[1] = byte_swap_32 (digest[1]);
10309 digest[2] = byte_swap_32 (digest[2]);
10310 digest[3] = byte_swap_32 (digest[3]);
10311
10312 digest[0] -= MD5M_A;
10313 digest[1] -= MD5M_B;
10314 digest[2] -= MD5M_C;
10315 digest[3] -= MD5M_D;
10316
10317 return (PARSER_OK);
10318 }
10319
10320 int md5half_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10321 {
10322 if ((input_len < DISPLAY_LEN_MIN_5100) || (input_len > DISPLAY_LEN_MAX_5100)) return (PARSER_GLOBAL_LENGTH);
10323
10324 uint32_t *digest = (uint32_t *) hash_buf->digest;
10325
10326 digest[0] = hex_to_uint (&input_buf[0]);
10327 digest[1] = hex_to_uint (&input_buf[8]);
10328 digest[2] = 0;
10329 digest[3] = 0;
10330
10331 digest[0] = byte_swap_32 (digest[0]);
10332 digest[1] = byte_swap_32 (digest[1]);
10333
10334 return (PARSER_OK);
10335 }
10336
10337 int md5s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10338 {
10339 if (data.opts_type & OPTS_TYPE_ST_HEX)
10340 {
10341 if ((input_len < DISPLAY_LEN_MIN_10H) || (input_len > DISPLAY_LEN_MAX_10H)) return (PARSER_GLOBAL_LENGTH);
10342 }
10343 else
10344 {
10345 if ((input_len < DISPLAY_LEN_MIN_10) || (input_len > DISPLAY_LEN_MAX_10)) return (PARSER_GLOBAL_LENGTH);
10346 }
10347
10348 uint32_t *digest = (uint32_t *) hash_buf->digest;
10349
10350 salt_t *salt = hash_buf->salt;
10351
10352 digest[0] = hex_to_uint (&input_buf[ 0]);
10353 digest[1] = hex_to_uint (&input_buf[ 8]);
10354 digest[2] = hex_to_uint (&input_buf[16]);
10355 digest[3] = hex_to_uint (&input_buf[24]);
10356
10357 digest[0] = byte_swap_32 (digest[0]);
10358 digest[1] = byte_swap_32 (digest[1]);
10359 digest[2] = byte_swap_32 (digest[2]);
10360 digest[3] = byte_swap_32 (digest[3]);
10361
10362 digest[0] -= MD5M_A;
10363 digest[1] -= MD5M_B;
10364 digest[2] -= MD5M_C;
10365 digest[3] -= MD5M_D;
10366
10367 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10368
10369 uint salt_len = input_len - 32 - 1;
10370
10371 char *salt_buf = input_buf + 32 + 1;
10372
10373 char *salt_buf_ptr = (char *) salt->salt_buf;
10374
10375 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10376
10377 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10378
10379 salt->salt_len = salt_len;
10380
10381 return (PARSER_OK);
10382 }
10383
10384 int md5pix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10385 {
10386 if ((input_len < DISPLAY_LEN_MIN_2400) || (input_len > DISPLAY_LEN_MAX_2400)) return (PARSER_GLOBAL_LENGTH);
10387
10388 uint32_t *digest = (uint32_t *) hash_buf->digest;
10389
10390 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
10391 | itoa64_to_int (input_buf[ 1]) << 6
10392 | itoa64_to_int (input_buf[ 2]) << 12
10393 | itoa64_to_int (input_buf[ 3]) << 18;
10394 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
10395 | itoa64_to_int (input_buf[ 5]) << 6
10396 | itoa64_to_int (input_buf[ 6]) << 12
10397 | itoa64_to_int (input_buf[ 7]) << 18;
10398 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
10399 | itoa64_to_int (input_buf[ 9]) << 6
10400 | itoa64_to_int (input_buf[10]) << 12
10401 | itoa64_to_int (input_buf[11]) << 18;
10402 digest[3] = itoa64_to_int (input_buf[12]) << 0
10403 | itoa64_to_int (input_buf[13]) << 6
10404 | itoa64_to_int (input_buf[14]) << 12
10405 | itoa64_to_int (input_buf[15]) << 18;
10406
10407 digest[0] -= MD5M_A;
10408 digest[1] -= MD5M_B;
10409 digest[2] -= MD5M_C;
10410 digest[3] -= MD5M_D;
10411
10412 digest[0] &= 0x00ffffff;
10413 digest[1] &= 0x00ffffff;
10414 digest[2] &= 0x00ffffff;
10415 digest[3] &= 0x00ffffff;
10416
10417 return (PARSER_OK);
10418 }
10419
10420 int md5asa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10421 {
10422 if (data.opts_type & OPTS_TYPE_ST_HEX)
10423 {
10424 if ((input_len < DISPLAY_LEN_MIN_2410H) || (input_len > DISPLAY_LEN_MAX_2410H)) return (PARSER_GLOBAL_LENGTH);
10425 }
10426 else
10427 {
10428 if ((input_len < DISPLAY_LEN_MIN_2410) || (input_len > DISPLAY_LEN_MAX_2410)) return (PARSER_GLOBAL_LENGTH);
10429 }
10430
10431 uint32_t *digest = (uint32_t *) hash_buf->digest;
10432
10433 salt_t *salt = hash_buf->salt;
10434
10435 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
10436 | itoa64_to_int (input_buf[ 1]) << 6
10437 | itoa64_to_int (input_buf[ 2]) << 12
10438 | itoa64_to_int (input_buf[ 3]) << 18;
10439 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
10440 | itoa64_to_int (input_buf[ 5]) << 6
10441 | itoa64_to_int (input_buf[ 6]) << 12
10442 | itoa64_to_int (input_buf[ 7]) << 18;
10443 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
10444 | itoa64_to_int (input_buf[ 9]) << 6
10445 | itoa64_to_int (input_buf[10]) << 12
10446 | itoa64_to_int (input_buf[11]) << 18;
10447 digest[3] = itoa64_to_int (input_buf[12]) << 0
10448 | itoa64_to_int (input_buf[13]) << 6
10449 | itoa64_to_int (input_buf[14]) << 12
10450 | itoa64_to_int (input_buf[15]) << 18;
10451
10452 digest[0] -= MD5M_A;
10453 digest[1] -= MD5M_B;
10454 digest[2] -= MD5M_C;
10455 digest[3] -= MD5M_D;
10456
10457 digest[0] &= 0x00ffffff;
10458 digest[1] &= 0x00ffffff;
10459 digest[2] &= 0x00ffffff;
10460 digest[3] &= 0x00ffffff;
10461
10462 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10463
10464 uint salt_len = input_len - 16 - 1;
10465
10466 char *salt_buf = input_buf + 16 + 1;
10467
10468 char *salt_buf_ptr = (char *) salt->salt_buf;
10469
10470 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10471
10472 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10473
10474 salt->salt_len = salt_len;
10475
10476 return (PARSER_OK);
10477 }
10478
10479 void transform_netntlmv1_key (const uint8_t *nthash, uint8_t *key)
10480 {
10481 key[0] = (nthash[0] >> 0);
10482 key[1] = (nthash[0] << 7) | (nthash[1] >> 1);
10483 key[2] = (nthash[1] << 6) | (nthash[2] >> 2);
10484 key[3] = (nthash[2] << 5) | (nthash[3] >> 3);
10485 key[4] = (nthash[3] << 4) | (nthash[4] >> 4);
10486 key[5] = (nthash[4] << 3) | (nthash[5] >> 5);
10487 key[6] = (nthash[5] << 2) | (nthash[6] >> 6);
10488 key[7] = (nthash[6] << 1);
10489
10490 key[0] |= 0x01;
10491 key[1] |= 0x01;
10492 key[2] |= 0x01;
10493 key[3] |= 0x01;
10494 key[4] |= 0x01;
10495 key[5] |= 0x01;
10496 key[6] |= 0x01;
10497 key[7] |= 0x01;
10498 }
10499
10500 int netntlmv1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10501 {
10502 if ((input_len < DISPLAY_LEN_MIN_5500) || (input_len > DISPLAY_LEN_MAX_5500)) return (PARSER_GLOBAL_LENGTH);
10503
10504 uint32_t *digest = (uint32_t *) hash_buf->digest;
10505
10506 salt_t *salt = hash_buf->salt;
10507
10508 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
10509
10510 /**
10511 * parse line
10512 */
10513
10514 char *user_pos = input_buf;
10515
10516 char *unused_pos = strchr (user_pos, ':');
10517
10518 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10519
10520 uint user_len = unused_pos - user_pos;
10521
10522 if (user_len > 60) return (PARSER_SALT_LENGTH);
10523
10524 unused_pos++;
10525
10526 char *domain_pos = strchr (unused_pos, ':');
10527
10528 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10529
10530 uint unused_len = domain_pos - unused_pos;
10531
10532 if (unused_len != 0) return (PARSER_SALT_LENGTH);
10533
10534 domain_pos++;
10535
10536 char *srvchall_pos = strchr (domain_pos, ':');
10537
10538 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10539
10540 uint domain_len = srvchall_pos - domain_pos;
10541
10542 if (domain_len > 45) return (PARSER_SALT_LENGTH);
10543
10544 srvchall_pos++;
10545
10546 char *hash_pos = strchr (srvchall_pos, ':');
10547
10548 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10549
10550 uint srvchall_len = hash_pos - srvchall_pos;
10551
10552 // if (srvchall_len != 0) return (PARSER_SALT_LENGTH);
10553
10554 hash_pos++;
10555
10556 char *clichall_pos = strchr (hash_pos, ':');
10557
10558 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10559
10560 uint hash_len = clichall_pos - hash_pos;
10561
10562 if (hash_len != 48) return (PARSER_HASH_LENGTH);
10563
10564 clichall_pos++;
10565
10566 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
10567
10568 if (clichall_len != 16) return (PARSER_SALT_LENGTH);
10569
10570 /**
10571 * store some data for later use
10572 */
10573
10574 netntlm->user_len = user_len * 2;
10575 netntlm->domain_len = domain_len * 2;
10576 netntlm->srvchall_len = srvchall_len / 2;
10577 netntlm->clichall_len = clichall_len / 2;
10578
10579 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
10580 char *chall_ptr = (char *) netntlm->chall_buf;
10581
10582 /**
10583 * handle username and domainname
10584 */
10585
10586 for (uint i = 0; i < user_len; i++)
10587 {
10588 *userdomain_ptr++ = user_pos[i];
10589 *userdomain_ptr++ = 0;
10590 }
10591
10592 for (uint i = 0; i < domain_len; i++)
10593 {
10594 *userdomain_ptr++ = domain_pos[i];
10595 *userdomain_ptr++ = 0;
10596 }
10597
10598 /**
10599 * handle server challenge encoding
10600 */
10601
10602 for (uint i = 0; i < srvchall_len; i += 2)
10603 {
10604 const char p0 = srvchall_pos[i + 0];
10605 const char p1 = srvchall_pos[i + 1];
10606
10607 *chall_ptr++ = hex_convert (p1) << 0
10608 | hex_convert (p0) << 4;
10609 }
10610
10611 /**
10612 * handle client challenge encoding
10613 */
10614
10615 for (uint i = 0; i < clichall_len; i += 2)
10616 {
10617 const char p0 = clichall_pos[i + 0];
10618 const char p1 = clichall_pos[i + 1];
10619
10620 *chall_ptr++ = hex_convert (p1) << 0
10621 | hex_convert (p0) << 4;
10622 }
10623
10624 /**
10625 * store data
10626 */
10627
10628 char *salt_buf_ptr = (char *) salt->salt_buf;
10629
10630 uint salt_len = parse_and_store_salt (salt_buf_ptr, clichall_pos, clichall_len);
10631
10632 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10633
10634 salt->salt_len = salt_len;
10635
10636 digest[0] = hex_to_uint (&hash_pos[ 0]);
10637 digest[1] = hex_to_uint (&hash_pos[ 8]);
10638 digest[2] = hex_to_uint (&hash_pos[16]);
10639 digest[3] = hex_to_uint (&hash_pos[24]);
10640
10641 digest[0] = byte_swap_32 (digest[0]);
10642 digest[1] = byte_swap_32 (digest[1]);
10643 digest[2] = byte_swap_32 (digest[2]);
10644 digest[3] = byte_swap_32 (digest[3]);
10645
10646 /* special case, last 8 byte do not need to be checked since they are brute-forced next */
10647
10648 uint digest_tmp[2];
10649
10650 digest_tmp[0] = hex_to_uint (&hash_pos[32]);
10651 digest_tmp[1] = hex_to_uint (&hash_pos[40]);
10652
10653 digest_tmp[0] = byte_swap_32 (digest_tmp[0]);
10654 digest_tmp[1] = byte_swap_32 (digest_tmp[1]);
10655
10656 /* special case 2: ESS */
10657
10658 if (srvchall_len == 48)
10659 {
10660 if ((netntlm->chall_buf[2] == 0) && (netntlm->chall_buf[3] == 0) && (netntlm->chall_buf[4] == 0) && (netntlm->chall_buf[5] == 0))
10661 {
10662 uint w[16];
10663
10664 w[ 0] = netntlm->chall_buf[6];
10665 w[ 1] = netntlm->chall_buf[7];
10666 w[ 2] = netntlm->chall_buf[0];
10667 w[ 3] = netntlm->chall_buf[1];
10668 w[ 4] = 0x80;
10669 w[ 5] = 0;
10670 w[ 6] = 0;
10671 w[ 7] = 0;
10672 w[ 8] = 0;
10673 w[ 9] = 0;
10674 w[10] = 0;
10675 w[11] = 0;
10676 w[12] = 0;
10677 w[13] = 0;
10678 w[14] = 16 * 8;
10679 w[15] = 0;
10680
10681 uint dgst[4];
10682
10683 dgst[0] = MAGIC_A;
10684 dgst[1] = MAGIC_B;
10685 dgst[2] = MAGIC_C;
10686 dgst[3] = MAGIC_D;
10687
10688 md5_64 (w, dgst);
10689
10690 salt->salt_buf[0] = dgst[0];
10691 salt->salt_buf[1] = dgst[1];
10692 }
10693 }
10694
10695 /* precompute netntlmv1 exploit start */
10696
10697 for (uint i = 0; i < 0x10000; i++)
10698 {
10699 uint key_md4[2] = { i, 0 };
10700 uint key_des[2] = { 0, 0 };
10701
10702 transform_netntlmv1_key ((uint8_t *) key_md4, (uint8_t *) key_des);
10703
10704 uint Kc[16];
10705 uint Kd[16];
10706
10707 _des_keysetup (key_des, Kc, Kd, c_skb);
10708
10709 uint data3[2] = { salt->salt_buf[0], salt->salt_buf[1] };
10710
10711 _des_encrypt (data3, Kc, Kd, c_SPtrans);
10712
10713 if (data3[0] != digest_tmp[0]) continue;
10714 if (data3[1] != digest_tmp[1]) continue;
10715
10716 salt->salt_buf[2] = i;
10717
10718 salt->salt_len = 24;
10719
10720 break;
10721 }
10722
10723 salt->salt_buf_pc[0] = digest_tmp[0];
10724 salt->salt_buf_pc[1] = digest_tmp[1];
10725
10726 /* precompute netntlmv1 exploit stop */
10727
10728 uint32_t tt;
10729
10730 IP (digest[0], digest[1], tt);
10731 IP (digest[2], digest[3], tt);
10732
10733 digest[0] = ROTATE_RIGHT (digest[0], 29);
10734 digest[1] = ROTATE_RIGHT (digest[1], 29);
10735 digest[2] = ROTATE_RIGHT (digest[2], 29);
10736 digest[3] = ROTATE_RIGHT (digest[3], 29);
10737
10738 IP (salt->salt_buf[0], salt->salt_buf[1], tt);
10739
10740 salt->salt_buf[0] = ROTATE_LEFT (salt->salt_buf[0], 3);
10741 salt->salt_buf[1] = ROTATE_LEFT (salt->salt_buf[1], 3);
10742
10743 return (PARSER_OK);
10744 }
10745
10746 int netntlmv2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10747 {
10748 if ((input_len < DISPLAY_LEN_MIN_5600) || (input_len > DISPLAY_LEN_MAX_5600)) return (PARSER_GLOBAL_LENGTH);
10749
10750 uint32_t *digest = (uint32_t *) hash_buf->digest;
10751
10752 salt_t *salt = hash_buf->salt;
10753
10754 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
10755
10756 /**
10757 * parse line
10758 */
10759
10760 char *user_pos = input_buf;
10761
10762 char *unused_pos = strchr (user_pos, ':');
10763
10764 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10765
10766 uint user_len = unused_pos - user_pos;
10767
10768 if (user_len > 60) return (PARSER_SALT_LENGTH);
10769
10770 unused_pos++;
10771
10772 char *domain_pos = strchr (unused_pos, ':');
10773
10774 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10775
10776 uint unused_len = domain_pos - unused_pos;
10777
10778 if (unused_len != 0) return (PARSER_SALT_LENGTH);
10779
10780 domain_pos++;
10781
10782 char *srvchall_pos = strchr (domain_pos, ':');
10783
10784 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10785
10786 uint domain_len = srvchall_pos - domain_pos;
10787
10788 if (domain_len > 45) return (PARSER_SALT_LENGTH);
10789
10790 srvchall_pos++;
10791
10792 char *hash_pos = strchr (srvchall_pos, ':');
10793
10794 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10795
10796 uint srvchall_len = hash_pos - srvchall_pos;
10797
10798 if (srvchall_len != 16) return (PARSER_SALT_LENGTH);
10799
10800 hash_pos++;
10801
10802 char *clichall_pos = strchr (hash_pos, ':');
10803
10804 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10805
10806 uint hash_len = clichall_pos - hash_pos;
10807
10808 if (hash_len != 32) return (PARSER_HASH_LENGTH);
10809
10810 clichall_pos++;
10811
10812 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
10813
10814 if (clichall_len > 1024) return (PARSER_SALT_LENGTH);
10815
10816 if (clichall_len % 2) return (PARSER_SALT_VALUE);
10817
10818 /**
10819 * store some data for later use
10820 */
10821
10822 netntlm->user_len = user_len * 2;
10823 netntlm->domain_len = domain_len * 2;
10824 netntlm->srvchall_len = srvchall_len / 2;
10825 netntlm->clichall_len = clichall_len / 2;
10826
10827 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
10828 char *chall_ptr = (char *) netntlm->chall_buf;
10829
10830 /**
10831 * handle username and domainname
10832 */
10833
10834 for (uint i = 0; i < user_len; i++)
10835 {
10836 *userdomain_ptr++ = toupper (user_pos[i]);
10837 *userdomain_ptr++ = 0;
10838 }
10839
10840 for (uint i = 0; i < domain_len; i++)
10841 {
10842 *userdomain_ptr++ = domain_pos[i];
10843 *userdomain_ptr++ = 0;
10844 }
10845
10846 *userdomain_ptr++ = 0x80;
10847
10848 /**
10849 * handle server challenge encoding
10850 */
10851
10852 for (uint i = 0; i < srvchall_len; i += 2)
10853 {
10854 const char p0 = srvchall_pos[i + 0];
10855 const char p1 = srvchall_pos[i + 1];
10856
10857 *chall_ptr++ = hex_convert (p1) << 0
10858 | hex_convert (p0) << 4;
10859 }
10860
10861 /**
10862 * handle client challenge encoding
10863 */
10864
10865 for (uint i = 0; i < clichall_len; i += 2)
10866 {
10867 const char p0 = clichall_pos[i + 0];
10868 const char p1 = clichall_pos[i + 1];
10869
10870 *chall_ptr++ = hex_convert (p1) << 0
10871 | hex_convert (p0) << 4;
10872 }
10873
10874 *chall_ptr++ = 0x80;
10875
10876 /**
10877 * handle hash itself
10878 */
10879
10880 digest[0] = hex_to_uint (&hash_pos[ 0]);
10881 digest[1] = hex_to_uint (&hash_pos[ 8]);
10882 digest[2] = hex_to_uint (&hash_pos[16]);
10883 digest[3] = hex_to_uint (&hash_pos[24]);
10884
10885 digest[0] = byte_swap_32 (digest[0]);
10886 digest[1] = byte_swap_32 (digest[1]);
10887 digest[2] = byte_swap_32 (digest[2]);
10888 digest[3] = byte_swap_32 (digest[3]);
10889
10890 /**
10891 * reuse challange data as salt_buf, its the buffer that is most likely unique
10892 */
10893
10894 salt->salt_buf[0] = 0;
10895 salt->salt_buf[1] = 0;
10896 salt->salt_buf[2] = 0;
10897 salt->salt_buf[3] = 0;
10898 salt->salt_buf[4] = 0;
10899 salt->salt_buf[5] = 0;
10900 salt->salt_buf[6] = 0;
10901 salt->salt_buf[7] = 0;
10902
10903 uint *uptr;
10904
10905 uptr = (uint *) netntlm->userdomain_buf;
10906
10907 for (uint i = 0; i < 16; i += 16)
10908 {
10909 md5_64 (uptr, salt->salt_buf);
10910 }
10911
10912 uptr = (uint *) netntlm->chall_buf;
10913
10914 for (uint i = 0; i < 256; i += 16)
10915 {
10916 md5_64 (uptr, salt->salt_buf);
10917 }
10918
10919 salt->salt_len = 16;
10920
10921 return (PARSER_OK);
10922 }
10923
10924 int joomla_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10925 {
10926 if (data.opts_type & OPTS_TYPE_ST_HEX)
10927 {
10928 if ((input_len < DISPLAY_LEN_MIN_11H) || (input_len > DISPLAY_LEN_MAX_11H)) return (PARSER_GLOBAL_LENGTH);
10929 }
10930 else
10931 {
10932 if ((input_len < DISPLAY_LEN_MIN_11) || (input_len > DISPLAY_LEN_MAX_11)) return (PARSER_GLOBAL_LENGTH);
10933 }
10934
10935 uint32_t *digest = (uint32_t *) hash_buf->digest;
10936
10937 salt_t *salt = hash_buf->salt;
10938
10939 digest[0] = hex_to_uint (&input_buf[ 0]);
10940 digest[1] = hex_to_uint (&input_buf[ 8]);
10941 digest[2] = hex_to_uint (&input_buf[16]);
10942 digest[3] = hex_to_uint (&input_buf[24]);
10943
10944 digest[0] = byte_swap_32 (digest[0]);
10945 digest[1] = byte_swap_32 (digest[1]);
10946 digest[2] = byte_swap_32 (digest[2]);
10947 digest[3] = byte_swap_32 (digest[3]);
10948
10949 digest[0] -= MD5M_A;
10950 digest[1] -= MD5M_B;
10951 digest[2] -= MD5M_C;
10952 digest[3] -= MD5M_D;
10953
10954 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10955
10956 uint salt_len = input_len - 32 - 1;
10957
10958 char *salt_buf = input_buf + 32 + 1;
10959
10960 char *salt_buf_ptr = (char *) salt->salt_buf;
10961
10962 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10963
10964 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10965
10966 salt->salt_len = salt_len;
10967
10968 return (PARSER_OK);
10969 }
10970
10971 int postgresql_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10972 {
10973 if (data.opts_type & OPTS_TYPE_ST_HEX)
10974 {
10975 if ((input_len < DISPLAY_LEN_MIN_12H) || (input_len > DISPLAY_LEN_MAX_12H)) return (PARSER_GLOBAL_LENGTH);
10976 }
10977 else
10978 {
10979 if ((input_len < DISPLAY_LEN_MIN_12) || (input_len > DISPLAY_LEN_MAX_12)) return (PARSER_GLOBAL_LENGTH);
10980 }
10981
10982 uint32_t *digest = (uint32_t *) hash_buf->digest;
10983
10984 salt_t *salt = hash_buf->salt;
10985
10986 digest[0] = hex_to_uint (&input_buf[ 0]);
10987 digest[1] = hex_to_uint (&input_buf[ 8]);
10988 digest[2] = hex_to_uint (&input_buf[16]);
10989 digest[3] = hex_to_uint (&input_buf[24]);
10990
10991 digest[0] = byte_swap_32 (digest[0]);
10992 digest[1] = byte_swap_32 (digest[1]);
10993 digest[2] = byte_swap_32 (digest[2]);
10994 digest[3] = byte_swap_32 (digest[3]);
10995
10996 digest[0] -= MD5M_A;
10997 digest[1] -= MD5M_B;
10998 digest[2] -= MD5M_C;
10999 digest[3] -= MD5M_D;
11000
11001 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11002
11003 uint salt_len = input_len - 32 - 1;
11004
11005 char *salt_buf = input_buf + 32 + 1;
11006
11007 char *salt_buf_ptr = (char *) salt->salt_buf;
11008
11009 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11010
11011 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11012
11013 salt->salt_len = salt_len;
11014
11015 return (PARSER_OK);
11016 }
11017
11018 int md5md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11019 {
11020 if ((input_len < DISPLAY_LEN_MIN_2600) || (input_len > DISPLAY_LEN_MAX_2600)) return (PARSER_GLOBAL_LENGTH);
11021
11022 uint32_t *digest = (uint32_t *) hash_buf->digest;
11023
11024 salt_t *salt = hash_buf->salt;
11025
11026 digest[0] = hex_to_uint (&input_buf[ 0]);
11027 digest[1] = hex_to_uint (&input_buf[ 8]);
11028 digest[2] = hex_to_uint (&input_buf[16]);
11029 digest[3] = hex_to_uint (&input_buf[24]);
11030
11031 digest[0] = byte_swap_32 (digest[0]);
11032 digest[1] = byte_swap_32 (digest[1]);
11033 digest[2] = byte_swap_32 (digest[2]);
11034 digest[3] = byte_swap_32 (digest[3]);
11035
11036 digest[0] -= MD5M_A;
11037 digest[1] -= MD5M_B;
11038 digest[2] -= MD5M_C;
11039 digest[3] -= MD5M_D;
11040
11041 /**
11042 * This is a virtual salt. While the algorithm is basically not salted
11043 * we can exploit the salt buffer to set the 0x80 and the w[14] value.
11044 * This way we can save a special md5md5 kernel and reuse the one from vbull.
11045 */
11046
11047 char *salt_buf_ptr = (char *) salt->salt_buf;
11048
11049 uint salt_len = parse_and_store_salt (salt_buf_ptr, (char *) "", 0);
11050
11051 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11052
11053 salt->salt_len = salt_len;
11054
11055 return (PARSER_OK);
11056 }
11057
11058 int vb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11059 {
11060 if (data.opts_type & OPTS_TYPE_ST_HEX)
11061 {
11062 if ((input_len < DISPLAY_LEN_MIN_2611H) || (input_len > DISPLAY_LEN_MAX_2611H)) return (PARSER_GLOBAL_LENGTH);
11063 }
11064 else
11065 {
11066 if ((input_len < DISPLAY_LEN_MIN_2611) || (input_len > DISPLAY_LEN_MAX_2611)) return (PARSER_GLOBAL_LENGTH);
11067 }
11068
11069 uint32_t *digest = (uint32_t *) hash_buf->digest;
11070
11071 salt_t *salt = hash_buf->salt;
11072
11073 digest[0] = hex_to_uint (&input_buf[ 0]);
11074 digest[1] = hex_to_uint (&input_buf[ 8]);
11075 digest[2] = hex_to_uint (&input_buf[16]);
11076 digest[3] = hex_to_uint (&input_buf[24]);
11077
11078 digest[0] = byte_swap_32 (digest[0]);
11079 digest[1] = byte_swap_32 (digest[1]);
11080 digest[2] = byte_swap_32 (digest[2]);
11081 digest[3] = byte_swap_32 (digest[3]);
11082
11083 digest[0] -= MD5M_A;
11084 digest[1] -= MD5M_B;
11085 digest[2] -= MD5M_C;
11086 digest[3] -= MD5M_D;
11087
11088 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11089
11090 uint salt_len = input_len - 32 - 1;
11091
11092 char *salt_buf = input_buf + 32 + 1;
11093
11094 char *salt_buf_ptr = (char *) salt->salt_buf;
11095
11096 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11097
11098 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11099
11100 salt->salt_len = salt_len;
11101
11102 return (PARSER_OK);
11103 }
11104
11105 int vb30_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11106 {
11107 if (data.opts_type & OPTS_TYPE_ST_HEX)
11108 {
11109 if ((input_len < DISPLAY_LEN_MIN_2711H) || (input_len > DISPLAY_LEN_MAX_2711H)) return (PARSER_GLOBAL_LENGTH);
11110 }
11111 else
11112 {
11113 if ((input_len < DISPLAY_LEN_MIN_2711) || (input_len > DISPLAY_LEN_MAX_2711)) return (PARSER_GLOBAL_LENGTH);
11114 }
11115
11116 uint32_t *digest = (uint32_t *) hash_buf->digest;
11117
11118 salt_t *salt = hash_buf->salt;
11119
11120 digest[0] = hex_to_uint (&input_buf[ 0]);
11121 digest[1] = hex_to_uint (&input_buf[ 8]);
11122 digest[2] = hex_to_uint (&input_buf[16]);
11123 digest[3] = hex_to_uint (&input_buf[24]);
11124
11125 digest[0] = byte_swap_32 (digest[0]);
11126 digest[1] = byte_swap_32 (digest[1]);
11127 digest[2] = byte_swap_32 (digest[2]);
11128 digest[3] = byte_swap_32 (digest[3]);
11129
11130 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11131
11132 uint salt_len = input_len - 32 - 1;
11133
11134 char *salt_buf = input_buf + 32 + 1;
11135
11136 char *salt_buf_ptr = (char *) salt->salt_buf;
11137
11138 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11139
11140 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11141
11142 salt->salt_len = salt_len;
11143
11144 return (PARSER_OK);
11145 }
11146
11147 int dcc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11148 {
11149 if (data.opts_type & OPTS_TYPE_ST_HEX)
11150 {
11151 if ((input_len < DISPLAY_LEN_MIN_1100H) || (input_len > DISPLAY_LEN_MAX_1100H)) return (PARSER_GLOBAL_LENGTH);
11152 }
11153 else
11154 {
11155 if ((input_len < DISPLAY_LEN_MIN_1100) || (input_len > DISPLAY_LEN_MAX_1100)) return (PARSER_GLOBAL_LENGTH);
11156 }
11157
11158 uint32_t *digest = (uint32_t *) hash_buf->digest;
11159
11160 salt_t *salt = hash_buf->salt;
11161
11162 digest[0] = hex_to_uint (&input_buf[ 0]);
11163 digest[1] = hex_to_uint (&input_buf[ 8]);
11164 digest[2] = hex_to_uint (&input_buf[16]);
11165 digest[3] = hex_to_uint (&input_buf[24]);
11166
11167 digest[0] = byte_swap_32 (digest[0]);
11168 digest[1] = byte_swap_32 (digest[1]);
11169 digest[2] = byte_swap_32 (digest[2]);
11170 digest[3] = byte_swap_32 (digest[3]);
11171
11172 digest[0] -= MD4M_A;
11173 digest[1] -= MD4M_B;
11174 digest[2] -= MD4M_C;
11175 digest[3] -= MD4M_D;
11176
11177 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11178
11179 uint salt_len = input_len - 32 - 1;
11180
11181 char *salt_buf = input_buf + 32 + 1;
11182
11183 char *salt_buf_ptr = (char *) salt->salt_buf;
11184
11185 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11186
11187 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11188
11189 salt->salt_len = salt_len;
11190
11191 return (PARSER_OK);
11192 }
11193
11194 int ipb2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11195 {
11196 if (data.opts_type & OPTS_TYPE_ST_HEX)
11197 {
11198 if ((input_len < DISPLAY_LEN_MIN_2811H) || (input_len > DISPLAY_LEN_MAX_2811H)) return (PARSER_GLOBAL_LENGTH);
11199 }
11200 else
11201 {
11202 if ((input_len < DISPLAY_LEN_MIN_2811) || (input_len > DISPLAY_LEN_MAX_2811)) return (PARSER_GLOBAL_LENGTH);
11203 }
11204
11205 uint32_t *digest = (uint32_t *) hash_buf->digest;
11206
11207 salt_t *salt = hash_buf->salt;
11208
11209 digest[0] = hex_to_uint (&input_buf[ 0]);
11210 digest[1] = hex_to_uint (&input_buf[ 8]);
11211 digest[2] = hex_to_uint (&input_buf[16]);
11212 digest[3] = hex_to_uint (&input_buf[24]);
11213
11214 digest[0] = byte_swap_32 (digest[0]);
11215 digest[1] = byte_swap_32 (digest[1]);
11216 digest[2] = byte_swap_32 (digest[2]);
11217 digest[3] = byte_swap_32 (digest[3]);
11218
11219 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11220
11221 uint salt_len = input_len - 32 - 1;
11222
11223 char *salt_buf = input_buf + 32 + 1;
11224
11225 uint salt_pc_block[16];
11226
11227 memset (salt_pc_block, 0, sizeof (salt_pc_block));
11228
11229 char *salt_pc_block_ptr = (char *) salt_pc_block;
11230
11231 salt_len = parse_and_store_salt (salt_pc_block_ptr, salt_buf, salt_len);
11232
11233 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11234
11235 salt_pc_block_ptr[salt_len] = (unsigned char) 0x80;
11236
11237 salt_pc_block[14] = salt_len * 8;
11238
11239 uint salt_pc_digest[4];
11240
11241 salt_pc_digest[0] = MAGIC_A;
11242 salt_pc_digest[1] = MAGIC_B;
11243 salt_pc_digest[2] = MAGIC_C;
11244 salt_pc_digest[3] = MAGIC_D;
11245
11246 md5_64 (salt_pc_block, salt_pc_digest);
11247
11248 salt_pc_digest[0] = byte_swap_32 (salt_pc_digest[0]);
11249 salt_pc_digest[1] = byte_swap_32 (salt_pc_digest[1]);
11250 salt_pc_digest[2] = byte_swap_32 (salt_pc_digest[2]);
11251 salt_pc_digest[3] = byte_swap_32 (salt_pc_digest[3]);
11252
11253 char *salt_buf_ptr = (char *) salt->salt_buf;
11254
11255 memcpy (salt_buf_ptr, salt_buf, salt_len);
11256
11257 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
11258
11259 bin_to_hex_lower (salt_pc_digest[0], salt_buf_pc_ptr + 0);
11260 bin_to_hex_lower (salt_pc_digest[1], salt_buf_pc_ptr + 8);
11261 bin_to_hex_lower (salt_pc_digest[2], salt_buf_pc_ptr + 16);
11262 bin_to_hex_lower (salt_pc_digest[3], salt_buf_pc_ptr + 24);
11263
11264 salt->salt_len = 32; // changed, was salt_len before -- was a bug? 32 should be correct
11265
11266 return (PARSER_OK);
11267 }
11268
11269 int sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11270 {
11271 if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH);
11272
11273 uint32_t *digest = (uint32_t *) hash_buf->digest;
11274
11275 digest[0] = hex_to_uint (&input_buf[ 0]);
11276 digest[1] = hex_to_uint (&input_buf[ 8]);
11277 digest[2] = hex_to_uint (&input_buf[16]);
11278 digest[3] = hex_to_uint (&input_buf[24]);
11279 digest[4] = hex_to_uint (&input_buf[32]);
11280
11281 digest[0] -= SHA1M_A;
11282 digest[1] -= SHA1M_B;
11283 digest[2] -= SHA1M_C;
11284 digest[3] -= SHA1M_D;
11285 digest[4] -= SHA1M_E;
11286
11287 return (PARSER_OK);
11288 }
11289
11290 int sha1linkedin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11291 {
11292 if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH);
11293
11294 uint32_t *digest = (uint32_t *) hash_buf->digest;
11295
11296 digest[0] = hex_to_uint (&input_buf[ 0]);
11297 digest[1] = hex_to_uint (&input_buf[ 8]);
11298 digest[2] = hex_to_uint (&input_buf[16]);
11299 digest[3] = hex_to_uint (&input_buf[24]);
11300 digest[4] = hex_to_uint (&input_buf[32]);
11301
11302 return (PARSER_OK);
11303 }
11304
11305 int sha1s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11306 {
11307 if (data.opts_type & OPTS_TYPE_ST_HEX)
11308 {
11309 if ((input_len < DISPLAY_LEN_MIN_110H) || (input_len > DISPLAY_LEN_MAX_110H)) return (PARSER_GLOBAL_LENGTH);
11310 }
11311 else
11312 {
11313 if ((input_len < DISPLAY_LEN_MIN_110) || (input_len > DISPLAY_LEN_MAX_110)) return (PARSER_GLOBAL_LENGTH);
11314 }
11315
11316 uint32_t *digest = (uint32_t *) hash_buf->digest;
11317
11318 salt_t *salt = hash_buf->salt;
11319
11320 digest[0] = hex_to_uint (&input_buf[ 0]);
11321 digest[1] = hex_to_uint (&input_buf[ 8]);
11322 digest[2] = hex_to_uint (&input_buf[16]);
11323 digest[3] = hex_to_uint (&input_buf[24]);
11324 digest[4] = hex_to_uint (&input_buf[32]);
11325
11326 digest[0] -= SHA1M_A;
11327 digest[1] -= SHA1M_B;
11328 digest[2] -= SHA1M_C;
11329 digest[3] -= SHA1M_D;
11330 digest[4] -= SHA1M_E;
11331
11332 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11333
11334 uint salt_len = input_len - 40 - 1;
11335
11336 char *salt_buf = input_buf + 40 + 1;
11337
11338 char *salt_buf_ptr = (char *) salt->salt_buf;
11339
11340 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11341
11342 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11343
11344 salt->salt_len = salt_len;
11345
11346 return (PARSER_OK);
11347 }
11348
11349 int sha1b64_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11350 {
11351 if ((input_len < DISPLAY_LEN_MIN_101) || (input_len > DISPLAY_LEN_MAX_101)) return (PARSER_GLOBAL_LENGTH);
11352
11353 if (memcmp (SIGNATURE_SHA1B64, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
11354
11355 uint32_t *digest = (uint32_t *) hash_buf->digest;
11356
11357 char tmp_buf[100];
11358
11359 memset (tmp_buf, 0, sizeof (tmp_buf));
11360
11361 base64_decode (base64_to_int, input_buf + 5, input_len - 5, tmp_buf);
11362
11363 memcpy (digest, tmp_buf, 20);
11364
11365 digest[0] = byte_swap_32 (digest[0]);
11366 digest[1] = byte_swap_32 (digest[1]);
11367 digest[2] = byte_swap_32 (digest[2]);
11368 digest[3] = byte_swap_32 (digest[3]);
11369 digest[4] = byte_swap_32 (digest[4]);
11370
11371 digest[0] -= SHA1M_A;
11372 digest[1] -= SHA1M_B;
11373 digest[2] -= SHA1M_C;
11374 digest[3] -= SHA1M_D;
11375 digest[4] -= SHA1M_E;
11376
11377 return (PARSER_OK);
11378 }
11379
11380 int sha1b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11381 {
11382 if ((input_len < DISPLAY_LEN_MIN_111) || (input_len > DISPLAY_LEN_MAX_111)) return (PARSER_GLOBAL_LENGTH);
11383
11384 if (memcmp (SIGNATURE_SSHA1B64_lower, input_buf, 6) && memcmp (SIGNATURE_SSHA1B64_upper, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11385
11386 uint32_t *digest = (uint32_t *) hash_buf->digest;
11387
11388 salt_t *salt = hash_buf->salt;
11389
11390 char tmp_buf[100];
11391
11392 memset (tmp_buf, 0, sizeof (tmp_buf));
11393
11394 int tmp_len = base64_decode (base64_to_int, input_buf + 6, input_len - 6, tmp_buf);
11395
11396 memcpy (digest, tmp_buf, 20);
11397
11398 salt->salt_len = tmp_len - 20;
11399
11400 memcpy (salt->salt_buf, tmp_buf + 20, salt->salt_len);
11401
11402 if (data.opts_type & OPTS_TYPE_ST_ADD80)
11403 {
11404 char *ptr = (char *) salt->salt_buf;
11405
11406 ptr[salt->salt_len] = 0x80;
11407 }
11408
11409 digest[0] = byte_swap_32 (digest[0]);
11410 digest[1] = byte_swap_32 (digest[1]);
11411 digest[2] = byte_swap_32 (digest[2]);
11412 digest[3] = byte_swap_32 (digest[3]);
11413 digest[4] = byte_swap_32 (digest[4]);
11414
11415 digest[0] -= SHA1M_A;
11416 digest[1] -= SHA1M_B;
11417 digest[2] -= SHA1M_C;
11418 digest[3] -= SHA1M_D;
11419 digest[4] -= SHA1M_E;
11420
11421 return (PARSER_OK);
11422 }
11423
11424 int mssql2000_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11425 {
11426 if ((input_len < DISPLAY_LEN_MIN_131) || (input_len > DISPLAY_LEN_MAX_131)) return (PARSER_GLOBAL_LENGTH);
11427
11428 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11429
11430 uint32_t *digest = (uint32_t *) hash_buf->digest;
11431
11432 salt_t *salt = hash_buf->salt;
11433
11434 char *salt_buf = input_buf + 6;
11435
11436 uint salt_len = 8;
11437
11438 char *salt_buf_ptr = (char *) salt->salt_buf;
11439
11440 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11441
11442 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11443
11444 salt->salt_len = salt_len;
11445
11446 char *hash_pos = input_buf + 6 + 8 + 40;
11447
11448 digest[0] = hex_to_uint (&hash_pos[ 0]);
11449 digest[1] = hex_to_uint (&hash_pos[ 8]);
11450 digest[2] = hex_to_uint (&hash_pos[16]);
11451 digest[3] = hex_to_uint (&hash_pos[24]);
11452 digest[4] = hex_to_uint (&hash_pos[32]);
11453
11454 digest[0] -= SHA1M_A;
11455 digest[1] -= SHA1M_B;
11456 digest[2] -= SHA1M_C;
11457 digest[3] -= SHA1M_D;
11458 digest[4] -= SHA1M_E;
11459
11460 return (PARSER_OK);
11461 }
11462
11463 int mssql2005_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11464 {
11465 if ((input_len < DISPLAY_LEN_MIN_132) || (input_len > DISPLAY_LEN_MAX_132)) return (PARSER_GLOBAL_LENGTH);
11466
11467 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11468
11469 uint32_t *digest = (uint32_t *) hash_buf->digest;
11470
11471 salt_t *salt = hash_buf->salt;
11472
11473 char *salt_buf = input_buf + 6;
11474
11475 uint salt_len = 8;
11476
11477 char *salt_buf_ptr = (char *) salt->salt_buf;
11478
11479 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11480
11481 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11482
11483 salt->salt_len = salt_len;
11484
11485 char *hash_pos = input_buf + 6 + 8;
11486
11487 digest[0] = hex_to_uint (&hash_pos[ 0]);
11488 digest[1] = hex_to_uint (&hash_pos[ 8]);
11489 digest[2] = hex_to_uint (&hash_pos[16]);
11490 digest[3] = hex_to_uint (&hash_pos[24]);
11491 digest[4] = hex_to_uint (&hash_pos[32]);
11492
11493 digest[0] -= SHA1M_A;
11494 digest[1] -= SHA1M_B;
11495 digest[2] -= SHA1M_C;
11496 digest[3] -= SHA1M_D;
11497 digest[4] -= SHA1M_E;
11498
11499 return (PARSER_OK);
11500 }
11501
11502 int mssql2012_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11503 {
11504 if ((input_len < DISPLAY_LEN_MIN_1731) || (input_len > DISPLAY_LEN_MAX_1731)) return (PARSER_GLOBAL_LENGTH);
11505
11506 if (memcmp (SIGNATURE_MSSQL2012, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11507
11508 uint64_t *digest = (uint64_t *) hash_buf->digest;
11509
11510 salt_t *salt = hash_buf->salt;
11511
11512 char *salt_buf = input_buf + 6;
11513
11514 uint salt_len = 8;
11515
11516 char *salt_buf_ptr = (char *) salt->salt_buf;
11517
11518 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11519
11520 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11521
11522 salt->salt_len = salt_len;
11523
11524 char *hash_pos = input_buf + 6 + 8;
11525
11526 digest[0] = hex_to_uint64_t (&hash_pos[ 0]);
11527 digest[1] = hex_to_uint64_t (&hash_pos[ 16]);
11528 digest[2] = hex_to_uint64_t (&hash_pos[ 32]);
11529 digest[3] = hex_to_uint64_t (&hash_pos[ 48]);
11530 digest[4] = hex_to_uint64_t (&hash_pos[ 64]);
11531 digest[5] = hex_to_uint64_t (&hash_pos[ 80]);
11532 digest[6] = hex_to_uint64_t (&hash_pos[ 96]);
11533 digest[7] = hex_to_uint64_t (&hash_pos[112]);
11534
11535 digest[0] -= SHA512M_A;
11536 digest[1] -= SHA512M_B;
11537 digest[2] -= SHA512M_C;
11538 digest[3] -= SHA512M_D;
11539 digest[4] -= SHA512M_E;
11540 digest[5] -= SHA512M_F;
11541 digest[6] -= SHA512M_G;
11542 digest[7] -= SHA512M_H;
11543
11544 return (PARSER_OK);
11545 }
11546
11547 int oracleh_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11548 {
11549 if (data.opts_type & OPTS_TYPE_ST_HEX)
11550 {
11551 if ((input_len < DISPLAY_LEN_MIN_3100H) || (input_len > DISPLAY_LEN_MAX_3100H)) return (PARSER_GLOBAL_LENGTH);
11552 }
11553 else
11554 {
11555 if ((input_len < DISPLAY_LEN_MIN_3100) || (input_len > DISPLAY_LEN_MAX_3100)) return (PARSER_GLOBAL_LENGTH);
11556 }
11557
11558 uint32_t *digest = (uint32_t *) hash_buf->digest;
11559
11560 salt_t *salt = hash_buf->salt;
11561
11562 digest[0] = hex_to_uint (&input_buf[ 0]);
11563 digest[1] = hex_to_uint (&input_buf[ 8]);
11564 digest[2] = 0;
11565 digest[3] = 0;
11566
11567 digest[0] = byte_swap_32 (digest[0]);
11568 digest[1] = byte_swap_32 (digest[1]);
11569
11570 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11571
11572 uint salt_len = input_len - 16 - 1;
11573
11574 char *salt_buf = input_buf + 16 + 1;
11575
11576 char *salt_buf_ptr = (char *) salt->salt_buf;
11577
11578 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11579
11580 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11581
11582 salt->salt_len = salt_len;
11583
11584 return (PARSER_OK);
11585 }
11586
11587 int oracles_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11588 {
11589 if ((input_len < DISPLAY_LEN_MIN_112) || (input_len > DISPLAY_LEN_MAX_112)) return (PARSER_GLOBAL_LENGTH);
11590
11591 uint32_t *digest = (uint32_t *) hash_buf->digest;
11592
11593 salt_t *salt = hash_buf->salt;
11594
11595 digest[0] = hex_to_uint (&input_buf[ 0]);
11596 digest[1] = hex_to_uint (&input_buf[ 8]);
11597 digest[2] = hex_to_uint (&input_buf[16]);
11598 digest[3] = hex_to_uint (&input_buf[24]);
11599 digest[4] = hex_to_uint (&input_buf[32]);
11600
11601 digest[0] -= SHA1M_A;
11602 digest[1] -= SHA1M_B;
11603 digest[2] -= SHA1M_C;
11604 digest[3] -= SHA1M_D;
11605 digest[4] -= SHA1M_E;
11606
11607 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11608
11609 uint salt_len = input_len - 40 - 1;
11610
11611 char *salt_buf = input_buf + 40 + 1;
11612
11613 char *salt_buf_ptr = (char *) salt->salt_buf;
11614
11615 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11616
11617 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11618
11619 salt->salt_len = salt_len;
11620
11621 return (PARSER_OK);
11622 }
11623
11624 int oraclet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11625 {
11626 if ((input_len < DISPLAY_LEN_MIN_12300) || (input_len > DISPLAY_LEN_MAX_12300)) return (PARSER_GLOBAL_LENGTH);
11627
11628 uint32_t *digest = (uint32_t *) hash_buf->digest;
11629
11630 salt_t *salt = hash_buf->salt;
11631
11632 char *hash_pos = input_buf;
11633
11634 digest[ 0] = hex_to_uint (&hash_pos[ 0]);
11635 digest[ 1] = hex_to_uint (&hash_pos[ 8]);
11636 digest[ 2] = hex_to_uint (&hash_pos[ 16]);
11637 digest[ 3] = hex_to_uint (&hash_pos[ 24]);
11638 digest[ 4] = hex_to_uint (&hash_pos[ 32]);
11639 digest[ 5] = hex_to_uint (&hash_pos[ 40]);
11640 digest[ 6] = hex_to_uint (&hash_pos[ 48]);
11641 digest[ 7] = hex_to_uint (&hash_pos[ 56]);
11642 digest[ 8] = hex_to_uint (&hash_pos[ 64]);
11643 digest[ 9] = hex_to_uint (&hash_pos[ 72]);
11644 digest[10] = hex_to_uint (&hash_pos[ 80]);
11645 digest[11] = hex_to_uint (&hash_pos[ 88]);
11646 digest[12] = hex_to_uint (&hash_pos[ 96]);
11647 digest[13] = hex_to_uint (&hash_pos[104]);
11648 digest[14] = hex_to_uint (&hash_pos[112]);
11649 digest[15] = hex_to_uint (&hash_pos[120]);
11650
11651 char *salt_pos = input_buf + 128;
11652
11653 salt->salt_buf[0] = hex_to_uint (&salt_pos[ 0]);
11654 salt->salt_buf[1] = hex_to_uint (&salt_pos[ 8]);
11655 salt->salt_buf[2] = hex_to_uint (&salt_pos[16]);
11656 salt->salt_buf[3] = hex_to_uint (&salt_pos[24]);
11657
11658 salt->salt_iter = ROUNDS_ORACLET - 1;
11659 salt->salt_len = 16;
11660
11661 return (PARSER_OK);
11662 }
11663
11664 int sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11665 {
11666 if ((input_len < DISPLAY_LEN_MIN_1400) || (input_len > DISPLAY_LEN_MAX_1400)) return (PARSER_GLOBAL_LENGTH);
11667
11668 uint32_t *digest = (uint32_t *) hash_buf->digest;
11669
11670 digest[0] = hex_to_uint (&input_buf[ 0]);
11671 digest[1] = hex_to_uint (&input_buf[ 8]);
11672 digest[2] = hex_to_uint (&input_buf[16]);
11673 digest[3] = hex_to_uint (&input_buf[24]);
11674 digest[4] = hex_to_uint (&input_buf[32]);
11675 digest[5] = hex_to_uint (&input_buf[40]);
11676 digest[6] = hex_to_uint (&input_buf[48]);
11677 digest[7] = hex_to_uint (&input_buf[56]);
11678
11679 digest[0] -= SHA256M_A;
11680 digest[1] -= SHA256M_B;
11681 digest[2] -= SHA256M_C;
11682 digest[3] -= SHA256M_D;
11683 digest[4] -= SHA256M_E;
11684 digest[5] -= SHA256M_F;
11685 digest[6] -= SHA256M_G;
11686 digest[7] -= SHA256M_H;
11687
11688 return (PARSER_OK);
11689 }
11690
11691 int sha256s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11692 {
11693 if (data.opts_type & OPTS_TYPE_ST_HEX)
11694 {
11695 if ((input_len < DISPLAY_LEN_MIN_1410H) || (input_len > DISPLAY_LEN_MAX_1410H)) return (PARSER_GLOBAL_LENGTH);
11696 }
11697 else
11698 {
11699 if ((input_len < DISPLAY_LEN_MIN_1410) || (input_len > DISPLAY_LEN_MAX_1410)) return (PARSER_GLOBAL_LENGTH);
11700 }
11701
11702 uint32_t *digest = (uint32_t *) hash_buf->digest;
11703
11704 salt_t *salt = hash_buf->salt;
11705
11706 digest[0] = hex_to_uint (&input_buf[ 0]);
11707 digest[1] = hex_to_uint (&input_buf[ 8]);
11708 digest[2] = hex_to_uint (&input_buf[16]);
11709 digest[3] = hex_to_uint (&input_buf[24]);
11710 digest[4] = hex_to_uint (&input_buf[32]);
11711 digest[5] = hex_to_uint (&input_buf[40]);
11712 digest[6] = hex_to_uint (&input_buf[48]);
11713 digest[7] = hex_to_uint (&input_buf[56]);
11714
11715 digest[0] -= SHA256M_A;
11716 digest[1] -= SHA256M_B;
11717 digest[2] -= SHA256M_C;
11718 digest[3] -= SHA256M_D;
11719 digest[4] -= SHA256M_E;
11720 digest[5] -= SHA256M_F;
11721 digest[6] -= SHA256M_G;
11722 digest[7] -= SHA256M_H;
11723
11724 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11725
11726 uint salt_len = input_len - 64 - 1;
11727
11728 char *salt_buf = input_buf + 64 + 1;
11729
11730 char *salt_buf_ptr = (char *) salt->salt_buf;
11731
11732 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11733
11734 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11735
11736 salt->salt_len = salt_len;
11737
11738 return (PARSER_OK);
11739 }
11740
11741 int sha384_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11742 {
11743 if ((input_len < DISPLAY_LEN_MIN_10800) || (input_len > DISPLAY_LEN_MAX_10800)) return (PARSER_GLOBAL_LENGTH);
11744
11745 uint64_t *digest = (uint64_t *) hash_buf->digest;
11746
11747 digest[0] = hex_to_uint64_t (&input_buf[ 0]);
11748 digest[1] = hex_to_uint64_t (&input_buf[ 16]);
11749 digest[2] = hex_to_uint64_t (&input_buf[ 32]);
11750 digest[3] = hex_to_uint64_t (&input_buf[ 48]);
11751 digest[4] = hex_to_uint64_t (&input_buf[ 64]);
11752 digest[5] = hex_to_uint64_t (&input_buf[ 80]);
11753 digest[6] = 0;
11754 digest[7] = 0;
11755
11756 digest[0] -= SHA384M_A;
11757 digest[1] -= SHA384M_B;
11758 digest[2] -= SHA384M_C;
11759 digest[3] -= SHA384M_D;
11760 digest[4] -= SHA384M_E;
11761 digest[5] -= SHA384M_F;
11762 digest[6] -= 0;
11763 digest[7] -= 0;
11764
11765 return (PARSER_OK);
11766 }
11767
11768 int sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11769 {
11770 if ((input_len < DISPLAY_LEN_MIN_1700) || (input_len > DISPLAY_LEN_MAX_1700)) return (PARSER_GLOBAL_LENGTH);
11771
11772 uint64_t *digest = (uint64_t *) hash_buf->digest;
11773
11774 digest[0] = hex_to_uint64_t (&input_buf[ 0]);
11775 digest[1] = hex_to_uint64_t (&input_buf[ 16]);
11776 digest[2] = hex_to_uint64_t (&input_buf[ 32]);
11777 digest[3] = hex_to_uint64_t (&input_buf[ 48]);
11778 digest[4] = hex_to_uint64_t (&input_buf[ 64]);
11779 digest[5] = hex_to_uint64_t (&input_buf[ 80]);
11780 digest[6] = hex_to_uint64_t (&input_buf[ 96]);
11781 digest[7] = hex_to_uint64_t (&input_buf[112]);
11782
11783 digest[0] -= SHA512M_A;
11784 digest[1] -= SHA512M_B;
11785 digest[2] -= SHA512M_C;
11786 digest[3] -= SHA512M_D;
11787 digest[4] -= SHA512M_E;
11788 digest[5] -= SHA512M_F;
11789 digest[6] -= SHA512M_G;
11790 digest[7] -= SHA512M_H;
11791
11792 return (PARSER_OK);
11793 }
11794
11795 int sha512s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11796 {
11797 if (data.opts_type & OPTS_TYPE_ST_HEX)
11798 {
11799 if ((input_len < DISPLAY_LEN_MIN_1710H) || (input_len > DISPLAY_LEN_MAX_1710H)) return (PARSER_GLOBAL_LENGTH);
11800 }
11801 else
11802 {
11803 if ((input_len < DISPLAY_LEN_MIN_1710) || (input_len > DISPLAY_LEN_MAX_1710)) return (PARSER_GLOBAL_LENGTH);
11804 }
11805
11806 uint64_t *digest = (uint64_t *) hash_buf->digest;
11807
11808 salt_t *salt = hash_buf->salt;
11809
11810 digest[0] = hex_to_uint64_t (&input_buf[ 0]);
11811 digest[1] = hex_to_uint64_t (&input_buf[ 16]);
11812 digest[2] = hex_to_uint64_t (&input_buf[ 32]);
11813 digest[3] = hex_to_uint64_t (&input_buf[ 48]);
11814 digest[4] = hex_to_uint64_t (&input_buf[ 64]);
11815 digest[5] = hex_to_uint64_t (&input_buf[ 80]);
11816 digest[6] = hex_to_uint64_t (&input_buf[ 96]);
11817 digest[7] = hex_to_uint64_t (&input_buf[112]);
11818
11819 digest[0] -= SHA512M_A;
11820 digest[1] -= SHA512M_B;
11821 digest[2] -= SHA512M_C;
11822 digest[3] -= SHA512M_D;
11823 digest[4] -= SHA512M_E;
11824 digest[5] -= SHA512M_F;
11825 digest[6] -= SHA512M_G;
11826 digest[7] -= SHA512M_H;
11827
11828 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11829
11830 uint salt_len = input_len - 128 - 1;
11831
11832 char *salt_buf = input_buf + 128 + 1;
11833
11834 char *salt_buf_ptr = (char *) salt->salt_buf;
11835
11836 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11837
11838 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11839
11840 salt->salt_len = salt_len;
11841
11842 return (PARSER_OK);
11843 }
11844
11845 int sha512crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11846 {
11847 if (memcmp (SIGNATURE_SHA512CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
11848
11849 uint64_t *digest = (uint64_t *) hash_buf->digest;
11850
11851 salt_t *salt = hash_buf->salt;
11852
11853 char *salt_pos = input_buf + 3;
11854
11855 uint iterations_len = 0;
11856
11857 if (memcmp (salt_pos, "rounds=", 7) == 0)
11858 {
11859 salt_pos += 7;
11860
11861 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
11862
11863 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
11864 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
11865
11866 salt_pos[0] = 0x0;
11867
11868 salt->salt_iter = atoi (salt_pos - iterations_len);
11869
11870 salt_pos += 1;
11871
11872 iterations_len += 8;
11873 }
11874 else
11875 {
11876 salt->salt_iter = ROUNDS_SHA512CRYPT;
11877 }
11878
11879 if ((input_len < DISPLAY_LEN_MIN_1800) || (input_len > DISPLAY_LEN_MAX_1800 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
11880
11881 char *hash_pos = strchr (salt_pos, '$');
11882
11883 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11884
11885 uint salt_len = hash_pos - salt_pos;
11886
11887 if (salt_len > 16) return (PARSER_SALT_LENGTH);
11888
11889 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
11890
11891 salt->salt_len = salt_len;
11892
11893 hash_pos++;
11894
11895 sha512crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
11896
11897 return (PARSER_OK);
11898 }
11899
11900 int keccak_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11901 {
11902 if ((input_len < DISPLAY_LEN_MIN_5000) || (input_len > DISPLAY_LEN_MAX_5000)) return (PARSER_GLOBAL_LENGTH);
11903
11904 if (input_len % 16) return (PARSER_GLOBAL_LENGTH);
11905
11906 uint64_t *digest = (uint64_t *) hash_buf->digest;
11907
11908 salt_t *salt = hash_buf->salt;
11909
11910 uint keccak_mdlen = input_len / 2;
11911
11912 for (uint i = 0; i < keccak_mdlen / 8; i++)
11913 {
11914 digest[i] = hex_to_uint64_t (&input_buf[i * 16]);
11915
11916 digest[i] = byte_swap_64 (digest[i]);
11917 }
11918
11919 salt->keccak_mdlen = keccak_mdlen;
11920
11921 return (PARSER_OK);
11922 }
11923
11924 int ikepsk_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11925 {
11926 if ((input_len < DISPLAY_LEN_MIN_5300) || (input_len > DISPLAY_LEN_MAX_5300)) return (PARSER_GLOBAL_LENGTH);
11927
11928 uint32_t *digest = (uint32_t *) hash_buf->digest;
11929
11930 salt_t *salt = hash_buf->salt;
11931
11932 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
11933
11934 /**
11935 * Parse that strange long line
11936 */
11937
11938 char *in_off[9];
11939
11940 size_t in_len[9];
11941
11942 in_off[0] = strtok (input_buf, ":");
11943
11944 in_len[0] = strlen (in_off[0]);
11945
11946 size_t i;
11947
11948 for (i = 1; i < 9; i++)
11949 {
11950 in_off[i] = strtok (NULL, ":");
11951
11952 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11953
11954 in_len[i] = strlen (in_off[i]);
11955 }
11956
11957 char *ptr;
11958
11959 ptr = (char *) ikepsk->msg_buf;
11960
11961 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_char (in_off[0] + i);
11962 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_char (in_off[1] + i);
11963 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_char (in_off[2] + i);
11964 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_char (in_off[3] + i);
11965 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_char (in_off[4] + i);
11966 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_char (in_off[5] + i);
11967
11968 *ptr = 0x80;
11969
11970 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
11971
11972 ptr = (char *) ikepsk->nr_buf;
11973
11974 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_char (in_off[6] + i);
11975 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_char (in_off[7] + i);
11976
11977 *ptr = 0x80;
11978
11979 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
11980
11981 /**
11982 * Store to database
11983 */
11984
11985 ptr = in_off[8];
11986
11987 digest[0] = hex_to_uint (&ptr[ 0]);
11988 digest[1] = hex_to_uint (&ptr[ 8]);
11989 digest[2] = hex_to_uint (&ptr[16]);
11990 digest[3] = hex_to_uint (&ptr[24]);
11991
11992 digest[0] = byte_swap_32 (digest[0]);
11993 digest[1] = byte_swap_32 (digest[1]);
11994 digest[2] = byte_swap_32 (digest[2]);
11995 digest[3] = byte_swap_32 (digest[3]);
11996
11997 salt->salt_len = 32;
11998
11999 salt->salt_buf[0] = ikepsk->nr_buf[0];
12000 salt->salt_buf[1] = ikepsk->nr_buf[1];
12001 salt->salt_buf[2] = ikepsk->nr_buf[2];
12002 salt->salt_buf[3] = ikepsk->nr_buf[3];
12003 salt->salt_buf[4] = ikepsk->nr_buf[4];
12004 salt->salt_buf[5] = ikepsk->nr_buf[5];
12005 salt->salt_buf[6] = ikepsk->nr_buf[6];
12006 salt->salt_buf[7] = ikepsk->nr_buf[7];
12007
12008 return (PARSER_OK);
12009 }
12010
12011 int ikepsk_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12012 {
12013 if ((input_len < DISPLAY_LEN_MIN_5400) || (input_len > DISPLAY_LEN_MAX_5400)) return (PARSER_GLOBAL_LENGTH);
12014
12015 uint32_t *digest = (uint32_t *) hash_buf->digest;
12016
12017 salt_t *salt = hash_buf->salt;
12018
12019 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
12020
12021 /**
12022 * Parse that strange long line
12023 */
12024
12025 char *in_off[9];
12026
12027 size_t in_len[9];
12028
12029 in_off[0] = strtok (input_buf, ":");
12030
12031 in_len[0] = strlen (in_off[0]);
12032
12033 size_t i;
12034
12035 for (i = 1; i < 9; i++)
12036 {
12037 in_off[i] = strtok (NULL, ":");
12038
12039 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12040
12041 in_len[i] = strlen (in_off[i]);
12042 }
12043
12044 char *ptr;
12045
12046 ptr = (char *) ikepsk->msg_buf;
12047
12048 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_char (in_off[0] + i);
12049 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_char (in_off[1] + i);
12050 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_char (in_off[2] + i);
12051 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_char (in_off[3] + i);
12052 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_char (in_off[4] + i);
12053 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_char (in_off[5] + i);
12054
12055 *ptr = 0x80;
12056
12057 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
12058
12059 ptr = (char *) ikepsk->nr_buf;
12060
12061 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_char (in_off[6] + i);
12062 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_char (in_off[7] + i);
12063
12064 *ptr = 0x80;
12065
12066 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
12067
12068 /**
12069 * Store to database
12070 */
12071
12072 ptr = in_off[8];
12073
12074 digest[0] = hex_to_uint (&ptr[ 0]);
12075 digest[1] = hex_to_uint (&ptr[ 8]);
12076 digest[2] = hex_to_uint (&ptr[16]);
12077 digest[3] = hex_to_uint (&ptr[24]);
12078 digest[4] = hex_to_uint (&ptr[32]);
12079
12080 salt->salt_len = 32;
12081
12082 salt->salt_buf[0] = ikepsk->nr_buf[0];
12083 salt->salt_buf[1] = ikepsk->nr_buf[1];
12084 salt->salt_buf[2] = ikepsk->nr_buf[2];
12085 salt->salt_buf[3] = ikepsk->nr_buf[3];
12086 salt->salt_buf[4] = ikepsk->nr_buf[4];
12087 salt->salt_buf[5] = ikepsk->nr_buf[5];
12088 salt->salt_buf[6] = ikepsk->nr_buf[6];
12089 salt->salt_buf[7] = ikepsk->nr_buf[7];
12090
12091 return (PARSER_OK);
12092 }
12093
12094 int ripemd160_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12095 {
12096 if ((input_len < DISPLAY_LEN_MIN_6000) || (input_len > DISPLAY_LEN_MAX_6000)) return (PARSER_GLOBAL_LENGTH);
12097
12098 uint32_t *digest = (uint32_t *) hash_buf->digest;
12099
12100 digest[0] = hex_to_uint (&input_buf[ 0]);
12101 digest[1] = hex_to_uint (&input_buf[ 8]);
12102 digest[2] = hex_to_uint (&input_buf[16]);
12103 digest[3] = hex_to_uint (&input_buf[24]);
12104 digest[4] = hex_to_uint (&input_buf[32]);
12105
12106 digest[0] = byte_swap_32 (digest[0]);
12107 digest[1] = byte_swap_32 (digest[1]);
12108 digest[2] = byte_swap_32 (digest[2]);
12109 digest[3] = byte_swap_32 (digest[3]);
12110 digest[4] = byte_swap_32 (digest[4]);
12111
12112 return (PARSER_OK);
12113 }
12114
12115 int whirlpool_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12116 {
12117 if ((input_len < DISPLAY_LEN_MIN_6100) || (input_len > DISPLAY_LEN_MAX_6100)) return (PARSER_GLOBAL_LENGTH);
12118
12119 uint32_t *digest = (uint32_t *) hash_buf->digest;
12120
12121 digest[ 0] = hex_to_uint (&input_buf[ 0]);
12122 digest[ 1] = hex_to_uint (&input_buf[ 8]);
12123 digest[ 2] = hex_to_uint (&input_buf[ 16]);
12124 digest[ 3] = hex_to_uint (&input_buf[ 24]);
12125 digest[ 4] = hex_to_uint (&input_buf[ 32]);
12126 digest[ 5] = hex_to_uint (&input_buf[ 40]);
12127 digest[ 6] = hex_to_uint (&input_buf[ 48]);
12128 digest[ 7] = hex_to_uint (&input_buf[ 56]);
12129 digest[ 8] = hex_to_uint (&input_buf[ 64]);
12130 digest[ 9] = hex_to_uint (&input_buf[ 72]);
12131 digest[10] = hex_to_uint (&input_buf[ 80]);
12132 digest[11] = hex_to_uint (&input_buf[ 88]);
12133 digest[12] = hex_to_uint (&input_buf[ 96]);
12134 digest[13] = hex_to_uint (&input_buf[104]);
12135 digest[14] = hex_to_uint (&input_buf[112]);
12136 digest[15] = hex_to_uint (&input_buf[120]);
12137
12138 return (PARSER_OK);
12139 }
12140
12141 int androidpin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12142 {
12143 if ((input_len < DISPLAY_LEN_MIN_5800) || (input_len > DISPLAY_LEN_MAX_5800)) return (PARSER_GLOBAL_LENGTH);
12144
12145 uint32_t *digest = (uint32_t *) hash_buf->digest;
12146
12147 salt_t *salt = hash_buf->salt;
12148
12149 digest[0] = hex_to_uint (&input_buf[ 0]);
12150 digest[1] = hex_to_uint (&input_buf[ 8]);
12151 digest[2] = hex_to_uint (&input_buf[16]);
12152 digest[3] = hex_to_uint (&input_buf[24]);
12153 digest[4] = hex_to_uint (&input_buf[32]);
12154
12155 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12156
12157 uint salt_len = input_len - 40 - 1;
12158
12159 char *salt_buf = input_buf + 40 + 1;
12160
12161 char *salt_buf_ptr = (char *) salt->salt_buf;
12162
12163 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12164
12165 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12166
12167 salt->salt_len = salt_len;
12168
12169 salt->salt_iter = ROUNDS_ANDROIDPIN - 1;
12170
12171 return (PARSER_OK);
12172 }
12173
12174 int truecrypt_parse_hash_1k (char *input_buf, uint input_len, hash_t *hash_buf)
12175 {
12176 uint32_t *digest = (uint32_t *) hash_buf->digest;
12177
12178 salt_t *salt = hash_buf->salt;
12179
12180 tc_t *tc = (tc_t *) hash_buf->esalt;
12181
12182 if (input_len == 0)
12183 {
12184 log_error ("TrueCrypt container not specified");
12185
12186 exit (-1);
12187 }
12188
12189 FILE *fp = fopen (input_buf, "rb");
12190
12191 if (fp == NULL)
12192 {
12193 log_error ("%s: %s", input_buf, strerror (errno));
12194
12195 exit (-1);
12196 }
12197
12198 char buf[512];
12199
12200 int n = fread (buf, 1, sizeof (buf), fp);
12201
12202 fclose (fp);
12203
12204 if (n != 512) return (PARSER_TC_FILE_SIZE);
12205
12206 memcpy (tc->salt_buf, buf, 64);
12207
12208 memcpy (tc->data_buf, buf + 64, 512 - 64);
12209
12210 salt->salt_buf[0] = tc->salt_buf[0];
12211
12212 salt->salt_len = 4;
12213
12214 salt->salt_iter = 1000 - 1;
12215
12216 digest[0] = tc->data_buf[0];
12217
12218 return (PARSER_OK);
12219 }
12220
12221 int truecrypt_parse_hash_2k (char *input_buf, uint input_len, hash_t *hash_buf)
12222 {
12223 uint32_t *digest = (uint32_t *) hash_buf->digest;
12224
12225 salt_t *salt = hash_buf->salt;
12226
12227 tc_t *tc = (tc_t *) hash_buf->esalt;
12228
12229 if (input_len == 0)
12230 {
12231 log_error ("TrueCrypt container not specified");
12232
12233 exit (-1);
12234 }
12235
12236 FILE *fp = fopen (input_buf, "rb");
12237
12238 if (fp == NULL)
12239 {
12240 log_error ("%s: %s", input_buf, strerror (errno));
12241
12242 exit (-1);
12243 }
12244
12245 char buf[512];
12246
12247 int n = fread (buf, 1, sizeof (buf), fp);
12248
12249 fclose (fp);
12250
12251 if (n != 512) return (PARSER_TC_FILE_SIZE);
12252
12253 memcpy (tc->salt_buf, buf, 64);
12254
12255 memcpy (tc->data_buf, buf + 64, 512 - 64);
12256
12257 salt->salt_buf[0] = tc->salt_buf[0];
12258
12259 salt->salt_len = 4;
12260
12261 salt->salt_iter = 2000 - 1;
12262
12263 digest[0] = tc->data_buf[0];
12264
12265 return (PARSER_OK);
12266 }
12267
12268 int md5aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12269 {
12270 if ((input_len < DISPLAY_LEN_MIN_6300) || (input_len > DISPLAY_LEN_MAX_6300)) return (PARSER_GLOBAL_LENGTH);
12271
12272 if (memcmp (SIGNATURE_MD5AIX, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
12273
12274 uint32_t *digest = (uint32_t *) hash_buf->digest;
12275
12276 salt_t *salt = hash_buf->salt;
12277
12278 char *salt_pos = input_buf + 6;
12279
12280 char *hash_pos = strchr (salt_pos, '$');
12281
12282 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12283
12284 uint salt_len = hash_pos - salt_pos;
12285
12286 if (salt_len < 8) return (PARSER_SALT_LENGTH);
12287
12288 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12289
12290 salt->salt_len = salt_len;
12291
12292 salt->salt_iter = 1000;
12293
12294 hash_pos++;
12295
12296 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12297
12298 return (PARSER_OK);
12299 }
12300
12301 int sha1aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12302 {
12303 if ((input_len < DISPLAY_LEN_MIN_6700) || (input_len > DISPLAY_LEN_MAX_6700)) return (PARSER_GLOBAL_LENGTH);
12304
12305 if (memcmp (SIGNATURE_SHA1AIX, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
12306
12307 uint32_t *digest = (uint32_t *) hash_buf->digest;
12308
12309 salt_t *salt = hash_buf->salt;
12310
12311 char *iter_pos = input_buf + 7;
12312
12313 char *salt_pos = strchr (iter_pos, '$');
12314
12315 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12316
12317 salt_pos++;
12318
12319 char *hash_pos = strchr (salt_pos, '$');
12320
12321 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12322
12323 uint salt_len = hash_pos - salt_pos;
12324
12325 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12326
12327 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12328
12329 salt->salt_len = salt_len;
12330
12331 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12332
12333 salt->salt_sign[0] = atoi (salt_iter);
12334
12335 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12336
12337 hash_pos++;
12338
12339 sha1aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12340
12341 digest[0] = byte_swap_32 (digest[0]);
12342 digest[1] = byte_swap_32 (digest[1]);
12343 digest[2] = byte_swap_32 (digest[2]);
12344 digest[3] = byte_swap_32 (digest[3]);
12345 digest[4] = byte_swap_32 (digest[4]);
12346
12347 return (PARSER_OK);
12348 }
12349
12350 int sha256aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12351 {
12352 if ((input_len < DISPLAY_LEN_MIN_6400) || (input_len > DISPLAY_LEN_MAX_6400)) return (PARSER_GLOBAL_LENGTH);
12353
12354 if (memcmp (SIGNATURE_SHA256AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
12355
12356 uint32_t *digest = (uint32_t *) hash_buf->digest;
12357
12358 salt_t *salt = hash_buf->salt;
12359
12360 char *iter_pos = input_buf + 9;
12361
12362 char *salt_pos = strchr (iter_pos, '$');
12363
12364 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12365
12366 salt_pos++;
12367
12368 char *hash_pos = strchr (salt_pos, '$');
12369
12370 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12371
12372 uint salt_len = hash_pos - salt_pos;
12373
12374 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12375
12376 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12377
12378 salt->salt_len = salt_len;
12379
12380 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12381
12382 salt->salt_sign[0] = atoi (salt_iter);
12383
12384 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12385
12386 hash_pos++;
12387
12388 sha256aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12389
12390 digest[0] = byte_swap_32 (digest[0]);
12391 digest[1] = byte_swap_32 (digest[1]);
12392 digest[2] = byte_swap_32 (digest[2]);
12393 digest[3] = byte_swap_32 (digest[3]);
12394 digest[4] = byte_swap_32 (digest[4]);
12395 digest[5] = byte_swap_32 (digest[5]);
12396 digest[6] = byte_swap_32 (digest[6]);
12397 digest[7] = byte_swap_32 (digest[7]);
12398
12399 return (PARSER_OK);
12400 }
12401
12402 int sha512aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12403 {
12404 if ((input_len < DISPLAY_LEN_MIN_6500) || (input_len > DISPLAY_LEN_MAX_6500)) return (PARSER_GLOBAL_LENGTH);
12405
12406 if (memcmp (SIGNATURE_SHA512AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
12407
12408 uint64_t *digest = (uint64_t *) hash_buf->digest;
12409
12410 salt_t *salt = hash_buf->salt;
12411
12412 char *iter_pos = input_buf + 9;
12413
12414 char *salt_pos = strchr (iter_pos, '$');
12415
12416 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12417
12418 salt_pos++;
12419
12420 char *hash_pos = strchr (salt_pos, '$');
12421
12422 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12423
12424 uint salt_len = hash_pos - salt_pos;
12425
12426 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12427
12428 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12429
12430 salt->salt_len = salt_len;
12431
12432 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12433
12434 salt->salt_sign[0] = atoi (salt_iter);
12435
12436 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12437
12438 hash_pos++;
12439
12440 sha512aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12441
12442 digest[0] = byte_swap_64 (digest[0]);
12443 digest[1] = byte_swap_64 (digest[1]);
12444 digest[2] = byte_swap_64 (digest[2]);
12445 digest[3] = byte_swap_64 (digest[3]);
12446 digest[4] = byte_swap_64 (digest[4]);
12447 digest[5] = byte_swap_64 (digest[5]);
12448 digest[6] = byte_swap_64 (digest[6]);
12449 digest[7] = byte_swap_64 (digest[7]);
12450
12451 return (PARSER_OK);
12452 }
12453
12454 int agilekey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12455 {
12456 if ((input_len < DISPLAY_LEN_MIN_6600) || (input_len > DISPLAY_LEN_MAX_6600)) return (PARSER_GLOBAL_LENGTH);
12457
12458 uint32_t *digest = (uint32_t *) hash_buf->digest;
12459
12460 salt_t *salt = hash_buf->salt;
12461
12462 agilekey_t *agilekey = (agilekey_t *) hash_buf->esalt;
12463
12464 /**
12465 * parse line
12466 */
12467
12468 char *iterations_pos = input_buf;
12469
12470 char *saltbuf_pos = strchr (iterations_pos, ':');
12471
12472 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12473
12474 uint iterations_len = saltbuf_pos - iterations_pos;
12475
12476 if (iterations_len > 6) return (PARSER_SALT_LENGTH);
12477
12478 saltbuf_pos++;
12479
12480 char *cipherbuf_pos = strchr (saltbuf_pos, ':');
12481
12482 if (cipherbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12483
12484 uint saltbuf_len = cipherbuf_pos - saltbuf_pos;
12485
12486 if (saltbuf_len != 16) return (PARSER_SALT_LENGTH);
12487
12488 uint cipherbuf_len = input_len - iterations_len - 1 - saltbuf_len - 1;
12489
12490 if (cipherbuf_len != 2080) return (PARSER_HASH_LENGTH);
12491
12492 cipherbuf_pos++;
12493
12494 /**
12495 * pbkdf2 iterations
12496 */
12497
12498 salt->salt_iter = atoi (iterations_pos) - 1;
12499
12500 /**
12501 * handle salt encoding
12502 */
12503
12504 char *saltbuf_ptr = (char *) salt->salt_buf;
12505
12506 for (uint i = 0; i < saltbuf_len; i += 2)
12507 {
12508 const char p0 = saltbuf_pos[i + 0];
12509 const char p1 = saltbuf_pos[i + 1];
12510
12511 *saltbuf_ptr++ = hex_convert (p1) << 0
12512 | hex_convert (p0) << 4;
12513 }
12514
12515 salt->salt_len = saltbuf_len / 2;
12516
12517 /**
12518 * handle cipher encoding
12519 */
12520
12521 uint *tmp = (uint *) mymalloc (32);
12522
12523 char *cipherbuf_ptr = (char *) tmp;
12524
12525 for (uint i = 2016; i < cipherbuf_len; i += 2)
12526 {
12527 const char p0 = cipherbuf_pos[i + 0];
12528 const char p1 = cipherbuf_pos[i + 1];
12529
12530 *cipherbuf_ptr++ = hex_convert (p1) << 0
12531 | hex_convert (p0) << 4;
12532 }
12533
12534 // iv is stored at salt_buf 4 (length 16)
12535 // data is stored at salt_buf 8 (length 16)
12536
12537 salt->salt_buf[ 4] = byte_swap_32 (tmp[0]);
12538 salt->salt_buf[ 5] = byte_swap_32 (tmp[1]);
12539 salt->salt_buf[ 6] = byte_swap_32 (tmp[2]);
12540 salt->salt_buf[ 7] = byte_swap_32 (tmp[3]);
12541
12542 salt->salt_buf[ 8] = byte_swap_32 (tmp[4]);
12543 salt->salt_buf[ 9] = byte_swap_32 (tmp[5]);
12544 salt->salt_buf[10] = byte_swap_32 (tmp[6]);
12545 salt->salt_buf[11] = byte_swap_32 (tmp[7]);
12546
12547 free (tmp);
12548
12549 for (uint i = 0, j = 0; i < 1040; i += 1, j += 2)
12550 {
12551 const char p0 = cipherbuf_pos[j + 0];
12552 const char p1 = cipherbuf_pos[j + 1];
12553
12554 agilekey->cipher[i] = hex_convert (p1) << 0
12555 | hex_convert (p0) << 4;
12556 }
12557
12558 /**
12559 * digest buf
12560 */
12561
12562 digest[0] = 0x10101010;
12563 digest[1] = 0x10101010;
12564 digest[2] = 0x10101010;
12565 digest[3] = 0x10101010;
12566
12567 return (PARSER_OK);
12568 }
12569
12570 int lastpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12571 {
12572 if ((input_len < DISPLAY_LEN_MIN_6800) || (input_len > DISPLAY_LEN_MAX_6800)) return (PARSER_GLOBAL_LENGTH);
12573
12574 uint32_t *digest = (uint32_t *) hash_buf->digest;
12575
12576 salt_t *salt = hash_buf->salt;
12577
12578 char *hashbuf_pos = input_buf;
12579
12580 char *iterations_pos = strchr (hashbuf_pos, ':');
12581
12582 if (iterations_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12583
12584 uint hash_len = iterations_pos - hashbuf_pos;
12585
12586 if ((hash_len != 32) && (hash_len != 64)) return (PARSER_HASH_LENGTH);
12587
12588 iterations_pos++;
12589
12590 char *saltbuf_pos = strchr (iterations_pos, ':');
12591
12592 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12593
12594 uint iterations_len = saltbuf_pos - iterations_pos;
12595
12596 saltbuf_pos++;
12597
12598 uint salt_len = input_len - hash_len - 1 - iterations_len - 1;
12599
12600 if (salt_len > 32) return (PARSER_SALT_LENGTH);
12601
12602 char *salt_buf_ptr = (char *) salt->salt_buf;
12603
12604 salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, salt_len);
12605
12606 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12607
12608 salt->salt_len = salt_len;
12609
12610 salt->salt_iter = atoi (iterations_pos) - 1;
12611
12612 digest[0] = hex_to_uint (&hashbuf_pos[ 0]);
12613 digest[1] = hex_to_uint (&hashbuf_pos[ 8]);
12614 digest[2] = hex_to_uint (&hashbuf_pos[16]);
12615 digest[3] = hex_to_uint (&hashbuf_pos[24]);
12616
12617 return (PARSER_OK);
12618 }
12619
12620 int gost_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12621 {
12622 if ((input_len < DISPLAY_LEN_MIN_6900) || (input_len > DISPLAY_LEN_MAX_6900)) return (PARSER_GLOBAL_LENGTH);
12623
12624 uint32_t *digest = (uint32_t *) hash_buf->digest;
12625
12626 digest[0] = hex_to_uint (&input_buf[ 0]);
12627 digest[1] = hex_to_uint (&input_buf[ 8]);
12628 digest[2] = hex_to_uint (&input_buf[16]);
12629 digest[3] = hex_to_uint (&input_buf[24]);
12630 digest[4] = hex_to_uint (&input_buf[32]);
12631 digest[5] = hex_to_uint (&input_buf[40]);
12632 digest[6] = hex_to_uint (&input_buf[48]);
12633 digest[7] = hex_to_uint (&input_buf[56]);
12634
12635 digest[0] = byte_swap_32 (digest[0]);
12636 digest[1] = byte_swap_32 (digest[1]);
12637 digest[2] = byte_swap_32 (digest[2]);
12638 digest[3] = byte_swap_32 (digest[3]);
12639 digest[4] = byte_swap_32 (digest[4]);
12640 digest[5] = byte_swap_32 (digest[5]);
12641 digest[6] = byte_swap_32 (digest[6]);
12642 digest[7] = byte_swap_32 (digest[7]);
12643
12644 return (PARSER_OK);
12645 }
12646
12647 int sha256crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12648 {
12649 if (memcmp (SIGNATURE_SHA256CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
12650
12651 uint32_t *digest = (uint32_t *) hash_buf->digest;
12652
12653 salt_t *salt = hash_buf->salt;
12654
12655 char *salt_pos = input_buf + 3;
12656
12657 uint iterations_len = 0;
12658
12659 if (memcmp (salt_pos, "rounds=", 7) == 0)
12660 {
12661 salt_pos += 7;
12662
12663 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
12664
12665 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
12666 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
12667
12668 salt_pos[0] = 0x0;
12669
12670 salt->salt_iter = atoi (salt_pos - iterations_len);
12671
12672 salt_pos += 1;
12673
12674 iterations_len += 8;
12675 }
12676 else
12677 {
12678 salt->salt_iter = ROUNDS_SHA256CRYPT;
12679 }
12680
12681 if ((input_len < DISPLAY_LEN_MIN_7400) || (input_len > DISPLAY_LEN_MAX_7400 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
12682
12683 char *hash_pos = strchr (salt_pos, '$');
12684
12685 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12686
12687 uint salt_len = hash_pos - salt_pos;
12688
12689 if (salt_len > 16) return (PARSER_SALT_LENGTH);
12690
12691 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12692
12693 salt->salt_len = salt_len;
12694
12695 hash_pos++;
12696
12697 sha256crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12698
12699 return (PARSER_OK);
12700 }
12701
12702 int sha512osx_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12703 {
12704 uint max_len = DISPLAY_LEN_MAX_7100 + (2 * 128);
12705
12706 if ((input_len < DISPLAY_LEN_MIN_7100) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
12707
12708 if (memcmp (SIGNATURE_SHA512OSX, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
12709
12710 uint64_t *digest = (uint64_t *) hash_buf->digest;
12711
12712 salt_t *salt = hash_buf->salt;
12713
12714 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
12715
12716 char *iter_pos = input_buf + 4;
12717
12718 char *salt_pos = strchr (iter_pos, '$');
12719
12720 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12721
12722 salt_pos++;
12723
12724 char *hash_pos = strchr (salt_pos, '$');
12725
12726 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12727
12728 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
12729
12730 hash_pos++;
12731
12732 digest[0] = hex_to_uint64_t (&hash_pos[ 0]);
12733 digest[1] = hex_to_uint64_t (&hash_pos[ 16]);
12734 digest[2] = hex_to_uint64_t (&hash_pos[ 32]);
12735 digest[3] = hex_to_uint64_t (&hash_pos[ 48]);
12736 digest[4] = hex_to_uint64_t (&hash_pos[ 64]);
12737 digest[5] = hex_to_uint64_t (&hash_pos[ 80]);
12738 digest[6] = hex_to_uint64_t (&hash_pos[ 96]);
12739 digest[7] = hex_to_uint64_t (&hash_pos[112]);
12740
12741 uint salt_len = hash_pos - salt_pos - 1;
12742
12743 if ((salt_len % 2) != 0) return (PARSER_SALT_LENGTH);
12744
12745 salt->salt_len = salt_len / 2;
12746
12747 pbkdf2_sha512->salt_buf[0] = hex_to_uint (&salt_pos[ 0]);
12748 pbkdf2_sha512->salt_buf[1] = hex_to_uint (&salt_pos[ 8]);
12749 pbkdf2_sha512->salt_buf[2] = hex_to_uint (&salt_pos[16]);
12750 pbkdf2_sha512->salt_buf[3] = hex_to_uint (&salt_pos[24]);
12751 pbkdf2_sha512->salt_buf[4] = hex_to_uint (&salt_pos[32]);
12752 pbkdf2_sha512->salt_buf[5] = hex_to_uint (&salt_pos[40]);
12753 pbkdf2_sha512->salt_buf[6] = hex_to_uint (&salt_pos[48]);
12754 pbkdf2_sha512->salt_buf[7] = hex_to_uint (&salt_pos[56]);
12755
12756 pbkdf2_sha512->salt_buf[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]);
12757 pbkdf2_sha512->salt_buf[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]);
12758 pbkdf2_sha512->salt_buf[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]);
12759 pbkdf2_sha512->salt_buf[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]);
12760 pbkdf2_sha512->salt_buf[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]);
12761 pbkdf2_sha512->salt_buf[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]);
12762 pbkdf2_sha512->salt_buf[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]);
12763 pbkdf2_sha512->salt_buf[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]);
12764 pbkdf2_sha512->salt_buf[8] = 0x01000000;
12765 pbkdf2_sha512->salt_buf[9] = 0x80;
12766
12767 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
12768
12769 salt->salt_iter = atoi (iter_pos) - 1;
12770
12771 return (PARSER_OK);
12772 }
12773
12774 int episerver4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12775 {
12776 if ((input_len < DISPLAY_LEN_MIN_1441) || (input_len > DISPLAY_LEN_MAX_1441)) return (PARSER_GLOBAL_LENGTH);
12777
12778 if (memcmp (SIGNATURE_EPISERVER4, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
12779
12780 uint32_t *digest = (uint32_t *) hash_buf->digest;
12781
12782 salt_t *salt = hash_buf->salt;
12783
12784 char *salt_pos = input_buf + 14;
12785
12786 char *hash_pos = strchr (salt_pos, '*');
12787
12788 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12789
12790 hash_pos++;
12791
12792 uint salt_len = hash_pos - salt_pos - 1;
12793
12794 char *salt_buf_ptr = (char *) salt->salt_buf;
12795
12796 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
12797
12798 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12799
12800 salt->salt_len = salt_len;
12801
12802 char tmp_buf[100]; memset (tmp_buf, 0, sizeof (tmp_buf));
12803
12804 base64_decode (base64_to_int, hash_pos, 43, tmp_buf);
12805
12806 memcpy (digest, tmp_buf, 32);
12807
12808 digest[0] = byte_swap_32 (digest[0]);
12809 digest[1] = byte_swap_32 (digest[1]);
12810 digest[2] = byte_swap_32 (digest[2]);
12811 digest[3] = byte_swap_32 (digest[3]);
12812 digest[4] = byte_swap_32 (digest[4]);
12813 digest[5] = byte_swap_32 (digest[5]);
12814 digest[6] = byte_swap_32 (digest[6]);
12815 digest[7] = byte_swap_32 (digest[7]);
12816
12817 digest[0] -= SHA256M_A;
12818 digest[1] -= SHA256M_B;
12819 digest[2] -= SHA256M_C;
12820 digest[3] -= SHA256M_D;
12821 digest[4] -= SHA256M_E;
12822 digest[5] -= SHA256M_F;
12823 digest[6] -= SHA256M_G;
12824 digest[7] -= SHA256M_H;
12825
12826 return (PARSER_OK);
12827 }
12828
12829 int sha512grub_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12830 {
12831 uint max_len = DISPLAY_LEN_MAX_7200 + (8 * 128);
12832
12833 if ((input_len < DISPLAY_LEN_MIN_7200) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
12834
12835 if (memcmp (SIGNATURE_SHA512GRUB, input_buf, 19)) return (PARSER_SIGNATURE_UNMATCHED);
12836
12837 uint64_t *digest = (uint64_t *) 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 + 19;
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_uint64_t (&hash_pos[ 0]);
12860 digest[1] = hex_to_uint64_t (&hash_pos[ 16]);
12861 digest[2] = hex_to_uint64_t (&hash_pos[ 32]);
12862 digest[3] = hex_to_uint64_t (&hash_pos[ 48]);
12863 digest[4] = hex_to_uint64_t (&hash_pos[ 64]);
12864 digest[5] = hex_to_uint64_t (&hash_pos[ 80]);
12865 digest[6] = hex_to_uint64_t (&hash_pos[ 96]);
12866 digest[7] = hex_to_uint64_t (&hash_pos[112]);
12867
12868 uint salt_len = hash_pos - salt_pos - 1;
12869
12870 salt_len /= 2;
12871
12872 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
12873
12874 uint i;
12875
12876 for (i = 0; i < salt_len; i++)
12877 {
12878 salt_buf_ptr[i] = hex_to_char (&salt_pos[i * 2]);
12879 }
12880
12881 salt_buf_ptr[salt_len + 3] = 0x01;
12882 salt_buf_ptr[salt_len + 4] = 0x80;
12883
12884 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
12885
12886 salt->salt_len = salt_len;
12887
12888 salt->salt_iter = atoi (iter_pos) - 1;
12889
12890 return (PARSER_OK);
12891 }
12892
12893 int sha512b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12894 {
12895 if ((input_len < DISPLAY_LEN_MIN_1711) || (input_len > DISPLAY_LEN_MAX_1711)) return (PARSER_GLOBAL_LENGTH);
12896
12897 if (memcmp (SIGNATURE_SHA512B64S, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
12898
12899 uint64_t *digest = (uint64_t *) hash_buf->digest;
12900
12901 salt_t *salt = hash_buf->salt;
12902
12903 char tmp_buf[120];
12904
12905 memset (tmp_buf, 0, sizeof (tmp_buf));
12906
12907 int tmp_len = base64_decode (base64_to_int, input_buf + 9, input_len - 9, tmp_buf);
12908
12909 memcpy (digest, tmp_buf, 64);
12910
12911 digest[0] = byte_swap_64 (digest[0]);
12912 digest[1] = byte_swap_64 (digest[1]);
12913 digest[2] = byte_swap_64 (digest[2]);
12914 digest[3] = byte_swap_64 (digest[3]);
12915 digest[4] = byte_swap_64 (digest[4]);
12916 digest[5] = byte_swap_64 (digest[5]);
12917 digest[6] = byte_swap_64 (digest[6]);
12918 digest[7] = byte_swap_64 (digest[7]);
12919
12920 digest[0] -= SHA512M_A;
12921 digest[1] -= SHA512M_B;
12922 digest[2] -= SHA512M_C;
12923 digest[3] -= SHA512M_D;
12924 digest[4] -= SHA512M_E;
12925 digest[5] -= SHA512M_F;
12926 digest[6] -= SHA512M_G;
12927 digest[7] -= SHA512M_H;
12928
12929 salt->salt_len = tmp_len - 64;
12930
12931 memcpy (salt->salt_buf, tmp_buf + 64, salt->salt_len);
12932
12933 if (data.opts_type & OPTS_TYPE_ST_ADD80)
12934 {
12935 char *ptr = (char *) salt->salt_buf;
12936
12937 ptr[salt->salt_len] = 0x80;
12938 }
12939
12940 return (PARSER_OK);
12941 }
12942
12943 int hmacmd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12944 {
12945 if (data.opts_type & OPTS_TYPE_ST_HEX)
12946 {
12947 if ((input_len < DISPLAY_LEN_MIN_50H) || (input_len > DISPLAY_LEN_MAX_50H)) return (PARSER_GLOBAL_LENGTH);
12948 }
12949 else
12950 {
12951 if ((input_len < DISPLAY_LEN_MIN_50) || (input_len > DISPLAY_LEN_MAX_50)) return (PARSER_GLOBAL_LENGTH);
12952 }
12953
12954 uint32_t *digest = (uint32_t *) hash_buf->digest;
12955
12956 salt_t *salt = hash_buf->salt;
12957
12958 digest[0] = hex_to_uint (&input_buf[ 0]);
12959 digest[1] = hex_to_uint (&input_buf[ 8]);
12960 digest[2] = hex_to_uint (&input_buf[16]);
12961 digest[3] = hex_to_uint (&input_buf[24]);
12962
12963 digest[0] = byte_swap_32 (digest[0]);
12964 digest[1] = byte_swap_32 (digest[1]);
12965 digest[2] = byte_swap_32 (digest[2]);
12966 digest[3] = byte_swap_32 (digest[3]);
12967
12968 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12969
12970 uint salt_len = input_len - 32 - 1;
12971
12972 char *salt_buf = input_buf + 32 + 1;
12973
12974 char *salt_buf_ptr = (char *) salt->salt_buf;
12975
12976 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12977
12978 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12979
12980 salt->salt_len = salt_len;
12981
12982 return (PARSER_OK);
12983 }
12984
12985 int hmacsha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12986 {
12987 if (data.opts_type & OPTS_TYPE_ST_HEX)
12988 {
12989 if ((input_len < DISPLAY_LEN_MIN_150H) || (input_len > DISPLAY_LEN_MAX_150H)) return (PARSER_GLOBAL_LENGTH);
12990 }
12991 else
12992 {
12993 if ((input_len < DISPLAY_LEN_MIN_150) || (input_len > DISPLAY_LEN_MAX_150)) return (PARSER_GLOBAL_LENGTH);
12994 }
12995
12996 uint32_t *digest = (uint32_t *) hash_buf->digest;
12997
12998 salt_t *salt = hash_buf->salt;
12999
13000 digest[0] = hex_to_uint (&input_buf[ 0]);
13001 digest[1] = hex_to_uint (&input_buf[ 8]);
13002 digest[2] = hex_to_uint (&input_buf[16]);
13003 digest[3] = hex_to_uint (&input_buf[24]);
13004 digest[4] = hex_to_uint (&input_buf[32]);
13005
13006 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13007
13008 uint salt_len = input_len - 40 - 1;
13009
13010 char *salt_buf = input_buf + 40 + 1;
13011
13012 char *salt_buf_ptr = (char *) salt->salt_buf;
13013
13014 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13015
13016 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13017
13018 salt->salt_len = salt_len;
13019
13020 return (PARSER_OK);
13021 }
13022
13023 int hmacsha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13024 {
13025 if (data.opts_type & OPTS_TYPE_ST_HEX)
13026 {
13027 if ((input_len < DISPLAY_LEN_MIN_1450H) || (input_len > DISPLAY_LEN_MAX_1450H)) return (PARSER_GLOBAL_LENGTH);
13028 }
13029 else
13030 {
13031 if ((input_len < DISPLAY_LEN_MIN_1450) || (input_len > DISPLAY_LEN_MAX_1450)) return (PARSER_GLOBAL_LENGTH);
13032 }
13033
13034 uint32_t *digest = (uint32_t *) hash_buf->digest;
13035
13036 salt_t *salt = hash_buf->salt;
13037
13038 digest[0] = hex_to_uint (&input_buf[ 0]);
13039 digest[1] = hex_to_uint (&input_buf[ 8]);
13040 digest[2] = hex_to_uint (&input_buf[16]);
13041 digest[3] = hex_to_uint (&input_buf[24]);
13042 digest[4] = hex_to_uint (&input_buf[32]);
13043 digest[5] = hex_to_uint (&input_buf[40]);
13044 digest[6] = hex_to_uint (&input_buf[48]);
13045 digest[7] = hex_to_uint (&input_buf[56]);
13046
13047 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13048
13049 uint salt_len = input_len - 64 - 1;
13050
13051 char *salt_buf = input_buf + 64 + 1;
13052
13053 char *salt_buf_ptr = (char *) salt->salt_buf;
13054
13055 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13056
13057 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13058
13059 salt->salt_len = salt_len;
13060
13061 return (PARSER_OK);
13062 }
13063
13064 int hmacsha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13065 {
13066 if (data.opts_type & OPTS_TYPE_ST_HEX)
13067 {
13068 if ((input_len < DISPLAY_LEN_MIN_1750H) || (input_len > DISPLAY_LEN_MAX_1750H)) return (PARSER_GLOBAL_LENGTH);
13069 }
13070 else
13071 {
13072 if ((input_len < DISPLAY_LEN_MIN_1750) || (input_len > DISPLAY_LEN_MAX_1750)) return (PARSER_GLOBAL_LENGTH);
13073 }
13074
13075 uint64_t *digest = (uint64_t *) hash_buf->digest;
13076
13077 salt_t *salt = hash_buf->salt;
13078
13079 digest[0] = hex_to_uint64_t (&input_buf[ 0]);
13080 digest[1] = hex_to_uint64_t (&input_buf[ 16]);
13081 digest[2] = hex_to_uint64_t (&input_buf[ 32]);
13082 digest[3] = hex_to_uint64_t (&input_buf[ 48]);
13083 digest[4] = hex_to_uint64_t (&input_buf[ 64]);
13084 digest[5] = hex_to_uint64_t (&input_buf[ 80]);
13085 digest[6] = hex_to_uint64_t (&input_buf[ 96]);
13086 digest[7] = hex_to_uint64_t (&input_buf[112]);
13087
13088 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13089
13090 uint salt_len = input_len - 128 - 1;
13091
13092 char *salt_buf = input_buf + 128 + 1;
13093
13094 char *salt_buf_ptr = (char *) salt->salt_buf;
13095
13096 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13097
13098 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13099
13100 salt->salt_len = salt_len;
13101
13102 return (PARSER_OK);
13103 }
13104
13105 int krb5pa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13106 {
13107 if ((input_len < DISPLAY_LEN_MIN_7500) || (input_len > DISPLAY_LEN_MAX_7500)) return (PARSER_GLOBAL_LENGTH);
13108
13109 if (memcmp (SIGNATURE_KRB5PA, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
13110
13111 uint32_t *digest = (uint32_t *) hash_buf->digest;
13112
13113 salt_t *salt = hash_buf->salt;
13114
13115 krb5pa_t *krb5pa = (krb5pa_t *) hash_buf->esalt;
13116
13117 /**
13118 * parse line
13119 */
13120
13121 char *user_pos = input_buf + 10 + 1;
13122
13123 char *realm_pos = strchr (user_pos, '$');
13124
13125 if (realm_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13126
13127 uint user_len = realm_pos - user_pos;
13128
13129 if (user_len >= 64) return (PARSER_SALT_LENGTH);
13130
13131 realm_pos++;
13132
13133 char *salt_pos = strchr (realm_pos, '$');
13134
13135 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13136
13137 uint realm_len = salt_pos - realm_pos;
13138
13139 if (realm_len >= 64) return (PARSER_SALT_LENGTH);
13140
13141 salt_pos++;
13142
13143 char *data_pos = strchr (salt_pos, '$');
13144
13145 if (data_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13146
13147 uint salt_len = data_pos - salt_pos;
13148
13149 if (salt_len >= 128) return (PARSER_SALT_LENGTH);
13150
13151 data_pos++;
13152
13153 uint data_len = input_len - 10 - 1 - user_len - 1 - realm_len - 1 - salt_len - 1;
13154
13155 if (data_len != ((36 + 16) * 2)) return (PARSER_SALT_LENGTH);
13156
13157 /**
13158 * copy data
13159 */
13160
13161 memcpy (krb5pa->user, user_pos, user_len);
13162 memcpy (krb5pa->realm, realm_pos, realm_len);
13163 memcpy (krb5pa->salt, salt_pos, salt_len);
13164
13165 char *timestamp_ptr = (char *) krb5pa->timestamp;
13166
13167 for (uint i = 0; i < (36 * 2); i += 2)
13168 {
13169 const char p0 = data_pos[i + 0];
13170 const char p1 = data_pos[i + 1];
13171
13172 *timestamp_ptr++ = hex_convert (p1) << 0
13173 | hex_convert (p0) << 4;
13174 }
13175
13176 char *checksum_ptr = (char *) krb5pa->checksum;
13177
13178 for (uint i = (36 * 2); i < ((36 + 16) * 2); i += 2)
13179 {
13180 const char p0 = data_pos[i + 0];
13181 const char p1 = data_pos[i + 1];
13182
13183 *checksum_ptr++ = hex_convert (p1) << 0
13184 | hex_convert (p0) << 4;
13185 }
13186
13187 /**
13188 * copy some data to generic buffers to make sorting happy
13189 */
13190
13191 salt->salt_buf[0] = krb5pa->timestamp[0];
13192 salt->salt_buf[1] = krb5pa->timestamp[1];
13193 salt->salt_buf[2] = krb5pa->timestamp[2];
13194 salt->salt_buf[3] = krb5pa->timestamp[3];
13195 salt->salt_buf[4] = krb5pa->timestamp[4];
13196 salt->salt_buf[5] = krb5pa->timestamp[5];
13197 salt->salt_buf[6] = krb5pa->timestamp[6];
13198 salt->salt_buf[7] = krb5pa->timestamp[7];
13199 salt->salt_buf[8] = krb5pa->timestamp[8];
13200
13201 salt->salt_len = 36;
13202
13203 digest[0] = krb5pa->checksum[0];
13204 digest[1] = krb5pa->checksum[1];
13205 digest[2] = krb5pa->checksum[2];
13206 digest[3] = krb5pa->checksum[3];
13207
13208 return (PARSER_OK);
13209 }
13210
13211 int sapb_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13212 {
13213 if ((input_len < DISPLAY_LEN_MIN_7700) || (input_len > DISPLAY_LEN_MAX_7700)) return (PARSER_GLOBAL_LENGTH);
13214
13215 uint32_t *digest = (uint32_t *) hash_buf->digest;
13216
13217 salt_t *salt = hash_buf->salt;
13218
13219 /**
13220 * parse line
13221 */
13222
13223 char *salt_pos = input_buf;
13224
13225 char *hash_pos = strchr (salt_pos, '$');
13226
13227 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13228
13229 uint salt_len = hash_pos - salt_pos;
13230
13231 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
13232
13233 hash_pos++;
13234
13235 uint hash_len = input_len - 1 - salt_len;
13236
13237 if (hash_len != 16) return (PARSER_HASH_LENGTH);
13238
13239 /**
13240 * valid some data
13241 */
13242
13243 uint user_len = 0;
13244
13245 for (uint i = 0; i < salt_len; i++)
13246 {
13247 if (salt_pos[i] == ' ') continue;
13248
13249 user_len++;
13250 }
13251
13252 // SAP user names cannot be longer than 12 characters
13253 if (user_len > 12) return (PARSER_SALT_LENGTH);
13254
13255 // SAP user name cannot start with ! or ?
13256 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
13257
13258 /**
13259 * copy data
13260 */
13261
13262 char *salt_buf_ptr = (char *) salt->salt_buf;
13263
13264 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13265
13266 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13267
13268 salt->salt_len = salt_len;
13269
13270 digest[0] = hex_to_uint (&hash_pos[0]);
13271 digest[1] = hex_to_uint (&hash_pos[8]);
13272 digest[2] = 0;
13273 digest[3] = 0;
13274
13275 digest[0] = byte_swap_32 (digest[0]);
13276 digest[1] = byte_swap_32 (digest[1]);
13277
13278 return (PARSER_OK);
13279 }
13280
13281 int sapg_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13282 {
13283 if ((input_len < DISPLAY_LEN_MIN_7800) || (input_len > DISPLAY_LEN_MAX_7800)) return (PARSER_GLOBAL_LENGTH);
13284
13285 uint32_t *digest = (uint32_t *) hash_buf->digest;
13286
13287 salt_t *salt = hash_buf->salt;
13288
13289 /**
13290 * parse line
13291 */
13292
13293 char *salt_pos = input_buf;
13294
13295 char *hash_pos = strchr (salt_pos, '$');
13296
13297 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13298
13299 uint salt_len = hash_pos - salt_pos;
13300
13301 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
13302
13303 hash_pos++;
13304
13305 uint hash_len = input_len - 1 - salt_len;
13306
13307 if (hash_len != 40) return (PARSER_HASH_LENGTH);
13308
13309 /**
13310 * valid some data
13311 */
13312
13313 uint user_len = 0;
13314
13315 for (uint i = 0; i < salt_len; i++)
13316 {
13317 if (salt_pos[i] == ' ') continue;
13318
13319 user_len++;
13320 }
13321
13322 // SAP user names cannot be longer than 12 characters
13323 if (user_len > 12) return (PARSER_SALT_LENGTH);
13324
13325 // SAP user name cannot start with ! or ?
13326 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
13327
13328 /**
13329 * copy data
13330 */
13331
13332 char *salt_buf_ptr = (char *) salt->salt_buf;
13333
13334 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13335
13336 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13337
13338 salt->salt_len = salt_len;
13339
13340 digest[0] = hex_to_uint (&hash_pos[ 0]);
13341 digest[1] = hex_to_uint (&hash_pos[ 8]);
13342 digest[2] = hex_to_uint (&hash_pos[16]);
13343 digest[3] = hex_to_uint (&hash_pos[24]);
13344 digest[4] = hex_to_uint (&hash_pos[32]);
13345
13346 return (PARSER_OK);
13347 }
13348
13349 int drupal7_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13350 {
13351 if ((input_len < DISPLAY_LEN_MIN_7900) || (input_len > DISPLAY_LEN_MAX_7900)) return (PARSER_GLOBAL_LENGTH);
13352
13353 if (memcmp (SIGNATURE_DRUPAL7, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
13354
13355 uint64_t *digest = (uint64_t *) hash_buf->digest;
13356
13357 salt_t *salt = hash_buf->salt;
13358
13359 char *iter_pos = input_buf + 3;
13360
13361 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
13362
13363 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
13364
13365 memcpy ((char *) salt->salt_sign, input_buf, 4);
13366
13367 salt->salt_iter = salt_iter;
13368
13369 char *salt_pos = iter_pos + 1;
13370
13371 uint salt_len = 8;
13372
13373 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13374
13375 salt->salt_len = salt_len;
13376
13377 char *hash_pos = salt_pos + salt_len;
13378
13379 drupal7_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13380
13381 // ugly hack start
13382
13383 char *tmp = (char *) salt->salt_buf_pc;
13384
13385 tmp[0] = hash_pos[42];
13386
13387 // ugly hack end
13388
13389 digest[ 0] = byte_swap_64 (digest[ 0]);
13390 digest[ 1] = byte_swap_64 (digest[ 1]);
13391 digest[ 2] = byte_swap_64 (digest[ 2]);
13392 digest[ 3] = byte_swap_64 (digest[ 3]);
13393 digest[ 4] = 0;
13394 digest[ 5] = 0;
13395 digest[ 6] = 0;
13396 digest[ 7] = 0;
13397
13398 return (PARSER_OK);
13399 }
13400
13401 int sybasease_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13402 {
13403 if ((input_len < DISPLAY_LEN_MIN_8000) || (input_len > DISPLAY_LEN_MAX_8000)) return (PARSER_GLOBAL_LENGTH);
13404
13405 if (memcmp (SIGNATURE_SYBASEASE, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
13406
13407 uint32_t *digest = (uint32_t *) hash_buf->digest;
13408
13409 salt_t *salt = hash_buf->salt;
13410
13411 char *salt_buf = input_buf + 6;
13412
13413 uint salt_len = 16;
13414
13415 char *salt_buf_ptr = (char *) salt->salt_buf;
13416
13417 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13418
13419 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13420
13421 salt->salt_len = salt_len;
13422
13423 char *hash_pos = input_buf + 6 + 16;
13424
13425 digest[0] = hex_to_uint (&hash_pos[ 0]);
13426 digest[1] = hex_to_uint (&hash_pos[ 8]);
13427 digest[2] = hex_to_uint (&hash_pos[16]);
13428 digest[3] = hex_to_uint (&hash_pos[24]);
13429 digest[4] = hex_to_uint (&hash_pos[32]);
13430 digest[5] = hex_to_uint (&hash_pos[40]);
13431 digest[6] = hex_to_uint (&hash_pos[48]);
13432 digest[7] = hex_to_uint (&hash_pos[56]);
13433
13434 return (PARSER_OK);
13435 }
13436
13437 int mysql323_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13438 {
13439 if ((input_len < DISPLAY_LEN_MIN_200) || (input_len > DISPLAY_LEN_MAX_200)) return (PARSER_GLOBAL_LENGTH);
13440
13441 uint32_t *digest = (uint32_t *) hash_buf->digest;
13442
13443 digest[0] = hex_to_uint (&input_buf[ 0]);
13444 digest[1] = hex_to_uint (&input_buf[ 8]);
13445 digest[2] = 0;
13446 digest[3] = 0;
13447
13448 return (PARSER_OK);
13449 }
13450
13451 int rakp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13452 {
13453 if ((input_len < DISPLAY_LEN_MIN_7300) || (input_len > DISPLAY_LEN_MAX_7300)) return (PARSER_GLOBAL_LENGTH);
13454
13455 uint32_t *digest = (uint32_t *) hash_buf->digest;
13456
13457 salt_t *salt = hash_buf->salt;
13458
13459 rakp_t *rakp = (rakp_t *) hash_buf->esalt;
13460
13461 char *saltbuf_pos = input_buf;
13462
13463 char *hashbuf_pos = strchr (saltbuf_pos, ':');
13464
13465 if (hashbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13466
13467 uint saltbuf_len = hashbuf_pos - saltbuf_pos;
13468
13469 if (saltbuf_len < 64) return (PARSER_SALT_LENGTH);
13470 if (saltbuf_len > 512) return (PARSER_SALT_LENGTH);
13471
13472 if (saltbuf_len & 1) return (PARSER_SALT_LENGTH); // muss gerade sein wegen hex
13473
13474 hashbuf_pos++;
13475
13476 uint hashbuf_len = input_len - saltbuf_len - 1;
13477
13478 if (hashbuf_len != 40) return (PARSER_HASH_LENGTH);
13479
13480 char *salt_ptr = (char *) saltbuf_pos;
13481 char *rakp_ptr = (char *) rakp->salt_buf;
13482
13483 uint i;
13484 uint j;
13485
13486 for (i = 0, j = 0; i < saltbuf_len; i += 2, j += 1)
13487 {
13488 rakp_ptr[j] = hex_to_char (&salt_ptr[i]);
13489 }
13490
13491 rakp_ptr[j] = 0x80;
13492
13493 rakp->salt_len = j;
13494
13495 for (i = 0; i < 64; i++)
13496 {
13497 rakp->salt_buf[i] = byte_swap_32 (rakp->salt_buf[i]);
13498 }
13499
13500 salt->salt_buf[0] = rakp->salt_buf[0];
13501 salt->salt_buf[1] = rakp->salt_buf[1];
13502 salt->salt_buf[2] = rakp->salt_buf[2];
13503 salt->salt_buf[3] = rakp->salt_buf[3];
13504 salt->salt_buf[4] = rakp->salt_buf[4];
13505 salt->salt_buf[5] = rakp->salt_buf[5];
13506 salt->salt_buf[6] = rakp->salt_buf[6];
13507 salt->salt_buf[7] = rakp->salt_buf[7];
13508
13509 salt->salt_len = 32; // muss min. 32 haben
13510
13511 digest[0] = hex_to_uint (&hashbuf_pos[ 0]);
13512 digest[1] = hex_to_uint (&hashbuf_pos[ 8]);
13513 digest[2] = hex_to_uint (&hashbuf_pos[16]);
13514 digest[3] = hex_to_uint (&hashbuf_pos[24]);
13515 digest[4] = hex_to_uint (&hashbuf_pos[32]);
13516
13517 return (PARSER_OK);
13518 }
13519
13520 int netscaler_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13521 {
13522 if ((input_len < DISPLAY_LEN_MIN_8100) || (input_len > DISPLAY_LEN_MAX_8100)) return (PARSER_GLOBAL_LENGTH);
13523
13524 uint32_t *digest = (uint32_t *) hash_buf->digest;
13525
13526 salt_t *salt = hash_buf->salt;
13527
13528 if (memcmp (SIGNATURE_NETSCALER, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
13529
13530 char *salt_pos = input_buf + 1;
13531
13532 memcpy (salt->salt_buf, salt_pos, 8);
13533
13534 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
13535 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
13536
13537 salt->salt_len = 8;
13538
13539 char *hash_pos = salt_pos + 8;
13540
13541 digest[0] = hex_to_uint (&hash_pos[ 0]);
13542 digest[1] = hex_to_uint (&hash_pos[ 8]);
13543 digest[2] = hex_to_uint (&hash_pos[16]);
13544 digest[3] = hex_to_uint (&hash_pos[24]);
13545 digest[4] = hex_to_uint (&hash_pos[32]);
13546
13547 digest[0] -= SHA1M_A;
13548 digest[1] -= SHA1M_B;
13549 digest[2] -= SHA1M_C;
13550 digest[3] -= SHA1M_D;
13551 digest[4] -= SHA1M_E;
13552
13553 return (PARSER_OK);
13554 }
13555
13556 int chap_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13557 {
13558 if ((input_len < DISPLAY_LEN_MIN_4800) || (input_len > DISPLAY_LEN_MAX_4800)) return (PARSER_GLOBAL_LENGTH);
13559
13560 uint32_t *digest = (uint32_t *) hash_buf->digest;
13561
13562 salt_t *salt = hash_buf->salt;
13563
13564 digest[0] = hex_to_uint (&input_buf[ 0]);
13565 digest[1] = hex_to_uint (&input_buf[ 8]);
13566 digest[2] = hex_to_uint (&input_buf[16]);
13567 digest[3] = hex_to_uint (&input_buf[24]);
13568
13569 digest[0] = byte_swap_32 (digest[0]);
13570 digest[1] = byte_swap_32 (digest[1]);
13571 digest[2] = byte_swap_32 (digest[2]);
13572 digest[3] = byte_swap_32 (digest[3]);
13573
13574 digest[0] -= MD5M_A;
13575 digest[1] -= MD5M_B;
13576 digest[2] -= MD5M_C;
13577 digest[3] -= MD5M_D;
13578
13579 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13580
13581 char *salt_buf_ptr = input_buf + 32 + 1;
13582
13583 uint32_t *salt_buf = salt->salt_buf;
13584
13585 salt_buf[0] = hex_to_uint (&salt_buf_ptr[ 0]);
13586 salt_buf[1] = hex_to_uint (&salt_buf_ptr[ 8]);
13587 salt_buf[2] = hex_to_uint (&salt_buf_ptr[16]);
13588 salt_buf[3] = hex_to_uint (&salt_buf_ptr[24]);
13589
13590 salt_buf[0] = byte_swap_32 (salt_buf[0]);
13591 salt_buf[1] = byte_swap_32 (salt_buf[1]);
13592 salt_buf[2] = byte_swap_32 (salt_buf[2]);
13593 salt_buf[3] = byte_swap_32 (salt_buf[3]);
13594
13595 salt->salt_len = 16 + 1;
13596
13597 if (input_buf[65] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13598
13599 char *idbyte_buf_ptr = input_buf + 32 + 1 + 32 + 1;
13600
13601 salt_buf[4] = hex_to_char (&idbyte_buf_ptr[0]) & 0xff;
13602
13603 return (PARSER_OK);
13604 }
13605
13606 int cloudkey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13607 {
13608 if ((input_len < DISPLAY_LEN_MIN_8200) || (input_len > DISPLAY_LEN_MAX_8200)) return (PARSER_GLOBAL_LENGTH);
13609
13610 uint32_t *digest = (uint32_t *) hash_buf->digest;
13611
13612 salt_t *salt = hash_buf->salt;
13613
13614 cloudkey_t *cloudkey = (cloudkey_t *) hash_buf->esalt;
13615
13616 /**
13617 * parse line
13618 */
13619
13620 char *hashbuf_pos = input_buf;
13621
13622 char *saltbuf_pos = strchr (hashbuf_pos, ':');
13623
13624 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13625
13626 const uint hashbuf_len = saltbuf_pos - hashbuf_pos;
13627
13628 if (hashbuf_len != 64) return (PARSER_HASH_LENGTH);
13629
13630 saltbuf_pos++;
13631
13632 char *iteration_pos = strchr (saltbuf_pos, ':');
13633
13634 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13635
13636 const uint saltbuf_len = iteration_pos - saltbuf_pos;
13637
13638 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
13639
13640 iteration_pos++;
13641
13642 char *databuf_pos = strchr (iteration_pos, ':');
13643
13644 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13645
13646 const uint iteration_len = databuf_pos - iteration_pos;
13647
13648 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
13649 if (iteration_len > 8) return (PARSER_SALT_ITERATION);
13650
13651 const uint databuf_len = input_len - hashbuf_len - 1 - saltbuf_len - 1 - iteration_len - 1;
13652
13653 if (databuf_len < 1) return (PARSER_SALT_LENGTH);
13654 if (databuf_len > 2048) return (PARSER_SALT_LENGTH);
13655
13656 databuf_pos++;
13657
13658 // digest
13659
13660 digest[0] = hex_to_uint (&hashbuf_pos[ 0]);
13661 digest[1] = hex_to_uint (&hashbuf_pos[ 8]);
13662 digest[2] = hex_to_uint (&hashbuf_pos[16]);
13663 digest[3] = hex_to_uint (&hashbuf_pos[24]);
13664 digest[4] = hex_to_uint (&hashbuf_pos[32]);
13665 digest[5] = hex_to_uint (&hashbuf_pos[40]);
13666 digest[6] = hex_to_uint (&hashbuf_pos[48]);
13667 digest[7] = hex_to_uint (&hashbuf_pos[56]);
13668
13669 // salt
13670
13671 char *saltbuf_ptr = (char *) salt->salt_buf;
13672
13673 for (uint i = 0; i < saltbuf_len; i += 2)
13674 {
13675 const char p0 = saltbuf_pos[i + 0];
13676 const char p1 = saltbuf_pos[i + 1];
13677
13678 *saltbuf_ptr++ = hex_convert (p1) << 0
13679 | hex_convert (p0) << 4;
13680 }
13681
13682 salt->salt_buf[4] = 0x01000000;
13683 salt->salt_buf[5] = 0x80;
13684
13685 salt->salt_len = saltbuf_len / 2;
13686
13687 // iteration
13688
13689 salt->salt_iter = atoi (iteration_pos) - 1;
13690
13691 // data
13692
13693 char *databuf_ptr = (char *) cloudkey->data_buf;
13694
13695 for (uint i = 0; i < databuf_len; i += 2)
13696 {
13697 const char p0 = databuf_pos[i + 0];
13698 const char p1 = databuf_pos[i + 1];
13699
13700 *databuf_ptr++ = hex_convert (p1) << 0
13701 | hex_convert (p0) << 4;
13702 }
13703
13704 *databuf_ptr++ = 0x80;
13705
13706 for (uint i = 0; i < 512; i++)
13707 {
13708 cloudkey->data_buf[i] = byte_swap_32 (cloudkey->data_buf[i]);
13709 }
13710
13711 cloudkey->data_len = databuf_len / 2;
13712
13713 return (PARSER_OK);
13714 }
13715
13716 int nsec3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13717 {
13718 if ((input_len < DISPLAY_LEN_MIN_8300) || (input_len > DISPLAY_LEN_MAX_8300)) return (PARSER_GLOBAL_LENGTH);
13719
13720 uint32_t *digest = (uint32_t *) hash_buf->digest;
13721
13722 salt_t *salt = hash_buf->salt;
13723
13724 /**
13725 * parse line
13726 */
13727
13728 char *hashbuf_pos = input_buf;
13729
13730 char *domainbuf_pos = strchr (hashbuf_pos, ':');
13731
13732 if (domainbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13733
13734 const uint hashbuf_len = domainbuf_pos - hashbuf_pos;
13735
13736 if (hashbuf_len != 32) return (PARSER_HASH_LENGTH);
13737
13738 domainbuf_pos++;
13739
13740 if (domainbuf_pos[0] != '.') return (PARSER_SALT_VALUE);
13741
13742 char *saltbuf_pos = strchr (domainbuf_pos, ':');
13743
13744 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13745
13746 const uint domainbuf_len = saltbuf_pos - domainbuf_pos;
13747
13748 if (domainbuf_len >= 32) return (PARSER_SALT_LENGTH);
13749
13750 saltbuf_pos++;
13751
13752 char *iteration_pos = strchr (saltbuf_pos, ':');
13753
13754 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13755
13756 const uint saltbuf_len = iteration_pos - saltbuf_pos;
13757
13758 if (saltbuf_len >= 28) return (PARSER_SALT_LENGTH); // 28 = 32 - 4; 4 = length
13759
13760 if ((domainbuf_len + saltbuf_len) >= 48) return (PARSER_SALT_LENGTH);
13761
13762 iteration_pos++;
13763
13764 const uint iteration_len = input_len - hashbuf_len - 1 - domainbuf_len - 1 - saltbuf_len - 1;
13765
13766 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
13767 if (iteration_len > 5) return (PARSER_SALT_ITERATION);
13768
13769 // ok, the plan for this algorithm is the following:
13770 // we have 2 salts here, the domain-name and a random salt
13771 // while both are used in the initial transformation,
13772 // only the random salt is used in the following iterations
13773 // so we create two buffer, one that includes domain-name (stored into salt_buf_pc[])
13774 // and one that includes only the real salt (stored into salt_buf[]).
13775 // the domain-name length is put into array position 7 of salt_buf_pc[] since there is not salt_pc_len
13776
13777 char tmp_buf[100]; memset (tmp_buf, 0, sizeof (tmp_buf));
13778
13779 base32_decode (itoa32_to_int, hashbuf_pos, 32, tmp_buf);
13780
13781 memcpy (digest, tmp_buf, 20);
13782
13783 digest[0] = byte_swap_32 (digest[0]);
13784 digest[1] = byte_swap_32 (digest[1]);
13785 digest[2] = byte_swap_32 (digest[2]);
13786 digest[3] = byte_swap_32 (digest[3]);
13787 digest[4] = byte_swap_32 (digest[4]);
13788
13789 // domain
13790
13791 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
13792
13793 memcpy (salt_buf_pc_ptr, domainbuf_pos, domainbuf_len);
13794
13795 char *len_ptr = NULL;
13796
13797 for (uint i = 0; i < domainbuf_len; i++)
13798 {
13799 if (salt_buf_pc_ptr[i] == '.')
13800 {
13801 len_ptr = &salt_buf_pc_ptr[i];
13802
13803 *len_ptr = 0;
13804 }
13805 else
13806 {
13807 *len_ptr += 1;
13808 }
13809 }
13810
13811 salt->salt_buf_pc[7] = domainbuf_len;
13812
13813 // "real" salt
13814
13815 char *salt_buf_ptr = (char *) salt->salt_buf;
13816
13817 const uint salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, saltbuf_len);
13818
13819 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13820
13821 salt->salt_len = salt_len;
13822
13823 // iteration
13824
13825 salt->salt_iter = atoi (iteration_pos);
13826
13827 return (PARSER_OK);
13828 }
13829
13830 int wbb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13831 {
13832 if ((input_len < DISPLAY_LEN_MIN_8400) || (input_len > DISPLAY_LEN_MAX_8400)) return (PARSER_GLOBAL_LENGTH);
13833
13834 uint32_t *digest = (uint32_t *) hash_buf->digest;
13835
13836 salt_t *salt = hash_buf->salt;
13837
13838 digest[0] = hex_to_uint (&input_buf[ 0]);
13839 digest[1] = hex_to_uint (&input_buf[ 8]);
13840 digest[2] = hex_to_uint (&input_buf[16]);
13841 digest[3] = hex_to_uint (&input_buf[24]);
13842 digest[4] = hex_to_uint (&input_buf[32]);
13843
13844 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13845
13846 uint salt_len = input_len - 40 - 1;
13847
13848 char *salt_buf = input_buf + 40 + 1;
13849
13850 char *salt_buf_ptr = (char *) salt->salt_buf;
13851
13852 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13853
13854 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13855
13856 salt->salt_len = salt_len;
13857
13858 return (PARSER_OK);
13859 }
13860
13861 int racf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13862 {
13863 const uint8_t ascii_to_ebcdic[] =
13864 {
13865 0x00, 0x01, 0x02, 0x03, 0x37, 0x2d, 0x2e, 0x2f, 0x16, 0x05, 0x25, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
13866 0x10, 0x11, 0x12, 0x13, 0x3c, 0x3d, 0x32, 0x26, 0x18, 0x19, 0x3f, 0x27, 0x1c, 0x1d, 0x1e, 0x1f,
13867 0x40, 0x4f, 0x7f, 0x7b, 0x5b, 0x6c, 0x50, 0x7d, 0x4d, 0x5d, 0x5c, 0x4e, 0x6b, 0x60, 0x4b, 0x61,
13868 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0x7a, 0x5e, 0x4c, 0x7e, 0x6e, 0x6f,
13869 0x7c, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6,
13870 0xd7, 0xd8, 0xd9, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0x4a, 0xe0, 0x5a, 0x5f, 0x6d,
13871 0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
13872 0x97, 0x98, 0x99, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xc0, 0x6a, 0xd0, 0xa1, 0x07,
13873 0x20, 0x21, 0x22, 0x23, 0x24, 0x15, 0x06, 0x17, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x09, 0x0a, 0x1b,
13874 0x30, 0x31, 0x1a, 0x33, 0x34, 0x35, 0x36, 0x08, 0x38, 0x39, 0x3a, 0x3b, 0x04, 0x14, 0x3e, 0xe1,
13875 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
13876 0x58, 0x59, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75,
13877 0x76, 0x77, 0x78, 0x80, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e,
13878 0x9f, 0xa0, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
13879 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xda, 0xdb,
13880 0xdc, 0xdd, 0xde, 0xdf, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
13881 };
13882
13883 if ((input_len < DISPLAY_LEN_MIN_8500) || (input_len > DISPLAY_LEN_MAX_8500)) return (PARSER_GLOBAL_LENGTH);
13884
13885 if (memcmp (SIGNATURE_RACF, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
13886
13887 uint32_t *digest = (uint32_t *) hash_buf->digest;
13888
13889 salt_t *salt = hash_buf->salt;
13890
13891 char *salt_pos = input_buf + 6 + 1;
13892
13893 char *digest_pos = strchr (salt_pos, '*');
13894
13895 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13896
13897 uint salt_len = digest_pos - salt_pos;
13898
13899 if (salt_len > 8) return (PARSER_SALT_LENGTH);
13900
13901 uint hash_len = input_len - 1 - salt_len - 1 - 6;
13902
13903 if (hash_len != 16) return (PARSER_HASH_LENGTH);
13904
13905 digest_pos++;
13906
13907 char *salt_buf_ptr = (char *) salt->salt_buf;
13908 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
13909
13910 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13911
13912 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13913
13914 salt->salt_len = salt_len;
13915
13916 for (uint i = 0; i < salt_len; i++)
13917 {
13918 salt_buf_pc_ptr[i] = ascii_to_ebcdic[(int) salt_buf_ptr[i]];
13919 }
13920 for (uint i = salt_len; i < 8; i++)
13921 {
13922 salt_buf_pc_ptr[i] = 0x40;
13923 }
13924
13925 uint tt;
13926
13927 IP (salt->salt_buf_pc[0], salt->salt_buf_pc[1], tt);
13928
13929 salt->salt_buf_pc[0] = ROTATE_LEFT (salt->salt_buf_pc[0], 3u);
13930 salt->salt_buf_pc[1] = ROTATE_LEFT (salt->salt_buf_pc[1], 3u);
13931
13932 digest[0] = hex_to_uint (&digest_pos[ 0]);
13933 digest[1] = hex_to_uint (&digest_pos[ 8]);
13934
13935 digest[0] = byte_swap_32 (digest[0]);
13936 digest[1] = byte_swap_32 (digest[1]);
13937
13938 IP (digest[0], digest[1], tt);
13939
13940 digest[0] = ROTATE_RIGHT (digest[0], 29);
13941 digest[1] = ROTATE_RIGHT (digest[1], 29);
13942 digest[2] = 0;
13943 digest[3] = 0;
13944
13945 return (PARSER_OK);
13946 }
13947
13948 int lotus5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13949 {
13950 if ((input_len < DISPLAY_LEN_MIN_8600) || (input_len > DISPLAY_LEN_MAX_8600)) return (PARSER_GLOBAL_LENGTH);
13951
13952 uint32_t *digest = (uint32_t *) hash_buf->digest;
13953
13954 digest[0] = hex_to_uint (&input_buf[ 0]);
13955 digest[1] = hex_to_uint (&input_buf[ 8]);
13956 digest[2] = hex_to_uint (&input_buf[16]);
13957 digest[3] = hex_to_uint (&input_buf[24]);
13958
13959 digest[0] = byte_swap_32 (digest[0]);
13960 digest[1] = byte_swap_32 (digest[1]);
13961 digest[2] = byte_swap_32 (digest[2]);
13962 digest[3] = byte_swap_32 (digest[3]);
13963
13964 return (PARSER_OK);
13965 }
13966
13967 int lotus6_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13968 {
13969 if ((input_len < DISPLAY_LEN_MIN_8700) || (input_len > DISPLAY_LEN_MAX_8700)) return (PARSER_GLOBAL_LENGTH);
13970
13971 if ((input_buf[0] != '(') || (input_buf[1] != 'G') || (input_buf[21] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
13972
13973 uint32_t *digest = (uint32_t *) hash_buf->digest;
13974
13975 salt_t *salt = hash_buf->salt;
13976
13977 char tmp_buf[120];
13978
13979 memset (tmp_buf, 0, sizeof (tmp_buf));
13980
13981 base64_decode (lotus64_to_int, input_buf + 2, input_len - 3, tmp_buf);
13982
13983 tmp_buf[3] += -4; // dont ask!
13984
13985 memcpy (salt->salt_buf, tmp_buf, 5);
13986
13987 salt->salt_len = 5;
13988
13989 memcpy (digest, tmp_buf + 5, 9);
13990
13991 // yes, only 9 byte are needed to crack, but 10 to display
13992
13993 salt->salt_buf_pc[7] = input_buf[20];
13994
13995 return (PARSER_OK);
13996 }
13997
13998 int lotus8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13999 {
14000 if ((input_len < DISPLAY_LEN_MIN_9100) || (input_len > DISPLAY_LEN_MAX_9100)) return (PARSER_GLOBAL_LENGTH);
14001
14002 if ((input_buf[0] != '(') || (input_buf[1] != 'H') || (input_buf[DISPLAY_LEN_MAX_9100 - 1] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
14003
14004 uint32_t *digest = (uint32_t *) hash_buf->digest;
14005
14006 salt_t *salt = hash_buf->salt;
14007
14008 char tmp_buf[120];
14009
14010 memset (tmp_buf, 0, sizeof (tmp_buf));
14011
14012 base64_decode (lotus64_to_int, input_buf + 2, input_len - 3, tmp_buf);
14013
14014 tmp_buf[3] += -4; // dont ask!
14015
14016 // salt
14017
14018 memcpy (salt->salt_buf, tmp_buf, 16);
14019
14020 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)
14021
14022 // iteration
14023
14024 char tmp_iter_buf[11];
14025
14026 memcpy (tmp_iter_buf, tmp_buf + 16, 10);
14027
14028 tmp_iter_buf[10] = 0;
14029
14030 salt->salt_iter = atoi (tmp_iter_buf);
14031
14032 if (salt->salt_iter < 1) // well, the limit hopefully is much higher
14033 {
14034 return (PARSER_SALT_ITERATION);
14035 }
14036
14037 salt->salt_iter--; // first round in init
14038
14039 // 2 additional bytes for display only
14040
14041 salt->salt_buf_pc[0] = tmp_buf[26];
14042 salt->salt_buf_pc[1] = tmp_buf[27];
14043
14044 // digest
14045
14046 memcpy (digest, tmp_buf + 28, 8);
14047
14048 digest[0] = byte_swap_32 (digest[0]);
14049 digest[1] = byte_swap_32 (digest[1]);
14050 digest[2] = 0;
14051 digest[3] = 0;
14052
14053 return (PARSER_OK);
14054 }
14055
14056 int hmailserver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14057 {
14058 if ((input_len < DISPLAY_LEN_MIN_1421) || (input_len > DISPLAY_LEN_MAX_1421)) return (PARSER_GLOBAL_LENGTH);
14059
14060 uint32_t *digest = (uint32_t *) hash_buf->digest;
14061
14062 salt_t *salt = hash_buf->salt;
14063
14064 char *salt_buf_pos = input_buf;
14065
14066 char *hash_buf_pos = salt_buf_pos + 6;
14067
14068 digest[0] = hex_to_uint (&hash_buf_pos[ 0]);
14069 digest[1] = hex_to_uint (&hash_buf_pos[ 8]);
14070 digest[2] = hex_to_uint (&hash_buf_pos[16]);
14071 digest[3] = hex_to_uint (&hash_buf_pos[24]);
14072 digest[4] = hex_to_uint (&hash_buf_pos[32]);
14073 digest[5] = hex_to_uint (&hash_buf_pos[40]);
14074 digest[6] = hex_to_uint (&hash_buf_pos[48]);
14075 digest[7] = hex_to_uint (&hash_buf_pos[56]);
14076
14077 digest[0] -= SHA256M_A;
14078 digest[1] -= SHA256M_B;
14079 digest[2] -= SHA256M_C;
14080 digest[3] -= SHA256M_D;
14081 digest[4] -= SHA256M_E;
14082 digest[5] -= SHA256M_F;
14083 digest[6] -= SHA256M_G;
14084 digest[7] -= SHA256M_H;
14085
14086 char *salt_buf_ptr = (char *) salt->salt_buf;
14087
14088 const uint salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf_pos, 6);
14089
14090 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14091
14092 salt->salt_len = salt_len;
14093
14094 return (PARSER_OK);
14095 }
14096
14097 int phps_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14098 {
14099 if ((input_len < DISPLAY_LEN_MIN_2612) || (input_len > DISPLAY_LEN_MAX_2612)) return (PARSER_GLOBAL_LENGTH);
14100
14101 uint32_t *digest = (uint32_t *) hash_buf->digest;
14102
14103 if (memcmp (SIGNATURE_PHPS, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14104
14105 salt_t *salt = hash_buf->salt;
14106
14107 char *salt_buf = input_buf + 6;
14108
14109 char *digest_buf = strchr (salt_buf, '$');
14110
14111 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14112
14113 uint salt_len = digest_buf - salt_buf;
14114
14115 digest_buf++; // skip the '$' symbol
14116
14117 char *salt_buf_ptr = (char *) salt->salt_buf;
14118
14119 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14120
14121 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14122
14123 salt->salt_len = salt_len;
14124
14125 digest[0] = hex_to_uint (&digest_buf[ 0]);
14126 digest[1] = hex_to_uint (&digest_buf[ 8]);
14127 digest[2] = hex_to_uint (&digest_buf[16]);
14128 digest[3] = hex_to_uint (&digest_buf[24]);
14129
14130 digest[0] = byte_swap_32 (digest[0]);
14131 digest[1] = byte_swap_32 (digest[1]);
14132 digest[2] = byte_swap_32 (digest[2]);
14133 digest[3] = byte_swap_32 (digest[3]);
14134
14135 digest[0] -= MD5M_A;
14136 digest[1] -= MD5M_B;
14137 digest[2] -= MD5M_C;
14138 digest[3] -= MD5M_D;
14139
14140 return (PARSER_OK);
14141 }
14142
14143 int mediawiki_b_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14144 {
14145 if ((input_len < DISPLAY_LEN_MIN_3711) || (input_len > DISPLAY_LEN_MAX_3711)) return (PARSER_GLOBAL_LENGTH);
14146
14147 if (memcmp (SIGNATURE_MEDIAWIKI_B, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14148
14149 uint32_t *digest = (uint32_t *) hash_buf->digest;
14150
14151 salt_t *salt = hash_buf->salt;
14152
14153 char *salt_buf = input_buf + 3;
14154
14155 char *digest_buf = strchr (salt_buf, '$');
14156
14157 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14158
14159 uint salt_len = digest_buf - salt_buf;
14160
14161 digest_buf++; // skip the '$' symbol
14162
14163 char *salt_buf_ptr = (char *) salt->salt_buf;
14164
14165 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14166
14167 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14168
14169 salt_buf_ptr[salt_len] = 0x2d;
14170
14171 salt->salt_len = salt_len + 1;
14172
14173 digest[0] = hex_to_uint (&digest_buf[ 0]);
14174 digest[1] = hex_to_uint (&digest_buf[ 8]);
14175 digest[2] = hex_to_uint (&digest_buf[16]);
14176 digest[3] = hex_to_uint (&digest_buf[24]);
14177
14178 digest[0] = byte_swap_32 (digest[0]);
14179 digest[1] = byte_swap_32 (digest[1]);
14180 digest[2] = byte_swap_32 (digest[2]);
14181 digest[3] = byte_swap_32 (digest[3]);
14182
14183 digest[0] -= MD5M_A;
14184 digest[1] -= MD5M_B;
14185 digest[2] -= MD5M_C;
14186 digest[3] -= MD5M_D;
14187
14188 return (PARSER_OK);
14189 }
14190
14191 int peoplesoft_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14192 {
14193 if ((input_len < DISPLAY_LEN_MIN_133) || (input_len > DISPLAY_LEN_MAX_133)) return (PARSER_GLOBAL_LENGTH);
14194
14195 uint32_t *digest = (uint32_t *) hash_buf->digest;
14196
14197 char tmp_buf[100];
14198
14199 memset (tmp_buf, 0, sizeof (tmp_buf));
14200
14201 base64_decode (base64_to_int, input_buf, input_len, tmp_buf);
14202
14203 memcpy (digest, tmp_buf, 20);
14204
14205 digest[0] = byte_swap_32 (digest[0]);
14206 digest[1] = byte_swap_32 (digest[1]);
14207 digest[2] = byte_swap_32 (digest[2]);
14208 digest[3] = byte_swap_32 (digest[3]);
14209 digest[4] = byte_swap_32 (digest[4]);
14210
14211 digest[0] -= SHA1M_A;
14212 digest[1] -= SHA1M_B;
14213 digest[2] -= SHA1M_C;
14214 digest[3] -= SHA1M_D;
14215 digest[4] -= SHA1M_E;
14216
14217 return (PARSER_OK);
14218 }
14219
14220 int skype_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14221 {
14222 if ((input_len < DISPLAY_LEN_MIN_23) || (input_len > DISPLAY_LEN_MAX_23)) return (PARSER_GLOBAL_LENGTH);
14223
14224 uint32_t *digest = (uint32_t *) hash_buf->digest;
14225
14226 salt_t *salt = hash_buf->salt;
14227
14228 digest[0] = hex_to_uint (&input_buf[ 0]);
14229 digest[1] = hex_to_uint (&input_buf[ 8]);
14230 digest[2] = hex_to_uint (&input_buf[16]);
14231 digest[3] = hex_to_uint (&input_buf[24]);
14232
14233 digest[0] = byte_swap_32 (digest[0]);
14234 digest[1] = byte_swap_32 (digest[1]);
14235 digest[2] = byte_swap_32 (digest[2]);
14236 digest[3] = byte_swap_32 (digest[3]);
14237
14238 digest[0] -= MD5M_A;
14239 digest[1] -= MD5M_B;
14240 digest[2] -= MD5M_C;
14241 digest[3] -= MD5M_D;
14242
14243 if (input_buf[32] != ':') return (PARSER_SEPARATOR_UNMATCHED);
14244
14245 uint salt_len = input_len - 32 - 1;
14246
14247 char *salt_buf = input_buf + 32 + 1;
14248
14249 char *salt_buf_ptr = (char *) salt->salt_buf;
14250
14251 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14252
14253 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14254
14255 /*
14256 * add static "salt" part
14257 */
14258
14259 memcpy (salt_buf_ptr + salt_len, "\nskyper\n", 8);
14260
14261 salt_len += 8;
14262
14263 salt->salt_len = salt_len;
14264
14265 return (PARSER_OK);
14266 }
14267
14268 int androidfde_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14269 {
14270 if ((input_len < DISPLAY_LEN_MIN_8800) || (input_len > DISPLAY_LEN_MAX_8800)) return (PARSER_GLOBAL_LENGTH);
14271
14272 if (memcmp (SIGNATURE_ANDROIDFDE, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
14273
14274 uint32_t *digest = (uint32_t *) hash_buf->digest;
14275
14276 salt_t *salt = hash_buf->salt;
14277
14278 androidfde_t *androidfde = (androidfde_t *) hash_buf->esalt;
14279
14280 /**
14281 * parse line
14282 */
14283
14284 char *saltlen_pos = input_buf + 1 + 3 + 1;
14285
14286 char *saltbuf_pos = strchr (saltlen_pos, '$');
14287
14288 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14289
14290 uint saltlen_len = saltbuf_pos - saltlen_pos;
14291
14292 if (saltlen_len != 2) return (PARSER_SALT_LENGTH);
14293
14294 saltbuf_pos++;
14295
14296 char *keylen_pos = strchr (saltbuf_pos, '$');
14297
14298 if (keylen_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14299
14300 uint saltbuf_len = keylen_pos - saltbuf_pos;
14301
14302 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
14303
14304 keylen_pos++;
14305
14306 char *keybuf_pos = strchr (keylen_pos, '$');
14307
14308 if (keybuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14309
14310 uint keylen_len = keybuf_pos - keylen_pos;
14311
14312 if (keylen_len != 2) return (PARSER_SALT_LENGTH);
14313
14314 keybuf_pos++;
14315
14316 char *databuf_pos = strchr (keybuf_pos, '$');
14317
14318 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14319
14320 uint keybuf_len = databuf_pos - keybuf_pos;
14321
14322 if (keybuf_len != 32) return (PARSER_SALT_LENGTH);
14323
14324 databuf_pos++;
14325
14326 uint data_len = input_len - 1 - 3 - 1 - saltlen_len - 1 - saltbuf_len - 1 - keylen_len - 1 - keybuf_len - 1;
14327
14328 if (data_len != 3072) return (PARSER_SALT_LENGTH);
14329
14330 /**
14331 * copy data
14332 */
14333
14334 digest[0] = hex_to_uint (&keybuf_pos[ 0]);
14335 digest[1] = hex_to_uint (&keybuf_pos[ 8]);
14336 digest[2] = hex_to_uint (&keybuf_pos[16]);
14337 digest[3] = hex_to_uint (&keybuf_pos[24]);
14338
14339 salt->salt_buf[0] = hex_to_uint (&saltbuf_pos[ 0]);
14340 salt->salt_buf[1] = hex_to_uint (&saltbuf_pos[ 8]);
14341 salt->salt_buf[2] = hex_to_uint (&saltbuf_pos[16]);
14342 salt->salt_buf[3] = hex_to_uint (&saltbuf_pos[24]);
14343
14344 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
14345 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
14346 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
14347 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
14348
14349 salt->salt_len = 16;
14350 salt->salt_iter = ROUNDS_ANDROIDFDE - 1;
14351
14352 for (uint i = 0, j = 0; i < 3072; i += 8, j += 1)
14353 {
14354 androidfde->data[j] = hex_to_uint (&databuf_pos[i]);
14355 }
14356
14357 return (PARSER_OK);
14358 }
14359
14360 int scrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14361 {
14362 if ((input_len < DISPLAY_LEN_MIN_8900) || (input_len > DISPLAY_LEN_MAX_8900)) return (PARSER_GLOBAL_LENGTH);
14363
14364 if (memcmp (SIGNATURE_SCRYPT, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14365
14366 uint32_t *digest = (uint32_t *) hash_buf->digest;
14367
14368 salt_t *salt = hash_buf->salt;
14369
14370 /**
14371 * parse line
14372 */
14373
14374 // first is the N salt parameter
14375
14376 char *N_pos = input_buf + 6;
14377
14378 if (N_pos[0] != ':') return (PARSER_SEPARATOR_UNMATCHED);
14379
14380 N_pos++;
14381
14382 salt->scrypt_N = atoi (N_pos);
14383
14384 // r
14385
14386 char *r_pos = strchr (N_pos, ':');
14387
14388 if (r_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14389
14390 r_pos++;
14391
14392 salt->scrypt_r = atoi (r_pos);
14393
14394 // p
14395
14396 char *p_pos = strchr (r_pos, ':');
14397
14398 if (p_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14399
14400 p_pos++;
14401
14402 salt->scrypt_p = atoi (p_pos);
14403
14404 // salt
14405
14406 char *saltbuf_pos = strchr (p_pos, ':');
14407
14408 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14409
14410 saltbuf_pos++;
14411
14412 char *hash_pos = strchr (saltbuf_pos, ':');
14413
14414 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14415
14416 hash_pos++;
14417
14418 // base64 decode
14419
14420 char tmp_buf[32];
14421
14422 memset (tmp_buf, 0, sizeof (tmp_buf));
14423
14424 int tmp_len = base64_decode (base64_to_int, saltbuf_pos, hash_pos - saltbuf_pos, tmp_buf);
14425
14426 char *salt_buf_ptr = (char *) salt->salt_buf;
14427
14428 memcpy (salt_buf_ptr, tmp_buf, tmp_len);
14429
14430 salt->salt_len = tmp_len;
14431 salt->salt_iter = 1;
14432
14433 // digest - base64 decode
14434
14435 memset (tmp_buf, 0, sizeof (tmp_buf));
14436
14437 tmp_len = input_len - (hash_pos - input_buf);
14438
14439 if (tmp_len != 44) return (PARSER_GLOBAL_LENGTH);
14440
14441 base64_decode (base64_to_int, hash_pos, tmp_len, tmp_buf);
14442
14443 memcpy (digest, tmp_buf, 32);
14444
14445 return (PARSER_OK);
14446 }
14447
14448 int juniper_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14449 {
14450 if ((input_len < DISPLAY_LEN_MIN_501) || (input_len > DISPLAY_LEN_MAX_501)) return (PARSER_GLOBAL_LENGTH);
14451
14452 uint32_t *digest = (uint32_t *) hash_buf->digest;
14453
14454 salt_t *salt = hash_buf->salt;
14455
14456 /**
14457 * parse line
14458 */
14459
14460 char decrypted[76]; // iv + hash
14461
14462 juniper_decrypt_hash (input_buf, decrypted);
14463
14464 char *md5crypt_hash = decrypted + 12;
14465
14466 if (memcmp (md5crypt_hash, "$1$danastre$", 12)) return (PARSER_SALT_VALUE);
14467
14468 salt->salt_iter = ROUNDS_MD5CRYPT;
14469
14470 char *salt_pos = md5crypt_hash + 3;
14471
14472 char *hash_pos = strchr (salt_pos, '$'); // or simply salt_pos + 8
14473
14474 salt->salt_len = hash_pos - salt_pos; // should be 8
14475
14476 memcpy ((char *) salt->salt_buf, salt_pos, salt->salt_len);
14477
14478 hash_pos++;
14479
14480 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
14481
14482 return (PARSER_OK);
14483 }
14484
14485 int cisco8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14486 {
14487 if ((input_len < DISPLAY_LEN_MIN_9200) || (input_len > DISPLAY_LEN_MAX_9200)) return (PARSER_GLOBAL_LENGTH);
14488
14489 if (memcmp (SIGNATURE_CISCO8, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14490
14491 uint32_t *digest = (uint32_t *) hash_buf->digest;
14492
14493 salt_t *salt = hash_buf->salt;
14494
14495 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
14496
14497 /**
14498 * parse line
14499 */
14500
14501 // first is *raw* salt
14502
14503 char *salt_pos = input_buf + 3;
14504
14505 char *hash_pos = strchr (salt_pos, '$');
14506
14507 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14508
14509 uint salt_len = hash_pos - salt_pos;
14510
14511 if (salt_len != 14) return (PARSER_SALT_LENGTH);
14512
14513 hash_pos++;
14514
14515 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
14516
14517 memcpy (salt_buf_ptr, salt_pos, 14);
14518
14519 salt_buf_ptr[17] = 0x01;
14520 salt_buf_ptr[18] = 0x80;
14521
14522 // add some stuff to normal salt to make sorted happy
14523
14524 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
14525 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
14526 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
14527 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
14528
14529 salt->salt_len = salt_len;
14530 salt->salt_iter = ROUNDS_CISCO8 - 1;
14531
14532 // base64 decode hash
14533
14534 char tmp_buf[100];
14535
14536 memset (tmp_buf, 0, sizeof (tmp_buf));
14537
14538 uint hash_len = input_len - 3 - salt_len - 1;
14539
14540 int tmp_len = base64_decode (itoa64_to_int, hash_pos, hash_len, tmp_buf);
14541
14542 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
14543
14544 memcpy (digest, tmp_buf, 32);
14545
14546 digest[0] = byte_swap_32 (digest[0]);
14547 digest[1] = byte_swap_32 (digest[1]);
14548 digest[2] = byte_swap_32 (digest[2]);
14549 digest[3] = byte_swap_32 (digest[3]);
14550 digest[4] = byte_swap_32 (digest[4]);
14551 digest[5] = byte_swap_32 (digest[5]);
14552 digest[6] = byte_swap_32 (digest[6]);
14553 digest[7] = byte_swap_32 (digest[7]);
14554
14555 return (PARSER_OK);
14556 }
14557
14558 int cisco9_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14559 {
14560 if ((input_len < DISPLAY_LEN_MIN_9300) || (input_len > DISPLAY_LEN_MAX_9300)) return (PARSER_GLOBAL_LENGTH);
14561
14562 if (memcmp (SIGNATURE_CISCO9, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14563
14564 uint32_t *digest = (uint32_t *) hash_buf->digest;
14565
14566 salt_t *salt = hash_buf->salt;
14567
14568 /**
14569 * parse line
14570 */
14571
14572 // first is *raw* salt
14573
14574 char *salt_pos = input_buf + 3;
14575
14576 char *hash_pos = strchr (salt_pos, '$');
14577
14578 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14579
14580 uint salt_len = hash_pos - salt_pos;
14581
14582 if (salt_len != 14) return (PARSER_SALT_LENGTH);
14583
14584 salt->salt_len = salt_len;
14585 hash_pos++;
14586
14587 char *salt_buf_ptr = (char *) salt->salt_buf;
14588
14589 memcpy (salt_buf_ptr, salt_pos, salt_len);
14590 salt_buf_ptr[salt_len] = 0;
14591
14592 // base64 decode hash
14593
14594 char tmp_buf[100];
14595
14596 memset (tmp_buf, 0, sizeof (tmp_buf));
14597
14598 uint hash_len = input_len - 3 - salt_len - 1;
14599
14600 int tmp_len = base64_decode (itoa64_to_int, hash_pos, hash_len, tmp_buf);
14601
14602 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
14603
14604 memcpy (digest, tmp_buf, 32);
14605
14606 // fixed:
14607 salt->scrypt_N = 16384;
14608 salt->scrypt_r = 1;
14609 salt->scrypt_p = 1;
14610 salt->salt_iter = 1;
14611
14612 return (PARSER_OK);
14613 }
14614
14615 int office2007_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14616 {
14617 if ((input_len < DISPLAY_LEN_MIN_9400) || (input_len > DISPLAY_LEN_MAX_9400)) return (PARSER_GLOBAL_LENGTH);
14618
14619 if (memcmp (SIGNATURE_OFFICE2007, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
14620
14621 uint32_t *digest = (uint32_t *) hash_buf->digest;
14622
14623 salt_t *salt = hash_buf->salt;
14624
14625 office2007_t *office2007 = (office2007_t *) hash_buf->esalt;
14626
14627 /**
14628 * parse line
14629 */
14630
14631 char *version_pos = input_buf + 8 + 1;
14632
14633 char *verifierHashSize_pos = strchr (version_pos, '*');
14634
14635 if (verifierHashSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14636
14637 uint32_t version_len = verifierHashSize_pos - version_pos;
14638
14639 if (version_len != 4) return (PARSER_SALT_LENGTH);
14640
14641 verifierHashSize_pos++;
14642
14643 char *keySize_pos = strchr (verifierHashSize_pos, '*');
14644
14645 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14646
14647 uint32_t verifierHashSize_len = keySize_pos - verifierHashSize_pos;
14648
14649 if (verifierHashSize_len != 2) return (PARSER_SALT_LENGTH);
14650
14651 keySize_pos++;
14652
14653 char *saltSize_pos = strchr (keySize_pos, '*');
14654
14655 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14656
14657 uint32_t keySize_len = saltSize_pos - keySize_pos;
14658
14659 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
14660
14661 saltSize_pos++;
14662
14663 char *osalt_pos = strchr (saltSize_pos, '*');
14664
14665 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14666
14667 uint32_t saltSize_len = osalt_pos - saltSize_pos;
14668
14669 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
14670
14671 osalt_pos++;
14672
14673 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
14674
14675 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14676
14677 uint32_t osalt_len = encryptedVerifier_pos - osalt_pos;
14678
14679 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
14680
14681 encryptedVerifier_pos++;
14682
14683 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
14684
14685 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14686
14687 uint32_t encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
14688
14689 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
14690
14691 encryptedVerifierHash_pos++;
14692
14693 uint32_t encryptedVerifierHash_len = input_len - 8 - 1 - version_len - 1 - verifierHashSize_len - 1 - keySize_len - 1 - saltSize_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
14694
14695 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
14696
14697 const uint version = atoi (version_pos);
14698
14699 if (version != 2007) return (PARSER_SALT_VALUE);
14700
14701 const uint verifierHashSize = atoi (verifierHashSize_pos);
14702
14703 if (verifierHashSize != 20) return (PARSER_SALT_VALUE);
14704
14705 const uint keySize = atoi (keySize_pos);
14706
14707 if ((keySize != 128) && (keySize != 256)) return (PARSER_SALT_VALUE);
14708
14709 office2007->keySize = keySize;
14710
14711 const uint saltSize = atoi (saltSize_pos);
14712
14713 if (saltSize != 16) return (PARSER_SALT_VALUE);
14714
14715 /**
14716 * salt
14717 */
14718
14719 salt->salt_len = 16;
14720 salt->salt_iter = ROUNDS_OFFICE2007;
14721
14722 salt->salt_buf[0] = hex_to_uint (&osalt_pos[ 0]);
14723 salt->salt_buf[1] = hex_to_uint (&osalt_pos[ 8]);
14724 salt->salt_buf[2] = hex_to_uint (&osalt_pos[16]);
14725 salt->salt_buf[3] = hex_to_uint (&osalt_pos[24]);
14726
14727 /**
14728 * esalt
14729 */
14730
14731 office2007->encryptedVerifier[0] = hex_to_uint (&encryptedVerifier_pos[ 0]);
14732 office2007->encryptedVerifier[1] = hex_to_uint (&encryptedVerifier_pos[ 8]);
14733 office2007->encryptedVerifier[2] = hex_to_uint (&encryptedVerifier_pos[16]);
14734 office2007->encryptedVerifier[3] = hex_to_uint (&encryptedVerifier_pos[24]);
14735
14736 office2007->encryptedVerifierHash[0] = hex_to_uint (&encryptedVerifierHash_pos[ 0]);
14737 office2007->encryptedVerifierHash[1] = hex_to_uint (&encryptedVerifierHash_pos[ 8]);
14738 office2007->encryptedVerifierHash[2] = hex_to_uint (&encryptedVerifierHash_pos[16]);
14739 office2007->encryptedVerifierHash[3] = hex_to_uint (&encryptedVerifierHash_pos[24]);
14740 office2007->encryptedVerifierHash[4] = hex_to_uint (&encryptedVerifierHash_pos[32]);
14741
14742 /**
14743 * digest
14744 */
14745
14746 digest[0] = office2007->encryptedVerifierHash[0];
14747 digest[1] = office2007->encryptedVerifierHash[1];
14748 digest[2] = office2007->encryptedVerifierHash[2];
14749 digest[3] = office2007->encryptedVerifierHash[3];
14750
14751 return (PARSER_OK);
14752 }
14753
14754 int office2010_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14755 {
14756 if ((input_len < DISPLAY_LEN_MIN_9500) || (input_len > DISPLAY_LEN_MAX_9500)) return (PARSER_GLOBAL_LENGTH);
14757
14758 if (memcmp (SIGNATURE_OFFICE2010, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
14759
14760 uint32_t *digest = (uint32_t *) hash_buf->digest;
14761
14762 salt_t *salt = hash_buf->salt;
14763
14764 office2010_t *office2010 = (office2010_t *) hash_buf->esalt;
14765
14766 /**
14767 * parse line
14768 */
14769
14770 char *version_pos = input_buf + 8 + 1;
14771
14772 char *spinCount_pos = strchr (version_pos, '*');
14773
14774 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14775
14776 uint32_t version_len = spinCount_pos - version_pos;
14777
14778 if (version_len != 4) return (PARSER_SALT_LENGTH);
14779
14780 spinCount_pos++;
14781
14782 char *keySize_pos = strchr (spinCount_pos, '*');
14783
14784 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14785
14786 uint32_t spinCount_len = keySize_pos - spinCount_pos;
14787
14788 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
14789
14790 keySize_pos++;
14791
14792 char *saltSize_pos = strchr (keySize_pos, '*');
14793
14794 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14795
14796 uint32_t keySize_len = saltSize_pos - keySize_pos;
14797
14798 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
14799
14800 saltSize_pos++;
14801
14802 char *osalt_pos = strchr (saltSize_pos, '*');
14803
14804 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14805
14806 uint32_t saltSize_len = osalt_pos - saltSize_pos;
14807
14808 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
14809
14810 osalt_pos++;
14811
14812 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
14813
14814 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14815
14816 uint32_t osalt_len = encryptedVerifier_pos - osalt_pos;
14817
14818 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
14819
14820 encryptedVerifier_pos++;
14821
14822 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
14823
14824 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14825
14826 uint32_t encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
14827
14828 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
14829
14830 encryptedVerifierHash_pos++;
14831
14832 uint32_t encryptedVerifierHash_len = input_len - 8 - 1 - version_len - 1 - spinCount_len - 1 - keySize_len - 1 - saltSize_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
14833
14834 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
14835
14836 const uint version = atoi (version_pos);
14837
14838 if (version != 2010) return (PARSER_SALT_VALUE);
14839
14840 const uint spinCount = atoi (spinCount_pos);
14841
14842 if (spinCount != 100000) return (PARSER_SALT_VALUE);
14843
14844 const uint keySize = atoi (keySize_pos);
14845
14846 if (keySize != 128) return (PARSER_SALT_VALUE);
14847
14848 const uint saltSize = atoi (saltSize_pos);
14849
14850 if (saltSize != 16) return (PARSER_SALT_VALUE);
14851
14852 /**
14853 * salt
14854 */
14855
14856 salt->salt_len = 16;
14857 salt->salt_iter = spinCount;
14858
14859 salt->salt_buf[0] = hex_to_uint (&osalt_pos[ 0]);
14860 salt->salt_buf[1] = hex_to_uint (&osalt_pos[ 8]);
14861 salt->salt_buf[2] = hex_to_uint (&osalt_pos[16]);
14862 salt->salt_buf[3] = hex_to_uint (&osalt_pos[24]);
14863
14864 /**
14865 * esalt
14866 */
14867
14868 office2010->encryptedVerifier[0] = hex_to_uint (&encryptedVerifier_pos[ 0]);
14869 office2010->encryptedVerifier[1] = hex_to_uint (&encryptedVerifier_pos[ 8]);
14870 office2010->encryptedVerifier[2] = hex_to_uint (&encryptedVerifier_pos[16]);
14871 office2010->encryptedVerifier[3] = hex_to_uint (&encryptedVerifier_pos[24]);
14872
14873 office2010->encryptedVerifierHash[0] = hex_to_uint (&encryptedVerifierHash_pos[ 0]);
14874 office2010->encryptedVerifierHash[1] = hex_to_uint (&encryptedVerifierHash_pos[ 8]);
14875 office2010->encryptedVerifierHash[2] = hex_to_uint (&encryptedVerifierHash_pos[16]);
14876 office2010->encryptedVerifierHash[3] = hex_to_uint (&encryptedVerifierHash_pos[24]);
14877 office2010->encryptedVerifierHash[4] = hex_to_uint (&encryptedVerifierHash_pos[32]);
14878 office2010->encryptedVerifierHash[5] = hex_to_uint (&encryptedVerifierHash_pos[40]);
14879 office2010->encryptedVerifierHash[6] = hex_to_uint (&encryptedVerifierHash_pos[48]);
14880 office2010->encryptedVerifierHash[7] = hex_to_uint (&encryptedVerifierHash_pos[56]);
14881
14882 /**
14883 * digest
14884 */
14885
14886 digest[0] = office2010->encryptedVerifierHash[0];
14887 digest[1] = office2010->encryptedVerifierHash[1];
14888 digest[2] = office2010->encryptedVerifierHash[2];
14889 digest[3] = office2010->encryptedVerifierHash[3];
14890
14891 return (PARSER_OK);
14892 }
14893
14894 int office2013_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14895 {
14896 if ((input_len < DISPLAY_LEN_MIN_9600) || (input_len > DISPLAY_LEN_MAX_9600)) return (PARSER_GLOBAL_LENGTH);
14897
14898 if (memcmp (SIGNATURE_OFFICE2013, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
14899
14900 uint32_t *digest = (uint32_t *) hash_buf->digest;
14901
14902 salt_t *salt = hash_buf->salt;
14903
14904 office2013_t *office2013 = (office2013_t *) hash_buf->esalt;
14905
14906 /**
14907 * parse line
14908 */
14909
14910 char *version_pos = input_buf + 8 + 1;
14911
14912 char *spinCount_pos = strchr (version_pos, '*');
14913
14914 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14915
14916 uint32_t version_len = spinCount_pos - version_pos;
14917
14918 if (version_len != 4) return (PARSER_SALT_LENGTH);
14919
14920 spinCount_pos++;
14921
14922 char *keySize_pos = strchr (spinCount_pos, '*');
14923
14924 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14925
14926 uint32_t spinCount_len = keySize_pos - spinCount_pos;
14927
14928 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
14929
14930 keySize_pos++;
14931
14932 char *saltSize_pos = strchr (keySize_pos, '*');
14933
14934 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14935
14936 uint32_t keySize_len = saltSize_pos - keySize_pos;
14937
14938 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
14939
14940 saltSize_pos++;
14941
14942 char *osalt_pos = strchr (saltSize_pos, '*');
14943
14944 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14945
14946 uint32_t saltSize_len = osalt_pos - saltSize_pos;
14947
14948 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
14949
14950 osalt_pos++;
14951
14952 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
14953
14954 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14955
14956 uint32_t osalt_len = encryptedVerifier_pos - osalt_pos;
14957
14958 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
14959
14960 encryptedVerifier_pos++;
14961
14962 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
14963
14964 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14965
14966 uint32_t encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
14967
14968 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
14969
14970 encryptedVerifierHash_pos++;
14971
14972 uint32_t encryptedVerifierHash_len = input_len - 8 - 1 - version_len - 1 - spinCount_len - 1 - keySize_len - 1 - saltSize_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
14973
14974 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
14975
14976 const uint version = atoi (version_pos);
14977
14978 if (version != 2013) return (PARSER_SALT_VALUE);
14979
14980 const uint spinCount = atoi (spinCount_pos);
14981
14982 if (spinCount != 100000) return (PARSER_SALT_VALUE);
14983
14984 const uint keySize = atoi (keySize_pos);
14985
14986 if (keySize != 256) return (PARSER_SALT_VALUE);
14987
14988 const uint saltSize = atoi (saltSize_pos);
14989
14990 if (saltSize != 16) return (PARSER_SALT_VALUE);
14991
14992 /**
14993 * salt
14994 */
14995
14996 salt->salt_len = 16;
14997 salt->salt_iter = spinCount;
14998
14999 salt->salt_buf[0] = hex_to_uint (&osalt_pos[ 0]);
15000 salt->salt_buf[1] = hex_to_uint (&osalt_pos[ 8]);
15001 salt->salt_buf[2] = hex_to_uint (&osalt_pos[16]);
15002 salt->salt_buf[3] = hex_to_uint (&osalt_pos[24]);
15003
15004 /**
15005 * esalt
15006 */
15007
15008 office2013->encryptedVerifier[0] = hex_to_uint (&encryptedVerifier_pos[ 0]);
15009 office2013->encryptedVerifier[1] = hex_to_uint (&encryptedVerifier_pos[ 8]);
15010 office2013->encryptedVerifier[2] = hex_to_uint (&encryptedVerifier_pos[16]);
15011 office2013->encryptedVerifier[3] = hex_to_uint (&encryptedVerifier_pos[24]);
15012
15013 office2013->encryptedVerifierHash[0] = hex_to_uint (&encryptedVerifierHash_pos[ 0]);
15014 office2013->encryptedVerifierHash[1] = hex_to_uint (&encryptedVerifierHash_pos[ 8]);
15015 office2013->encryptedVerifierHash[2] = hex_to_uint (&encryptedVerifierHash_pos[16]);
15016 office2013->encryptedVerifierHash[3] = hex_to_uint (&encryptedVerifierHash_pos[24]);
15017 office2013->encryptedVerifierHash[4] = hex_to_uint (&encryptedVerifierHash_pos[32]);
15018 office2013->encryptedVerifierHash[5] = hex_to_uint (&encryptedVerifierHash_pos[40]);
15019 office2013->encryptedVerifierHash[6] = hex_to_uint (&encryptedVerifierHash_pos[48]);
15020 office2013->encryptedVerifierHash[7] = hex_to_uint (&encryptedVerifierHash_pos[56]);
15021
15022 /**
15023 * digest
15024 */
15025
15026 digest[0] = office2013->encryptedVerifierHash[0];
15027 digest[1] = office2013->encryptedVerifierHash[1];
15028 digest[2] = office2013->encryptedVerifierHash[2];
15029 digest[3] = office2013->encryptedVerifierHash[3];
15030
15031 return (PARSER_OK);
15032 }
15033
15034 int oldoffice01_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15035 {
15036 if ((input_len < DISPLAY_LEN_MIN_9700) || (input_len > DISPLAY_LEN_MAX_9700)) return (PARSER_GLOBAL_LENGTH);
15037
15038 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15039
15040 uint32_t *digest = (uint32_t *) hash_buf->digest;
15041
15042 salt_t *salt = hash_buf->salt;
15043
15044 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
15045
15046 /**
15047 * parse line
15048 */
15049
15050 char *version_pos = input_buf + 11;
15051
15052 char *osalt_pos = strchr (version_pos, '*');
15053
15054 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15055
15056 uint32_t version_len = osalt_pos - version_pos;
15057
15058 if (version_len != 1) return (PARSER_SALT_LENGTH);
15059
15060 osalt_pos++;
15061
15062 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15063
15064 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15065
15066 uint32_t osalt_len = encryptedVerifier_pos - osalt_pos;
15067
15068 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15069
15070 encryptedVerifier_pos++;
15071
15072 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15073
15074 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15075
15076 uint32_t encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15077
15078 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15079
15080 encryptedVerifierHash_pos++;
15081
15082 uint32_t encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
15083
15084 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
15085
15086 const uint version = *version_pos - 0x30;
15087
15088 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
15089
15090 /**
15091 * esalt
15092 */
15093
15094 oldoffice01->version = version;
15095
15096 oldoffice01->encryptedVerifier[0] = hex_to_uint (&encryptedVerifier_pos[ 0]);
15097 oldoffice01->encryptedVerifier[1] = hex_to_uint (&encryptedVerifier_pos[ 8]);
15098 oldoffice01->encryptedVerifier[2] = hex_to_uint (&encryptedVerifier_pos[16]);
15099 oldoffice01->encryptedVerifier[3] = hex_to_uint (&encryptedVerifier_pos[24]);
15100
15101 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
15102 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
15103 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
15104 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
15105
15106 oldoffice01->encryptedVerifierHash[0] = hex_to_uint (&encryptedVerifierHash_pos[ 0]);
15107 oldoffice01->encryptedVerifierHash[1] = hex_to_uint (&encryptedVerifierHash_pos[ 8]);
15108 oldoffice01->encryptedVerifierHash[2] = hex_to_uint (&encryptedVerifierHash_pos[16]);
15109 oldoffice01->encryptedVerifierHash[3] = hex_to_uint (&encryptedVerifierHash_pos[24]);
15110
15111 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
15112 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
15113 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
15114 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
15115
15116 /**
15117 * salt
15118 */
15119
15120 salt->salt_len = 16;
15121
15122 salt->salt_buf[0] = hex_to_uint (&osalt_pos[ 0]);
15123 salt->salt_buf[1] = hex_to_uint (&osalt_pos[ 8]);
15124 salt->salt_buf[2] = hex_to_uint (&osalt_pos[16]);
15125 salt->salt_buf[3] = hex_to_uint (&osalt_pos[24]);
15126
15127 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15128 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15129 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15130 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15131
15132 // this is a workaround as office produces multiple documents with the same salt
15133
15134 salt->salt_len += 32;
15135
15136 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
15137 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
15138 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
15139 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
15140 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
15141 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
15142 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
15143 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
15144
15145 /**
15146 * digest
15147 */
15148
15149 digest[0] = oldoffice01->encryptedVerifierHash[0];
15150 digest[1] = oldoffice01->encryptedVerifierHash[1];
15151 digest[2] = oldoffice01->encryptedVerifierHash[2];
15152 digest[3] = oldoffice01->encryptedVerifierHash[3];
15153
15154 return (PARSER_OK);
15155 }
15156
15157 int oldoffice01cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15158 {
15159 return oldoffice01_parse_hash (input_buf, input_len, hash_buf);
15160 }
15161
15162 int oldoffice01cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15163 {
15164 if ((input_len < DISPLAY_LEN_MIN_9720) || (input_len > DISPLAY_LEN_MAX_9720)) return (PARSER_GLOBAL_LENGTH);
15165
15166 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15167
15168 uint32_t *digest = (uint32_t *) hash_buf->digest;
15169
15170 salt_t *salt = hash_buf->salt;
15171
15172 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
15173
15174 /**
15175 * parse line
15176 */
15177
15178 char *version_pos = input_buf + 11;
15179
15180 char *osalt_pos = strchr (version_pos, '*');
15181
15182 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15183
15184 uint32_t version_len = osalt_pos - version_pos;
15185
15186 if (version_len != 1) return (PARSER_SALT_LENGTH);
15187
15188 osalt_pos++;
15189
15190 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15191
15192 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15193
15194 uint32_t osalt_len = encryptedVerifier_pos - osalt_pos;
15195
15196 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15197
15198 encryptedVerifier_pos++;
15199
15200 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15201
15202 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15203
15204 uint32_t encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15205
15206 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15207
15208 encryptedVerifierHash_pos++;
15209
15210 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
15211
15212 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15213
15214 uint32_t encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
15215
15216 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
15217
15218 rc4key_pos++;
15219
15220 uint32_t rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
15221
15222 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
15223
15224 const uint version = *version_pos - 0x30;
15225
15226 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
15227
15228 /**
15229 * esalt
15230 */
15231
15232 oldoffice01->version = version;
15233
15234 oldoffice01->encryptedVerifier[0] = hex_to_uint (&encryptedVerifier_pos[ 0]);
15235 oldoffice01->encryptedVerifier[1] = hex_to_uint (&encryptedVerifier_pos[ 8]);
15236 oldoffice01->encryptedVerifier[2] = hex_to_uint (&encryptedVerifier_pos[16]);
15237 oldoffice01->encryptedVerifier[3] = hex_to_uint (&encryptedVerifier_pos[24]);
15238
15239 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
15240 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
15241 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
15242 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
15243
15244 oldoffice01->encryptedVerifierHash[0] = hex_to_uint (&encryptedVerifierHash_pos[ 0]);
15245 oldoffice01->encryptedVerifierHash[1] = hex_to_uint (&encryptedVerifierHash_pos[ 8]);
15246 oldoffice01->encryptedVerifierHash[2] = hex_to_uint (&encryptedVerifierHash_pos[16]);
15247 oldoffice01->encryptedVerifierHash[3] = hex_to_uint (&encryptedVerifierHash_pos[24]);
15248
15249 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
15250 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
15251 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
15252 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
15253
15254 oldoffice01->rc4key[1] = 0;
15255 oldoffice01->rc4key[0] = 0;
15256
15257 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
15258 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
15259 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
15260 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
15261 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
15262 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
15263 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
15264 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
15265 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
15266 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
15267
15268 oldoffice01->rc4key[0] = byte_swap_32 (oldoffice01->rc4key[0]);
15269 oldoffice01->rc4key[1] = byte_swap_32 (oldoffice01->rc4key[1]);
15270
15271 /**
15272 * salt
15273 */
15274
15275 salt->salt_len = 16;
15276
15277 salt->salt_buf[0] = hex_to_uint (&osalt_pos[ 0]);
15278 salt->salt_buf[1] = hex_to_uint (&osalt_pos[ 8]);
15279 salt->salt_buf[2] = hex_to_uint (&osalt_pos[16]);
15280 salt->salt_buf[3] = hex_to_uint (&osalt_pos[24]);
15281
15282 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15283 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15284 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15285 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15286
15287 // this is a workaround as office produces multiple documents with the same salt
15288
15289 salt->salt_len += 32;
15290
15291 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
15292 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
15293 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
15294 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
15295 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
15296 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
15297 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
15298 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
15299
15300 /**
15301 * digest
15302 */
15303
15304 digest[0] = oldoffice01->rc4key[0];
15305 digest[1] = oldoffice01->rc4key[1];
15306 digest[2] = 0;
15307 digest[3] = 0;
15308
15309 return (PARSER_OK);
15310 }
15311
15312 int oldoffice34_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15313 {
15314 if ((input_len < DISPLAY_LEN_MIN_9800) || (input_len > DISPLAY_LEN_MAX_9800)) return (PARSER_GLOBAL_LENGTH);
15315
15316 if ((memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE4, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15317
15318 uint32_t *digest = (uint32_t *) hash_buf->digest;
15319
15320 salt_t *salt = hash_buf->salt;
15321
15322 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
15323
15324 /**
15325 * parse line
15326 */
15327
15328 char *version_pos = input_buf + 11;
15329
15330 char *osalt_pos = strchr (version_pos, '*');
15331
15332 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15333
15334 uint32_t version_len = osalt_pos - version_pos;
15335
15336 if (version_len != 1) return (PARSER_SALT_LENGTH);
15337
15338 osalt_pos++;
15339
15340 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15341
15342 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15343
15344 uint32_t osalt_len = encryptedVerifier_pos - osalt_pos;
15345
15346 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15347
15348 encryptedVerifier_pos++;
15349
15350 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15351
15352 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15353
15354 uint32_t encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15355
15356 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15357
15358 encryptedVerifierHash_pos++;
15359
15360 uint32_t encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
15361
15362 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
15363
15364 const uint version = *version_pos - 0x30;
15365
15366 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
15367
15368 /**
15369 * esalt
15370 */
15371
15372 oldoffice34->version = version;
15373
15374 oldoffice34->encryptedVerifier[0] = hex_to_uint (&encryptedVerifier_pos[ 0]);
15375 oldoffice34->encryptedVerifier[1] = hex_to_uint (&encryptedVerifier_pos[ 8]);
15376 oldoffice34->encryptedVerifier[2] = hex_to_uint (&encryptedVerifier_pos[16]);
15377 oldoffice34->encryptedVerifier[3] = hex_to_uint (&encryptedVerifier_pos[24]);
15378
15379 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
15380 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
15381 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
15382 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
15383
15384 oldoffice34->encryptedVerifierHash[0] = hex_to_uint (&encryptedVerifierHash_pos[ 0]);
15385 oldoffice34->encryptedVerifierHash[1] = hex_to_uint (&encryptedVerifierHash_pos[ 8]);
15386 oldoffice34->encryptedVerifierHash[2] = hex_to_uint (&encryptedVerifierHash_pos[16]);
15387 oldoffice34->encryptedVerifierHash[3] = hex_to_uint (&encryptedVerifierHash_pos[24]);
15388 oldoffice34->encryptedVerifierHash[4] = hex_to_uint (&encryptedVerifierHash_pos[32]);
15389
15390 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
15391 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
15392 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
15393 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
15394 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
15395
15396 /**
15397 * salt
15398 */
15399
15400 salt->salt_len = 16;
15401
15402 salt->salt_buf[0] = hex_to_uint (&osalt_pos[ 0]);
15403 salt->salt_buf[1] = hex_to_uint (&osalt_pos[ 8]);
15404 salt->salt_buf[2] = hex_to_uint (&osalt_pos[16]);
15405 salt->salt_buf[3] = hex_to_uint (&osalt_pos[24]);
15406
15407 // this is a workaround as office produces multiple documents with the same salt
15408
15409 salt->salt_len += 32;
15410
15411 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
15412 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
15413 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
15414 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
15415 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
15416 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
15417 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
15418 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
15419
15420 /**
15421 * digest
15422 */
15423
15424 digest[0] = oldoffice34->encryptedVerifierHash[0];
15425 digest[1] = oldoffice34->encryptedVerifierHash[1];
15426 digest[2] = oldoffice34->encryptedVerifierHash[2];
15427 digest[3] = oldoffice34->encryptedVerifierHash[3];
15428
15429 return (PARSER_OK);
15430 }
15431
15432 int oldoffice34cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15433 {
15434 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
15435
15436 return oldoffice34_parse_hash (input_buf, input_len, hash_buf);
15437 }
15438
15439 int oldoffice34cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15440 {
15441 if ((input_len < DISPLAY_LEN_MIN_9820) || (input_len > DISPLAY_LEN_MAX_9820)) return (PARSER_GLOBAL_LENGTH);
15442
15443 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
15444
15445 uint32_t *digest = (uint32_t *) hash_buf->digest;
15446
15447 salt_t *salt = hash_buf->salt;
15448
15449 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
15450
15451 /**
15452 * parse line
15453 */
15454
15455 char *version_pos = input_buf + 11;
15456
15457 char *osalt_pos = strchr (version_pos, '*');
15458
15459 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15460
15461 uint32_t version_len = osalt_pos - version_pos;
15462
15463 if (version_len != 1) return (PARSER_SALT_LENGTH);
15464
15465 osalt_pos++;
15466
15467 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15468
15469 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15470
15471 uint32_t osalt_len = encryptedVerifier_pos - osalt_pos;
15472
15473 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15474
15475 encryptedVerifier_pos++;
15476
15477 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15478
15479 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15480
15481 uint32_t encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15482
15483 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15484
15485 encryptedVerifierHash_pos++;
15486
15487 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
15488
15489 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15490
15491 uint32_t encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
15492
15493 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
15494
15495 rc4key_pos++;
15496
15497 uint32_t rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
15498
15499 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
15500
15501 const uint version = *version_pos - 0x30;
15502
15503 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
15504
15505 /**
15506 * esalt
15507 */
15508
15509 oldoffice34->version = version;
15510
15511 oldoffice34->encryptedVerifier[0] = hex_to_uint (&encryptedVerifier_pos[ 0]);
15512 oldoffice34->encryptedVerifier[1] = hex_to_uint (&encryptedVerifier_pos[ 8]);
15513 oldoffice34->encryptedVerifier[2] = hex_to_uint (&encryptedVerifier_pos[16]);
15514 oldoffice34->encryptedVerifier[3] = hex_to_uint (&encryptedVerifier_pos[24]);
15515
15516 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
15517 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
15518 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
15519 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
15520
15521 oldoffice34->encryptedVerifierHash[0] = hex_to_uint (&encryptedVerifierHash_pos[ 0]);
15522 oldoffice34->encryptedVerifierHash[1] = hex_to_uint (&encryptedVerifierHash_pos[ 8]);
15523 oldoffice34->encryptedVerifierHash[2] = hex_to_uint (&encryptedVerifierHash_pos[16]);
15524 oldoffice34->encryptedVerifierHash[3] = hex_to_uint (&encryptedVerifierHash_pos[24]);
15525 oldoffice34->encryptedVerifierHash[4] = hex_to_uint (&encryptedVerifierHash_pos[32]);
15526
15527 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
15528 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
15529 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
15530 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
15531 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
15532
15533 oldoffice34->rc4key[1] = 0;
15534 oldoffice34->rc4key[0] = 0;
15535
15536 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
15537 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
15538 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
15539 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
15540 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
15541 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
15542 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
15543 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
15544 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
15545 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
15546
15547 oldoffice34->rc4key[0] = byte_swap_32 (oldoffice34->rc4key[0]);
15548 oldoffice34->rc4key[1] = byte_swap_32 (oldoffice34->rc4key[1]);
15549
15550 /**
15551 * salt
15552 */
15553
15554 salt->salt_len = 16;
15555
15556 salt->salt_buf[0] = hex_to_uint (&osalt_pos[ 0]);
15557 salt->salt_buf[1] = hex_to_uint (&osalt_pos[ 8]);
15558 salt->salt_buf[2] = hex_to_uint (&osalt_pos[16]);
15559 salt->salt_buf[3] = hex_to_uint (&osalt_pos[24]);
15560
15561 // this is a workaround as office produces multiple documents with the same salt
15562
15563 salt->salt_len += 32;
15564
15565 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
15566 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
15567 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
15568 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
15569 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
15570 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
15571 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
15572 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
15573
15574 /**
15575 * digest
15576 */
15577
15578 digest[0] = oldoffice34->rc4key[0];
15579 digest[1] = oldoffice34->rc4key[1];
15580 digest[2] = 0;
15581 digest[3] = 0;
15582
15583 return (PARSER_OK);
15584 }
15585
15586 int radmin2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15587 {
15588 if ((input_len < DISPLAY_LEN_MIN_9900) || (input_len > DISPLAY_LEN_MAX_9900)) return (PARSER_GLOBAL_LENGTH);
15589
15590 uint32_t *digest = (uint32_t *) hash_buf->digest;
15591
15592 digest[0] = hex_to_uint (&input_buf[ 0]);
15593 digest[1] = hex_to_uint (&input_buf[ 8]);
15594 digest[2] = hex_to_uint (&input_buf[16]);
15595 digest[3] = hex_to_uint (&input_buf[24]);
15596
15597 digest[0] = byte_swap_32 (digest[0]);
15598 digest[1] = byte_swap_32 (digest[1]);
15599 digest[2] = byte_swap_32 (digest[2]);
15600 digest[3] = byte_swap_32 (digest[3]);
15601
15602 return (PARSER_OK);
15603 }
15604
15605 int djangosha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15606 {
15607 if ((input_len < DISPLAY_LEN_MIN_124) || (input_len > DISPLAY_LEN_MAX_124)) return (PARSER_GLOBAL_LENGTH);
15608
15609 if ((memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5)) && (memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
15610
15611 uint32_t *digest = (uint32_t *) hash_buf->digest;
15612
15613 salt_t *salt = hash_buf->salt;
15614
15615 char *signature_pos = input_buf;
15616
15617 char *salt_pos = strchr (signature_pos, '$');
15618
15619 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15620
15621 uint32_t signature_len = salt_pos - signature_pos;
15622
15623 if (signature_len != 4) return (PARSER_SIGNATURE_UNMATCHED);
15624
15625 salt_pos++;
15626
15627 char *hash_pos = strchr (salt_pos, '$');
15628
15629 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15630
15631 uint32_t salt_len = hash_pos - salt_pos;
15632
15633 if (salt_len > 32) return (PARSER_SALT_LENGTH);
15634
15635 hash_pos++;
15636
15637 uint32_t hash_len = input_len - signature_len - 1 - salt_len - 1;
15638
15639 if (hash_len != 40) return (PARSER_SALT_LENGTH);
15640
15641 digest[0] = hex_to_uint (&hash_pos[ 0]);
15642 digest[1] = hex_to_uint (&hash_pos[ 8]);
15643 digest[2] = hex_to_uint (&hash_pos[16]);
15644 digest[3] = hex_to_uint (&hash_pos[24]);
15645 digest[4] = hex_to_uint (&hash_pos[32]);
15646
15647 digest[0] -= SHA1M_A;
15648 digest[1] -= SHA1M_B;
15649 digest[2] -= SHA1M_C;
15650 digest[3] -= SHA1M_D;
15651 digest[4] -= SHA1M_E;
15652
15653 char *salt_buf_ptr = (char *) salt->salt_buf;
15654
15655 memcpy (salt_buf_ptr, salt_pos, salt_len);
15656
15657 salt->salt_len = salt_len;
15658
15659 return (PARSER_OK);
15660 }
15661
15662 int djangopbkdf2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15663 {
15664 if ((input_len < DISPLAY_LEN_MIN_10000) || (input_len > DISPLAY_LEN_MAX_10000)) return (PARSER_GLOBAL_LENGTH);
15665
15666 if (memcmp (SIGNATURE_DJANGOPBKDF2, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
15667
15668 uint32_t *digest = (uint32_t *) hash_buf->digest;
15669
15670 salt_t *salt = hash_buf->salt;
15671
15672 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
15673
15674 /**
15675 * parse line
15676 */
15677
15678 char *iter_pos = input_buf + 14;
15679
15680 const int iter = atoi (iter_pos);
15681
15682 if (iter < 1) return (PARSER_SALT_ITERATION);
15683
15684 salt->salt_iter = iter - 1;
15685
15686 char *salt_pos = strchr (iter_pos, '$');
15687
15688 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15689
15690 salt_pos++;
15691
15692 char *hash_pos = strchr (salt_pos, '$');
15693
15694 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15695
15696 const uint salt_len = hash_pos - salt_pos;
15697
15698 hash_pos++;
15699
15700 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
15701
15702 memcpy (salt_buf_ptr, salt_pos, salt_len);
15703
15704 salt->salt_len = salt_len;
15705
15706 salt_buf_ptr[salt_len + 3] = 0x01;
15707 salt_buf_ptr[salt_len + 4] = 0x80;
15708
15709 // add some stuff to normal salt to make sorted happy
15710
15711 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
15712 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
15713 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
15714 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
15715 salt->salt_buf[4] = salt->salt_iter;
15716
15717 // base64 decode hash
15718
15719 char tmp_buf[100];
15720
15721 memset (tmp_buf, 0, sizeof (tmp_buf));
15722
15723 uint hash_len = input_len - (hash_pos - input_buf);
15724
15725 if (hash_len != 44) return (PARSER_HASH_LENGTH);
15726
15727 base64_decode (base64_to_int, hash_pos, hash_len, tmp_buf);
15728
15729 memcpy (digest, tmp_buf, 32);
15730
15731 digest[0] = byte_swap_32 (digest[0]);
15732 digest[1] = byte_swap_32 (digest[1]);
15733 digest[2] = byte_swap_32 (digest[2]);
15734 digest[3] = byte_swap_32 (digest[3]);
15735 digest[4] = byte_swap_32 (digest[4]);
15736 digest[5] = byte_swap_32 (digest[5]);
15737 digest[6] = byte_swap_32 (digest[6]);
15738 digest[7] = byte_swap_32 (digest[7]);
15739
15740 return (PARSER_OK);
15741 }
15742
15743 int siphash_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15744 {
15745 if ((input_len < DISPLAY_LEN_MIN_10100) || (input_len > DISPLAY_LEN_MAX_10100)) return (PARSER_GLOBAL_LENGTH);
15746
15747 uint32_t *digest = (uint32_t *) hash_buf->digest;
15748
15749 salt_t *salt = hash_buf->salt;
15750
15751 digest[0] = hex_to_uint (&input_buf[ 0]);
15752 digest[1] = hex_to_uint (&input_buf[ 8]);
15753 digest[2] = 0;
15754 digest[3] = 0;
15755
15756 digest[0] = byte_swap_32 (digest[0]);
15757 digest[1] = byte_swap_32 (digest[1]);
15758
15759 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15760 if (input_buf[18] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15761 if (input_buf[20] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15762
15763 char iter_c = input_buf[17];
15764 char iter_d = input_buf[19];
15765
15766 // atm only defaults, let's see if there's more request
15767 if (iter_c != '2') return (PARSER_SALT_ITERATION);
15768 if (iter_d != '4') return (PARSER_SALT_ITERATION);
15769
15770 char *salt_buf = input_buf + 16 + 1 + 1 + 1 + 1 + 1;
15771
15772 salt->salt_buf[0] = hex_to_uint (&salt_buf[ 0]);
15773 salt->salt_buf[1] = hex_to_uint (&salt_buf[ 8]);
15774 salt->salt_buf[2] = hex_to_uint (&salt_buf[16]);
15775 salt->salt_buf[3] = hex_to_uint (&salt_buf[24]);
15776
15777 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15778 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15779 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15780 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15781
15782 salt->salt_len = 16;
15783
15784 return (PARSER_OK);
15785 }
15786
15787 int crammd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15788 {
15789 if ((input_len < DISPLAY_LEN_MIN_10200) || (input_len > DISPLAY_LEN_MAX_10200)) return (PARSER_GLOBAL_LENGTH);
15790
15791 if (memcmp (SIGNATURE_CRAM_MD5, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
15792
15793 uint32_t *digest = (uint32_t *) hash_buf->digest;
15794
15795 cram_md5_t *cram_md5 = (cram_md5_t *) hash_buf->esalt;
15796
15797 salt_t *salt = hash_buf->salt;
15798
15799 char *salt_pos = input_buf + 10;
15800
15801 char *hash_pos = strchr (salt_pos, '$');
15802
15803 uint salt_len = hash_pos - salt_pos;
15804
15805 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15806
15807 hash_pos++;
15808
15809 uint hash_len = input_len - 10 - salt_len - 1;
15810
15811 // base64 decode salt
15812
15813 char tmp_buf[100];
15814
15815 memset (tmp_buf, 0, sizeof (tmp_buf));
15816
15817 salt_len = base64_decode (base64_to_int, salt_pos, salt_len, tmp_buf);
15818
15819 if (salt_len > 55) return (PARSER_SALT_LENGTH);
15820
15821 tmp_buf[salt_len] = 0x80;
15822
15823 memcpy (&salt->salt_buf, tmp_buf, salt_len + 1);
15824
15825 salt->salt_len = salt_len;
15826
15827 // base64 decode salt
15828
15829 memset (tmp_buf, 0, sizeof (tmp_buf));
15830
15831 hash_len = base64_decode (base64_to_int, hash_pos, hash_len, tmp_buf);
15832
15833 uint user_len = hash_len - 32;
15834
15835 char *tmp_hash = tmp_buf + user_len;
15836
15837 user_len--; // skip the trailing space
15838
15839 digest[0] = hex_to_uint (&tmp_hash[ 0]);
15840 digest[1] = hex_to_uint (&tmp_hash[ 8]);
15841 digest[2] = hex_to_uint (&tmp_hash[16]);
15842 digest[3] = hex_to_uint (&tmp_hash[24]);
15843
15844 digest[0] = byte_swap_32 (digest[0]);
15845 digest[1] = byte_swap_32 (digest[1]);
15846 digest[2] = byte_swap_32 (digest[2]);
15847 digest[3] = byte_swap_32 (digest[3]);
15848
15849 // store username for host only (output hash if cracked)
15850
15851 memset (cram_md5->user, 0, sizeof (cram_md5->user));
15852 memcpy (cram_md5->user, tmp_buf, user_len);
15853
15854 return (PARSER_OK);
15855 }
15856
15857 int saph_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15858 {
15859 if ((input_len < DISPLAY_LEN_MIN_10300) || (input_len > DISPLAY_LEN_MAX_10300)) return (PARSER_GLOBAL_LENGTH);
15860
15861 if (memcmp (SIGNATURE_SAPH_SHA1, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
15862
15863 uint32_t *digest = (uint32_t *) hash_buf->digest;
15864
15865 salt_t *salt = hash_buf->salt;
15866
15867 char *iter_pos = input_buf + 10;
15868
15869 uint32_t iter = atoi (iter_pos);
15870
15871 if (iter < 1)
15872 {
15873 return (PARSER_SALT_ITERATION);
15874 }
15875
15876 iter--; // first iteration is special
15877
15878 salt->salt_iter = iter;
15879
15880 char *base64_pos = strchr (iter_pos, '}');
15881
15882 if (base64_pos == NULL)
15883 {
15884 return (PARSER_SIGNATURE_UNMATCHED);
15885 }
15886
15887 base64_pos++;
15888
15889 // base64 decode salt
15890
15891 uint32_t base64_len = input_len - (base64_pos - input_buf);
15892
15893 char tmp_buf[100];
15894
15895 memset (tmp_buf, 0, sizeof (tmp_buf));
15896
15897 uint32_t decoded_len = base64_decode (base64_to_int, base64_pos, base64_len, tmp_buf);
15898
15899 if (decoded_len < 24)
15900 {
15901 return (PARSER_SALT_LENGTH);
15902 }
15903
15904 // copy the salt
15905
15906 uint salt_len = decoded_len - 20;
15907
15908 if (salt_len < 4) return (PARSER_SALT_LENGTH);
15909 if (salt_len > 16) return (PARSER_SALT_LENGTH);
15910
15911 memcpy (&salt->salt_buf, tmp_buf + 20, salt_len);
15912
15913 salt->salt_len = salt_len;
15914
15915 // set digest
15916
15917 uint32_t *digest_ptr = (uint32_t*) tmp_buf;
15918
15919 digest[0] = byte_swap_32 (digest_ptr[0]);
15920 digest[1] = byte_swap_32 (digest_ptr[1]);
15921 digest[2] = byte_swap_32 (digest_ptr[2]);
15922 digest[3] = byte_swap_32 (digest_ptr[3]);
15923 digest[4] = byte_swap_32 (digest_ptr[4]);
15924
15925 return (PARSER_OK);
15926 }
15927
15928 int redmine_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15929 {
15930 if ((input_len < DISPLAY_LEN_MIN_7600) || (input_len > DISPLAY_LEN_MAX_7600)) return (PARSER_GLOBAL_LENGTH);
15931
15932 uint32_t *digest = (uint32_t *) hash_buf->digest;
15933
15934 salt_t *salt = hash_buf->salt;
15935
15936 digest[0] = hex_to_uint (&input_buf[ 0]);
15937 digest[1] = hex_to_uint (&input_buf[ 8]);
15938 digest[2] = hex_to_uint (&input_buf[16]);
15939 digest[3] = hex_to_uint (&input_buf[24]);
15940 digest[4] = hex_to_uint (&input_buf[32]);
15941
15942 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15943
15944 uint salt_len = input_len - 40 - 1;
15945
15946 char *salt_buf = input_buf + 40 + 1;
15947
15948 char *salt_buf_ptr = (char *) salt->salt_buf;
15949
15950 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
15951
15952 if (salt_len != 32) return (PARSER_SALT_LENGTH);
15953
15954 salt->salt_len = salt_len;
15955
15956 return (PARSER_OK);
15957 }
15958
15959 int pdf11_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15960 {
15961 if ((input_len < DISPLAY_LEN_MIN_10400) || (input_len > DISPLAY_LEN_MAX_10400)) return (PARSER_GLOBAL_LENGTH);
15962
15963 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
15964
15965 uint32_t *digest = (uint32_t *) hash_buf->digest;
15966
15967 salt_t *salt = hash_buf->salt;
15968
15969 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
15970
15971 /**
15972 * parse line
15973 */
15974
15975 char *V_pos = input_buf + 5;
15976
15977 char *R_pos = strchr (V_pos, '*');
15978
15979 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15980
15981 uint32_t V_len = R_pos - V_pos;
15982
15983 R_pos++;
15984
15985 char *bits_pos = strchr (R_pos, '*');
15986
15987 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15988
15989 uint32_t R_len = bits_pos - R_pos;
15990
15991 bits_pos++;
15992
15993 char *P_pos = strchr (bits_pos, '*');
15994
15995 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15996
15997 uint32_t bits_len = P_pos - bits_pos;
15998
15999 P_pos++;
16000
16001 char *enc_md_pos = strchr (P_pos, '*');
16002
16003 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16004
16005 uint32_t P_len = enc_md_pos - P_pos;
16006
16007 enc_md_pos++;
16008
16009 char *id_len_pos = strchr (enc_md_pos, '*');
16010
16011 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16012
16013 uint32_t enc_md_len = id_len_pos - enc_md_pos;
16014
16015 id_len_pos++;
16016
16017 char *id_buf_pos = strchr (id_len_pos, '*');
16018
16019 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16020
16021 uint32_t id_len_len = id_buf_pos - id_len_pos;
16022
16023 id_buf_pos++;
16024
16025 char *u_len_pos = strchr (id_buf_pos, '*');
16026
16027 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16028
16029 uint32_t id_buf_len = u_len_pos - id_buf_pos;
16030
16031 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
16032
16033 u_len_pos++;
16034
16035 char *u_buf_pos = strchr (u_len_pos, '*');
16036
16037 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16038
16039 uint32_t u_len_len = u_buf_pos - u_len_pos;
16040
16041 u_buf_pos++;
16042
16043 char *o_len_pos = strchr (u_buf_pos, '*');
16044
16045 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16046
16047 uint32_t u_buf_len = o_len_pos - u_buf_pos;
16048
16049 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16050
16051 o_len_pos++;
16052
16053 char *o_buf_pos = strchr (o_len_pos, '*');
16054
16055 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16056
16057 uint32_t o_len_len = o_buf_pos - o_len_pos;
16058
16059 o_buf_pos++;
16060
16061 uint32_t 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;
16062
16063 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16064
16065 // validate data
16066
16067 const int V = atoi (V_pos);
16068 const int R = atoi (R_pos);
16069 const int P = atoi (P_pos);
16070
16071 if (V != 1) return (PARSER_SALT_VALUE);
16072 if (R != 2) return (PARSER_SALT_VALUE);
16073
16074 const int enc_md = atoi (enc_md_pos);
16075
16076 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
16077
16078 const int id_len = atoi (id_len_pos);
16079 const int u_len = atoi (u_len_pos);
16080 const int o_len = atoi (o_len_pos);
16081
16082 if (id_len != 16) return (PARSER_SALT_VALUE);
16083 if (u_len != 32) return (PARSER_SALT_VALUE);
16084 if (o_len != 32) return (PARSER_SALT_VALUE);
16085
16086 const int bits = atoi (bits_pos);
16087
16088 if (bits != 40) return (PARSER_SALT_VALUE);
16089
16090 // copy data to esalt
16091
16092 pdf->V = V;
16093 pdf->R = R;
16094 pdf->P = P;
16095
16096 pdf->enc_md = enc_md;
16097
16098 pdf->id_buf[0] = hex_to_uint (&id_buf_pos[ 0]);
16099 pdf->id_buf[1] = hex_to_uint (&id_buf_pos[ 8]);
16100 pdf->id_buf[2] = hex_to_uint (&id_buf_pos[16]);
16101 pdf->id_buf[3] = hex_to_uint (&id_buf_pos[24]);
16102 pdf->id_len = id_len;
16103
16104 pdf->u_buf[0] = hex_to_uint (&u_buf_pos[ 0]);
16105 pdf->u_buf[1] = hex_to_uint (&u_buf_pos[ 8]);
16106 pdf->u_buf[2] = hex_to_uint (&u_buf_pos[16]);
16107 pdf->u_buf[3] = hex_to_uint (&u_buf_pos[24]);
16108 pdf->u_buf[4] = hex_to_uint (&u_buf_pos[32]);
16109 pdf->u_buf[5] = hex_to_uint (&u_buf_pos[40]);
16110 pdf->u_buf[6] = hex_to_uint (&u_buf_pos[48]);
16111 pdf->u_buf[7] = hex_to_uint (&u_buf_pos[56]);
16112 pdf->u_len = u_len;
16113
16114 pdf->o_buf[0] = hex_to_uint (&o_buf_pos[ 0]);
16115 pdf->o_buf[1] = hex_to_uint (&o_buf_pos[ 8]);
16116 pdf->o_buf[2] = hex_to_uint (&o_buf_pos[16]);
16117 pdf->o_buf[3] = hex_to_uint (&o_buf_pos[24]);
16118 pdf->o_buf[4] = hex_to_uint (&o_buf_pos[32]);
16119 pdf->o_buf[5] = hex_to_uint (&o_buf_pos[40]);
16120 pdf->o_buf[6] = hex_to_uint (&o_buf_pos[48]);
16121 pdf->o_buf[7] = hex_to_uint (&o_buf_pos[56]);
16122 pdf->o_len = o_len;
16123
16124 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16125 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16126 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16127 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16128
16129 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16130 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16131 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16132 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16133 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16134 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16135 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16136 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16137
16138 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16139 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16140 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16141 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16142 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16143 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16144 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16145 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16146
16147 // we use ID for salt, maybe needs to change, we will see...
16148
16149 salt->salt_buf[0] = pdf->id_buf[0];
16150 salt->salt_buf[1] = pdf->id_buf[1];
16151 salt->salt_buf[2] = pdf->id_buf[2];
16152 salt->salt_buf[3] = pdf->id_buf[3];
16153 salt->salt_len = pdf->id_len;
16154
16155 digest[0] = pdf->u_buf[0];
16156 digest[1] = pdf->u_buf[1];
16157 digest[2] = pdf->u_buf[2];
16158 digest[3] = pdf->u_buf[3];
16159
16160 return (PARSER_OK);
16161 }
16162
16163 int pdf11cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16164 {
16165 return pdf11_parse_hash (input_buf, input_len, hash_buf);
16166 }
16167
16168 int pdf11cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16169 {
16170 if ((input_len < DISPLAY_LEN_MIN_10420) || (input_len > DISPLAY_LEN_MAX_10420)) return (PARSER_GLOBAL_LENGTH);
16171
16172 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16173
16174 uint32_t *digest = (uint32_t *) hash_buf->digest;
16175
16176 salt_t *salt = hash_buf->salt;
16177
16178 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16179
16180 /**
16181 * parse line
16182 */
16183
16184 char *V_pos = input_buf + 5;
16185
16186 char *R_pos = strchr (V_pos, '*');
16187
16188 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16189
16190 uint32_t V_len = R_pos - V_pos;
16191
16192 R_pos++;
16193
16194 char *bits_pos = strchr (R_pos, '*');
16195
16196 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16197
16198 uint32_t R_len = bits_pos - R_pos;
16199
16200 bits_pos++;
16201
16202 char *P_pos = strchr (bits_pos, '*');
16203
16204 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16205
16206 uint32_t bits_len = P_pos - bits_pos;
16207
16208 P_pos++;
16209
16210 char *enc_md_pos = strchr (P_pos, '*');
16211
16212 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16213
16214 uint32_t P_len = enc_md_pos - P_pos;
16215
16216 enc_md_pos++;
16217
16218 char *id_len_pos = strchr (enc_md_pos, '*');
16219
16220 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16221
16222 uint32_t enc_md_len = id_len_pos - enc_md_pos;
16223
16224 id_len_pos++;
16225
16226 char *id_buf_pos = strchr (id_len_pos, '*');
16227
16228 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16229
16230 uint32_t id_len_len = id_buf_pos - id_len_pos;
16231
16232 id_buf_pos++;
16233
16234 char *u_len_pos = strchr (id_buf_pos, '*');
16235
16236 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16237
16238 uint32_t id_buf_len = u_len_pos - id_buf_pos;
16239
16240 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
16241
16242 u_len_pos++;
16243
16244 char *u_buf_pos = strchr (u_len_pos, '*');
16245
16246 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16247
16248 uint32_t u_len_len = u_buf_pos - u_len_pos;
16249
16250 u_buf_pos++;
16251
16252 char *o_len_pos = strchr (u_buf_pos, '*');
16253
16254 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16255
16256 uint32_t u_buf_len = o_len_pos - u_buf_pos;
16257
16258 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16259
16260 o_len_pos++;
16261
16262 char *o_buf_pos = strchr (o_len_pos, '*');
16263
16264 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16265
16266 uint32_t o_len_len = o_buf_pos - o_len_pos;
16267
16268 o_buf_pos++;
16269
16270 char *rc4key_pos = strchr (o_buf_pos, ':');
16271
16272 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16273
16274 uint32_t o_buf_len = rc4key_pos - o_buf_pos;
16275
16276 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16277
16278 rc4key_pos++;
16279
16280 uint32_t 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;
16281
16282 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
16283
16284 // validate data
16285
16286 const int V = atoi (V_pos);
16287 const int R = atoi (R_pos);
16288 const int P = atoi (P_pos);
16289
16290 if (V != 1) return (PARSER_SALT_VALUE);
16291 if (R != 2) return (PARSER_SALT_VALUE);
16292
16293 const int enc_md = atoi (enc_md_pos);
16294
16295 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
16296
16297 const int id_len = atoi (id_len_pos);
16298 const int u_len = atoi (u_len_pos);
16299 const int o_len = atoi (o_len_pos);
16300
16301 if (id_len != 16) return (PARSER_SALT_VALUE);
16302 if (u_len != 32) return (PARSER_SALT_VALUE);
16303 if (o_len != 32) return (PARSER_SALT_VALUE);
16304
16305 const int bits = atoi (bits_pos);
16306
16307 if (bits != 40) return (PARSER_SALT_VALUE);
16308
16309 // copy data to esalt
16310
16311 pdf->V = V;
16312 pdf->R = R;
16313 pdf->P = P;
16314
16315 pdf->enc_md = enc_md;
16316
16317 pdf->id_buf[0] = hex_to_uint (&id_buf_pos[ 0]);
16318 pdf->id_buf[1] = hex_to_uint (&id_buf_pos[ 8]);
16319 pdf->id_buf[2] = hex_to_uint (&id_buf_pos[16]);
16320 pdf->id_buf[3] = hex_to_uint (&id_buf_pos[24]);
16321 pdf->id_len = id_len;
16322
16323 pdf->u_buf[0] = hex_to_uint (&u_buf_pos[ 0]);
16324 pdf->u_buf[1] = hex_to_uint (&u_buf_pos[ 8]);
16325 pdf->u_buf[2] = hex_to_uint (&u_buf_pos[16]);
16326 pdf->u_buf[3] = hex_to_uint (&u_buf_pos[24]);
16327 pdf->u_buf[4] = hex_to_uint (&u_buf_pos[32]);
16328 pdf->u_buf[5] = hex_to_uint (&u_buf_pos[40]);
16329 pdf->u_buf[6] = hex_to_uint (&u_buf_pos[48]);
16330 pdf->u_buf[7] = hex_to_uint (&u_buf_pos[56]);
16331 pdf->u_len = u_len;
16332
16333 pdf->o_buf[0] = hex_to_uint (&o_buf_pos[ 0]);
16334 pdf->o_buf[1] = hex_to_uint (&o_buf_pos[ 8]);
16335 pdf->o_buf[2] = hex_to_uint (&o_buf_pos[16]);
16336 pdf->o_buf[3] = hex_to_uint (&o_buf_pos[24]);
16337 pdf->o_buf[4] = hex_to_uint (&o_buf_pos[32]);
16338 pdf->o_buf[5] = hex_to_uint (&o_buf_pos[40]);
16339 pdf->o_buf[6] = hex_to_uint (&o_buf_pos[48]);
16340 pdf->o_buf[7] = hex_to_uint (&o_buf_pos[56]);
16341 pdf->o_len = o_len;
16342
16343 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16344 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16345 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16346 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16347
16348 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16349 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16350 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16351 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16352 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16353 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16354 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16355 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16356
16357 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16358 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16359 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16360 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16361 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16362 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16363 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16364 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16365
16366 pdf->rc4key[1] = 0;
16367 pdf->rc4key[0] = 0;
16368
16369 pdf->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
16370 pdf->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
16371 pdf->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
16372 pdf->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
16373 pdf->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
16374 pdf->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
16375 pdf->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
16376 pdf->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
16377 pdf->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
16378 pdf->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
16379
16380 pdf->rc4key[0] = byte_swap_32 (pdf->rc4key[0]);
16381 pdf->rc4key[1] = byte_swap_32 (pdf->rc4key[1]);
16382
16383 // we use ID for salt, maybe needs to change, we will see...
16384
16385 salt->salt_buf[0] = pdf->id_buf[0];
16386 salt->salt_buf[1] = pdf->id_buf[1];
16387 salt->salt_buf[2] = pdf->id_buf[2];
16388 salt->salt_buf[3] = pdf->id_buf[3];
16389 salt->salt_buf[4] = pdf->u_buf[0];
16390 salt->salt_buf[5] = pdf->u_buf[1];
16391 salt->salt_buf[6] = pdf->o_buf[0];
16392 salt->salt_buf[7] = pdf->o_buf[1];
16393 salt->salt_len = pdf->id_len + 16;
16394
16395 digest[0] = pdf->rc4key[0];
16396 digest[1] = pdf->rc4key[1];
16397 digest[2] = 0;
16398 digest[3] = 0;
16399
16400 return (PARSER_OK);
16401 }
16402
16403 int pdf14_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16404 {
16405 if ((input_len < DISPLAY_LEN_MIN_10500) || (input_len > DISPLAY_LEN_MAX_10500)) return (PARSER_GLOBAL_LENGTH);
16406
16407 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16408
16409 uint32_t *digest = (uint32_t *) hash_buf->digest;
16410
16411 salt_t *salt = hash_buf->salt;
16412
16413 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16414
16415 /**
16416 * parse line
16417 */
16418
16419 char *V_pos = input_buf + 5;
16420
16421 char *R_pos = strchr (V_pos, '*');
16422
16423 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16424
16425 uint32_t V_len = R_pos - V_pos;
16426
16427 R_pos++;
16428
16429 char *bits_pos = strchr (R_pos, '*');
16430
16431 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16432
16433 uint32_t R_len = bits_pos - R_pos;
16434
16435 bits_pos++;
16436
16437 char *P_pos = strchr (bits_pos, '*');
16438
16439 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16440
16441 uint32_t bits_len = P_pos - bits_pos;
16442
16443 P_pos++;
16444
16445 char *enc_md_pos = strchr (P_pos, '*');
16446
16447 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16448
16449 uint32_t P_len = enc_md_pos - P_pos;
16450
16451 enc_md_pos++;
16452
16453 char *id_len_pos = strchr (enc_md_pos, '*');
16454
16455 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16456
16457 uint32_t enc_md_len = id_len_pos - enc_md_pos;
16458
16459 id_len_pos++;
16460
16461 char *id_buf_pos = strchr (id_len_pos, '*');
16462
16463 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16464
16465 uint32_t id_len_len = id_buf_pos - id_len_pos;
16466
16467 id_buf_pos++;
16468
16469 char *u_len_pos = strchr (id_buf_pos, '*');
16470
16471 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16472
16473 uint32_t id_buf_len = u_len_pos - id_buf_pos;
16474
16475 if ((id_buf_len != 32) && (id_buf_len != 64)) return (PARSER_SALT_LENGTH);
16476
16477 u_len_pos++;
16478
16479 char *u_buf_pos = strchr (u_len_pos, '*');
16480
16481 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16482
16483 uint32_t u_len_len = u_buf_pos - u_len_pos;
16484
16485 u_buf_pos++;
16486
16487 char *o_len_pos = strchr (u_buf_pos, '*');
16488
16489 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16490
16491 uint32_t u_buf_len = o_len_pos - u_buf_pos;
16492
16493 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16494
16495 o_len_pos++;
16496
16497 char *o_buf_pos = strchr (o_len_pos, '*');
16498
16499 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16500
16501 uint32_t o_len_len = o_buf_pos - o_len_pos;
16502
16503 o_buf_pos++;
16504
16505 uint32_t 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;
16506
16507 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16508
16509 // validate data
16510
16511 const int V = atoi (V_pos);
16512 const int R = atoi (R_pos);
16513 const int P = atoi (P_pos);
16514
16515 int vr_ok = 0;
16516
16517 if ((V == 2) && (R == 3)) vr_ok = 1;
16518 if ((V == 4) && (R == 4)) vr_ok = 1;
16519
16520 if (vr_ok == 0) return (PARSER_SALT_VALUE);
16521
16522 const int id_len = atoi (id_len_pos);
16523 const int u_len = atoi (u_len_pos);
16524 const int o_len = atoi (o_len_pos);
16525
16526 if ((id_len != 16) && (id_len != 32)) return (PARSER_SALT_VALUE);
16527
16528 if (u_len != 32) return (PARSER_SALT_VALUE);
16529 if (o_len != 32) return (PARSER_SALT_VALUE);
16530
16531 const int bits = atoi (bits_pos);
16532
16533 if (bits != 128) return (PARSER_SALT_VALUE);
16534
16535 int enc_md = 1;
16536
16537 if (R >= 4)
16538 {
16539 enc_md = atoi (enc_md_pos);
16540 }
16541
16542 // copy data to esalt
16543
16544 pdf->V = V;
16545 pdf->R = R;
16546 pdf->P = P;
16547
16548 pdf->enc_md = enc_md;
16549
16550 pdf->id_buf[0] = hex_to_uint (&id_buf_pos[ 0]);
16551 pdf->id_buf[1] = hex_to_uint (&id_buf_pos[ 8]);
16552 pdf->id_buf[2] = hex_to_uint (&id_buf_pos[16]);
16553 pdf->id_buf[3] = hex_to_uint (&id_buf_pos[24]);
16554
16555 if (id_len == 32)
16556 {
16557 pdf->id_buf[4] = hex_to_uint (&id_buf_pos[32]);
16558 pdf->id_buf[5] = hex_to_uint (&id_buf_pos[40]);
16559 pdf->id_buf[6] = hex_to_uint (&id_buf_pos[48]);
16560 pdf->id_buf[7] = hex_to_uint (&id_buf_pos[56]);
16561 }
16562
16563 pdf->id_len = id_len;
16564
16565 pdf->u_buf[0] = hex_to_uint (&u_buf_pos[ 0]);
16566 pdf->u_buf[1] = hex_to_uint (&u_buf_pos[ 8]);
16567 pdf->u_buf[2] = hex_to_uint (&u_buf_pos[16]);
16568 pdf->u_buf[3] = hex_to_uint (&u_buf_pos[24]);
16569 pdf->u_buf[4] = hex_to_uint (&u_buf_pos[32]);
16570 pdf->u_buf[5] = hex_to_uint (&u_buf_pos[40]);
16571 pdf->u_buf[6] = hex_to_uint (&u_buf_pos[48]);
16572 pdf->u_buf[7] = hex_to_uint (&u_buf_pos[56]);
16573 pdf->u_len = u_len;
16574
16575 pdf->o_buf[0] = hex_to_uint (&o_buf_pos[ 0]);
16576 pdf->o_buf[1] = hex_to_uint (&o_buf_pos[ 8]);
16577 pdf->o_buf[2] = hex_to_uint (&o_buf_pos[16]);
16578 pdf->o_buf[3] = hex_to_uint (&o_buf_pos[24]);
16579 pdf->o_buf[4] = hex_to_uint (&o_buf_pos[32]);
16580 pdf->o_buf[5] = hex_to_uint (&o_buf_pos[40]);
16581 pdf->o_buf[6] = hex_to_uint (&o_buf_pos[48]);
16582 pdf->o_buf[7] = hex_to_uint (&o_buf_pos[56]);
16583 pdf->o_len = o_len;
16584
16585 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16586 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16587 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16588 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16589
16590 if (id_len == 32)
16591 {
16592 pdf->id_buf[4] = byte_swap_32 (pdf->id_buf[4]);
16593 pdf->id_buf[5] = byte_swap_32 (pdf->id_buf[5]);
16594 pdf->id_buf[6] = byte_swap_32 (pdf->id_buf[6]);
16595 pdf->id_buf[7] = byte_swap_32 (pdf->id_buf[7]);
16596 }
16597
16598 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16599 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16600 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16601 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16602 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16603 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16604 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16605 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16606
16607 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16608 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16609 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16610 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16611 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16612 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16613 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16614 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16615
16616 // precompute rc4 data for later use
16617
16618 uint padding[8] =
16619 {
16620 0x5e4ebf28,
16621 0x418a754e,
16622 0x564e0064,
16623 0x0801faff,
16624 0xb6002e2e,
16625 0x803e68d0,
16626 0xfea90c2f,
16627 0x7a695364
16628 };
16629
16630 // md5
16631
16632 uint salt_pc_block[32];
16633
16634 char *salt_pc_ptr = (char *) salt_pc_block;
16635
16636 memcpy (salt_pc_ptr, padding, 32);
16637 memcpy (salt_pc_ptr + 32, pdf->id_buf, pdf->id_len);
16638
16639 uint salt_pc_digest[4];
16640
16641 md5_complete_no_limit (salt_pc_digest, salt_pc_block, 32 + pdf->id_len);
16642
16643 pdf->rc4data[0] = salt_pc_digest[0];
16644 pdf->rc4data[1] = salt_pc_digest[1];
16645
16646 // we use ID for salt, maybe needs to change, we will see...
16647
16648 salt->salt_buf[0] = pdf->id_buf[0];
16649 salt->salt_buf[1] = pdf->id_buf[1];
16650 salt->salt_buf[2] = pdf->id_buf[2];
16651 salt->salt_buf[3] = pdf->id_buf[3];
16652 salt->salt_buf[4] = pdf->u_buf[0];
16653 salt->salt_buf[5] = pdf->u_buf[1];
16654 salt->salt_buf[6] = pdf->o_buf[0];
16655 salt->salt_buf[7] = pdf->o_buf[1];
16656 salt->salt_len = pdf->id_len + 16;
16657
16658 salt->salt_iter = ROUNDS_PDF14;
16659
16660 digest[0] = pdf->u_buf[0];
16661 digest[1] = pdf->u_buf[1];
16662 digest[2] = 0;
16663 digest[3] = 0;
16664
16665 return (PARSER_OK);
16666 }
16667
16668 int pdf17l3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16669 {
16670 int ret = pdf17l8_parse_hash (input_buf, input_len, hash_buf);
16671
16672 if (ret != PARSER_OK)
16673 {
16674 return ret;
16675 }
16676
16677 uint32_t *digest = (uint32_t *) hash_buf->digest;
16678
16679 salt_t *salt = hash_buf->salt;
16680
16681 digest[0] -= SHA256M_A;
16682 digest[1] -= SHA256M_B;
16683 digest[2] -= SHA256M_C;
16684 digest[3] -= SHA256M_D;
16685 digest[4] -= SHA256M_E;
16686 digest[5] -= SHA256M_F;
16687 digest[6] -= SHA256M_G;
16688 digest[7] -= SHA256M_H;
16689
16690 salt->salt_buf[2] = 0x80;
16691
16692 return (PARSER_OK);
16693 }
16694
16695 int pdf17l8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16696 {
16697 if ((input_len < DISPLAY_LEN_MIN_10600) || (input_len > DISPLAY_LEN_MAX_10600)) return (PARSER_GLOBAL_LENGTH);
16698
16699 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16700
16701 uint32_t *digest = (uint32_t *) hash_buf->digest;
16702
16703 salt_t *salt = hash_buf->salt;
16704
16705 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16706
16707 /**
16708 * parse line
16709 */
16710
16711 char *V_pos = input_buf + 5;
16712
16713 char *R_pos = strchr (V_pos, '*');
16714
16715 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16716
16717 uint32_t V_len = R_pos - V_pos;
16718
16719 R_pos++;
16720
16721 char *bits_pos = strchr (R_pos, '*');
16722
16723 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16724
16725 uint32_t R_len = bits_pos - R_pos;
16726
16727 bits_pos++;
16728
16729 char *P_pos = strchr (bits_pos, '*');
16730
16731 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16732
16733 uint32_t bits_len = P_pos - bits_pos;
16734
16735 P_pos++;
16736
16737 char *enc_md_pos = strchr (P_pos, '*');
16738
16739 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16740
16741 uint32_t P_len = enc_md_pos - P_pos;
16742
16743 enc_md_pos++;
16744
16745 char *id_len_pos = strchr (enc_md_pos, '*');
16746
16747 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16748
16749 uint32_t enc_md_len = id_len_pos - enc_md_pos;
16750
16751 id_len_pos++;
16752
16753 char *id_buf_pos = strchr (id_len_pos, '*');
16754
16755 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16756
16757 uint32_t id_len_len = id_buf_pos - id_len_pos;
16758
16759 id_buf_pos++;
16760
16761 char *u_len_pos = strchr (id_buf_pos, '*');
16762
16763 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16764
16765 uint32_t id_buf_len = u_len_pos - id_buf_pos;
16766
16767 u_len_pos++;
16768
16769 char *u_buf_pos = strchr (u_len_pos, '*');
16770
16771 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16772
16773 uint32_t u_len_len = u_buf_pos - u_len_pos;
16774
16775 u_buf_pos++;
16776
16777 char *o_len_pos = strchr (u_buf_pos, '*');
16778
16779 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16780
16781 uint32_t u_buf_len = o_len_pos - u_buf_pos;
16782
16783 o_len_pos++;
16784
16785 char *o_buf_pos = strchr (o_len_pos, '*');
16786
16787 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16788
16789 uint32_t o_len_len = o_buf_pos - o_len_pos;
16790
16791 o_buf_pos++;
16792
16793 char *last = strchr (o_buf_pos, '*');
16794
16795 if (last == NULL) last = input_buf + input_len;
16796
16797 uint32_t o_buf_len = last - o_buf_pos;
16798
16799 // validate data
16800
16801 const int V = atoi (V_pos);
16802 const int R = atoi (R_pos);
16803
16804 int vr_ok = 0;
16805
16806 if ((V == 5) && (R == 5)) vr_ok = 1;
16807 if ((V == 5) && (R == 6)) vr_ok = 1;
16808
16809 if (vr_ok == 0) return (PARSER_SALT_VALUE);
16810
16811 const int bits = atoi (bits_pos);
16812
16813 if (bits != 256) return (PARSER_SALT_VALUE);
16814
16815 int enc_md = atoi (enc_md_pos);
16816
16817 if (enc_md != 1) return (PARSER_SALT_VALUE);
16818
16819 const uint id_len = atoi (id_len_pos);
16820 const uint u_len = atoi (u_len_pos);
16821 const uint o_len = atoi (o_len_pos);
16822
16823 if (V_len > 6) return (PARSER_SALT_LENGTH);
16824 if (R_len > 6) return (PARSER_SALT_LENGTH);
16825 if (P_len > 6) return (PARSER_SALT_LENGTH);
16826 if (id_len_len > 6) return (PARSER_SALT_LENGTH);
16827 if (u_len_len > 6) return (PARSER_SALT_LENGTH);
16828 if (o_len_len > 6) return (PARSER_SALT_LENGTH);
16829 if (bits_len > 6) return (PARSER_SALT_LENGTH);
16830 if (enc_md_len > 6) return (PARSER_SALT_LENGTH);
16831
16832 if ((id_len * 2) != id_buf_len) return (PARSER_SALT_VALUE);
16833 if ((u_len * 2) != u_buf_len) return (PARSER_SALT_VALUE);
16834 if ((o_len * 2) != o_buf_len) return (PARSER_SALT_VALUE);
16835
16836 // copy data to esalt
16837
16838 if (u_len < 40) return (PARSER_SALT_VALUE);
16839
16840 for (int i = 0, j = 0; i < 8 + 2; i += 1, j += 8)
16841 {
16842 pdf->u_buf[i] = hex_to_uint (&u_buf_pos[j]);
16843 }
16844
16845 salt->salt_buf[0] = pdf->u_buf[8];
16846 salt->salt_buf[1] = pdf->u_buf[9];
16847
16848 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
16849 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
16850
16851 salt->salt_len = 8;
16852 salt->salt_iter = ROUNDS_PDF17L8;
16853
16854 digest[0] = pdf->u_buf[0];
16855 digest[1] = pdf->u_buf[1];
16856 digest[2] = pdf->u_buf[2];
16857 digest[3] = pdf->u_buf[3];
16858 digest[4] = pdf->u_buf[4];
16859 digest[5] = pdf->u_buf[5];
16860 digest[6] = pdf->u_buf[6];
16861 digest[7] = pdf->u_buf[7];
16862
16863 return (PARSER_OK);
16864 }
16865
16866 int pbkdf2_sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16867 {
16868 if ((input_len < DISPLAY_LEN_MIN_10900) || (input_len > DISPLAY_LEN_MAX_10900)) return (PARSER_GLOBAL_LENGTH);
16869
16870 if (memcmp (SIGNATURE_PBKDF2_SHA256, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
16871
16872 uint32_t *digest = (uint32_t *) hash_buf->digest;
16873
16874 salt_t *salt = hash_buf->salt;
16875
16876 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
16877
16878 /**
16879 * parse line
16880 */
16881
16882 // iterations
16883
16884 char *iter_pos = input_buf + 7;
16885
16886 uint32_t iter = atoi (iter_pos);
16887
16888 if (iter < 1) return (PARSER_SALT_ITERATION);
16889 if (iter > 999999) return (PARSER_SALT_ITERATION);
16890
16891 // first is *raw* salt
16892
16893 char *salt_pos = strchr (iter_pos, ':');
16894
16895 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16896
16897 salt_pos++;
16898
16899 char *hash_pos = strchr (salt_pos, ':');
16900
16901 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16902
16903 uint32_t salt_len = hash_pos - salt_pos;
16904
16905 if (salt_len > 64) return (PARSER_SALT_LENGTH);
16906
16907 hash_pos++;
16908
16909 uint32_t hash_b64_len = input_len - (hash_pos - input_buf);
16910
16911 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
16912
16913 // decode salt
16914
16915 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
16916
16917 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
16918
16919 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
16920
16921 salt_buf_ptr[salt_len + 3] = 0x01;
16922 salt_buf_ptr[salt_len + 4] = 0x80;
16923
16924 salt->salt_len = salt_len;
16925 salt->salt_iter = iter - 1;
16926
16927 // decode hash
16928
16929 char tmp_buf[100];
16930
16931 memset (tmp_buf, 0, sizeof (tmp_buf));
16932
16933 int hash_len = base64_decode (base64_to_int, hash_pos, hash_b64_len, tmp_buf);
16934
16935 if (hash_len < 16) return (PARSER_HASH_LENGTH);
16936
16937 memcpy (digest, tmp_buf, 16);
16938
16939 digest[0] = byte_swap_32 (digest[0]);
16940 digest[1] = byte_swap_32 (digest[1]);
16941 digest[2] = byte_swap_32 (digest[2]);
16942 digest[3] = byte_swap_32 (digest[3]);
16943
16944 // add some stuff to normal salt to make sorted happy
16945
16946 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
16947 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
16948 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
16949 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
16950 salt->salt_buf[4] = salt->salt_iter;
16951
16952 return (PARSER_OK);
16953 }
16954
16955 int prestashop_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16956 {
16957 if ((input_len < DISPLAY_LEN_MIN_11000) || (input_len > DISPLAY_LEN_MAX_11000)) return (PARSER_GLOBAL_LENGTH);
16958
16959 uint32_t *digest = (uint32_t *) hash_buf->digest;
16960
16961 salt_t *salt = hash_buf->salt;
16962
16963 digest[0] = hex_to_uint (&input_buf[ 0]);
16964 digest[1] = hex_to_uint (&input_buf[ 8]);
16965 digest[2] = hex_to_uint (&input_buf[16]);
16966 digest[3] = hex_to_uint (&input_buf[24]);
16967
16968 digest[0] = byte_swap_32 (digest[0]);
16969 digest[1] = byte_swap_32 (digest[1]);
16970 digest[2] = byte_swap_32 (digest[2]);
16971 digest[3] = byte_swap_32 (digest[3]);
16972
16973 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16974
16975 uint salt_len = input_len - 32 - 1;
16976
16977 char *salt_buf = input_buf + 32 + 1;
16978
16979 char *salt_buf_ptr = (char *) salt->salt_buf;
16980
16981 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
16982
16983 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
16984
16985 salt->salt_len = salt_len;
16986
16987 return (PARSER_OK);
16988 }
16989
16990 int postgresql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16991 {
16992 if ((input_len < DISPLAY_LEN_MIN_11100) || (input_len > DISPLAY_LEN_MAX_11100)) return (PARSER_GLOBAL_LENGTH);
16993
16994 if (memcmp (SIGNATURE_POSTGRESQL_AUTH, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
16995
16996 uint32_t *digest = (uint32_t *) hash_buf->digest;
16997
16998 salt_t *salt = hash_buf->salt;
16999
17000 char *user_pos = input_buf + 10;
17001
17002 char *salt_pos = strchr (user_pos, '*');
17003
17004 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17005
17006 salt_pos++;
17007
17008 char *hash_pos = strchr (salt_pos, '*');
17009
17010 hash_pos++;
17011
17012 uint hash_len = input_len - (hash_pos - input_buf);
17013
17014 if (hash_len != 32) return (PARSER_HASH_LENGTH);
17015
17016 uint user_len = salt_pos - user_pos - 1;
17017
17018 uint salt_len = hash_pos - salt_pos - 1;
17019
17020 if (salt_len != 8) return (PARSER_SALT_LENGTH);
17021
17022 /*
17023 * store digest
17024 */
17025
17026 digest[0] = hex_to_uint (&hash_pos[ 0]);
17027 digest[1] = hex_to_uint (&hash_pos[ 8]);
17028 digest[2] = hex_to_uint (&hash_pos[16]);
17029 digest[3] = hex_to_uint (&hash_pos[24]);
17030
17031 digest[0] = byte_swap_32 (digest[0]);
17032 digest[1] = byte_swap_32 (digest[1]);
17033 digest[2] = byte_swap_32 (digest[2]);
17034 digest[3] = byte_swap_32 (digest[3]);
17035
17036 digest[0] -= MD5M_A;
17037 digest[1] -= MD5M_B;
17038 digest[2] -= MD5M_C;
17039 digest[3] -= MD5M_D;
17040
17041 /*
17042 * store salt
17043 */
17044
17045 char *salt_buf_ptr = (char *) salt->salt_buf;
17046
17047 // first 4 bytes are the "challenge"
17048
17049 salt_buf_ptr[0] = hex_to_char (&salt_pos[0]);
17050 salt_buf_ptr[1] = hex_to_char (&salt_pos[2]);
17051 salt_buf_ptr[2] = hex_to_char (&salt_pos[4]);
17052 salt_buf_ptr[3] = hex_to_char (&salt_pos[6]);
17053
17054 // append the user name
17055
17056 user_len = parse_and_store_salt (salt_buf_ptr + 4, user_pos, user_len);
17057
17058 salt->salt_len = 4 + user_len;
17059
17060 return (PARSER_OK);
17061 }
17062
17063 int mysql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17064 {
17065 if ((input_len < DISPLAY_LEN_MIN_11200) || (input_len > DISPLAY_LEN_MAX_11200)) return (PARSER_GLOBAL_LENGTH);
17066
17067 if (memcmp (SIGNATURE_MYSQL_AUTH, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
17068
17069 uint32_t *digest = (uint32_t *) hash_buf->digest;
17070
17071 salt_t *salt = hash_buf->salt;
17072
17073 char *salt_pos = input_buf + 9;
17074
17075 char *hash_pos = strchr (salt_pos, '*');
17076
17077 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17078
17079 hash_pos++;
17080
17081 uint hash_len = input_len - (hash_pos - input_buf);
17082
17083 if (hash_len != 40) return (PARSER_HASH_LENGTH);
17084
17085 uint salt_len = hash_pos - salt_pos - 1;
17086
17087 if (salt_len != 40) return (PARSER_SALT_LENGTH);
17088
17089 /*
17090 * store digest
17091 */
17092
17093 digest[0] = hex_to_uint (&hash_pos[ 0]);
17094 digest[1] = hex_to_uint (&hash_pos[ 8]);
17095 digest[2] = hex_to_uint (&hash_pos[16]);
17096 digest[3] = hex_to_uint (&hash_pos[24]);
17097 digest[4] = hex_to_uint (&hash_pos[32]);
17098
17099 /*
17100 * store salt
17101 */
17102
17103 char *salt_buf_ptr = (char *) salt->salt_buf;
17104
17105 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
17106
17107 salt->salt_len = salt_len;
17108
17109 return (PARSER_OK);
17110 }
17111
17112 int bitcoin_wallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17113 {
17114 if ((input_len < DISPLAY_LEN_MIN_11300) || (input_len > DISPLAY_LEN_MAX_11300)) return (PARSER_GLOBAL_LENGTH);
17115
17116 if (memcmp (SIGNATURE_BITCOIN_WALLET, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
17117
17118 uint32_t *digest = (uint32_t *) hash_buf->digest;
17119
17120 salt_t *salt = hash_buf->salt;
17121
17122 bitcoin_wallet_t *bitcoin_wallet = (bitcoin_wallet_t *) hash_buf->esalt;
17123
17124 /**
17125 * parse line
17126 */
17127
17128 char *cry_master_len_pos = input_buf + 9;
17129
17130 char *cry_master_buf_pos = strchr (cry_master_len_pos, '$');
17131
17132 if (cry_master_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17133
17134 uint32_t cry_master_len_len = cry_master_buf_pos - cry_master_len_pos;
17135
17136 cry_master_buf_pos++;
17137
17138 char *cry_salt_len_pos = strchr (cry_master_buf_pos, '$');
17139
17140 if (cry_salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17141
17142 uint32_t cry_master_buf_len = cry_salt_len_pos - cry_master_buf_pos;
17143
17144 cry_salt_len_pos++;
17145
17146 char *cry_salt_buf_pos = strchr (cry_salt_len_pos, '$');
17147
17148 if (cry_salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17149
17150 uint32_t cry_salt_len_len = cry_salt_buf_pos - cry_salt_len_pos;
17151
17152 cry_salt_buf_pos++;
17153
17154 char *cry_rounds_pos = strchr (cry_salt_buf_pos, '$');
17155
17156 if (cry_rounds_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17157
17158 uint32_t cry_salt_buf_len = cry_rounds_pos - cry_salt_buf_pos;
17159
17160 cry_rounds_pos++;
17161
17162 char *ckey_len_pos = strchr (cry_rounds_pos, '$');
17163
17164 if (ckey_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17165
17166 uint32_t cry_rounds_len = ckey_len_pos - cry_rounds_pos;
17167
17168 ckey_len_pos++;
17169
17170 char *ckey_buf_pos = strchr (ckey_len_pos, '$');
17171
17172 if (ckey_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17173
17174 uint32_t ckey_len_len = ckey_buf_pos - ckey_len_pos;
17175
17176 ckey_buf_pos++;
17177
17178 char *public_key_len_pos = strchr (ckey_buf_pos, '$');
17179
17180 if (public_key_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17181
17182 uint32_t ckey_buf_len = public_key_len_pos - ckey_buf_pos;
17183
17184 public_key_len_pos++;
17185
17186 char *public_key_buf_pos = strchr (public_key_len_pos, '$');
17187
17188 if (public_key_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17189
17190 uint32_t public_key_len_len = public_key_buf_pos - public_key_len_pos;
17191
17192 public_key_buf_pos++;
17193
17194 uint32_t 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;
17195
17196 const uint cry_master_len = atoi (cry_master_len_pos);
17197 const uint cry_salt_len = atoi (cry_salt_len_pos);
17198 const uint ckey_len = atoi (ckey_len_pos);
17199 const uint public_key_len = atoi (public_key_len_pos);
17200
17201 if (cry_master_buf_len != cry_master_len) return (PARSER_SALT_VALUE);
17202 if (cry_salt_buf_len != cry_salt_len) return (PARSER_SALT_VALUE);
17203 if (ckey_buf_len != ckey_len) return (PARSER_SALT_VALUE);
17204 if (public_key_buf_len != public_key_len) return (PARSER_SALT_VALUE);
17205
17206 for (uint i = 0, j = 0; i < cry_master_len; i += 1, j += 8)
17207 {
17208 bitcoin_wallet->cry_master_buf[i] = hex_to_uint (&cry_master_buf_pos[j]);
17209
17210 bitcoin_wallet->cry_master_buf[i] = byte_swap_32 (bitcoin_wallet->cry_master_buf[i]);
17211 }
17212
17213 for (uint i = 0, j = 0; i < ckey_len; i += 1, j += 8)
17214 {
17215 bitcoin_wallet->ckey_buf[i] = hex_to_uint (&ckey_buf_pos[j]);
17216
17217 bitcoin_wallet->ckey_buf[i] = byte_swap_32 (bitcoin_wallet->ckey_buf[i]);
17218 }
17219
17220 for (uint i = 0, j = 0; i < public_key_len; i += 1, j += 8)
17221 {
17222 bitcoin_wallet->public_key_buf[i] = hex_to_uint (&public_key_buf_pos[j]);
17223
17224 bitcoin_wallet->public_key_buf[i] = byte_swap_32 (bitcoin_wallet->public_key_buf[i]);
17225 }
17226
17227 bitcoin_wallet->cry_master_len = cry_master_len / 2;
17228 bitcoin_wallet->ckey_len = ckey_len / 2;
17229 bitcoin_wallet->public_key_len = public_key_len / 2;
17230
17231 /*
17232 * store digest (should be unique enought, hopefully)
17233 */
17234
17235 digest[0] = bitcoin_wallet->cry_master_buf[0];
17236 digest[1] = bitcoin_wallet->cry_master_buf[1];
17237 digest[2] = bitcoin_wallet->cry_master_buf[2];
17238 digest[3] = bitcoin_wallet->cry_master_buf[3];
17239
17240 /*
17241 * store salt
17242 */
17243
17244 if (cry_rounds_len >= 7) return (PARSER_SALT_VALUE);
17245
17246 const uint cry_rounds = atoi (cry_rounds_pos);
17247
17248 salt->salt_iter = cry_rounds - 1;
17249
17250 char *salt_buf_ptr = (char *) salt->salt_buf;
17251
17252 const uint salt_len = parse_and_store_salt (salt_buf_ptr, cry_salt_buf_pos, cry_salt_buf_len);
17253
17254 salt->salt_len = salt_len;
17255
17256 return (PARSER_OK);
17257 }
17258
17259 int sip_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17260 {
17261 if ((input_len < DISPLAY_LEN_MIN_11400) || (input_len > DISPLAY_LEN_MAX_11400)) return (PARSER_GLOBAL_LENGTH);
17262
17263 if (memcmp (SIGNATURE_SIP_AUTH, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
17264
17265 uint32_t *digest = (uint32_t *) hash_buf->digest;
17266
17267 salt_t *salt = hash_buf->salt;
17268
17269 sip_t *sip = (sip_t *) hash_buf->esalt;
17270
17271 // work with a temporary copy of input_buf (s.t. we can manipulate it directly)
17272
17273 char temp_input_buf[input_len + 1];
17274
17275 memset (temp_input_buf, 0, sizeof (temp_input_buf));
17276 memcpy (temp_input_buf, input_buf, input_len);
17277
17278 // URI_server:
17279
17280 char *URI_server_pos = temp_input_buf + 6;
17281
17282 char *URI_client_pos = strchr (URI_server_pos, '*');
17283
17284 if (URI_client_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17285
17286 URI_client_pos[0] = 0;
17287 URI_client_pos++;
17288
17289 uint URI_server_len = strlen (URI_server_pos);
17290
17291 if (URI_server_len > 512) return (PARSER_SALT_LENGTH);
17292
17293 // URI_client:
17294
17295 char *user_pos = strchr (URI_client_pos, '*');
17296
17297 if (user_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17298
17299 user_pos[0] = 0;
17300 user_pos++;
17301
17302 uint URI_client_len = strlen (URI_client_pos);
17303
17304 if (URI_client_len > 512) return (PARSER_SALT_LENGTH);
17305
17306 // user:
17307
17308 char *realm_pos = strchr (user_pos, '*');
17309
17310 if (realm_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17311
17312 realm_pos[0] = 0;
17313 realm_pos++;
17314
17315 uint user_len = strlen (user_pos);
17316
17317 if (user_len > 116) return (PARSER_SALT_LENGTH);
17318
17319 // realm:
17320
17321 char *method_pos = strchr (realm_pos, '*');
17322
17323 if (method_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17324
17325 method_pos[0] = 0;
17326 method_pos++;
17327
17328 uint realm_len = strlen (realm_pos);
17329
17330 if (realm_len > 116) return (PARSER_SALT_LENGTH);
17331
17332 // method:
17333
17334 char *URI_prefix_pos = strchr (method_pos, '*');
17335
17336 if (URI_prefix_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17337
17338 URI_prefix_pos[0] = 0;
17339 URI_prefix_pos++;
17340
17341 uint method_len = strlen (method_pos);
17342
17343 if (method_len > 246) return (PARSER_SALT_LENGTH);
17344
17345 // URI_prefix:
17346
17347 char *URI_resource_pos = strchr (URI_prefix_pos, '*');
17348
17349 if (URI_resource_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17350
17351 URI_resource_pos[0] = 0;
17352 URI_resource_pos++;
17353
17354 uint URI_prefix_len = strlen (URI_prefix_pos);
17355
17356 if (URI_prefix_len > 245) return (PARSER_SALT_LENGTH);
17357
17358 // URI_resource:
17359
17360 char *URI_suffix_pos = strchr (URI_resource_pos, '*');
17361
17362 if (URI_suffix_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17363
17364 URI_suffix_pos[0] = 0;
17365 URI_suffix_pos++;
17366
17367 uint URI_resource_len = strlen (URI_resource_pos);
17368
17369 if (URI_resource_len < 1) return (PARSER_SALT_LENGTH);
17370 if (URI_resource_len > 246) return (PARSER_SALT_LENGTH);
17371
17372 // URI_suffix:
17373
17374 char *nonce_pos = strchr (URI_suffix_pos, '*');
17375
17376 if (nonce_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17377
17378 nonce_pos[0] = 0;
17379 nonce_pos++;
17380
17381 uint URI_suffix_len = strlen (URI_suffix_pos);
17382
17383 if (URI_suffix_len > 245) return (PARSER_SALT_LENGTH);
17384
17385 // nonce:
17386
17387 char *nonce_client_pos = strchr (nonce_pos, '*');
17388
17389 if (nonce_client_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17390
17391 nonce_client_pos[0] = 0;
17392 nonce_client_pos++;
17393
17394 uint nonce_len = strlen (nonce_pos);
17395
17396 if (nonce_len < 1) return (PARSER_SALT_LENGTH);
17397 if (nonce_len > 50) return (PARSER_SALT_LENGTH);
17398
17399 // nonce_client:
17400
17401 char *nonce_count_pos = strchr (nonce_client_pos, '*');
17402
17403 if (nonce_count_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17404
17405 nonce_count_pos[0] = 0;
17406 nonce_count_pos++;
17407
17408 uint nonce_client_len = strlen (nonce_client_pos);
17409
17410 if (nonce_client_len > 50) return (PARSER_SALT_LENGTH);
17411
17412 // nonce_count:
17413
17414 char *qop_pos = strchr (nonce_count_pos, '*');
17415
17416 if (qop_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17417
17418 qop_pos[0] = 0;
17419 qop_pos++;
17420
17421 uint nonce_count_len = strlen (nonce_count_pos);
17422
17423 if (nonce_count_len > 50) return (PARSER_SALT_LENGTH);
17424
17425 // qop:
17426
17427 char *directive_pos = strchr (qop_pos, '*');
17428
17429 if (directive_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17430
17431 directive_pos[0] = 0;
17432 directive_pos++;
17433
17434 uint qop_len = strlen (qop_pos);
17435
17436 if (qop_len > 50) return (PARSER_SALT_LENGTH);
17437
17438 // directive
17439
17440 char *digest_pos = strchr (directive_pos, '*');
17441
17442 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17443
17444 digest_pos[0] = 0;
17445 digest_pos++;
17446
17447 uint directive_len = strlen (directive_pos);
17448
17449 if (directive_len != 3) return (PARSER_SALT_LENGTH);
17450
17451 if (memcmp (directive_pos, "MD5", 3))
17452 {
17453 log_info ("ERROR: only the MD5 directive is currently supported\n");
17454
17455 return (PARSER_SIP_AUTH_DIRECTIVE);
17456 }
17457
17458 /*
17459 * first (pre-)compute: HA2 = md5 ($method . ":" . $uri)
17460 */
17461
17462 uint md5_len = 0;
17463
17464 uint md5_max_len = 4 * 64;
17465
17466 uint md5_remaining_len = md5_max_len;
17467
17468 uint tmp_md5_buf[md5_max_len / 4];
17469
17470 memset (tmp_md5_buf, 0, sizeof (tmp_md5_buf));
17471
17472 char *tmp_md5_ptr = (char *) tmp_md5_buf;
17473
17474 snprintf (tmp_md5_ptr, md5_remaining_len, "%s:", method_pos);
17475
17476 md5_len += method_len + 1;
17477 tmp_md5_ptr += method_len + 1;
17478
17479 if (URI_prefix_len > 0)
17480 {
17481 md5_remaining_len = md5_max_len - md5_len;
17482
17483 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s:", URI_prefix_pos);
17484
17485 md5_len += URI_prefix_len + 1;
17486 tmp_md5_ptr += URI_prefix_len + 1;
17487 }
17488
17489 md5_remaining_len = md5_max_len - md5_len;
17490
17491 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s", URI_resource_pos);
17492
17493 md5_len += URI_resource_len;
17494 tmp_md5_ptr += URI_resource_len;
17495
17496 if (URI_suffix_len > 0)
17497 {
17498 md5_remaining_len = md5_max_len - md5_len;
17499
17500 snprintf (tmp_md5_ptr, md5_remaining_len + 1, ":%s", URI_suffix_pos);
17501
17502 md5_len += 1 + URI_suffix_len;
17503 }
17504
17505 uint tmp_digest[4];
17506
17507 md5_complete_no_limit (tmp_digest, tmp_md5_buf, md5_len);
17508
17509 tmp_digest[0] = byte_swap_32 (tmp_digest[0]);
17510 tmp_digest[1] = byte_swap_32 (tmp_digest[1]);
17511 tmp_digest[2] = byte_swap_32 (tmp_digest[2]);
17512 tmp_digest[3] = byte_swap_32 (tmp_digest[3]);
17513
17514 /*
17515 * esalt
17516 */
17517
17518 char *esalt_buf_ptr = (char *) sip->esalt_buf;
17519
17520 uint esalt_len = 0;
17521
17522 uint max_esalt_len = sizeof (sip->esalt_buf); // 151 = (64 + 64 + 55) - 32, where 32 is the hexadecimal MD5 HA1 hash
17523
17524 // there are 2 possibilities for the esalt:
17525
17526 if ((strcmp (qop_pos, "auth") == 0) || (strcmp (qop_pos, "auth-int") == 0))
17527 {
17528 esalt_len = 1 + nonce_len + 1 + nonce_count_len + 1 + nonce_client_len + 1 + qop_len + 1 + 32;
17529
17530 if (esalt_len > max_esalt_len) return (PARSER_SALT_LENGTH);
17531
17532 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%s:%s:%s:%08x%08x%08x%08x",
17533 nonce_pos,
17534 nonce_count_pos,
17535 nonce_client_pos,
17536 qop_pos,
17537 tmp_digest[0],
17538 tmp_digest[1],
17539 tmp_digest[2],
17540 tmp_digest[3]);
17541 }
17542 else
17543 {
17544 esalt_len = 1 + nonce_len + 1 + 32;
17545
17546 if (esalt_len > max_esalt_len) return (PARSER_SALT_LENGTH);
17547
17548 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%08x%08x%08x%08x",
17549 nonce_pos,
17550 tmp_digest[0],
17551 tmp_digest[1],
17552 tmp_digest[2],
17553 tmp_digest[3]);
17554 }
17555
17556 // add 0x80 to esalt
17557
17558 esalt_buf_ptr[esalt_len] = 0x80;
17559
17560 sip->esalt_len = esalt_len;
17561
17562 /*
17563 * actual salt
17564 */
17565
17566 char *sip_salt_ptr = (char *) sip->salt_buf;
17567
17568 uint salt_len = user_len + 1 + realm_len + 1;
17569
17570 uint max_salt_len = 119;
17571
17572 if (salt_len > max_salt_len) return (PARSER_SALT_LENGTH);
17573
17574 snprintf (sip_salt_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
17575
17576 sip->salt_len = salt_len;
17577
17578 /*
17579 * fake salt (for sorting)
17580 */
17581
17582 char *salt_buf_ptr = (char *) salt->salt_buf;
17583
17584 max_salt_len = 55;
17585
17586 uint fake_salt_len = salt_len;
17587
17588 if (fake_salt_len > max_salt_len)
17589 {
17590 fake_salt_len = max_salt_len;
17591 }
17592
17593 snprintf (salt_buf_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
17594
17595 salt->salt_len = fake_salt_len;
17596
17597 /*
17598 * digest
17599 */
17600
17601 digest[0] = hex_to_uint (&digest_pos[ 0]);
17602 digest[1] = hex_to_uint (&digest_pos[ 8]);
17603 digest[2] = hex_to_uint (&digest_pos[16]);
17604 digest[3] = hex_to_uint (&digest_pos[24]);
17605
17606 digest[0] = byte_swap_32 (digest[0]);
17607 digest[1] = byte_swap_32 (digest[1]);
17608 digest[2] = byte_swap_32 (digest[2]);
17609 digest[3] = byte_swap_32 (digest[3]);
17610
17611 return (PARSER_OK);
17612 }
17613
17614 int crc32_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17615 {
17616 if ((input_len < DISPLAY_LEN_MIN_11500) || (input_len > DISPLAY_LEN_MAX_11500)) return (PARSER_GLOBAL_LENGTH);
17617
17618 if (input_buf[8] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
17619
17620 uint32_t *digest = (uint32_t *) hash_buf->digest;
17621
17622 salt_t *salt = hash_buf->salt;
17623
17624 // digest
17625
17626 char *digest_pos = input_buf;
17627
17628 digest[0] = hex_to_uint (&digest_pos[0]);
17629 digest[1] = 0;
17630 digest[2] = 0;
17631 digest[3] = 0;
17632
17633 // salt
17634
17635 char *salt_buf = input_buf + 8 + 1;
17636
17637 uint salt_len = 8;
17638
17639 char *salt_buf_ptr = (char *) salt->salt_buf;
17640
17641 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
17642
17643 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17644
17645 salt->salt_len = salt_len;
17646
17647 return (PARSER_OK);
17648 }
17649
17650 int seven_zip_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17651 {
17652 if ((input_len < DISPLAY_LEN_MIN_11600) || (input_len > DISPLAY_LEN_MAX_11600)) return (PARSER_GLOBAL_LENGTH);
17653
17654 if (memcmp (SIGNATURE_SEVEN_ZIP, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
17655
17656 uint32_t *digest = (uint32_t *) hash_buf->digest;
17657
17658 salt_t *salt = hash_buf->salt;
17659
17660 seven_zip_t *seven_zip = (seven_zip_t *) hash_buf->esalt;
17661
17662 /**
17663 * parse line
17664 */
17665
17666 char *p_buf_pos = input_buf + 4;
17667
17668 char *NumCyclesPower_pos = strchr (p_buf_pos, '$');
17669
17670 if (NumCyclesPower_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17671
17672 uint32_t p_buf_len = NumCyclesPower_pos - p_buf_pos;
17673
17674 NumCyclesPower_pos++;
17675
17676 char *salt_len_pos = strchr (NumCyclesPower_pos, '$');
17677
17678 if (salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17679
17680 uint32_t NumCyclesPower_len = salt_len_pos - NumCyclesPower_pos;
17681
17682 salt_len_pos++;
17683
17684 char *salt_buf_pos = strchr (salt_len_pos, '$');
17685
17686 if (salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17687
17688 uint32_t salt_len_len = salt_buf_pos - salt_len_pos;
17689
17690 salt_buf_pos++;
17691
17692 char *iv_len_pos = strchr (salt_buf_pos, '$');
17693
17694 if (iv_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17695
17696 uint32_t salt_buf_len = iv_len_pos - salt_buf_pos;
17697
17698 iv_len_pos++;
17699
17700 char *iv_buf_pos = strchr (iv_len_pos, '$');
17701
17702 if (iv_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17703
17704 uint32_t iv_len_len = iv_buf_pos - iv_len_pos;
17705
17706 iv_buf_pos++;
17707
17708 char *crc_buf_pos = strchr (iv_buf_pos, '$');
17709
17710 if (crc_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17711
17712 uint32_t iv_buf_len = crc_buf_pos - iv_buf_pos;
17713
17714 crc_buf_pos++;
17715
17716 char *data_len_pos = strchr (crc_buf_pos, '$');
17717
17718 if (data_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17719
17720 uint32_t crc_buf_len = data_len_pos - crc_buf_pos;
17721
17722 data_len_pos++;
17723
17724 char *unpack_size_pos = strchr (data_len_pos, '$');
17725
17726 if (unpack_size_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17727
17728 uint32_t data_len_len = unpack_size_pos - data_len_pos;
17729
17730 unpack_size_pos++;
17731
17732 char *data_buf_pos = strchr (unpack_size_pos, '$');
17733
17734 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17735
17736 uint32_t unpack_size_len = data_buf_pos - unpack_size_pos;
17737
17738 data_buf_pos++;
17739
17740 uint32_t 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;
17741
17742 const uint iter = atoi (NumCyclesPower_pos);
17743 const uint crc = atoi (crc_buf_pos);
17744 const uint p_buf = atoi (p_buf_pos);
17745 const uint salt_len = atoi (salt_len_pos);
17746 const uint iv_len = atoi (iv_len_pos);
17747 const uint unpack_size = atoi (unpack_size_pos);
17748 const uint data_len = atoi (data_len_pos);
17749
17750 /**
17751 * verify some data
17752 */
17753
17754 if (p_buf != 0) return (PARSER_SALT_VALUE);
17755 if (salt_len != 0) return (PARSER_SALT_VALUE);
17756
17757 if ((data_len * 2) != data_buf_len) return (PARSER_SALT_VALUE);
17758
17759 if (data_len > 384) return (PARSER_SALT_VALUE);
17760
17761 if (unpack_size > data_len) return (PARSER_SALT_VALUE);
17762
17763 /**
17764 * store data
17765 */
17766
17767 seven_zip->iv_buf[0] = hex_to_uint (&iv_buf_pos[ 0]);
17768 seven_zip->iv_buf[1] = hex_to_uint (&iv_buf_pos[ 8]);
17769 seven_zip->iv_buf[2] = hex_to_uint (&iv_buf_pos[16]);
17770 seven_zip->iv_buf[3] = hex_to_uint (&iv_buf_pos[24]);
17771
17772 seven_zip->iv_len = iv_len;
17773
17774 memcpy (seven_zip->salt_buf, salt_buf_pos, salt_buf_len); // we just need that for later ascii_digest()
17775
17776 seven_zip->salt_len = 0;
17777
17778 seven_zip->crc = crc;
17779
17780 for (uint i = 0, j = 0; j < data_buf_len; i += 1, j += 8)
17781 {
17782 seven_zip->data_buf[i] = hex_to_uint (&data_buf_pos[j]);
17783
17784 seven_zip->data_buf[i] = byte_swap_32 (seven_zip->data_buf[i]);
17785 }
17786
17787 seven_zip->data_len = data_len;
17788
17789 seven_zip->unpack_size = unpack_size;
17790
17791 // real salt
17792
17793 salt->salt_buf[0] = seven_zip->data_buf[0];
17794 salt->salt_buf[1] = seven_zip->data_buf[1];
17795 salt->salt_buf[2] = seven_zip->data_buf[2];
17796 salt->salt_buf[3] = seven_zip->data_buf[3];
17797
17798 salt->salt_len = 16;
17799
17800 salt->salt_sign[0] = iter;
17801
17802 salt->salt_iter = 1 << iter;
17803
17804 /**
17805 * digest
17806 */
17807
17808 digest[0] = crc;
17809 digest[1] = 0;
17810 digest[2] = 0;
17811 digest[3] = 0;
17812
17813 return (PARSER_OK);
17814 }
17815
17816 int gost2012sbog_256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17817 {
17818 if ((input_len < DISPLAY_LEN_MIN_11700) || (input_len > DISPLAY_LEN_MAX_11700)) return (PARSER_GLOBAL_LENGTH);
17819
17820 uint32_t *digest = (uint32_t *) hash_buf->digest;
17821
17822 digest[0] = hex_to_uint (&input_buf[ 0]);
17823 digest[1] = hex_to_uint (&input_buf[ 8]);
17824 digest[2] = hex_to_uint (&input_buf[16]);
17825 digest[3] = hex_to_uint (&input_buf[24]);
17826 digest[4] = hex_to_uint (&input_buf[32]);
17827 digest[5] = hex_to_uint (&input_buf[40]);
17828 digest[6] = hex_to_uint (&input_buf[48]);
17829 digest[7] = hex_to_uint (&input_buf[56]);
17830
17831 digest[0] = byte_swap_32 (digest[0]);
17832 digest[1] = byte_swap_32 (digest[1]);
17833 digest[2] = byte_swap_32 (digest[2]);
17834 digest[3] = byte_swap_32 (digest[3]);
17835 digest[4] = byte_swap_32 (digest[4]);
17836 digest[5] = byte_swap_32 (digest[5]);
17837 digest[6] = byte_swap_32 (digest[6]);
17838 digest[7] = byte_swap_32 (digest[7]);
17839
17840 return (PARSER_OK);
17841 }
17842
17843 int gost2012sbog_512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17844 {
17845 if ((input_len < DISPLAY_LEN_MIN_11800) || (input_len > DISPLAY_LEN_MAX_11800)) return (PARSER_GLOBAL_LENGTH);
17846
17847 uint32_t *digest = (uint32_t *) hash_buf->digest;
17848
17849 digest[ 0] = hex_to_uint (&input_buf[ 0]);
17850 digest[ 1] = hex_to_uint (&input_buf[ 8]);
17851 digest[ 2] = hex_to_uint (&input_buf[ 16]);
17852 digest[ 3] = hex_to_uint (&input_buf[ 24]);
17853 digest[ 4] = hex_to_uint (&input_buf[ 32]);
17854 digest[ 5] = hex_to_uint (&input_buf[ 40]);
17855 digest[ 6] = hex_to_uint (&input_buf[ 48]);
17856 digest[ 7] = hex_to_uint (&input_buf[ 56]);
17857 digest[ 8] = hex_to_uint (&input_buf[ 64]);
17858 digest[ 9] = hex_to_uint (&input_buf[ 72]);
17859 digest[10] = hex_to_uint (&input_buf[ 80]);
17860 digest[11] = hex_to_uint (&input_buf[ 88]);
17861 digest[12] = hex_to_uint (&input_buf[ 96]);
17862 digest[13] = hex_to_uint (&input_buf[104]);
17863 digest[14] = hex_to_uint (&input_buf[112]);
17864 digest[15] = hex_to_uint (&input_buf[120]);
17865
17866 digest[ 0] = byte_swap_32 (digest[ 0]);
17867 digest[ 1] = byte_swap_32 (digest[ 1]);
17868 digest[ 2] = byte_swap_32 (digest[ 2]);
17869 digest[ 3] = byte_swap_32 (digest[ 3]);
17870 digest[ 4] = byte_swap_32 (digest[ 4]);
17871 digest[ 5] = byte_swap_32 (digest[ 5]);
17872 digest[ 6] = byte_swap_32 (digest[ 6]);
17873 digest[ 7] = byte_swap_32 (digest[ 7]);
17874 digest[ 8] = byte_swap_32 (digest[ 8]);
17875 digest[ 9] = byte_swap_32 (digest[ 9]);
17876 digest[10] = byte_swap_32 (digest[10]);
17877 digest[11] = byte_swap_32 (digest[11]);
17878 digest[12] = byte_swap_32 (digest[12]);
17879 digest[13] = byte_swap_32 (digest[13]);
17880 digest[14] = byte_swap_32 (digest[14]);
17881 digest[15] = byte_swap_32 (digest[15]);
17882
17883 return (PARSER_OK);
17884 }
17885
17886 int pbkdf2_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17887 {
17888 if ((input_len < DISPLAY_LEN_MIN_11900) || (input_len > DISPLAY_LEN_MAX_11900)) return (PARSER_GLOBAL_LENGTH);
17889
17890 if (memcmp (SIGNATURE_PBKDF2_MD5, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
17891
17892 uint32_t *digest = (uint32_t *) hash_buf->digest;
17893
17894 salt_t *salt = hash_buf->salt;
17895
17896 pbkdf2_md5_t *pbkdf2_md5 = (pbkdf2_md5_t *) hash_buf->esalt;
17897
17898 /**
17899 * parse line
17900 */
17901
17902 // iterations
17903
17904 char *iter_pos = input_buf + 4;
17905
17906 uint32_t iter = atoi (iter_pos);
17907
17908 if (iter < 1) return (PARSER_SALT_ITERATION);
17909 if (iter > 999999) return (PARSER_SALT_ITERATION);
17910
17911 // first is *raw* salt
17912
17913 char *salt_pos = strchr (iter_pos, ':');
17914
17915 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17916
17917 salt_pos++;
17918
17919 char *hash_pos = strchr (salt_pos, ':');
17920
17921 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17922
17923 uint32_t salt_len = hash_pos - salt_pos;
17924
17925 if (salt_len > 64) return (PARSER_SALT_LENGTH);
17926
17927 hash_pos++;
17928
17929 uint32_t hash_b64_len = input_len - (hash_pos - input_buf);
17930
17931 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
17932
17933 // decode salt
17934
17935 char *salt_buf_ptr = (char *) pbkdf2_md5->salt_buf;
17936
17937 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
17938
17939 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17940
17941 salt_buf_ptr[salt_len + 3] = 0x01;
17942 salt_buf_ptr[salt_len + 4] = 0x80;
17943
17944 salt->salt_len = salt_len;
17945 salt->salt_iter = iter - 1;
17946
17947 // decode hash
17948
17949 char tmp_buf[100];
17950
17951 memset (tmp_buf, 0, sizeof (tmp_buf));
17952
17953 int hash_len = base64_decode (base64_to_int, hash_pos, hash_b64_len, tmp_buf);
17954
17955 if (hash_len < 16) return (PARSER_HASH_LENGTH);
17956
17957 memcpy (digest, tmp_buf, 16);
17958
17959 // add some stuff to normal salt to make sorted happy
17960
17961 salt->salt_buf[0] = pbkdf2_md5->salt_buf[0];
17962 salt->salt_buf[1] = pbkdf2_md5->salt_buf[1];
17963 salt->salt_buf[2] = pbkdf2_md5->salt_buf[2];
17964 salt->salt_buf[3] = pbkdf2_md5->salt_buf[3];
17965 salt->salt_buf[4] = salt->salt_iter;
17966
17967 return (PARSER_OK);
17968 }
17969
17970 int pbkdf2_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17971 {
17972 if ((input_len < DISPLAY_LEN_MIN_12000) || (input_len > DISPLAY_LEN_MAX_12000)) return (PARSER_GLOBAL_LENGTH);
17973
17974 if (memcmp (SIGNATURE_PBKDF2_SHA1, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
17975
17976 uint32_t *digest = (uint32_t *) hash_buf->digest;
17977
17978 salt_t *salt = hash_buf->salt;
17979
17980 pbkdf2_sha1_t *pbkdf2_sha1 = (pbkdf2_sha1_t *) hash_buf->esalt;
17981
17982 /**
17983 * parse line
17984 */
17985
17986 // iterations
17987
17988 char *iter_pos = input_buf + 5;
17989
17990 uint32_t iter = atoi (iter_pos);
17991
17992 if (iter < 1) return (PARSER_SALT_ITERATION);
17993 if (iter > 999999) return (PARSER_SALT_ITERATION);
17994
17995 // first is *raw* salt
17996
17997 char *salt_pos = strchr (iter_pos, ':');
17998
17999 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18000
18001 salt_pos++;
18002
18003 char *hash_pos = strchr (salt_pos, ':');
18004
18005 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18006
18007 uint32_t salt_len = hash_pos - salt_pos;
18008
18009 if (salt_len > 64) return (PARSER_SALT_LENGTH);
18010
18011 hash_pos++;
18012
18013 uint32_t hash_b64_len = input_len - (hash_pos - input_buf);
18014
18015 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
18016
18017 // decode salt
18018
18019 char *salt_buf_ptr = (char *) pbkdf2_sha1->salt_buf;
18020
18021 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18022
18023 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18024
18025 salt_buf_ptr[salt_len + 3] = 0x01;
18026 salt_buf_ptr[salt_len + 4] = 0x80;
18027
18028 salt->salt_len = salt_len;
18029 salt->salt_iter = iter - 1;
18030
18031 // decode hash
18032
18033 char tmp_buf[100];
18034
18035 memset (tmp_buf, 0, sizeof (tmp_buf));
18036
18037 int hash_len = base64_decode (base64_to_int, hash_pos, hash_b64_len, tmp_buf);
18038
18039 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18040
18041 memcpy (digest, tmp_buf, 16);
18042
18043 digest[0] = byte_swap_32 (digest[0]);
18044 digest[1] = byte_swap_32 (digest[1]);
18045 digest[2] = byte_swap_32 (digest[2]);
18046 digest[3] = byte_swap_32 (digest[3]);
18047
18048 // add some stuff to normal salt to make sorted happy
18049
18050 salt->salt_buf[0] = pbkdf2_sha1->salt_buf[0];
18051 salt->salt_buf[1] = pbkdf2_sha1->salt_buf[1];
18052 salt->salt_buf[2] = pbkdf2_sha1->salt_buf[2];
18053 salt->salt_buf[3] = pbkdf2_sha1->salt_buf[3];
18054 salt->salt_buf[4] = salt->salt_iter;
18055
18056 return (PARSER_OK);
18057 }
18058
18059 int pbkdf2_sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18060 {
18061 if ((input_len < DISPLAY_LEN_MIN_12100) || (input_len > DISPLAY_LEN_MAX_12100)) return (PARSER_GLOBAL_LENGTH);
18062
18063 if (memcmp (SIGNATURE_PBKDF2_SHA512, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
18064
18065 uint64_t *digest = (uint64_t *) hash_buf->digest;
18066
18067 salt_t *salt = hash_buf->salt;
18068
18069 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
18070
18071 /**
18072 * parse line
18073 */
18074
18075 // iterations
18076
18077 char *iter_pos = input_buf + 7;
18078
18079 uint32_t iter = atoi (iter_pos);
18080
18081 if (iter < 1) return (PARSER_SALT_ITERATION);
18082 if (iter > 999999) return (PARSER_SALT_ITERATION);
18083
18084 // first is *raw* salt
18085
18086 char *salt_pos = strchr (iter_pos, ':');
18087
18088 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18089
18090 salt_pos++;
18091
18092 char *hash_pos = strchr (salt_pos, ':');
18093
18094 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18095
18096 uint32_t salt_len = hash_pos - salt_pos;
18097
18098 if (salt_len > 64) return (PARSER_SALT_LENGTH);
18099
18100 hash_pos++;
18101
18102 uint32_t hash_b64_len = input_len - (hash_pos - input_buf);
18103
18104 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
18105
18106 // decode salt
18107
18108 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
18109
18110 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18111
18112 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18113
18114 salt_buf_ptr[salt_len + 3] = 0x01;
18115 salt_buf_ptr[salt_len + 4] = 0x80;
18116
18117 salt->salt_len = salt_len;
18118 salt->salt_iter = iter - 1;
18119
18120 // decode hash
18121
18122 char tmp_buf[100];
18123
18124 memset (tmp_buf, 0, sizeof (tmp_buf));
18125
18126 int hash_len = base64_decode (base64_to_int, hash_pos, hash_b64_len, tmp_buf);
18127
18128 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18129
18130 memcpy (digest, tmp_buf, 64);
18131
18132 digest[0] = byte_swap_64 (digest[0]);
18133 digest[1] = byte_swap_64 (digest[1]);
18134 digest[2] = byte_swap_64 (digest[2]);
18135 digest[3] = byte_swap_64 (digest[3]);
18136 digest[4] = byte_swap_64 (digest[4]);
18137 digest[5] = byte_swap_64 (digest[5]);
18138 digest[6] = byte_swap_64 (digest[6]);
18139 digest[7] = byte_swap_64 (digest[7]);
18140
18141 // add some stuff to normal salt to make sorted happy
18142
18143 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
18144 salt->salt_buf[1] = pbkdf2_sha512->salt_buf[1];
18145 salt->salt_buf[2] = pbkdf2_sha512->salt_buf[2];
18146 salt->salt_buf[3] = pbkdf2_sha512->salt_buf[3];
18147 salt->salt_buf[4] = salt->salt_iter;
18148
18149 return (PARSER_OK);
18150 }
18151
18152 int ecryptfs_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18153 {
18154 if ((input_len < DISPLAY_LEN_MIN_12200) || (input_len > DISPLAY_LEN_MAX_12200)) return (PARSER_GLOBAL_LENGTH);
18155
18156 if (memcmp (SIGNATURE_ECRYPTFS, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
18157
18158 uint *digest = (uint *) hash_buf->digest;
18159
18160 salt_t *salt = hash_buf->salt;
18161
18162 /**
18163 * parse line
18164 */
18165
18166 char *salt_pos = input_buf + 10 + 2 + 2; // skip over "0$" and "1$"
18167
18168 char *hash_pos = strchr (salt_pos, '$');
18169
18170 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18171
18172 uint32_t salt_len = hash_pos - salt_pos;
18173
18174 if (salt_len != 16) return (PARSER_SALT_LENGTH);
18175
18176 hash_pos++;
18177
18178 uint32_t hash_len = input_len - 10 - 2 - 2 - salt_len - 1;
18179
18180 if (hash_len != 16) return (PARSER_HASH_LENGTH);
18181
18182 // decode hash
18183
18184 digest[ 0] = hex_to_uint (&hash_pos[0]);
18185 digest[ 1] = hex_to_uint (&hash_pos[8]);
18186 digest[ 2] = 0;
18187 digest[ 3] = 0;
18188 digest[ 4] = 0;
18189 digest[ 5] = 0;
18190 digest[ 6] = 0;
18191 digest[ 7] = 0;
18192 digest[ 8] = 0;
18193 digest[ 9] = 0;
18194 digest[10] = 0;
18195 digest[11] = 0;
18196 digest[12] = 0;
18197 digest[13] = 0;
18198 digest[14] = 0;
18199 digest[15] = 0;
18200
18201 // decode salt
18202
18203 salt->salt_buf[0] = hex_to_uint (&salt_pos[0]);
18204 salt->salt_buf[1] = hex_to_uint (&salt_pos[8]);
18205
18206 salt->salt_iter = ROUNDS_ECRYPTFS;
18207 salt->salt_len = 8;
18208
18209 return (PARSER_OK);
18210 }
18211
18212 int bsdicrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18213 {
18214 if ((input_len < DISPLAY_LEN_MIN_12400) || (input_len > DISPLAY_LEN_MAX_12400)) return (PARSER_GLOBAL_LENGTH);
18215
18216 if (memcmp (SIGNATURE_BSDICRYPT, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
18217
18218 unsigned char c19 = itoa64_to_int (input_buf[19]);
18219
18220 if (c19 & 3) return (PARSER_HASH_VALUE);
18221
18222 salt_t *salt = hash_buf->salt;
18223
18224 uint32_t *digest = (uint32_t *) hash_buf->digest;
18225
18226 // iteration count
18227
18228 salt->salt_iter = itoa64_to_int (input_buf[1])
18229 | itoa64_to_int (input_buf[2]) << 6
18230 | itoa64_to_int (input_buf[3]) << 12
18231 | itoa64_to_int (input_buf[4]) << 18;
18232
18233 // set salt
18234
18235 salt->salt_buf[0] = itoa64_to_int (input_buf[5])
18236 | itoa64_to_int (input_buf[6]) << 6
18237 | itoa64_to_int (input_buf[7]) << 12
18238 | itoa64_to_int (input_buf[8]) << 18;
18239
18240 salt->salt_len = 4;
18241
18242 char tmp_buf[100];
18243
18244 memset (tmp_buf, 0, sizeof (tmp_buf));
18245
18246 base64_decode (itoa64_to_int, input_buf + 9, 11, tmp_buf);
18247
18248 memcpy (digest, tmp_buf, 8);
18249
18250 uint tt;
18251
18252 IP (digest[0], digest[1], tt);
18253
18254 digest[0] = ROTATE_RIGHT (digest[0], 31);
18255 digest[1] = ROTATE_RIGHT (digest[1], 31);
18256 digest[2] = 0;
18257 digest[3] = 0;
18258
18259 return (PARSER_OK);
18260 }
18261
18262 int rar3hp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18263 {
18264 if ((input_len < DISPLAY_LEN_MIN_12500) || (input_len > DISPLAY_LEN_MAX_12500)) return (PARSER_GLOBAL_LENGTH);
18265
18266 if (memcmp (SIGNATURE_RAR3, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
18267
18268 uint32_t *digest = (uint32_t *) hash_buf->digest;
18269
18270 salt_t *salt = hash_buf->salt;
18271
18272 /**
18273 * parse line
18274 */
18275
18276 char *type_pos = input_buf + 6 + 1;
18277
18278 char *salt_pos = strchr (type_pos, '*');
18279
18280 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18281
18282 uint32_t type_len = salt_pos - type_pos;
18283
18284 if (type_len != 1) return (PARSER_SALT_LENGTH);
18285
18286 salt_pos++;
18287
18288 char *crypted_pos = strchr (salt_pos, '*');
18289
18290 if (crypted_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18291
18292 uint32_t salt_len = crypted_pos - salt_pos;
18293
18294 if (salt_len != 16) return (PARSER_SALT_LENGTH);
18295
18296 crypted_pos++;
18297
18298 uint32_t crypted_len = input_len - 6 - 1 - type_len - 1 - salt_len - 1;
18299
18300 if (crypted_len != 32) return (PARSER_SALT_LENGTH);
18301
18302 /**
18303 * copy data
18304 */
18305
18306 salt->salt_buf[0] = hex_to_uint (&salt_pos[0]);
18307 salt->salt_buf[1] = hex_to_uint (&salt_pos[8]);
18308
18309 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
18310 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
18311
18312 salt->salt_buf[2] = hex_to_uint (&crypted_pos[ 0]);
18313 salt->salt_buf[3] = hex_to_uint (&crypted_pos[ 8]);
18314 salt->salt_buf[4] = hex_to_uint (&crypted_pos[16]);
18315 salt->salt_buf[5] = hex_to_uint (&crypted_pos[24]);
18316
18317 salt->salt_len = 24;
18318 salt->salt_iter = ROUNDS_RAR3;
18319
18320 // there's no hash for rar3. the data which is in crypted_pos is some encrypted data and
18321 // if it matches the value \xc4\x3d\x7b\x00\x40\x07\x00 after decrypt we know that we successfully cracked it.
18322
18323 digest[0] = 0xc43d7b00;
18324 digest[1] = 0x40070000;
18325 digest[2] = 0;
18326 digest[3] = 0;
18327
18328 return (PARSER_OK);
18329 }
18330
18331 int cf10_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18332 {
18333 if ((input_len < DISPLAY_LEN_MIN_12600) || (input_len > DISPLAY_LEN_MAX_12600)) return (PARSER_GLOBAL_LENGTH);
18334
18335 uint32_t *digest = (uint32_t *) hash_buf->digest;
18336
18337 salt_t *salt = hash_buf->salt;
18338
18339 digest[0] = hex_to_uint (&input_buf[ 0]);
18340 digest[1] = hex_to_uint (&input_buf[ 8]);
18341 digest[2] = hex_to_uint (&input_buf[16]);
18342 digest[3] = hex_to_uint (&input_buf[24]);
18343 digest[4] = hex_to_uint (&input_buf[32]);
18344 digest[5] = hex_to_uint (&input_buf[40]);
18345 digest[6] = hex_to_uint (&input_buf[48]);
18346 digest[7] = hex_to_uint (&input_buf[56]);
18347
18348 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
18349
18350 uint salt_len = input_len - 64 - 1;
18351
18352 char *salt_buf = input_buf + 64 + 1;
18353
18354 char *salt_buf_ptr = (char *) salt->salt_buf;
18355
18356 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
18357
18358 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18359
18360 salt->salt_len = salt_len;
18361
18362 /**
18363 * we can precompute the first sha256 transform
18364 */
18365
18366 uint w[16];
18367
18368 w[ 0] = byte_swap_32 (salt->salt_buf[ 0]);
18369 w[ 1] = byte_swap_32 (salt->salt_buf[ 1]);
18370 w[ 2] = byte_swap_32 (salt->salt_buf[ 2]);
18371 w[ 3] = byte_swap_32 (salt->salt_buf[ 3]);
18372 w[ 4] = byte_swap_32 (salt->salt_buf[ 4]);
18373 w[ 5] = byte_swap_32 (salt->salt_buf[ 5]);
18374 w[ 6] = byte_swap_32 (salt->salt_buf[ 6]);
18375 w[ 7] = byte_swap_32 (salt->salt_buf[ 7]);
18376 w[ 8] = byte_swap_32 (salt->salt_buf[ 8]);
18377 w[ 9] = byte_swap_32 (salt->salt_buf[ 9]);
18378 w[10] = byte_swap_32 (salt->salt_buf[10]);
18379 w[11] = byte_swap_32 (salt->salt_buf[11]);
18380 w[12] = byte_swap_32 (salt->salt_buf[12]);
18381 w[13] = byte_swap_32 (salt->salt_buf[13]);
18382 w[14] = byte_swap_32 (salt->salt_buf[14]);
18383 w[15] = byte_swap_32 (salt->salt_buf[15]);
18384
18385 uint pc256[8];
18386
18387 pc256[0] = SHA256M_A;
18388 pc256[1] = SHA256M_B;
18389 pc256[2] = SHA256M_C;
18390 pc256[3] = SHA256M_D;
18391 pc256[4] = SHA256M_E;
18392 pc256[5] = SHA256M_F;
18393 pc256[6] = SHA256M_G;
18394 pc256[7] = SHA256M_H;
18395
18396 sha256_64 (w, pc256);
18397
18398 salt->salt_buf_pc[0] = pc256[0];
18399 salt->salt_buf_pc[1] = pc256[1];
18400 salt->salt_buf_pc[2] = pc256[2];
18401 salt->salt_buf_pc[3] = pc256[3];
18402 salt->salt_buf_pc[4] = pc256[4];
18403 salt->salt_buf_pc[5] = pc256[5];
18404 salt->salt_buf_pc[6] = pc256[6];
18405 salt->salt_buf_pc[7] = pc256[7];
18406
18407 digest[0] -= pc256[0];
18408 digest[1] -= pc256[1];
18409 digest[2] -= pc256[2];
18410 digest[3] -= pc256[3];
18411 digest[4] -= pc256[4];
18412 digest[5] -= pc256[5];
18413 digest[6] -= pc256[6];
18414 digest[7] -= pc256[7];
18415
18416 return (PARSER_OK);
18417 }
18418
18419 int mywallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18420 {
18421 if ((input_len < DISPLAY_LEN_MIN_12700) || (input_len > DISPLAY_LEN_MAX_12700)) return (PARSER_GLOBAL_LENGTH);
18422
18423 if (memcmp (SIGNATURE_MYWALLET, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
18424
18425 uint32_t *digest = (uint32_t *) hash_buf->digest;
18426
18427 salt_t *salt = hash_buf->salt;
18428
18429 /**
18430 * parse line
18431 */
18432
18433 char *data_len_pos = input_buf + 1 + 10 + 1;
18434
18435 char *data_buf_pos = strchr (data_len_pos, '$');
18436
18437 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18438
18439 uint32_t data_len_len = data_buf_pos - data_len_pos;
18440
18441 if (data_len_len < 1) return (PARSER_SALT_LENGTH);
18442 if (data_len_len > 5) return (PARSER_SALT_LENGTH);
18443
18444 data_buf_pos++;
18445
18446 uint32_t data_buf_len = input_len - 1 - 10 - 1 - data_len_len - 1;
18447
18448 if (data_buf_len < 64) return (PARSER_HASH_LENGTH);
18449
18450 if (data_buf_len % 16) return (PARSER_HASH_LENGTH);
18451
18452 uint32_t data_len = atoi (data_len_pos);
18453
18454 if ((data_len * 2) != data_buf_len) return (PARSER_HASH_LENGTH);
18455
18456 /**
18457 * salt
18458 */
18459
18460 char *salt_pos = data_buf_pos;
18461
18462 salt->salt_buf[0] = hex_to_uint (&salt_pos[ 0]);
18463 salt->salt_buf[1] = hex_to_uint (&salt_pos[ 8]);
18464 salt->salt_buf[2] = hex_to_uint (&salt_pos[16]);
18465 salt->salt_buf[3] = hex_to_uint (&salt_pos[24]);
18466
18467 // this is actually the CT, which is also the hash later (if matched)
18468
18469 salt->salt_buf[4] = hex_to_uint (&salt_pos[32]);
18470 salt->salt_buf[5] = hex_to_uint (&salt_pos[40]);
18471 salt->salt_buf[6] = hex_to_uint (&salt_pos[48]);
18472 salt->salt_buf[7] = hex_to_uint (&salt_pos[56]);
18473
18474 salt->salt_len = 32; // note we need to fix this to 16 in kernel
18475
18476 salt->salt_iter = 10 - 1;
18477
18478 /**
18479 * digest buf
18480 */
18481
18482 digest[0] = salt->salt_buf[4];
18483 digest[1] = salt->salt_buf[5];
18484 digest[2] = salt->salt_buf[6];
18485 digest[3] = salt->salt_buf[7];
18486
18487 return (PARSER_OK);
18488 }
18489
18490 int ms_drsr_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18491 {
18492 if ((input_len < DISPLAY_LEN_MIN_12800) || (input_len > DISPLAY_LEN_MAX_12800)) return (PARSER_GLOBAL_LENGTH);
18493
18494 if (memcmp (SIGNATURE_MS_DRSR, input_buf, 11)) return (PARSER_SIGNATURE_UNMATCHED);
18495
18496 uint32_t *digest = (uint32_t *) hash_buf->digest;
18497
18498 salt_t *salt = hash_buf->salt;
18499
18500 /**
18501 * parse line
18502 */
18503
18504 char *salt_pos = input_buf + 11 + 1;
18505
18506 char *iter_pos = strchr (salt_pos, ',');
18507
18508 if (iter_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18509
18510 uint32_t salt_len = iter_pos - salt_pos;
18511
18512 if (salt_len != 20) return (PARSER_SALT_LENGTH);
18513
18514 iter_pos++;
18515
18516 char *hash_pos = strchr (iter_pos, ',');
18517
18518 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18519
18520 uint32_t iter_len = hash_pos - iter_pos;
18521
18522 if (iter_len > 5) return (PARSER_SALT_LENGTH);
18523
18524 hash_pos++;
18525
18526 uint32_t hash_len = input_len - 11 - 1 - salt_len - 1 - iter_len - 1;
18527
18528 if (hash_len != 64) return (PARSER_HASH_LENGTH);
18529
18530 /**
18531 * salt
18532 */
18533
18534 salt->salt_buf[0] = hex_to_uint (&salt_pos[ 0]);
18535 salt->salt_buf[1] = hex_to_uint (&salt_pos[ 8]);
18536 salt->salt_buf[2] = hex_to_uint (&salt_pos[16]) & 0xffff0000;
18537 salt->salt_buf[3] = 0x00018000;
18538
18539 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
18540 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
18541 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
18542 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
18543
18544 salt->salt_len = salt_len / 2;
18545
18546 salt->salt_iter = atoi (iter_pos) - 1;
18547
18548 /**
18549 * digest buf
18550 */
18551
18552 digest[0] = hex_to_uint (&hash_pos[ 0]);
18553 digest[1] = hex_to_uint (&hash_pos[ 8]);
18554 digest[2] = hex_to_uint (&hash_pos[16]);
18555 digest[3] = hex_to_uint (&hash_pos[24]);
18556 digest[4] = hex_to_uint (&hash_pos[32]);
18557 digest[5] = hex_to_uint (&hash_pos[40]);
18558 digest[6] = hex_to_uint (&hash_pos[48]);
18559 digest[7] = hex_to_uint (&hash_pos[56]);
18560
18561 return (PARSER_OK);
18562 }
18563
18564 /**
18565 * parallel running threads
18566 */
18567
18568 #ifdef WIN
18569
18570 BOOL WINAPI sigHandler_default (DWORD sig)
18571 {
18572 switch (sig)
18573 {
18574 case CTRL_CLOSE_EVENT:
18575
18576 /*
18577 * special case see: https://stackoverflow.com/questions/3640633/c-setconsolectrlhandler-routine-issue/5610042#5610042
18578 * if the user interacts w/ the user-interface (GUI/cmd), we need to do the finalization job within this signal handler
18579 * function otherwise it is to late (e.g. after returning from this function)
18580 */
18581
18582 myabort ();
18583
18584 SetConsoleCtrlHandler (NULL, TRUE);
18585
18586 hc_sleep (10);
18587
18588 return TRUE;
18589
18590 case CTRL_C_EVENT:
18591 case CTRL_LOGOFF_EVENT:
18592 case CTRL_SHUTDOWN_EVENT:
18593
18594 myabort ();
18595
18596 SetConsoleCtrlHandler (NULL, TRUE);
18597
18598 return TRUE;
18599 }
18600
18601 return FALSE;
18602 }
18603
18604 BOOL WINAPI sigHandler_benchmark (DWORD sig)
18605 {
18606 switch (sig)
18607 {
18608 case CTRL_CLOSE_EVENT:
18609
18610 myabort ();
18611
18612 SetConsoleCtrlHandler (NULL, TRUE);
18613
18614 hc_sleep (10);
18615
18616 return TRUE;
18617
18618 case CTRL_C_EVENT:
18619 case CTRL_LOGOFF_EVENT:
18620 case CTRL_SHUTDOWN_EVENT:
18621
18622 myquit ();
18623
18624 SetConsoleCtrlHandler (NULL, TRUE);
18625
18626 return TRUE;
18627 }
18628
18629 return FALSE;
18630 }
18631
18632 void hc_signal (BOOL WINAPI (callback) (DWORD))
18633 {
18634 if (callback == NULL)
18635 {
18636 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, FALSE);
18637 }
18638 else
18639 {
18640 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, TRUE);
18641 }
18642 }
18643
18644 #else
18645
18646 void sigHandler_default (int sig)
18647 {
18648 myabort ();
18649
18650 signal (sig, NULL);
18651 }
18652
18653 void sigHandler_benchmark (int sig)
18654 {
18655 myquit ();
18656
18657 signal (sig, NULL);
18658 }
18659
18660 void hc_signal (void (callback) (int))
18661 {
18662 if (callback == NULL) callback = SIG_DFL;
18663
18664 signal (SIGINT, callback);
18665 signal (SIGTERM, callback);
18666 signal (SIGABRT, callback);
18667 }
18668
18669 #endif
18670
18671 void status_display ();
18672
18673 void *thread_keypress (void *p)
18674 {
18675 int benchmark = *((int *) p);
18676
18677 uint quiet = data.quiet;
18678
18679 tty_break();
18680
18681 while ((data.devices_status != STATUS_EXHAUSTED) && (data.devices_status != STATUS_CRACKED) && (data.devices_status != STATUS_ABORTED) && (data.devices_status != STATUS_QUIT))
18682 {
18683 int ch = tty_getchar();
18684
18685 if (ch == -1) break;
18686
18687 if (ch == 0) continue;
18688
18689 #ifdef _POSIX
18690 if (ch != '\n')
18691 #endif
18692
18693 hc_thread_mutex_lock (mux_display);
18694
18695 log_info ("");
18696
18697 switch (ch)
18698 {
18699 case 's':
18700 case '\n':
18701
18702 log_info ("");
18703
18704 status_display ();
18705
18706 log_info ("");
18707
18708 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
18709 if (quiet == 0) fflush (stdout);
18710
18711 break;
18712
18713 case 'b':
18714
18715 log_info ("");
18716
18717 bypass ();
18718
18719 log_info ("");
18720
18721 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
18722 if (quiet == 0) fflush (stdout);
18723
18724 break;
18725
18726 case 'p':
18727
18728 log_info ("");
18729
18730 SuspendThreads ();
18731
18732 log_info ("");
18733
18734 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
18735 if (quiet == 0) fflush (stdout);
18736
18737 break;
18738
18739 case 'r':
18740
18741 log_info ("");
18742
18743 ResumeThreads ();
18744
18745 log_info ("");
18746
18747 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
18748 if (quiet == 0) fflush (stdout);
18749
18750 break;
18751
18752 case 'c':
18753
18754 log_info ("");
18755
18756 if (benchmark == 1) break;
18757
18758 stop_at_checkpoint ();
18759
18760 log_info ("");
18761
18762 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
18763 if (quiet == 0) fflush (stdout);
18764
18765 break;
18766
18767 case 'q':
18768
18769 log_info ("");
18770
18771 if (benchmark == 1)
18772 {
18773 myquit ();
18774 }
18775 else
18776 {
18777 myabort ();
18778 }
18779
18780 break;
18781 }
18782
18783 hc_thread_mutex_unlock (mux_display);
18784 }
18785
18786 tty_fix();
18787
18788 return (p);
18789 }
18790
18791 /**
18792 * rules common
18793 */
18794
18795 bool class_num (char c)
18796 {
18797 return ((c >= '0') && (c <= '9'));
18798 }
18799
18800 bool class_lower (char c)
18801 {
18802 return ((c >= 'a') && (c <= 'z'));
18803 }
18804
18805 bool class_upper (char c)
18806 {
18807 return ((c >= 'A') && (c <= 'Z'));
18808 }
18809
18810 bool class_alpha (char c)
18811 {
18812 return (class_lower (c) || class_upper (c));
18813 }
18814
18815 char conv_ctoi (char c)
18816 {
18817 if (class_num (c))
18818 {
18819 return c - '0';
18820 }
18821 else if (class_upper (c))
18822 {
18823 return c - 'A' + (char) 10;
18824 }
18825
18826 return (char) (-1);
18827 }
18828
18829 char conv_itoc (char c)
18830 {
18831 if (c < 10)
18832 {
18833 return c + '0';
18834 }
18835 else if (c < 37)
18836 {
18837 return c + 'A' - (char) 10;
18838 }
18839
18840 return (char) (-1);
18841 }
18842
18843 /**
18844 * GPU rules
18845 */
18846
18847 #define INCR_POS if (++rule_pos == rule_len) return (-1)
18848 #define SET_NAME(rule,val) (rule)->cmds[rule_cnt] = ((val) & 0xff) << 0
18849 #define SET_P0(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 8
18850 #define SET_P1(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 16
18851 #define MAX_GPU_RULES 14
18852 #define GET_NAME(rule) rule_cmd = (((rule)->cmds[rule_cnt] >> 0) & 0xff)
18853 #define GET_P0(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 8) & 0xff)
18854 #define GET_P1(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 16) & 0xff)
18855
18856 #define SET_P0_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 8
18857 #define SET_P1_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 16
18858 #define GET_P0_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 8) & 0xff)
18859 #define GET_P1_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 16) & 0xff)
18860
18861 int cpu_rule_to_gpu_rule (char rule_buf[BUFSIZ], uint rule_len, gpu_rule_t *rule)
18862 {
18863 uint rule_pos;
18864 uint rule_cnt;
18865
18866 for (rule_pos = 0, rule_cnt = 0; rule_pos < rule_len && rule_cnt < MAX_GPU_RULES; rule_pos++, rule_cnt++)
18867 {
18868 switch (rule_buf[rule_pos])
18869 {
18870 case ' ':
18871 rule_cnt--;
18872 break;
18873
18874 case RULE_OP_MANGLE_NOOP:
18875 SET_NAME (rule, rule_buf[rule_pos]);
18876 break;
18877
18878 case RULE_OP_MANGLE_LREST:
18879 SET_NAME (rule, rule_buf[rule_pos]);
18880 break;
18881
18882 case RULE_OP_MANGLE_UREST:
18883 SET_NAME (rule, rule_buf[rule_pos]);
18884 break;
18885
18886 case RULE_OP_MANGLE_LREST_UFIRST:
18887 SET_NAME (rule, rule_buf[rule_pos]);
18888 break;
18889
18890 case RULE_OP_MANGLE_UREST_LFIRST:
18891 SET_NAME (rule, rule_buf[rule_pos]);
18892 break;
18893
18894 case RULE_OP_MANGLE_TREST:
18895 SET_NAME (rule, rule_buf[rule_pos]);
18896 break;
18897
18898 case RULE_OP_MANGLE_TOGGLE_AT:
18899 SET_NAME (rule, rule_buf[rule_pos]);
18900 SET_P0_CONV (rule, rule_buf[rule_pos]);
18901 break;
18902
18903 case RULE_OP_MANGLE_REVERSE:
18904 SET_NAME (rule, rule_buf[rule_pos]);
18905 break;
18906
18907 case RULE_OP_MANGLE_DUPEWORD:
18908 SET_NAME (rule, rule_buf[rule_pos]);
18909 break;
18910
18911 case RULE_OP_MANGLE_DUPEWORD_TIMES:
18912 SET_NAME (rule, rule_buf[rule_pos]);
18913 SET_P0_CONV (rule, rule_buf[rule_pos]);
18914 break;
18915
18916 case RULE_OP_MANGLE_REFLECT:
18917 SET_NAME (rule, rule_buf[rule_pos]);
18918 break;
18919
18920 case RULE_OP_MANGLE_ROTATE_LEFT:
18921 SET_NAME (rule, rule_buf[rule_pos]);
18922 break;
18923
18924 case RULE_OP_MANGLE_ROTATE_RIGHT:
18925 SET_NAME (rule, rule_buf[rule_pos]);
18926 break;
18927
18928 case RULE_OP_MANGLE_APPEND:
18929 SET_NAME (rule, rule_buf[rule_pos]);
18930 SET_P0 (rule, rule_buf[rule_pos]);
18931 break;
18932
18933 case RULE_OP_MANGLE_PREPEND:
18934 SET_NAME (rule, rule_buf[rule_pos]);
18935 SET_P0 (rule, rule_buf[rule_pos]);
18936 break;
18937
18938 case RULE_OP_MANGLE_DELETE_FIRST:
18939 SET_NAME (rule, rule_buf[rule_pos]);
18940 break;
18941
18942 case RULE_OP_MANGLE_DELETE_LAST:
18943 SET_NAME (rule, rule_buf[rule_pos]);
18944 break;
18945
18946 case RULE_OP_MANGLE_DELETE_AT:
18947 SET_NAME (rule, rule_buf[rule_pos]);
18948 SET_P0_CONV (rule, rule_buf[rule_pos]);
18949 break;
18950
18951 case RULE_OP_MANGLE_EXTRACT:
18952 SET_NAME (rule, rule_buf[rule_pos]);
18953 SET_P0_CONV (rule, rule_buf[rule_pos]);
18954 SET_P1_CONV (rule, rule_buf[rule_pos]);
18955 break;
18956
18957 case RULE_OP_MANGLE_OMIT:
18958 SET_NAME (rule, rule_buf[rule_pos]);
18959 SET_P0_CONV (rule, rule_buf[rule_pos]);
18960 SET_P1_CONV (rule, rule_buf[rule_pos]);
18961 break;
18962
18963 case RULE_OP_MANGLE_INSERT:
18964 SET_NAME (rule, rule_buf[rule_pos]);
18965 SET_P0_CONV (rule, rule_buf[rule_pos]);
18966 SET_P1 (rule, rule_buf[rule_pos]);
18967 break;
18968
18969 case RULE_OP_MANGLE_OVERSTRIKE:
18970 SET_NAME (rule, rule_buf[rule_pos]);
18971 SET_P0_CONV (rule, rule_buf[rule_pos]);
18972 SET_P1 (rule, rule_buf[rule_pos]);
18973 break;
18974
18975 case RULE_OP_MANGLE_TRUNCATE_AT:
18976 SET_NAME (rule, rule_buf[rule_pos]);
18977 SET_P0_CONV (rule, rule_buf[rule_pos]);
18978 break;
18979
18980 case RULE_OP_MANGLE_REPLACE:
18981 SET_NAME (rule, rule_buf[rule_pos]);
18982 SET_P0 (rule, rule_buf[rule_pos]);
18983 SET_P1 (rule, rule_buf[rule_pos]);
18984 break;
18985
18986 case RULE_OP_MANGLE_PURGECHAR:
18987 return (-1);
18988 break;
18989
18990 case RULE_OP_MANGLE_TOGGLECASE_REC:
18991 return (-1);
18992 break;
18993
18994 case RULE_OP_MANGLE_DUPECHAR_FIRST:
18995 SET_NAME (rule, rule_buf[rule_pos]);
18996 SET_P0_CONV (rule, rule_buf[rule_pos]);
18997 break;
18998
18999 case RULE_OP_MANGLE_DUPECHAR_LAST:
19000 SET_NAME (rule, rule_buf[rule_pos]);
19001 SET_P0_CONV (rule, rule_buf[rule_pos]);
19002 break;
19003
19004 case RULE_OP_MANGLE_DUPECHAR_ALL:
19005 SET_NAME (rule, rule_buf[rule_pos]);
19006 break;
19007
19008 case RULE_OP_MANGLE_SWITCH_FIRST:
19009 SET_NAME (rule, rule_buf[rule_pos]);
19010 break;
19011
19012 case RULE_OP_MANGLE_SWITCH_LAST:
19013 SET_NAME (rule, rule_buf[rule_pos]);
19014 break;
19015
19016 case RULE_OP_MANGLE_SWITCH_AT:
19017 SET_NAME (rule, rule_buf[rule_pos]);
19018 SET_P0_CONV (rule, rule_buf[rule_pos]);
19019 SET_P1_CONV (rule, rule_buf[rule_pos]);
19020 break;
19021
19022 case RULE_OP_MANGLE_CHR_SHIFTL:
19023 SET_NAME (rule, rule_buf[rule_pos]);
19024 SET_P0_CONV (rule, rule_buf[rule_pos]);
19025 break;
19026
19027 case RULE_OP_MANGLE_CHR_SHIFTR:
19028 SET_NAME (rule, rule_buf[rule_pos]);
19029 SET_P0_CONV (rule, rule_buf[rule_pos]);
19030 break;
19031
19032 case RULE_OP_MANGLE_CHR_INCR:
19033 SET_NAME (rule, rule_buf[rule_pos]);
19034 SET_P0_CONV (rule, rule_buf[rule_pos]);
19035 break;
19036
19037 case RULE_OP_MANGLE_CHR_DECR:
19038 SET_NAME (rule, rule_buf[rule_pos]);
19039 SET_P0_CONV (rule, rule_buf[rule_pos]);
19040 break;
19041
19042 case RULE_OP_MANGLE_REPLACE_NP1:
19043 SET_NAME (rule, rule_buf[rule_pos]);
19044 SET_P0_CONV (rule, rule_buf[rule_pos]);
19045 break;
19046
19047 case RULE_OP_MANGLE_REPLACE_NM1:
19048 SET_NAME (rule, rule_buf[rule_pos]);
19049 SET_P0_CONV (rule, rule_buf[rule_pos]);
19050 break;
19051
19052 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
19053 SET_NAME (rule, rule_buf[rule_pos]);
19054 SET_P0_CONV (rule, rule_buf[rule_pos]);
19055 break;
19056
19057 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
19058 SET_NAME (rule, rule_buf[rule_pos]);
19059 SET_P0_CONV (rule, rule_buf[rule_pos]);
19060 break;
19061
19062 case RULE_OP_MANGLE_TITLE:
19063 SET_NAME (rule, rule_buf[rule_pos]);
19064 break;
19065
19066 default:
19067 return (-1);
19068 break;
19069 }
19070 }
19071
19072 if (rule_pos < rule_len) return (-1);
19073
19074 return (0);
19075 }
19076
19077 int gpu_rule_to_cpu_rule (char rule_buf[BUFSIZ], gpu_rule_t *rule)
19078 {
19079 uint rule_cnt;
19080 uint rule_pos;
19081 uint rule_len = BUFSIZ - 1; // maximum possible len
19082
19083 char rule_cmd;
19084
19085 for (rule_cnt = 0, rule_pos = 0; rule_pos < rule_len && rule_cnt < MAX_GPU_RULES; rule_pos++, rule_cnt++)
19086 {
19087 GET_NAME (rule);
19088
19089 if (rule_cnt > 0) rule_buf[rule_pos++] = ' ';
19090
19091 switch (rule_cmd)
19092 {
19093 case RULE_OP_MANGLE_NOOP:
19094 rule_buf[rule_pos] = rule_cmd;
19095 break;
19096
19097 case RULE_OP_MANGLE_LREST:
19098 rule_buf[rule_pos] = rule_cmd;
19099 break;
19100
19101 case RULE_OP_MANGLE_UREST:
19102 rule_buf[rule_pos] = rule_cmd;
19103 break;
19104
19105 case RULE_OP_MANGLE_LREST_UFIRST:
19106 rule_buf[rule_pos] = rule_cmd;
19107 break;
19108
19109 case RULE_OP_MANGLE_UREST_LFIRST:
19110 rule_buf[rule_pos] = rule_cmd;
19111 break;
19112
19113 case RULE_OP_MANGLE_TREST:
19114 rule_buf[rule_pos] = rule_cmd;
19115 break;
19116
19117 case RULE_OP_MANGLE_TOGGLE_AT:
19118 rule_buf[rule_pos] = rule_cmd;
19119 GET_P0_CONV (rule);
19120 break;
19121
19122 case RULE_OP_MANGLE_REVERSE:
19123 rule_buf[rule_pos] = rule_cmd;
19124 break;
19125
19126 case RULE_OP_MANGLE_DUPEWORD:
19127 rule_buf[rule_pos] = rule_cmd;
19128 break;
19129
19130 case RULE_OP_MANGLE_DUPEWORD_TIMES:
19131 rule_buf[rule_pos] = rule_cmd;
19132 GET_P0_CONV (rule);
19133 break;
19134
19135 case RULE_OP_MANGLE_REFLECT:
19136 rule_buf[rule_pos] = rule_cmd;
19137 break;
19138
19139 case RULE_OP_MANGLE_ROTATE_LEFT:
19140 rule_buf[rule_pos] = rule_cmd;
19141 break;
19142
19143 case RULE_OP_MANGLE_ROTATE_RIGHT:
19144 rule_buf[rule_pos] = rule_cmd;
19145 break;
19146
19147 case RULE_OP_MANGLE_APPEND:
19148 rule_buf[rule_pos] = rule_cmd;
19149 GET_P0 (rule);
19150 break;
19151
19152 case RULE_OP_MANGLE_PREPEND:
19153 rule_buf[rule_pos] = rule_cmd;
19154 GET_P0 (rule);
19155 break;
19156
19157 case RULE_OP_MANGLE_DELETE_FIRST:
19158 rule_buf[rule_pos] = rule_cmd;
19159 break;
19160
19161 case RULE_OP_MANGLE_DELETE_LAST:
19162 rule_buf[rule_pos] = rule_cmd;
19163 break;
19164
19165 case RULE_OP_MANGLE_DELETE_AT:
19166 rule_buf[rule_pos] = rule_cmd;
19167 GET_P0_CONV (rule);
19168 break;
19169
19170 case RULE_OP_MANGLE_EXTRACT:
19171 rule_buf[rule_pos] = rule_cmd;
19172 GET_P0_CONV (rule);
19173 GET_P1_CONV (rule);
19174 break;
19175
19176 case RULE_OP_MANGLE_OMIT:
19177 rule_buf[rule_pos] = rule_cmd;
19178 GET_P0_CONV (rule);
19179 GET_P1_CONV (rule);
19180 break;
19181
19182 case RULE_OP_MANGLE_INSERT:
19183 rule_buf[rule_pos] = rule_cmd;
19184 GET_P0_CONV (rule);
19185 GET_P1 (rule);
19186 break;
19187
19188 case RULE_OP_MANGLE_OVERSTRIKE:
19189 rule_buf[rule_pos] = rule_cmd;
19190 GET_P0_CONV (rule);
19191 GET_P1 (rule);
19192 break;
19193
19194 case RULE_OP_MANGLE_TRUNCATE_AT:
19195 rule_buf[rule_pos] = rule_cmd;
19196 GET_P0_CONV (rule);
19197 break;
19198
19199 case RULE_OP_MANGLE_REPLACE:
19200 rule_buf[rule_pos] = rule_cmd;
19201 GET_P0 (rule);
19202 GET_P1 (rule);
19203 break;
19204
19205 case RULE_OP_MANGLE_PURGECHAR:
19206 return (-1);
19207 break;
19208
19209 case RULE_OP_MANGLE_TOGGLECASE_REC:
19210 return (-1);
19211 break;
19212
19213 case RULE_OP_MANGLE_DUPECHAR_FIRST:
19214 rule_buf[rule_pos] = rule_cmd;
19215 GET_P0_CONV (rule);
19216 break;
19217
19218 case RULE_OP_MANGLE_DUPECHAR_LAST:
19219 rule_buf[rule_pos] = rule_cmd;
19220 GET_P0_CONV (rule);
19221 break;
19222
19223 case RULE_OP_MANGLE_DUPECHAR_ALL:
19224 rule_buf[rule_pos] = rule_cmd;
19225 break;
19226
19227 case RULE_OP_MANGLE_SWITCH_FIRST:
19228 rule_buf[rule_pos] = rule_cmd;
19229 break;
19230
19231 case RULE_OP_MANGLE_SWITCH_LAST:
19232 rule_buf[rule_pos] = rule_cmd;
19233 break;
19234
19235 case RULE_OP_MANGLE_SWITCH_AT:
19236 rule_buf[rule_pos] = rule_cmd;
19237 GET_P0_CONV (rule);
19238 GET_P1_CONV (rule);
19239 break;
19240
19241 case RULE_OP_MANGLE_CHR_SHIFTL:
19242 rule_buf[rule_pos] = rule_cmd;
19243 GET_P0_CONV (rule);
19244 break;
19245
19246 case RULE_OP_MANGLE_CHR_SHIFTR:
19247 rule_buf[rule_pos] = rule_cmd;
19248 GET_P0_CONV (rule);
19249 break;
19250
19251 case RULE_OP_MANGLE_CHR_INCR:
19252 rule_buf[rule_pos] = rule_cmd;
19253 GET_P0_CONV (rule);
19254 break;
19255
19256 case RULE_OP_MANGLE_CHR_DECR:
19257 rule_buf[rule_pos] = rule_cmd;
19258 GET_P0_CONV (rule);
19259 break;
19260
19261 case RULE_OP_MANGLE_REPLACE_NP1:
19262 rule_buf[rule_pos] = rule_cmd;
19263 GET_P0_CONV (rule);
19264 break;
19265
19266 case RULE_OP_MANGLE_REPLACE_NM1:
19267 rule_buf[rule_pos] = rule_cmd;
19268 GET_P0_CONV (rule);
19269 break;
19270
19271 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
19272 rule_buf[rule_pos] = rule_cmd;
19273 GET_P0_CONV (rule);
19274 break;
19275
19276 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
19277 rule_buf[rule_pos] = rule_cmd;
19278 GET_P0_CONV (rule);
19279 break;
19280
19281 case RULE_OP_MANGLE_TITLE:
19282 rule_buf[rule_pos] = rule_cmd;
19283 break;
19284
19285 case 0:
19286 return rule_pos - 1;
19287 break;
19288
19289 default:
19290 return (-1);
19291 break;
19292 }
19293 }
19294
19295 if (rule_cnt > 0)
19296 {
19297 return rule_pos;
19298 }
19299
19300 return (-1);
19301 }
19302
19303 /**
19304 * CPU rules : this is from hashcat sources, cpu based rules
19305 */
19306
19307 #define NEXT_RULEPOS(rp) if (++(rp) == rule_len) return (RULE_RC_SYNTAX_ERROR)
19308 #define NEXT_RPTOI(r,rp,up) if (((up) = conv_ctoi ((r)[(rp)])) == -1) return (RULE_RC_SYNTAX_ERROR)
19309
19310 #define MANGLE_TOGGLE_AT(a,p) if (class_alpha ((a)[(p)])) (a)[(p)] ^= 0x20
19311 #define MANGLE_LOWER_AT(a,p) if (class_upper ((a)[(p)])) (a)[(p)] ^= 0x20
19312 #define MANGLE_UPPER_AT(a,p) if (class_lower ((a)[(p)])) (a)[(p)] ^= 0x20
19313
19314 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); arr[(r)] = arr[(l)]; arr[(l)] = c; } */
19315 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); (a)[(r)] = (a)[(l)]; (a)[(l)] = c; } */
19316 #define MANGLE_SWITCH(a,l,r) { char c = (a)[(r)]; (a)[(r)] = (a)[(l)]; (a)[(l)] = c; }
19317
19318 int mangle_lrest (char arr[BLOCK_SIZE], int arr_len)
19319 {
19320 int pos;
19321
19322 for (pos = 0; pos < arr_len; pos++) MANGLE_LOWER_AT (arr, pos);
19323
19324 return (arr_len);
19325 }
19326
19327 int mangle_urest (char arr[BLOCK_SIZE], int arr_len)
19328 {
19329 int pos;
19330
19331 for (pos = 0; pos < arr_len; pos++) MANGLE_UPPER_AT (arr, pos);
19332
19333 return (arr_len);
19334 }
19335
19336 int mangle_trest (char arr[BLOCK_SIZE], int arr_len)
19337 {
19338 int pos;
19339
19340 for (pos = 0; pos < arr_len; pos++) MANGLE_TOGGLE_AT (arr, pos);
19341
19342 return (arr_len);
19343 }
19344
19345 int mangle_reverse (char arr[BLOCK_SIZE], int arr_len)
19346 {
19347 int l;
19348 int r;
19349
19350 for (l = 0; l < arr_len; l++)
19351 {
19352 r = arr_len - 1 - l;
19353
19354 if (l >= r) break;
19355
19356 MANGLE_SWITCH (arr, l, r);
19357 }
19358
19359 return (arr_len);
19360 }
19361
19362 int mangle_double (char arr[BLOCK_SIZE], int arr_len)
19363 {
19364 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
19365
19366 memcpy (&arr[arr_len], arr, (size_t) arr_len);
19367
19368 return (arr_len * 2);
19369 }
19370
19371 int mangle_double_times (char arr[BLOCK_SIZE], int arr_len, int times)
19372 {
19373 if (((arr_len * times) + arr_len) >= BLOCK_SIZE) return (arr_len);
19374
19375 int orig_len = arr_len;
19376
19377 int i;
19378
19379 for (i = 0; i < times; i++)
19380 {
19381 memcpy (&arr[arr_len], arr, orig_len);
19382
19383 arr_len += orig_len;
19384 }
19385
19386 return (arr_len);
19387 }
19388
19389 int mangle_reflect (char arr[BLOCK_SIZE], int arr_len)
19390 {
19391 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
19392
19393 mangle_double (arr, arr_len);
19394
19395 mangle_reverse (arr + arr_len, arr_len);
19396
19397 return (arr_len * 2);
19398 }
19399
19400 int mangle_rotate_left (char arr[BLOCK_SIZE], int arr_len)
19401 {
19402 int l;
19403 int r;
19404
19405 for (l = 0, r = arr_len - 1; r > 0; r--)
19406 {
19407 MANGLE_SWITCH (arr, l, r);
19408 }
19409
19410 return (arr_len);
19411 }
19412
19413 int mangle_rotate_right (char arr[BLOCK_SIZE], int arr_len)
19414 {
19415 int l;
19416 int r;
19417
19418 for (l = 0, r = arr_len - 1; l < r; l++)
19419 {
19420 MANGLE_SWITCH (arr, l, r);
19421 }
19422
19423 return (arr_len);
19424 }
19425
19426 int mangle_append (char arr[BLOCK_SIZE], int arr_len, char c)
19427 {
19428 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
19429
19430 arr[arr_len] = c;
19431
19432 return (arr_len + 1);
19433 }
19434
19435 int mangle_prepend (char arr[BLOCK_SIZE], int arr_len, char c)
19436 {
19437 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
19438
19439 int arr_pos;
19440
19441 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
19442 {
19443 arr[arr_pos + 1] = arr[arr_pos];
19444 }
19445
19446 arr[0] = c;
19447
19448 return (arr_len + 1);
19449 }
19450
19451 int mangle_delete_at (char arr[BLOCK_SIZE], int arr_len, int upos)
19452 {
19453 if (upos >= arr_len) return (arr_len);
19454
19455 int arr_pos;
19456
19457 for (arr_pos = upos; arr_pos < arr_len - 1; arr_pos++)
19458 {
19459 arr[arr_pos] = arr[arr_pos + 1];
19460 }
19461
19462 return (arr_len - 1);
19463 }
19464
19465 int mangle_extract (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
19466 {
19467 if (upos >= arr_len) return (arr_len);
19468
19469 if ((upos + ulen) > arr_len) return (arr_len);
19470
19471 int arr_pos;
19472
19473 for (arr_pos = 0; arr_pos < ulen; arr_pos++)
19474 {
19475 arr[arr_pos] = arr[upos + arr_pos];
19476 }
19477
19478 return (ulen);
19479 }
19480
19481 int mangle_omit (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
19482 {
19483 if (upos >= arr_len) return (arr_len);
19484
19485 if ((upos + ulen) >= arr_len) return (arr_len);
19486
19487 int arr_pos;
19488
19489 for (arr_pos = upos; arr_pos < arr_len - ulen; arr_pos++)
19490 {
19491 arr[arr_pos] = arr[arr_pos + ulen];
19492 }
19493
19494 return (arr_len - ulen);
19495 }
19496
19497 int mangle_insert (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
19498 {
19499 if (upos >= arr_len) return (arr_len);
19500
19501 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
19502
19503 int arr_pos;
19504
19505 for (arr_pos = arr_len - 1; arr_pos > upos - 1; arr_pos--)
19506 {
19507 arr[arr_pos + 1] = arr[arr_pos];
19508 }
19509
19510 arr[upos] = c;
19511
19512 return (arr_len + 1);
19513 }
19514
19515 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)
19516 {
19517 if ((arr_len + arr2_cpy) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
19518
19519 if (arr_pos > arr_len) return (RULE_RC_REJECT_ERROR);
19520
19521 if (arr2_pos > arr2_len) return (RULE_RC_REJECT_ERROR);
19522
19523 if ((arr2_pos + arr2_cpy) > arr2_len) return (RULE_RC_REJECT_ERROR);
19524
19525 if (arr2_cpy < 1) return (RULE_RC_SYNTAX_ERROR);
19526
19527 memcpy (arr2, arr2 + arr2_pos, arr2_len - arr2_pos);
19528
19529 memcpy (arr2 + arr2_cpy, arr + arr_pos, arr_len - arr_pos);
19530
19531 memcpy (arr + arr_pos, arr2, arr_len - arr_pos + arr2_cpy);
19532
19533 return (arr_len + arr2_cpy);
19534 }
19535
19536 int mangle_overstrike (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
19537 {
19538 if (upos >= arr_len) return (arr_len);
19539
19540 arr[upos] = c;
19541
19542 return (arr_len);
19543 }
19544
19545 int mangle_truncate_at (char arr[BLOCK_SIZE], int arr_len, int upos)
19546 {
19547 if (upos >= arr_len) return (arr_len);
19548
19549 memset (arr + upos, 0, arr_len - upos);
19550
19551 return (upos);
19552 }
19553
19554 int mangle_replace (char arr[BLOCK_SIZE], int arr_len, char oldc, char newc)
19555 {
19556 int arr_pos;
19557
19558 for (arr_pos = 0; arr_pos < arr_len; arr_pos++)
19559 {
19560 if (arr[arr_pos] != oldc) continue;
19561
19562 arr[arr_pos] = newc;
19563 }
19564
19565 return (arr_len);
19566 }
19567
19568 int mangle_purgechar (char arr[BLOCK_SIZE], int arr_len, char c)
19569 {
19570 int arr_pos;
19571
19572 int ret_len;
19573
19574 for (ret_len = 0, arr_pos = 0; arr_pos < arr_len; arr_pos++)
19575 {
19576 if (arr[arr_pos] == c) continue;
19577
19578 arr[ret_len] = arr[arr_pos];
19579
19580 ret_len++;
19581 }
19582
19583 return (ret_len);
19584 }
19585
19586 int mangle_dupeblock_prepend (char arr[BLOCK_SIZE], int arr_len, int ulen)
19587 {
19588 if (ulen > arr_len) return (arr_len);
19589
19590 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
19591
19592 char cs[100];
19593
19594 memcpy (cs, arr, ulen);
19595
19596 int i;
19597
19598 for (i = 0; i < ulen; i++)
19599 {
19600 char c = cs[i];
19601
19602 arr_len = mangle_insert (arr, arr_len, i, c);
19603 }
19604
19605 return (arr_len);
19606 }
19607
19608 int mangle_dupeblock_append (char arr[BLOCK_SIZE], int arr_len, int ulen)
19609 {
19610 if (ulen > arr_len) return (arr_len);
19611
19612 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
19613
19614 int upos = arr_len - ulen;
19615
19616 int i;
19617
19618 for (i = 0; i < ulen; i++)
19619 {
19620 char c = arr[upos + i];
19621
19622 arr_len = mangle_append (arr, arr_len, c);
19623 }
19624
19625 return (arr_len);
19626 }
19627
19628 int mangle_dupechar_at (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
19629 {
19630 if ( arr_len == 0) return (arr_len);
19631 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
19632
19633 char c = arr[upos];
19634
19635 int i;
19636
19637 for (i = 0; i < ulen; i++)
19638 {
19639 arr_len = mangle_insert (arr, arr_len, upos, c);
19640 }
19641
19642 return (arr_len);
19643 }
19644
19645 int mangle_dupechar (char arr[BLOCK_SIZE], int arr_len)
19646 {
19647 if ( arr_len == 0) return (arr_len);
19648 if ((arr_len + arr_len) >= BLOCK_SIZE) return (arr_len);
19649
19650 int arr_pos;
19651
19652 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
19653 {
19654 int new_pos = arr_pos * 2;
19655
19656 arr[new_pos] = arr[arr_pos];
19657
19658 arr[new_pos + 1] = arr[arr_pos];
19659 }
19660
19661 return (arr_len * 2);
19662 }
19663
19664 int mangle_switch_at_check (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
19665 {
19666 if (upos >= arr_len) return (arr_len);
19667 if (upos2 >= arr_len) return (arr_len);
19668
19669 MANGLE_SWITCH (arr, upos, upos2);
19670
19671 return (arr_len);
19672 }
19673
19674 int mangle_switch_at (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
19675 {
19676 MANGLE_SWITCH (arr, upos, upos2);
19677
19678 return (arr_len);
19679 }
19680
19681 int mangle_chr_shiftl (uint8_t arr[BLOCK_SIZE], int arr_len, int upos)
19682 {
19683 if (upos >= arr_len) return (arr_len);
19684
19685 arr[upos] <<= 1;
19686
19687 return (arr_len);
19688 }
19689
19690 int mangle_chr_shiftr (uint8_t arr[BLOCK_SIZE], int arr_len, int upos)
19691 {
19692 if (upos >= arr_len) return (arr_len);
19693
19694 arr[upos] >>= 1;
19695
19696 return (arr_len);
19697 }
19698
19699 int mangle_chr_incr (uint8_t arr[BLOCK_SIZE], int arr_len, int upos)
19700 {
19701 if (upos >= arr_len) return (arr_len);
19702
19703 arr[upos] += 1;
19704
19705 return (arr_len);
19706 }
19707
19708 int mangle_chr_decr (uint8_t arr[BLOCK_SIZE], int arr_len, int upos)
19709 {
19710 if (upos >= arr_len) return (arr_len);
19711
19712 arr[upos] -= 1;
19713
19714 return (arr_len);
19715 }
19716
19717 int mangle_title (char arr[BLOCK_SIZE], int arr_len)
19718 {
19719 int upper_next = 1;
19720
19721 int pos;
19722
19723 for (pos = 0; pos < arr_len; pos++)
19724 {
19725 if (arr[pos] == ' ')
19726 {
19727 upper_next = 1;
19728
19729 continue;
19730 }
19731
19732 if (upper_next)
19733 {
19734 upper_next = 0;
19735
19736 MANGLE_UPPER_AT (arr, pos);
19737 }
19738 else
19739 {
19740 MANGLE_LOWER_AT (arr, pos);
19741 }
19742 }
19743
19744 return (arr_len);
19745 }
19746
19747 int generate_random_rule (char rule_buf[RP_RULE_BUFSIZ], uint32_t rp_gen_func_min, uint32_t rp_gen_func_max)
19748 {
19749 uint32_t rp_gen_num = get_random_num (rp_gen_func_min, rp_gen_func_max);
19750
19751 uint32_t j;
19752
19753 uint32_t rule_pos = 0;
19754
19755 for (j = 0; j < rp_gen_num; j++)
19756 {
19757 uint32_t r = 0;
19758 uint32_t p1 = 0;
19759 uint32_t p2 = 0;
19760 uint32_t p3 = 0;
19761
19762 switch ((char) get_random_num (0, 9))
19763 {
19764 case 0:
19765 r = get_random_num (0, sizeof (grp_op_nop));
19766 rule_buf[rule_pos++] = grp_op_nop[r];
19767 break;
19768
19769 case 1:
19770 r = get_random_num (0, sizeof (grp_op_pos_p0));
19771 rule_buf[rule_pos++] = grp_op_pos_p0[r];
19772 p1 = get_random_num (0, sizeof (grp_pos));
19773 rule_buf[rule_pos++] = grp_pos[p1];
19774 break;
19775
19776 case 2:
19777 r = get_random_num (0, sizeof (grp_op_pos_p1));
19778 rule_buf[rule_pos++] = grp_op_pos_p1[r];
19779 p1 = get_random_num (1, 6);
19780 rule_buf[rule_pos++] = grp_pos[p1];
19781 break;
19782
19783 case 3:
19784 r = get_random_num (0, sizeof (grp_op_chr));
19785 rule_buf[rule_pos++] = grp_op_chr[r];
19786 p1 = get_random_num (0x20, 0x7e);
19787 rule_buf[rule_pos++] = (char) p1;
19788 break;
19789
19790 case 4:
19791 r = get_random_num (0, sizeof (grp_op_chr_chr));
19792 rule_buf[rule_pos++] = grp_op_chr_chr[r];
19793 p1 = get_random_num (0x20, 0x7e);
19794 rule_buf[rule_pos++] = (char) p1;
19795 p2 = get_random_num (0x20, 0x7e);
19796 while (p1 == p2)
19797 p2 = get_random_num (0x20, 0x7e);
19798 rule_buf[rule_pos++] = (char) p2;
19799 break;
19800
19801 case 5:
19802 r = get_random_num (0, sizeof (grp_op_pos_chr));
19803 rule_buf[rule_pos++] = grp_op_pos_chr[r];
19804 p1 = get_random_num (0, sizeof (grp_pos));
19805 rule_buf[rule_pos++] = grp_pos[p1];
19806 p2 = get_random_num (0x20, 0x7e);
19807 rule_buf[rule_pos++] = (char) p2;
19808 break;
19809
19810 case 6:
19811 r = get_random_num (0, sizeof (grp_op_pos_pos0));
19812 rule_buf[rule_pos++] = grp_op_pos_pos0[r];
19813 p1 = get_random_num (0, sizeof (grp_pos));
19814 rule_buf[rule_pos++] = grp_pos[p1];
19815 p2 = get_random_num (0, sizeof (grp_pos));
19816 while (p1 == p2)
19817 p2 = get_random_num (0, sizeof (grp_pos));
19818 rule_buf[rule_pos++] = grp_pos[p2];
19819 break;
19820
19821 case 7:
19822 r = get_random_num (0, sizeof (grp_op_pos_pos1));
19823 rule_buf[rule_pos++] = grp_op_pos_pos1[r];
19824 p1 = get_random_num (0, sizeof (grp_pos));
19825 rule_buf[rule_pos++] = grp_pos[p1];
19826 p2 = get_random_num (1, sizeof (grp_pos));
19827 while (p1 == p2)
19828 p2 = get_random_num (1, sizeof (grp_pos));
19829 rule_buf[rule_pos++] = grp_pos[p2];
19830 break;
19831
19832 case 8:
19833 r = get_random_num (0, sizeof (grp_op_pos1_pos2_pos3));
19834 rule_buf[rule_pos++] = grp_op_pos1_pos2_pos3[r];
19835 p1 = get_random_num (0, sizeof (grp_pos));
19836 rule_buf[rule_pos++] = grp_pos[p1];
19837 p2 = get_random_num (1, sizeof (grp_pos));
19838 rule_buf[rule_pos++] = grp_pos[p1];
19839 p3 = get_random_num (0, sizeof (grp_pos));
19840 rule_buf[rule_pos++] = grp_pos[p3];
19841 break;
19842 }
19843 }
19844
19845 return (rule_pos);
19846 }
19847
19848 int _old_apply_rule (char *rule, int rule_len, char in[BLOCK_SIZE], int in_len, char out[BLOCK_SIZE])
19849 {
19850 char mem[BLOCK_SIZE];
19851
19852 if (in == NULL) return (RULE_RC_REJECT_ERROR);
19853
19854 if (out == NULL) return (RULE_RC_REJECT_ERROR);
19855
19856 if (in_len < 1) return (RULE_RC_REJECT_ERROR);
19857
19858 if (rule_len < 1) return (RULE_RC_REJECT_ERROR);
19859
19860 int out_len = in_len;
19861 int mem_len = in_len;
19862
19863 memcpy (out, in, out_len);
19864
19865 int rule_pos;
19866
19867 for (rule_pos = 0; rule_pos < rule_len; rule_pos++)
19868 {
19869 int upos; int upos2;
19870 int ulen;
19871
19872 switch (rule[rule_pos])
19873 {
19874 case ' ':
19875 break;
19876
19877 case RULE_OP_MANGLE_NOOP:
19878 break;
19879
19880 case RULE_OP_MANGLE_LREST:
19881 out_len = mangle_lrest (out, out_len);
19882 break;
19883
19884 case RULE_OP_MANGLE_UREST:
19885 out_len = mangle_urest (out, out_len);
19886 break;
19887
19888 case RULE_OP_MANGLE_LREST_UFIRST:
19889 out_len = mangle_lrest (out, out_len);
19890 if (out_len) MANGLE_UPPER_AT (out, 0);
19891 break;
19892
19893 case RULE_OP_MANGLE_UREST_LFIRST:
19894 out_len = mangle_urest (out, out_len);
19895 if (out_len) MANGLE_LOWER_AT (out, 0);
19896 break;
19897
19898 case RULE_OP_MANGLE_TREST:
19899 out_len = mangle_trest (out, out_len);
19900 break;
19901
19902 case RULE_OP_MANGLE_TOGGLE_AT:
19903 NEXT_RULEPOS (rule_pos);
19904 NEXT_RPTOI (rule, rule_pos, upos);
19905 if (upos < out_len) MANGLE_TOGGLE_AT (out, upos);
19906 break;
19907
19908 case RULE_OP_MANGLE_REVERSE:
19909 out_len = mangle_reverse (out, out_len);
19910 break;
19911
19912 case RULE_OP_MANGLE_DUPEWORD:
19913 out_len = mangle_double (out, out_len);
19914 break;
19915
19916 case RULE_OP_MANGLE_DUPEWORD_TIMES:
19917 NEXT_RULEPOS (rule_pos);
19918 NEXT_RPTOI (rule, rule_pos, ulen);
19919 out_len = mangle_double_times (out, out_len, ulen);
19920 break;
19921
19922 case RULE_OP_MANGLE_REFLECT:
19923 out_len = mangle_reflect (out, out_len);
19924 break;
19925
19926 case RULE_OP_MANGLE_ROTATE_LEFT:
19927 mangle_rotate_left (out, out_len);
19928 break;
19929
19930 case RULE_OP_MANGLE_ROTATE_RIGHT:
19931 mangle_rotate_right (out, out_len);
19932 break;
19933
19934 case RULE_OP_MANGLE_APPEND:
19935 NEXT_RULEPOS (rule_pos);
19936 out_len = mangle_append (out, out_len, rule[rule_pos]);
19937 break;
19938
19939 case RULE_OP_MANGLE_PREPEND:
19940 NEXT_RULEPOS (rule_pos);
19941 out_len = mangle_prepend (out, out_len, rule[rule_pos]);
19942 break;
19943
19944 case RULE_OP_MANGLE_DELETE_FIRST:
19945 out_len = mangle_delete_at (out, out_len, 0);
19946 break;
19947
19948 case RULE_OP_MANGLE_DELETE_LAST:
19949 out_len = mangle_delete_at (out, out_len, (out_len) ? out_len - 1 : 0);
19950 break;
19951
19952 case RULE_OP_MANGLE_DELETE_AT:
19953 NEXT_RULEPOS (rule_pos);
19954 NEXT_RPTOI (rule, rule_pos, upos);
19955 out_len = mangle_delete_at (out, out_len, upos);
19956 break;
19957
19958 case RULE_OP_MANGLE_EXTRACT:
19959 NEXT_RULEPOS (rule_pos);
19960 NEXT_RPTOI (rule, rule_pos, upos);
19961 NEXT_RULEPOS (rule_pos);
19962 NEXT_RPTOI (rule, rule_pos, ulen);
19963 out_len = mangle_extract (out, out_len, upos, ulen);
19964 break;
19965
19966 case RULE_OP_MANGLE_OMIT:
19967 NEXT_RULEPOS (rule_pos);
19968 NEXT_RPTOI (rule, rule_pos, upos);
19969 NEXT_RULEPOS (rule_pos);
19970 NEXT_RPTOI (rule, rule_pos, ulen);
19971 out_len = mangle_omit (out, out_len, upos, ulen);
19972 break;
19973
19974 case RULE_OP_MANGLE_INSERT:
19975 NEXT_RULEPOS (rule_pos);
19976 NEXT_RPTOI (rule, rule_pos, upos);
19977 NEXT_RULEPOS (rule_pos);
19978 out_len = mangle_insert (out, out_len, upos, rule[rule_pos]);
19979 break;
19980
19981 case RULE_OP_MANGLE_OVERSTRIKE:
19982 NEXT_RULEPOS (rule_pos);
19983 NEXT_RPTOI (rule, rule_pos, upos);
19984 NEXT_RULEPOS (rule_pos);
19985 out_len = mangle_overstrike (out, out_len, upos, rule[rule_pos]);
19986 break;
19987
19988 case RULE_OP_MANGLE_TRUNCATE_AT:
19989 NEXT_RULEPOS (rule_pos);
19990 NEXT_RPTOI (rule, rule_pos, upos);
19991 out_len = mangle_truncate_at (out, out_len, upos);
19992 break;
19993
19994 case RULE_OP_MANGLE_REPLACE:
19995 NEXT_RULEPOS (rule_pos);
19996 NEXT_RULEPOS (rule_pos);
19997 out_len = mangle_replace (out, out_len, rule[rule_pos - 1], rule[rule_pos]);
19998 break;
19999
20000 case RULE_OP_MANGLE_PURGECHAR:
20001 NEXT_RULEPOS (rule_pos);
20002 out_len = mangle_purgechar (out, out_len, rule[rule_pos]);
20003 break;
20004
20005 case RULE_OP_MANGLE_TOGGLECASE_REC:
20006 /* todo */
20007 break;
20008
20009 case RULE_OP_MANGLE_DUPECHAR_FIRST:
20010 NEXT_RULEPOS (rule_pos);
20011 NEXT_RPTOI (rule, rule_pos, ulen);
20012 out_len = mangle_dupechar_at (out, out_len, 0, ulen);
20013 break;
20014
20015 case RULE_OP_MANGLE_DUPECHAR_LAST:
20016 NEXT_RULEPOS (rule_pos);
20017 NEXT_RPTOI (rule, rule_pos, ulen);
20018 out_len = mangle_dupechar_at (out, out_len, out_len - 1, ulen);
20019 break;
20020
20021 case RULE_OP_MANGLE_DUPECHAR_ALL:
20022 out_len = mangle_dupechar (out, out_len);
20023 break;
20024
20025 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
20026 NEXT_RULEPOS (rule_pos);
20027 NEXT_RPTOI (rule, rule_pos, ulen);
20028 out_len = mangle_dupeblock_prepend (out, out_len, ulen);
20029 break;
20030
20031 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
20032 NEXT_RULEPOS (rule_pos);
20033 NEXT_RPTOI (rule, rule_pos, ulen);
20034 out_len = mangle_dupeblock_append (out, out_len, ulen);
20035 break;
20036
20037 case RULE_OP_MANGLE_SWITCH_FIRST:
20038 if (out_len >= 2) mangle_switch_at (out, out_len, 0, 1);
20039 break;
20040
20041 case RULE_OP_MANGLE_SWITCH_LAST:
20042 if (out_len >= 2) mangle_switch_at (out, out_len, out_len - 1, out_len - 2);
20043 break;
20044
20045 case RULE_OP_MANGLE_SWITCH_AT:
20046 NEXT_RULEPOS (rule_pos);
20047 NEXT_RPTOI (rule, rule_pos, upos);
20048 NEXT_RULEPOS (rule_pos);
20049 NEXT_RPTOI (rule, rule_pos, upos2);
20050 out_len = mangle_switch_at_check (out, out_len, upos, upos2);
20051 break;
20052
20053 case RULE_OP_MANGLE_CHR_SHIFTL:
20054 NEXT_RULEPOS (rule_pos);
20055 NEXT_RPTOI (rule, rule_pos, upos);
20056 mangle_chr_shiftl ((uint8_t *) out, out_len, upos);
20057 break;
20058
20059 case RULE_OP_MANGLE_CHR_SHIFTR:
20060 NEXT_RULEPOS (rule_pos);
20061 NEXT_RPTOI (rule, rule_pos, upos);
20062 mangle_chr_shiftr ((uint8_t *) out, out_len, upos);
20063 break;
20064
20065 case RULE_OP_MANGLE_CHR_INCR:
20066 NEXT_RULEPOS (rule_pos);
20067 NEXT_RPTOI (rule, rule_pos, upos);
20068 mangle_chr_incr ((uint8_t *) out, out_len, upos);
20069 break;
20070
20071 case RULE_OP_MANGLE_CHR_DECR:
20072 NEXT_RULEPOS (rule_pos);
20073 NEXT_RPTOI (rule, rule_pos, upos);
20074 mangle_chr_decr ((uint8_t *) out, out_len, upos);
20075 break;
20076
20077 case RULE_OP_MANGLE_REPLACE_NP1:
20078 NEXT_RULEPOS (rule_pos);
20079 NEXT_RPTOI (rule, rule_pos, upos);
20080 if ((upos >= 0) && ((upos + 1) < out_len)) mangle_overstrike (out, out_len, upos, out[upos + 1]);
20081 break;
20082
20083 case RULE_OP_MANGLE_REPLACE_NM1:
20084 NEXT_RULEPOS (rule_pos);
20085 NEXT_RPTOI (rule, rule_pos, upos);
20086 if ((upos >= 1) && ((upos + 0) < out_len)) mangle_overstrike (out, out_len, upos, out[upos - 1]);
20087 break;
20088
20089 case RULE_OP_MANGLE_TITLE:
20090 out_len = mangle_title (out, out_len);
20091 break;
20092
20093 case RULE_OP_MANGLE_EXTRACT_MEMORY:
20094 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20095 NEXT_RULEPOS (rule_pos);
20096 NEXT_RPTOI (rule, rule_pos, upos);
20097 NEXT_RULEPOS (rule_pos);
20098 NEXT_RPTOI (rule, rule_pos, ulen);
20099 NEXT_RULEPOS (rule_pos);
20100 NEXT_RPTOI (rule, rule_pos, upos2);
20101 if ((out_len = mangle_insert_multi (out, out_len, upos2, mem, mem_len, upos, ulen)) < 1) return (out_len);
20102 break;
20103
20104 case RULE_OP_MANGLE_APPEND_MEMORY:
20105 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20106 if ((out_len + mem_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
20107 memcpy (out + out_len, mem, mem_len);
20108 out_len += mem_len;
20109 break;
20110
20111 case RULE_OP_MANGLE_PREPEND_MEMORY:
20112 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20113 if ((mem_len + out_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
20114 memcpy (mem + mem_len, out, out_len);
20115 out_len += mem_len;
20116 memcpy (out, mem, out_len);
20117 break;
20118
20119 case RULE_OP_MEMORIZE_WORD:
20120 memcpy (mem, out, out_len);
20121 mem_len = out_len;
20122 break;
20123
20124 case RULE_OP_REJECT_LESS:
20125 NEXT_RULEPOS (rule_pos);
20126 NEXT_RPTOI (rule, rule_pos, upos);
20127 if (out_len > upos) return (RULE_RC_REJECT_ERROR);
20128 break;
20129
20130 case RULE_OP_REJECT_GREATER:
20131 NEXT_RULEPOS (rule_pos);
20132 NEXT_RPTOI (rule, rule_pos, upos);
20133 if (out_len < upos) return (RULE_RC_REJECT_ERROR);
20134 break;
20135
20136 case RULE_OP_REJECT_CONTAIN:
20137 NEXT_RULEPOS (rule_pos);
20138 if (strchr (out, rule[rule_pos]) != NULL) return (RULE_RC_REJECT_ERROR);
20139 break;
20140
20141 case RULE_OP_REJECT_NOT_CONTAIN:
20142 NEXT_RULEPOS (rule_pos);
20143 if (strchr (out, rule[rule_pos]) == NULL) return (RULE_RC_REJECT_ERROR);
20144 break;
20145
20146 case RULE_OP_REJECT_EQUAL_FIRST:
20147 NEXT_RULEPOS (rule_pos);
20148 if (out[0] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20149 break;
20150
20151 case RULE_OP_REJECT_EQUAL_LAST:
20152 NEXT_RULEPOS (rule_pos);
20153 if (out[out_len - 1] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20154 break;
20155
20156 case RULE_OP_REJECT_EQUAL_AT:
20157 NEXT_RULEPOS (rule_pos);
20158 NEXT_RPTOI (rule, rule_pos, upos);
20159 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
20160 NEXT_RULEPOS (rule_pos);
20161 if (out[upos] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20162 break;
20163
20164 case RULE_OP_REJECT_CONTAINS:
20165 NEXT_RULEPOS (rule_pos);
20166 NEXT_RPTOI (rule, rule_pos, upos);
20167 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
20168 NEXT_RULEPOS (rule_pos);
20169 int c; int cnt; for (c = 0, cnt = 0; c < out_len; c++) if (out[c] == rule[rule_pos]) cnt++;
20170 if (cnt < upos) return (RULE_RC_REJECT_ERROR);
20171 break;
20172
20173 case RULE_OP_REJECT_MEMORY:
20174 if ((out_len == mem_len) && (memcmp (out, mem, out_len) == 0)) return (RULE_RC_REJECT_ERROR);
20175 break;
20176
20177 default:
20178 return (RULE_RC_SYNTAX_ERROR);
20179 break;
20180 }
20181 }
20182
20183 memset (out + out_len, 0, BLOCK_SIZE - out_len);
20184
20185 return (out_len);
20186 }