8b7c0a7838858129befdc029bad2909f7c2a05e5
[hashcat.git] / src / shared.c
1 /**
2 * Authors.....: Jens Steube <jens.steube@gmail.com>
3 * Gabriele Gristina <matrix@hashcat.net>
4 *
5 * License.....: MIT
6 */
7
8 #ifdef OSX
9 #include <stdio.h>
10 #endif
11
12 #include <shared.h>
13 #include <limits.h>
14
15 /**
16 * basic bit handling
17 */
18
19 u32 rotl32 (const u32 a, const u32 n)
20 {
21 return ((a << n) | (a >> (32 - n)));
22 }
23
24 u32 rotr32 (const u32 a, const u32 n)
25 {
26 return ((a >> n) | (a << (32 - n)));
27 }
28
29 u64 rotl64 (const u64 a, const u64 n)
30 {
31 return ((a << n) | (a >> (64 - n)));
32 }
33
34 u64 rotr64 (const u64 a, const u64 n)
35 {
36 return ((a >> n) | (a << (64 - n)));
37 }
38
39 u32 byte_swap_32 (const u32 n)
40 {
41 return (n & 0xff000000) >> 24
42 | (n & 0x00ff0000) >> 8
43 | (n & 0x0000ff00) << 8
44 | (n & 0x000000ff) << 24;
45 }
46
47 u64 byte_swap_64 (const u64 n)
48 {
49 return (n & 0xff00000000000000ULL) >> 56
50 | (n & 0x00ff000000000000ULL) >> 40
51 | (n & 0x0000ff0000000000ULL) >> 24
52 | (n & 0x000000ff00000000ULL) >> 8
53 | (n & 0x00000000ff000000ULL) << 8
54 | (n & 0x0000000000ff0000ULL) << 24
55 | (n & 0x000000000000ff00ULL) << 40
56 | (n & 0x00000000000000ffULL) << 56;
57 }
58
59 /**
60 * ciphers for use on cpu
61 */
62
63 #include "cpu-des.c"
64 #include "cpu-aes.c"
65
66 /**
67 * hashes for use on cpu
68 */
69
70 #include "cpu-md5.c"
71 #include "cpu-sha256.c"
72
73 /**
74 * logging
75 */
76
77 int last_len = 0;
78
79 void log_final (FILE *fp, const char *fmt, va_list ap)
80 {
81 if (last_len)
82 {
83 fputc ('\r', fp);
84
85 for (int i = 0; i < last_len; i++)
86 {
87 fputc (' ', fp);
88 }
89
90 fputc ('\r', fp);
91 }
92
93 char s[4096] = { 0 };
94
95 int max_len = (int) sizeof (s);
96
97 int len = vsnprintf (s, max_len, fmt, ap);
98
99 if (len > max_len) len = max_len;
100
101 fwrite (s, len, 1, fp);
102
103 fflush (fp);
104
105 last_len = len;
106 }
107
108 void log_out_nn (FILE *fp, const char *fmt, ...)
109 {
110 if (SUPPRESS_OUTPUT) return;
111
112 va_list ap;
113
114 va_start (ap, fmt);
115
116 log_final (fp, fmt, ap);
117
118 va_end (ap);
119 }
120
121 void log_info_nn (const char *fmt, ...)
122 {
123 if (SUPPRESS_OUTPUT) return;
124
125 va_list ap;
126
127 va_start (ap, fmt);
128
129 log_final (stdout, fmt, ap);
130
131 va_end (ap);
132 }
133
134 void log_error_nn (const char *fmt, ...)
135 {
136 if (SUPPRESS_OUTPUT) return;
137
138 va_list ap;
139
140 va_start (ap, fmt);
141
142 log_final (stderr, fmt, ap);
143
144 va_end (ap);
145 }
146
147 void log_out (FILE *fp, const char *fmt, ...)
148 {
149 if (SUPPRESS_OUTPUT) return;
150
151 va_list ap;
152
153 va_start (ap, fmt);
154
155 log_final (fp, fmt, ap);
156
157 va_end (ap);
158
159 fputc ('\n', fp);
160
161 last_len = 0;
162 }
163
164 void log_info (const char *fmt, ...)
165 {
166 if (SUPPRESS_OUTPUT) return;
167
168 va_list ap;
169
170 va_start (ap, fmt);
171
172 log_final (stdout, fmt, ap);
173
174 va_end (ap);
175
176 fputc ('\n', stdout);
177
178 last_len = 0;
179 }
180
181 void log_error (const char *fmt, ...)
182 {
183 if (SUPPRESS_OUTPUT) return;
184
185 fputc ('\n', stderr);
186 fputc ('\n', stderr);
187
188 va_list ap;
189
190 va_start (ap, fmt);
191
192 log_final (stderr, fmt, ap);
193
194 va_end (ap);
195
196 fputc ('\n', stderr);
197 fputc ('\n', stderr);
198
199 last_len = 0;
200 }
201
202 /**
203 * converter
204 */
205
206 u8 int_to_base32 (const u8 c)
207 {
208 static const u8 tbl[0x20] =
209 {
210 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50,
211 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
212 };
213
214 return tbl[c];
215 }
216
217 u8 base32_to_int (const u8 c)
218 {
219 if ((c >= 'A') && (c <= 'Z')) return c - 'A';
220 else if ((c >= '2') && (c <= '7')) return c - '2' + 26;
221
222 return 0;
223 }
224
225 u8 int_to_itoa32 (const u8 c)
226 {
227 static const u8 tbl[0x20] =
228 {
229 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66,
230 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76,
231 };
232
233 return tbl[c];
234 }
235
236 u8 itoa32_to_int (const u8 c)
237 {
238 if ((c >= '0') && (c <= '9')) return c - '0';
239 else if ((c >= 'a') && (c <= 'v')) return c - 'a' + 10;
240
241 return 0;
242 }
243
244 u8 int_to_itoa64 (const u8 c)
245 {
246 static const u8 tbl[0x40] =
247 {
248 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44,
249 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54,
250 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a,
251 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a,
252 };
253
254 return tbl[c];
255 }
256
257 u8 itoa64_to_int (const u8 c)
258 {
259 static const u8 tbl[0x100] =
260 {
261 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21,
262 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31,
263 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01,
264 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a,
265 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a,
266 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x20, 0x21, 0x22, 0x23, 0x24,
267 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34,
268 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01, 0x02, 0x03, 0x04,
269 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14,
270 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24,
271 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34,
272 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01, 0x02, 0x03, 0x04,
273 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14,
274 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24,
275 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34,
276 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01, 0x02, 0x03, 0x04,
277 };
278
279 return tbl[c];
280 }
281
282 u8 int_to_base64 (const u8 c)
283 {
284 static const u8 tbl[0x40] =
285 {
286 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50,
287 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66,
288 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76,
289 0x77, 0x78, 0x79, 0x7a, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x2b, 0x2f,
290 };
291
292 return tbl[c];
293 }
294
295 u8 base64_to_int (const u8 c)
296 {
297 static const u8 tbl[0x100] =
298 {
299 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
300 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
301 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x3f,
302 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
303 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
304 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00,
305 0x00, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,
306 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00,
307 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
308 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00,
311 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
312 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
313 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
314 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
315 };
316
317 return tbl[c];
318 }
319
320 u8 int_to_bf64 (const u8 c)
321 {
322 static const u8 tbl[0x40] =
323 {
324 0x2e, 0x2f, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e,
325 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64,
326 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74,
327 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
328 };
329
330 return tbl[c];
331 }
332
333 u8 bf64_to_int (const u8 c)
334 {
335 static const u8 tbl[0x100] =
336 {
337 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
338 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
339 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
340 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
341 0x00, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
342 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00,
343 0x00, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a,
344 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00,
345 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
346 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00,
349 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
350 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
351 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
352 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
353 };
354
355 return tbl[c];
356 }
357
358 u8 int_to_lotus64 (const u8 c)
359 {
360 if (c < 10) return '0' + c;
361 else if (c < 36) return 'A' + c - 10;
362 else if (c < 62) return 'a' + c - 36;
363 else if (c == 62) return '+';
364 else if (c == 63) return '/';
365
366 return 0;
367 }
368
369 u8 lotus64_to_int (const u8 c)
370 {
371 if ((c >= '0') && (c <= '9')) return c - '0';
372 else if ((c >= 'A') && (c <= 'Z')) return c - 'A' + 10;
373 else if ((c >= 'a') && (c <= 'z')) return c - 'a' + 36;
374 else if (c == '+') return 62;
375 else if (c == '/') return 63;
376 else
377
378 return 0;
379 }
380
381 int base32_decode (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf)
382 {
383 const u8 *in_ptr = in_buf;
384
385 u8 *out_ptr = out_buf;
386
387 for (int i = 0; i < in_len; i += 8)
388 {
389 const u8 out_val0 = f (in_ptr[0] & 0x7f);
390 const u8 out_val1 = f (in_ptr[1] & 0x7f);
391 const u8 out_val2 = f (in_ptr[2] & 0x7f);
392 const u8 out_val3 = f (in_ptr[3] & 0x7f);
393 const u8 out_val4 = f (in_ptr[4] & 0x7f);
394 const u8 out_val5 = f (in_ptr[5] & 0x7f);
395 const u8 out_val6 = f (in_ptr[6] & 0x7f);
396 const u8 out_val7 = f (in_ptr[7] & 0x7f);
397
398 out_ptr[0] = ((out_val0 << 3) & 0xf8) | ((out_val1 >> 2) & 0x07);
399 out_ptr[1] = ((out_val1 << 6) & 0xc0) | ((out_val2 << 1) & 0x3e) | ((out_val3 >> 4) & 0x01);
400 out_ptr[2] = ((out_val3 << 4) & 0xf0) | ((out_val4 >> 1) & 0x0f);
401 out_ptr[3] = ((out_val4 << 7) & 0x80) | ((out_val5 << 2) & 0x7c) | ((out_val6 >> 3) & 0x03);
402 out_ptr[4] = ((out_val6 << 5) & 0xe0) | ((out_val7 >> 0) & 0x1f);
403
404 in_ptr += 8;
405 out_ptr += 5;
406 }
407
408 for (int i = 0; i < in_len; i++)
409 {
410 if (in_buf[i] != '=') continue;
411
412 in_len = i;
413 }
414
415 int out_len = (in_len * 5) / 8;
416
417 return out_len;
418 }
419
420 int base32_encode (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf)
421 {
422 const u8 *in_ptr = in_buf;
423
424 u8 *out_ptr = out_buf;
425
426 for (int i = 0; i < in_len; i += 5)
427 {
428 const u8 out_val0 = f ( ((in_ptr[0] >> 3) & 0x1f));
429 const u8 out_val1 = f (((in_ptr[0] << 2) & 0x1c) | ((in_ptr[1] >> 6) & 0x03));
430 const u8 out_val2 = f ( ((in_ptr[1] >> 1) & 0x1f));
431 const u8 out_val3 = f (((in_ptr[1] << 4) & 0x10) | ((in_ptr[2] >> 4) & 0x0f));
432 const u8 out_val4 = f (((in_ptr[2] << 1) & 0x1e) | ((in_ptr[3] >> 7) & 0x01));
433 const u8 out_val5 = f ( ((in_ptr[3] >> 2) & 0x1f));
434 const u8 out_val6 = f (((in_ptr[3] << 3) & 0x18) | ((in_ptr[4] >> 5) & 0x07));
435 const u8 out_val7 = f ( ((in_ptr[4] >> 0) & 0x1f));
436
437 out_ptr[0] = out_val0 & 0x7f;
438 out_ptr[1] = out_val1 & 0x7f;
439 out_ptr[2] = out_val2 & 0x7f;
440 out_ptr[3] = out_val3 & 0x7f;
441 out_ptr[4] = out_val4 & 0x7f;
442 out_ptr[5] = out_val5 & 0x7f;
443 out_ptr[6] = out_val6 & 0x7f;
444 out_ptr[7] = out_val7 & 0x7f;
445
446 in_ptr += 5;
447 out_ptr += 8;
448 }
449
450 int out_len = (int) (((0.5 + (float) in_len) * 8) / 5); // ceil (in_len * 8 / 5)
451
452 while (out_len % 8)
453 {
454 out_buf[out_len] = '=';
455
456 out_len++;
457 }
458
459 return out_len;
460 }
461
462 int base64_decode (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf)
463 {
464 const u8 *in_ptr = in_buf;
465
466 u8 *out_ptr = out_buf;
467
468 for (int i = 0; i < in_len; i += 4)
469 {
470 const u8 out_val0 = f (in_ptr[0] & 0x7f);
471 const u8 out_val1 = f (in_ptr[1] & 0x7f);
472 const u8 out_val2 = f (in_ptr[2] & 0x7f);
473 const u8 out_val3 = f (in_ptr[3] & 0x7f);
474
475 out_ptr[0] = ((out_val0 << 2) & 0xfc) | ((out_val1 >> 4) & 0x03);
476 out_ptr[1] = ((out_val1 << 4) & 0xf0) | ((out_val2 >> 2) & 0x0f);
477 out_ptr[2] = ((out_val2 << 6) & 0xc0) | ((out_val3 >> 0) & 0x3f);
478
479 in_ptr += 4;
480 out_ptr += 3;
481 }
482
483 for (int i = 0; i < in_len; i++)
484 {
485 if (in_buf[i] != '=') continue;
486
487 in_len = i;
488 }
489
490 int out_len = (in_len * 6) / 8;
491
492 return out_len;
493 }
494
495 int base64_encode (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf)
496 {
497 const u8 *in_ptr = in_buf;
498
499 u8 *out_ptr = out_buf;
500
501 for (int i = 0; i < in_len; i += 3)
502 {
503 const u8 out_val0 = f ( ((in_ptr[0] >> 2) & 0x3f));
504 const u8 out_val1 = f (((in_ptr[0] << 4) & 0x30) | ((in_ptr[1] >> 4) & 0x0f));
505 const u8 out_val2 = f (((in_ptr[1] << 2) & 0x3c) | ((in_ptr[2] >> 6) & 0x03));
506 const u8 out_val3 = f ( ((in_ptr[2] >> 0) & 0x3f));
507
508 out_ptr[0] = out_val0 & 0x7f;
509 out_ptr[1] = out_val1 & 0x7f;
510 out_ptr[2] = out_val2 & 0x7f;
511 out_ptr[3] = out_val3 & 0x7f;
512
513 in_ptr += 3;
514 out_ptr += 4;
515 }
516
517 int out_len = (int) (((0.5 + (float) in_len) * 8) / 6); // ceil (in_len * 8 / 6)
518
519 while (out_len % 4)
520 {
521 out_buf[out_len] = '=';
522
523 out_len++;
524 }
525
526 return out_len;
527 }
528
529 int is_valid_hex_char (const u8 c)
530 {
531 if ((c >= '0') && (c <= '9')) return 1;
532 if ((c >= 'A') && (c <= 'F')) return 1;
533 if ((c >= 'a') && (c <= 'f')) return 1;
534
535 return 0;
536 }
537
538 u8 hex_convert (const u8 c)
539 {
540 return (c & 15) + (c >> 6) * 9;
541 }
542
543 u8 hex_to_u8 (const u8 hex[2])
544 {
545 u8 v = 0;
546
547 v |= (hex_convert (hex[1]) << 0);
548 v |= (hex_convert (hex[0]) << 4);
549
550 return (v);
551 }
552
553 u32 hex_to_u32 (const u8 hex[8])
554 {
555 u32 v = 0;
556
557 v |= ((u32) hex_convert (hex[7])) << 0;
558 v |= ((u32) hex_convert (hex[6])) << 4;
559 v |= ((u32) hex_convert (hex[5])) << 8;
560 v |= ((u32) hex_convert (hex[4])) << 12;
561 v |= ((u32) hex_convert (hex[3])) << 16;
562 v |= ((u32) hex_convert (hex[2])) << 20;
563 v |= ((u32) hex_convert (hex[1])) << 24;
564 v |= ((u32) hex_convert (hex[0])) << 28;
565
566 return (v);
567 }
568
569 u64 hex_to_u64 (const u8 hex[16])
570 {
571 u64 v = 0;
572
573 v |= ((u64) hex_convert (hex[15]) << 0);
574 v |= ((u64) hex_convert (hex[14]) << 4);
575 v |= ((u64) hex_convert (hex[13]) << 8);
576 v |= ((u64) hex_convert (hex[12]) << 12);
577 v |= ((u64) hex_convert (hex[11]) << 16);
578 v |= ((u64) hex_convert (hex[10]) << 20);
579 v |= ((u64) hex_convert (hex[ 9]) << 24);
580 v |= ((u64) hex_convert (hex[ 8]) << 28);
581 v |= ((u64) hex_convert (hex[ 7]) << 32);
582 v |= ((u64) hex_convert (hex[ 6]) << 36);
583 v |= ((u64) hex_convert (hex[ 5]) << 40);
584 v |= ((u64) hex_convert (hex[ 4]) << 44);
585 v |= ((u64) hex_convert (hex[ 3]) << 48);
586 v |= ((u64) hex_convert (hex[ 2]) << 52);
587 v |= ((u64) hex_convert (hex[ 1]) << 56);
588 v |= ((u64) hex_convert (hex[ 0]) << 60);
589
590 return (v);
591 }
592
593 void bin_to_hex_lower (const u32 v, u8 hex[8])
594 {
595 hex[0] = v >> 28 & 15;
596 hex[1] = v >> 24 & 15;
597 hex[2] = v >> 20 & 15;
598 hex[3] = v >> 16 & 15;
599 hex[4] = v >> 12 & 15;
600 hex[5] = v >> 8 & 15;
601 hex[6] = v >> 4 & 15;
602 hex[7] = v >> 0 & 15;
603
604 u32 add;
605
606 hex[0] += 6; add = ((hex[0] & 0x10) >> 4) * 39; hex[0] += 42 + add;
607 hex[1] += 6; add = ((hex[1] & 0x10) >> 4) * 39; hex[1] += 42 + add;
608 hex[2] += 6; add = ((hex[2] & 0x10) >> 4) * 39; hex[2] += 42 + add;
609 hex[3] += 6; add = ((hex[3] & 0x10) >> 4) * 39; hex[3] += 42 + add;
610 hex[4] += 6; add = ((hex[4] & 0x10) >> 4) * 39; hex[4] += 42 + add;
611 hex[5] += 6; add = ((hex[5] & 0x10) >> 4) * 39; hex[5] += 42 + add;
612 hex[6] += 6; add = ((hex[6] & 0x10) >> 4) * 39; hex[6] += 42 + add;
613 hex[7] += 6; add = ((hex[7] & 0x10) >> 4) * 39; hex[7] += 42 + add;
614 }
615
616 /**
617 * decoder
618 */
619
620 static void AES128_decrypt_cbc (const u32 key[4], const u32 iv[4], const u32 in[16], u32 out[16])
621 {
622 AES_KEY skey;
623
624 AES_set_decrypt_key ((const u8 *) key, 128, &skey);
625
626 u32 _iv[4] = { 0 };
627
628 _iv[0] = iv[0];
629 _iv[1] = iv[1];
630 _iv[2] = iv[2];
631 _iv[3] = iv[3];
632
633 for (int i = 0; i < 16; i += 4)
634 {
635 u32 _in[4] = { 0 };
636 u32 _out[4] = { 0 };
637
638 _in[0] = in[i + 0];
639 _in[1] = in[i + 1];
640 _in[2] = in[i + 2];
641 _in[3] = in[i + 3];
642
643 AES_decrypt (&skey, (const u8 *) _in, (u8 *) _out);
644
645 _out[0] ^= _iv[0];
646 _out[1] ^= _iv[1];
647 _out[2] ^= _iv[2];
648 _out[3] ^= _iv[3];
649
650 out[i + 0] = _out[0];
651 out[i + 1] = _out[1];
652 out[i + 2] = _out[2];
653 out[i + 3] = _out[3];
654
655 _iv[0] = _in[0];
656 _iv[1] = _in[1];
657 _iv[2] = _in[2];
658 _iv[3] = _in[3];
659 }
660 }
661
662 static void juniper_decrypt_hash (char *in, char *out)
663 {
664 // base64 decode
665
666 u8 base64_buf[100] = { 0 };
667
668 base64_decode (base64_to_int, (const u8 *) in, DISPLAY_LEN_MIN_501, base64_buf);
669
670 // iv stuff
671
672 u32 juniper_iv[4] = { 0 };
673
674 memcpy (juniper_iv, base64_buf, 12);
675
676 memcpy (out, juniper_iv, 12);
677
678 // reversed key
679
680 u32 juniper_key[4] = { 0 };
681
682 juniper_key[0] = byte_swap_32 (0xa6707a7e);
683 juniper_key[1] = byte_swap_32 (0x8df91059);
684 juniper_key[2] = byte_swap_32 (0xdea70ae5);
685 juniper_key[3] = byte_swap_32 (0x2f9c2442);
686
687 // AES decrypt
688
689 u32 *in_ptr = (u32 *) (base64_buf + 12);
690 u32 *out_ptr = (u32 *) (out + 12);
691
692 AES128_decrypt_cbc (juniper_key, juniper_iv, in_ptr, out_ptr);
693 }
694
695 void phpass_decode (u8 digest[16], u8 buf[22])
696 {
697 int l;
698
699 l = itoa64_to_int (buf[ 0]) << 0;
700 l |= itoa64_to_int (buf[ 1]) << 6;
701 l |= itoa64_to_int (buf[ 2]) << 12;
702 l |= itoa64_to_int (buf[ 3]) << 18;
703
704 digest[ 0] = (l >> 0) & 0xff;
705 digest[ 1] = (l >> 8) & 0xff;
706 digest[ 2] = (l >> 16) & 0xff;
707
708 l = itoa64_to_int (buf[ 4]) << 0;
709 l |= itoa64_to_int (buf[ 5]) << 6;
710 l |= itoa64_to_int (buf[ 6]) << 12;
711 l |= itoa64_to_int (buf[ 7]) << 18;
712
713 digest[ 3] = (l >> 0) & 0xff;
714 digest[ 4] = (l >> 8) & 0xff;
715 digest[ 5] = (l >> 16) & 0xff;
716
717 l = itoa64_to_int (buf[ 8]) << 0;
718 l |= itoa64_to_int (buf[ 9]) << 6;
719 l |= itoa64_to_int (buf[10]) << 12;
720 l |= itoa64_to_int (buf[11]) << 18;
721
722 digest[ 6] = (l >> 0) & 0xff;
723 digest[ 7] = (l >> 8) & 0xff;
724 digest[ 8] = (l >> 16) & 0xff;
725
726 l = itoa64_to_int (buf[12]) << 0;
727 l |= itoa64_to_int (buf[13]) << 6;
728 l |= itoa64_to_int (buf[14]) << 12;
729 l |= itoa64_to_int (buf[15]) << 18;
730
731 digest[ 9] = (l >> 0) & 0xff;
732 digest[10] = (l >> 8) & 0xff;
733 digest[11] = (l >> 16) & 0xff;
734
735 l = itoa64_to_int (buf[16]) << 0;
736 l |= itoa64_to_int (buf[17]) << 6;
737 l |= itoa64_to_int (buf[18]) << 12;
738 l |= itoa64_to_int (buf[19]) << 18;
739
740 digest[12] = (l >> 0) & 0xff;
741 digest[13] = (l >> 8) & 0xff;
742 digest[14] = (l >> 16) & 0xff;
743
744 l = itoa64_to_int (buf[20]) << 0;
745 l |= itoa64_to_int (buf[21]) << 6;
746
747 digest[15] = (l >> 0) & 0xff;
748 }
749
750 void phpass_encode (u8 digest[16], u8 buf[22])
751 {
752 int l;
753
754 l = (digest[ 0] << 0) | (digest[ 1] << 8) | (digest[ 2] << 16);
755
756 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
757 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
758 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
759 buf[ 3] = int_to_itoa64 (l & 0x3f);
760
761 l = (digest[ 3] << 0) | (digest[ 4] << 8) | (digest[ 5] << 16);
762
763 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
764 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
765 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
766 buf[ 7] = int_to_itoa64 (l & 0x3f);
767
768 l = (digest[ 6] << 0) | (digest[ 7] << 8) | (digest[ 8] << 16);
769
770 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
771 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
772 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
773 buf[11] = int_to_itoa64 (l & 0x3f);
774
775 l = (digest[ 9] << 0) | (digest[10] << 8) | (digest[11] << 16);
776
777 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
778 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
779 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
780 buf[15] = int_to_itoa64 (l & 0x3f);
781
782 l = (digest[12] << 0) | (digest[13] << 8) | (digest[14] << 16);
783
784 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
785 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
786 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
787 buf[19] = int_to_itoa64 (l & 0x3f);
788
789 l = (digest[15] << 0);
790
791 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
792 buf[21] = int_to_itoa64 (l & 0x3f);
793 }
794
795 void md5crypt_decode (u8 digest[16], u8 buf[22])
796 {
797 int l;
798
799 l = itoa64_to_int (buf[ 0]) << 0;
800 l |= itoa64_to_int (buf[ 1]) << 6;
801 l |= itoa64_to_int (buf[ 2]) << 12;
802 l |= itoa64_to_int (buf[ 3]) << 18;
803
804 digest[ 0] = (l >> 16) & 0xff;
805 digest[ 6] = (l >> 8) & 0xff;
806 digest[12] = (l >> 0) & 0xff;
807
808 l = itoa64_to_int (buf[ 4]) << 0;
809 l |= itoa64_to_int (buf[ 5]) << 6;
810 l |= itoa64_to_int (buf[ 6]) << 12;
811 l |= itoa64_to_int (buf[ 7]) << 18;
812
813 digest[ 1] = (l >> 16) & 0xff;
814 digest[ 7] = (l >> 8) & 0xff;
815 digest[13] = (l >> 0) & 0xff;
816
817 l = itoa64_to_int (buf[ 8]) << 0;
818 l |= itoa64_to_int (buf[ 9]) << 6;
819 l |= itoa64_to_int (buf[10]) << 12;
820 l |= itoa64_to_int (buf[11]) << 18;
821
822 digest[ 2] = (l >> 16) & 0xff;
823 digest[ 8] = (l >> 8) & 0xff;
824 digest[14] = (l >> 0) & 0xff;
825
826 l = itoa64_to_int (buf[12]) << 0;
827 l |= itoa64_to_int (buf[13]) << 6;
828 l |= itoa64_to_int (buf[14]) << 12;
829 l |= itoa64_to_int (buf[15]) << 18;
830
831 digest[ 3] = (l >> 16) & 0xff;
832 digest[ 9] = (l >> 8) & 0xff;
833 digest[15] = (l >> 0) & 0xff;
834
835 l = itoa64_to_int (buf[16]) << 0;
836 l |= itoa64_to_int (buf[17]) << 6;
837 l |= itoa64_to_int (buf[18]) << 12;
838 l |= itoa64_to_int (buf[19]) << 18;
839
840 digest[ 4] = (l >> 16) & 0xff;
841 digest[10] = (l >> 8) & 0xff;
842 digest[ 5] = (l >> 0) & 0xff;
843
844 l = itoa64_to_int (buf[20]) << 0;
845 l |= itoa64_to_int (buf[21]) << 6;
846
847 digest[11] = (l >> 0) & 0xff;
848 }
849
850 void md5crypt_encode (u8 digest[16], u8 buf[22])
851 {
852 int l;
853
854 l = (digest[ 0] << 16) | (digest[ 6] << 8) | (digest[12] << 0);
855
856 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
857 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
858 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
859 buf[ 3] = int_to_itoa64 (l & 0x3f); l >>= 6;
860
861 l = (digest[ 1] << 16) | (digest[ 7] << 8) | (digest[13] << 0);
862
863 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
864 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
865 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
866 buf[ 7] = int_to_itoa64 (l & 0x3f); l >>= 6;
867
868 l = (digest[ 2] << 16) | (digest[ 8] << 8) | (digest[14] << 0);
869
870 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
871 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
872 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
873 buf[11] = int_to_itoa64 (l & 0x3f); l >>= 6;
874
875 l = (digest[ 3] << 16) | (digest[ 9] << 8) | (digest[15] << 0);
876
877 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
878 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
879 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
880 buf[15] = int_to_itoa64 (l & 0x3f); l >>= 6;
881
882 l = (digest[ 4] << 16) | (digest[10] << 8) | (digest[ 5] << 0);
883
884 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
885 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
886 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
887 buf[19] = int_to_itoa64 (l & 0x3f); l >>= 6;
888
889 l = (digest[11] << 0);
890
891 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
892 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
893 }
894
895 void sha512crypt_decode (u8 digest[64], u8 buf[86])
896 {
897 int l;
898
899 l = itoa64_to_int (buf[ 0]) << 0;
900 l |= itoa64_to_int (buf[ 1]) << 6;
901 l |= itoa64_to_int (buf[ 2]) << 12;
902 l |= itoa64_to_int (buf[ 3]) << 18;
903
904 digest[ 0] = (l >> 16) & 0xff;
905 digest[21] = (l >> 8) & 0xff;
906 digest[42] = (l >> 0) & 0xff;
907
908 l = itoa64_to_int (buf[ 4]) << 0;
909 l |= itoa64_to_int (buf[ 5]) << 6;
910 l |= itoa64_to_int (buf[ 6]) << 12;
911 l |= itoa64_to_int (buf[ 7]) << 18;
912
913 digest[22] = (l >> 16) & 0xff;
914 digest[43] = (l >> 8) & 0xff;
915 digest[ 1] = (l >> 0) & 0xff;
916
917 l = itoa64_to_int (buf[ 8]) << 0;
918 l |= itoa64_to_int (buf[ 9]) << 6;
919 l |= itoa64_to_int (buf[10]) << 12;
920 l |= itoa64_to_int (buf[11]) << 18;
921
922 digest[44] = (l >> 16) & 0xff;
923 digest[ 2] = (l >> 8) & 0xff;
924 digest[23] = (l >> 0) & 0xff;
925
926 l = itoa64_to_int (buf[12]) << 0;
927 l |= itoa64_to_int (buf[13]) << 6;
928 l |= itoa64_to_int (buf[14]) << 12;
929 l |= itoa64_to_int (buf[15]) << 18;
930
931 digest[ 3] = (l >> 16) & 0xff;
932 digest[24] = (l >> 8) & 0xff;
933 digest[45] = (l >> 0) & 0xff;
934
935 l = itoa64_to_int (buf[16]) << 0;
936 l |= itoa64_to_int (buf[17]) << 6;
937 l |= itoa64_to_int (buf[18]) << 12;
938 l |= itoa64_to_int (buf[19]) << 18;
939
940 digest[25] = (l >> 16) & 0xff;
941 digest[46] = (l >> 8) & 0xff;
942 digest[ 4] = (l >> 0) & 0xff;
943
944 l = itoa64_to_int (buf[20]) << 0;
945 l |= itoa64_to_int (buf[21]) << 6;
946 l |= itoa64_to_int (buf[22]) << 12;
947 l |= itoa64_to_int (buf[23]) << 18;
948
949 digest[47] = (l >> 16) & 0xff;
950 digest[ 5] = (l >> 8) & 0xff;
951 digest[26] = (l >> 0) & 0xff;
952
953 l = itoa64_to_int (buf[24]) << 0;
954 l |= itoa64_to_int (buf[25]) << 6;
955 l |= itoa64_to_int (buf[26]) << 12;
956 l |= itoa64_to_int (buf[27]) << 18;
957
958 digest[ 6] = (l >> 16) & 0xff;
959 digest[27] = (l >> 8) & 0xff;
960 digest[48] = (l >> 0) & 0xff;
961
962 l = itoa64_to_int (buf[28]) << 0;
963 l |= itoa64_to_int (buf[29]) << 6;
964 l |= itoa64_to_int (buf[30]) << 12;
965 l |= itoa64_to_int (buf[31]) << 18;
966
967 digest[28] = (l >> 16) & 0xff;
968 digest[49] = (l >> 8) & 0xff;
969 digest[ 7] = (l >> 0) & 0xff;
970
971 l = itoa64_to_int (buf[32]) << 0;
972 l |= itoa64_to_int (buf[33]) << 6;
973 l |= itoa64_to_int (buf[34]) << 12;
974 l |= itoa64_to_int (buf[35]) << 18;
975
976 digest[50] = (l >> 16) & 0xff;
977 digest[ 8] = (l >> 8) & 0xff;
978 digest[29] = (l >> 0) & 0xff;
979
980 l = itoa64_to_int (buf[36]) << 0;
981 l |= itoa64_to_int (buf[37]) << 6;
982 l |= itoa64_to_int (buf[38]) << 12;
983 l |= itoa64_to_int (buf[39]) << 18;
984
985 digest[ 9] = (l >> 16) & 0xff;
986 digest[30] = (l >> 8) & 0xff;
987 digest[51] = (l >> 0) & 0xff;
988
989 l = itoa64_to_int (buf[40]) << 0;
990 l |= itoa64_to_int (buf[41]) << 6;
991 l |= itoa64_to_int (buf[42]) << 12;
992 l |= itoa64_to_int (buf[43]) << 18;
993
994 digest[31] = (l >> 16) & 0xff;
995 digest[52] = (l >> 8) & 0xff;
996 digest[10] = (l >> 0) & 0xff;
997
998 l = itoa64_to_int (buf[44]) << 0;
999 l |= itoa64_to_int (buf[45]) << 6;
1000 l |= itoa64_to_int (buf[46]) << 12;
1001 l |= itoa64_to_int (buf[47]) << 18;
1002
1003 digest[53] = (l >> 16) & 0xff;
1004 digest[11] = (l >> 8) & 0xff;
1005 digest[32] = (l >> 0) & 0xff;
1006
1007 l = itoa64_to_int (buf[48]) << 0;
1008 l |= itoa64_to_int (buf[49]) << 6;
1009 l |= itoa64_to_int (buf[50]) << 12;
1010 l |= itoa64_to_int (buf[51]) << 18;
1011
1012 digest[12] = (l >> 16) & 0xff;
1013 digest[33] = (l >> 8) & 0xff;
1014 digest[54] = (l >> 0) & 0xff;
1015
1016 l = itoa64_to_int (buf[52]) << 0;
1017 l |= itoa64_to_int (buf[53]) << 6;
1018 l |= itoa64_to_int (buf[54]) << 12;
1019 l |= itoa64_to_int (buf[55]) << 18;
1020
1021 digest[34] = (l >> 16) & 0xff;
1022 digest[55] = (l >> 8) & 0xff;
1023 digest[13] = (l >> 0) & 0xff;
1024
1025 l = itoa64_to_int (buf[56]) << 0;
1026 l |= itoa64_to_int (buf[57]) << 6;
1027 l |= itoa64_to_int (buf[58]) << 12;
1028 l |= itoa64_to_int (buf[59]) << 18;
1029
1030 digest[56] = (l >> 16) & 0xff;
1031 digest[14] = (l >> 8) & 0xff;
1032 digest[35] = (l >> 0) & 0xff;
1033
1034 l = itoa64_to_int (buf[60]) << 0;
1035 l |= itoa64_to_int (buf[61]) << 6;
1036 l |= itoa64_to_int (buf[62]) << 12;
1037 l |= itoa64_to_int (buf[63]) << 18;
1038
1039 digest[15] = (l >> 16) & 0xff;
1040 digest[36] = (l >> 8) & 0xff;
1041 digest[57] = (l >> 0) & 0xff;
1042
1043 l = itoa64_to_int (buf[64]) << 0;
1044 l |= itoa64_to_int (buf[65]) << 6;
1045 l |= itoa64_to_int (buf[66]) << 12;
1046 l |= itoa64_to_int (buf[67]) << 18;
1047
1048 digest[37] = (l >> 16) & 0xff;
1049 digest[58] = (l >> 8) & 0xff;
1050 digest[16] = (l >> 0) & 0xff;
1051
1052 l = itoa64_to_int (buf[68]) << 0;
1053 l |= itoa64_to_int (buf[69]) << 6;
1054 l |= itoa64_to_int (buf[70]) << 12;
1055 l |= itoa64_to_int (buf[71]) << 18;
1056
1057 digest[59] = (l >> 16) & 0xff;
1058 digest[17] = (l >> 8) & 0xff;
1059 digest[38] = (l >> 0) & 0xff;
1060
1061 l = itoa64_to_int (buf[72]) << 0;
1062 l |= itoa64_to_int (buf[73]) << 6;
1063 l |= itoa64_to_int (buf[74]) << 12;
1064 l |= itoa64_to_int (buf[75]) << 18;
1065
1066 digest[18] = (l >> 16) & 0xff;
1067 digest[39] = (l >> 8) & 0xff;
1068 digest[60] = (l >> 0) & 0xff;
1069
1070 l = itoa64_to_int (buf[76]) << 0;
1071 l |= itoa64_to_int (buf[77]) << 6;
1072 l |= itoa64_to_int (buf[78]) << 12;
1073 l |= itoa64_to_int (buf[79]) << 18;
1074
1075 digest[40] = (l >> 16) & 0xff;
1076 digest[61] = (l >> 8) & 0xff;
1077 digest[19] = (l >> 0) & 0xff;
1078
1079 l = itoa64_to_int (buf[80]) << 0;
1080 l |= itoa64_to_int (buf[81]) << 6;
1081 l |= itoa64_to_int (buf[82]) << 12;
1082 l |= itoa64_to_int (buf[83]) << 18;
1083
1084 digest[62] = (l >> 16) & 0xff;
1085 digest[20] = (l >> 8) & 0xff;
1086 digest[41] = (l >> 0) & 0xff;
1087
1088 l = itoa64_to_int (buf[84]) << 0;
1089 l |= itoa64_to_int (buf[85]) << 6;
1090
1091 digest[63] = (l >> 0) & 0xff;
1092 }
1093
1094 void sha512crypt_encode (u8 digest[64], u8 buf[86])
1095 {
1096 int l;
1097
1098 l = (digest[ 0] << 16) | (digest[21] << 8) | (digest[42] << 0);
1099
1100 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1101 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1102 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1103 buf[ 3] = int_to_itoa64 (l & 0x3f); l >>= 6;
1104
1105 l = (digest[22] << 16) | (digest[43] << 8) | (digest[ 1] << 0);
1106
1107 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1108 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1109 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1110 buf[ 7] = int_to_itoa64 (l & 0x3f); l >>= 6;
1111
1112 l = (digest[44] << 16) | (digest[ 2] << 8) | (digest[23] << 0);
1113
1114 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1115 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1116 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1117 buf[11] = int_to_itoa64 (l & 0x3f); l >>= 6;
1118
1119 l = (digest[ 3] << 16) | (digest[24] << 8) | (digest[45] << 0);
1120
1121 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1122 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1123 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1124 buf[15] = int_to_itoa64 (l & 0x3f); l >>= 6;
1125
1126 l = (digest[25] << 16) | (digest[46] << 8) | (digest[ 4] << 0);
1127
1128 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1129 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1130 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1131 buf[19] = int_to_itoa64 (l & 0x3f); l >>= 6;
1132
1133 l = (digest[47] << 16) | (digest[ 5] << 8) | (digest[26] << 0);
1134
1135 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1136 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1137 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1138 buf[23] = int_to_itoa64 (l & 0x3f); l >>= 6;
1139
1140 l = (digest[ 6] << 16) | (digest[27] << 8) | (digest[48] << 0);
1141
1142 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1143 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1144 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
1145 buf[27] = int_to_itoa64 (l & 0x3f); l >>= 6;
1146
1147 l = (digest[28] << 16) | (digest[49] << 8) | (digest[ 7] << 0);
1148
1149 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
1150 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
1151 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
1152 buf[31] = int_to_itoa64 (l & 0x3f); l >>= 6;
1153
1154 l = (digest[50] << 16) | (digest[ 8] << 8) | (digest[29] << 0);
1155
1156 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
1157 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
1158 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
1159 buf[35] = int_to_itoa64 (l & 0x3f); l >>= 6;
1160
1161 l = (digest[ 9] << 16) | (digest[30] << 8) | (digest[51] << 0);
1162
1163 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
1164 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
1165 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
1166 buf[39] = int_to_itoa64 (l & 0x3f); l >>= 6;
1167
1168 l = (digest[31] << 16) | (digest[52] << 8) | (digest[10] << 0);
1169
1170 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
1171 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
1172 buf[42] = int_to_itoa64 (l & 0x3f); l >>= 6;
1173 buf[43] = int_to_itoa64 (l & 0x3f); l >>= 6;
1174
1175 l = (digest[53] << 16) | (digest[11] << 8) | (digest[32] << 0);
1176
1177 buf[44] = int_to_itoa64 (l & 0x3f); l >>= 6;
1178 buf[45] = int_to_itoa64 (l & 0x3f); l >>= 6;
1179 buf[46] = int_to_itoa64 (l & 0x3f); l >>= 6;
1180 buf[47] = int_to_itoa64 (l & 0x3f); l >>= 6;
1181
1182 l = (digest[12] << 16) | (digest[33] << 8) | (digest[54] << 0);
1183
1184 buf[48] = int_to_itoa64 (l & 0x3f); l >>= 6;
1185 buf[49] = int_to_itoa64 (l & 0x3f); l >>= 6;
1186 buf[50] = int_to_itoa64 (l & 0x3f); l >>= 6;
1187 buf[51] = int_to_itoa64 (l & 0x3f); l >>= 6;
1188
1189 l = (digest[34] << 16) | (digest[55] << 8) | (digest[13] << 0);
1190
1191 buf[52] = int_to_itoa64 (l & 0x3f); l >>= 6;
1192 buf[53] = int_to_itoa64 (l & 0x3f); l >>= 6;
1193 buf[54] = int_to_itoa64 (l & 0x3f); l >>= 6;
1194 buf[55] = int_to_itoa64 (l & 0x3f); l >>= 6;
1195
1196 l = (digest[56] << 16) | (digest[14] << 8) | (digest[35] << 0);
1197
1198 buf[56] = int_to_itoa64 (l & 0x3f); l >>= 6;
1199 buf[57] = int_to_itoa64 (l & 0x3f); l >>= 6;
1200 buf[58] = int_to_itoa64 (l & 0x3f); l >>= 6;
1201 buf[59] = int_to_itoa64 (l & 0x3f); l >>= 6;
1202
1203 l = (digest[15] << 16) | (digest[36] << 8) | (digest[57] << 0);
1204
1205 buf[60] = int_to_itoa64 (l & 0x3f); l >>= 6;
1206 buf[61] = int_to_itoa64 (l & 0x3f); l >>= 6;
1207 buf[62] = int_to_itoa64 (l & 0x3f); l >>= 6;
1208 buf[63] = int_to_itoa64 (l & 0x3f); l >>= 6;
1209
1210 l = (digest[37] << 16) | (digest[58] << 8) | (digest[16] << 0);
1211
1212 buf[64] = int_to_itoa64 (l & 0x3f); l >>= 6;
1213 buf[65] = int_to_itoa64 (l & 0x3f); l >>= 6;
1214 buf[66] = int_to_itoa64 (l & 0x3f); l >>= 6;
1215 buf[67] = int_to_itoa64 (l & 0x3f); l >>= 6;
1216
1217 l = (digest[59] << 16) | (digest[17] << 8) | (digest[38] << 0);
1218
1219 buf[68] = int_to_itoa64 (l & 0x3f); l >>= 6;
1220 buf[69] = int_to_itoa64 (l & 0x3f); l >>= 6;
1221 buf[70] = int_to_itoa64 (l & 0x3f); l >>= 6;
1222 buf[71] = int_to_itoa64 (l & 0x3f); l >>= 6;
1223
1224 l = (digest[18] << 16) | (digest[39] << 8) | (digest[60] << 0);
1225
1226 buf[72] = int_to_itoa64 (l & 0x3f); l >>= 6;
1227 buf[73] = int_to_itoa64 (l & 0x3f); l >>= 6;
1228 buf[74] = int_to_itoa64 (l & 0x3f); l >>= 6;
1229 buf[75] = int_to_itoa64 (l & 0x3f); l >>= 6;
1230
1231 l = (digest[40] << 16) | (digest[61] << 8) | (digest[19] << 0);
1232
1233 buf[76] = int_to_itoa64 (l & 0x3f); l >>= 6;
1234 buf[77] = int_to_itoa64 (l & 0x3f); l >>= 6;
1235 buf[78] = int_to_itoa64 (l & 0x3f); l >>= 6;
1236 buf[79] = int_to_itoa64 (l & 0x3f); l >>= 6;
1237
1238 l = (digest[62] << 16) | (digest[20] << 8) | (digest[41] << 0);
1239
1240 buf[80] = int_to_itoa64 (l & 0x3f); l >>= 6;
1241 buf[81] = int_to_itoa64 (l & 0x3f); l >>= 6;
1242 buf[82] = int_to_itoa64 (l & 0x3f); l >>= 6;
1243 buf[83] = int_to_itoa64 (l & 0x3f); l >>= 6;
1244
1245 l = 0 | 0 | (digest[63] << 0);
1246
1247 buf[84] = int_to_itoa64 (l & 0x3f); l >>= 6;
1248 buf[85] = int_to_itoa64 (l & 0x3f); l >>= 6;
1249 }
1250
1251 void sha1aix_decode (u8 digest[20], u8 buf[27])
1252 {
1253 int l;
1254
1255 l = itoa64_to_int (buf[ 0]) << 0;
1256 l |= itoa64_to_int (buf[ 1]) << 6;
1257 l |= itoa64_to_int (buf[ 2]) << 12;
1258 l |= itoa64_to_int (buf[ 3]) << 18;
1259
1260 digest[ 2] = (l >> 0) & 0xff;
1261 digest[ 1] = (l >> 8) & 0xff;
1262 digest[ 0] = (l >> 16) & 0xff;
1263
1264 l = itoa64_to_int (buf[ 4]) << 0;
1265 l |= itoa64_to_int (buf[ 5]) << 6;
1266 l |= itoa64_to_int (buf[ 6]) << 12;
1267 l |= itoa64_to_int (buf[ 7]) << 18;
1268
1269 digest[ 5] = (l >> 0) & 0xff;
1270 digest[ 4] = (l >> 8) & 0xff;
1271 digest[ 3] = (l >> 16) & 0xff;
1272
1273 l = itoa64_to_int (buf[ 8]) << 0;
1274 l |= itoa64_to_int (buf[ 9]) << 6;
1275 l |= itoa64_to_int (buf[10]) << 12;
1276 l |= itoa64_to_int (buf[11]) << 18;
1277
1278 digest[ 8] = (l >> 0) & 0xff;
1279 digest[ 7] = (l >> 8) & 0xff;
1280 digest[ 6] = (l >> 16) & 0xff;
1281
1282 l = itoa64_to_int (buf[12]) << 0;
1283 l |= itoa64_to_int (buf[13]) << 6;
1284 l |= itoa64_to_int (buf[14]) << 12;
1285 l |= itoa64_to_int (buf[15]) << 18;
1286
1287 digest[11] = (l >> 0) & 0xff;
1288 digest[10] = (l >> 8) & 0xff;
1289 digest[ 9] = (l >> 16) & 0xff;
1290
1291 l = itoa64_to_int (buf[16]) << 0;
1292 l |= itoa64_to_int (buf[17]) << 6;
1293 l |= itoa64_to_int (buf[18]) << 12;
1294 l |= itoa64_to_int (buf[19]) << 18;
1295
1296 digest[14] = (l >> 0) & 0xff;
1297 digest[13] = (l >> 8) & 0xff;
1298 digest[12] = (l >> 16) & 0xff;
1299
1300 l = itoa64_to_int (buf[20]) << 0;
1301 l |= itoa64_to_int (buf[21]) << 6;
1302 l |= itoa64_to_int (buf[22]) << 12;
1303 l |= itoa64_to_int (buf[23]) << 18;
1304
1305 digest[17] = (l >> 0) & 0xff;
1306 digest[16] = (l >> 8) & 0xff;
1307 digest[15] = (l >> 16) & 0xff;
1308
1309 l = itoa64_to_int (buf[24]) << 0;
1310 l |= itoa64_to_int (buf[25]) << 6;
1311 l |= itoa64_to_int (buf[26]) << 12;
1312
1313 digest[19] = (l >> 8) & 0xff;
1314 digest[18] = (l >> 16) & 0xff;
1315 }
1316
1317 void sha1aix_encode (u8 digest[20], u8 buf[27])
1318 {
1319 int l;
1320
1321 l = (digest[ 2] << 0) | (digest[ 1] << 8) | (digest[ 0] << 16);
1322
1323 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1324 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1325 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1326 buf[ 3] = int_to_itoa64 (l & 0x3f);
1327
1328 l = (digest[ 5] << 0) | (digest[ 4] << 8) | (digest[ 3] << 16);
1329
1330 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1331 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1332 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1333 buf[ 7] = int_to_itoa64 (l & 0x3f);
1334
1335 l = (digest[ 8] << 0) | (digest[ 7] << 8) | (digest[ 6] << 16);
1336
1337 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1338 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1339 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1340 buf[11] = int_to_itoa64 (l & 0x3f);
1341
1342 l = (digest[11] << 0) | (digest[10] << 8) | (digest[ 9] << 16);
1343
1344 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1345 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1346 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1347 buf[15] = int_to_itoa64 (l & 0x3f);
1348
1349 l = (digest[14] << 0) | (digest[13] << 8) | (digest[12] << 16);
1350
1351 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1352 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1353 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1354 buf[19] = int_to_itoa64 (l & 0x3f);
1355
1356 l = (digest[17] << 0) | (digest[16] << 8) | (digest[15] << 16);
1357
1358 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1359 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1360 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1361 buf[23] = int_to_itoa64 (l & 0x3f);
1362
1363 l = 0 | (digest[19] << 8) | (digest[18] << 16);
1364
1365 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1366 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1367 buf[26] = int_to_itoa64 (l & 0x3f);
1368 }
1369
1370 void sha256aix_decode (u8 digest[32], u8 buf[43])
1371 {
1372 int l;
1373
1374 l = itoa64_to_int (buf[ 0]) << 0;
1375 l |= itoa64_to_int (buf[ 1]) << 6;
1376 l |= itoa64_to_int (buf[ 2]) << 12;
1377 l |= itoa64_to_int (buf[ 3]) << 18;
1378
1379 digest[ 2] = (l >> 0) & 0xff;
1380 digest[ 1] = (l >> 8) & 0xff;
1381 digest[ 0] = (l >> 16) & 0xff;
1382
1383 l = itoa64_to_int (buf[ 4]) << 0;
1384 l |= itoa64_to_int (buf[ 5]) << 6;
1385 l |= itoa64_to_int (buf[ 6]) << 12;
1386 l |= itoa64_to_int (buf[ 7]) << 18;
1387
1388 digest[ 5] = (l >> 0) & 0xff;
1389 digest[ 4] = (l >> 8) & 0xff;
1390 digest[ 3] = (l >> 16) & 0xff;
1391
1392 l = itoa64_to_int (buf[ 8]) << 0;
1393 l |= itoa64_to_int (buf[ 9]) << 6;
1394 l |= itoa64_to_int (buf[10]) << 12;
1395 l |= itoa64_to_int (buf[11]) << 18;
1396
1397 digest[ 8] = (l >> 0) & 0xff;
1398 digest[ 7] = (l >> 8) & 0xff;
1399 digest[ 6] = (l >> 16) & 0xff;
1400
1401 l = itoa64_to_int (buf[12]) << 0;
1402 l |= itoa64_to_int (buf[13]) << 6;
1403 l |= itoa64_to_int (buf[14]) << 12;
1404 l |= itoa64_to_int (buf[15]) << 18;
1405
1406 digest[11] = (l >> 0) & 0xff;
1407 digest[10] = (l >> 8) & 0xff;
1408 digest[ 9] = (l >> 16) & 0xff;
1409
1410 l = itoa64_to_int (buf[16]) << 0;
1411 l |= itoa64_to_int (buf[17]) << 6;
1412 l |= itoa64_to_int (buf[18]) << 12;
1413 l |= itoa64_to_int (buf[19]) << 18;
1414
1415 digest[14] = (l >> 0) & 0xff;
1416 digest[13] = (l >> 8) & 0xff;
1417 digest[12] = (l >> 16) & 0xff;
1418
1419 l = itoa64_to_int (buf[20]) << 0;
1420 l |= itoa64_to_int (buf[21]) << 6;
1421 l |= itoa64_to_int (buf[22]) << 12;
1422 l |= itoa64_to_int (buf[23]) << 18;
1423
1424 digest[17] = (l >> 0) & 0xff;
1425 digest[16] = (l >> 8) & 0xff;
1426 digest[15] = (l >> 16) & 0xff;
1427
1428 l = itoa64_to_int (buf[24]) << 0;
1429 l |= itoa64_to_int (buf[25]) << 6;
1430 l |= itoa64_to_int (buf[26]) << 12;
1431 l |= itoa64_to_int (buf[27]) << 18;
1432
1433 digest[20] = (l >> 0) & 0xff;
1434 digest[19] = (l >> 8) & 0xff;
1435 digest[18] = (l >> 16) & 0xff;
1436
1437 l = itoa64_to_int (buf[28]) << 0;
1438 l |= itoa64_to_int (buf[29]) << 6;
1439 l |= itoa64_to_int (buf[30]) << 12;
1440 l |= itoa64_to_int (buf[31]) << 18;
1441
1442 digest[23] = (l >> 0) & 0xff;
1443 digest[22] = (l >> 8) & 0xff;
1444 digest[21] = (l >> 16) & 0xff;
1445
1446 l = itoa64_to_int (buf[32]) << 0;
1447 l |= itoa64_to_int (buf[33]) << 6;
1448 l |= itoa64_to_int (buf[34]) << 12;
1449 l |= itoa64_to_int (buf[35]) << 18;
1450
1451 digest[26] = (l >> 0) & 0xff;
1452 digest[25] = (l >> 8) & 0xff;
1453 digest[24] = (l >> 16) & 0xff;
1454
1455 l = itoa64_to_int (buf[36]) << 0;
1456 l |= itoa64_to_int (buf[37]) << 6;
1457 l |= itoa64_to_int (buf[38]) << 12;
1458 l |= itoa64_to_int (buf[39]) << 18;
1459
1460 digest[29] = (l >> 0) & 0xff;
1461 digest[28] = (l >> 8) & 0xff;
1462 digest[27] = (l >> 16) & 0xff;
1463
1464 l = itoa64_to_int (buf[40]) << 0;
1465 l |= itoa64_to_int (buf[41]) << 6;
1466 l |= itoa64_to_int (buf[42]) << 12;
1467
1468 //digest[32] = (l >> 0) & 0xff;
1469 digest[31] = (l >> 8) & 0xff;
1470 digest[30] = (l >> 16) & 0xff;
1471 }
1472
1473 void sha256aix_encode (u8 digest[32], u8 buf[43])
1474 {
1475 int l;
1476
1477 l = (digest[ 2] << 0) | (digest[ 1] << 8) | (digest[ 0] << 16);
1478
1479 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1480 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1481 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1482 buf[ 3] = int_to_itoa64 (l & 0x3f);
1483
1484 l = (digest[ 5] << 0) | (digest[ 4] << 8) | (digest[ 3] << 16);
1485
1486 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1487 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1488 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1489 buf[ 7] = int_to_itoa64 (l & 0x3f);
1490
1491 l = (digest[ 8] << 0) | (digest[ 7] << 8) | (digest[ 6] << 16);
1492
1493 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1494 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1495 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1496 buf[11] = int_to_itoa64 (l & 0x3f);
1497
1498 l = (digest[11] << 0) | (digest[10] << 8) | (digest[ 9] << 16);
1499
1500 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1501 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1502 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1503 buf[15] = int_to_itoa64 (l & 0x3f);
1504
1505 l = (digest[14] << 0) | (digest[13] << 8) | (digest[12] << 16);
1506
1507 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1508 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1509 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1510 buf[19] = int_to_itoa64 (l & 0x3f);
1511
1512 l = (digest[17] << 0) | (digest[16] << 8) | (digest[15] << 16);
1513
1514 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1515 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1516 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1517 buf[23] = int_to_itoa64 (l & 0x3f);
1518
1519 l = (digest[20] << 0) | (digest[19] << 8) | (digest[18] << 16);
1520
1521 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1522 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1523 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
1524 buf[27] = int_to_itoa64 (l & 0x3f);
1525
1526 l = (digest[23] << 0) | (digest[22] << 8) | (digest[21] << 16);
1527
1528 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
1529 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
1530 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
1531 buf[31] = int_to_itoa64 (l & 0x3f);
1532
1533 l = (digest[26] << 0) | (digest[25] << 8) | (digest[24] << 16);
1534
1535 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
1536 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
1537 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
1538 buf[35] = int_to_itoa64 (l & 0x3f);
1539
1540 l = (digest[29] << 0) | (digest[28] << 8) | (digest[27] << 16);
1541
1542 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
1543 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
1544 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
1545 buf[39] = int_to_itoa64 (l & 0x3f);
1546
1547 l = 0 | (digest[31] << 8) | (digest[30] << 16);
1548
1549 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
1550 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
1551 buf[42] = int_to_itoa64 (l & 0x3f);
1552 }
1553
1554 void sha512aix_decode (u8 digest[64], u8 buf[86])
1555 {
1556 int l;
1557
1558 l = itoa64_to_int (buf[ 0]) << 0;
1559 l |= itoa64_to_int (buf[ 1]) << 6;
1560 l |= itoa64_to_int (buf[ 2]) << 12;
1561 l |= itoa64_to_int (buf[ 3]) << 18;
1562
1563 digest[ 2] = (l >> 0) & 0xff;
1564 digest[ 1] = (l >> 8) & 0xff;
1565 digest[ 0] = (l >> 16) & 0xff;
1566
1567 l = itoa64_to_int (buf[ 4]) << 0;
1568 l |= itoa64_to_int (buf[ 5]) << 6;
1569 l |= itoa64_to_int (buf[ 6]) << 12;
1570 l |= itoa64_to_int (buf[ 7]) << 18;
1571
1572 digest[ 5] = (l >> 0) & 0xff;
1573 digest[ 4] = (l >> 8) & 0xff;
1574 digest[ 3] = (l >> 16) & 0xff;
1575
1576 l = itoa64_to_int (buf[ 8]) << 0;
1577 l |= itoa64_to_int (buf[ 9]) << 6;
1578 l |= itoa64_to_int (buf[10]) << 12;
1579 l |= itoa64_to_int (buf[11]) << 18;
1580
1581 digest[ 8] = (l >> 0) & 0xff;
1582 digest[ 7] = (l >> 8) & 0xff;
1583 digest[ 6] = (l >> 16) & 0xff;
1584
1585 l = itoa64_to_int (buf[12]) << 0;
1586 l |= itoa64_to_int (buf[13]) << 6;
1587 l |= itoa64_to_int (buf[14]) << 12;
1588 l |= itoa64_to_int (buf[15]) << 18;
1589
1590 digest[11] = (l >> 0) & 0xff;
1591 digest[10] = (l >> 8) & 0xff;
1592 digest[ 9] = (l >> 16) & 0xff;
1593
1594 l = itoa64_to_int (buf[16]) << 0;
1595 l |= itoa64_to_int (buf[17]) << 6;
1596 l |= itoa64_to_int (buf[18]) << 12;
1597 l |= itoa64_to_int (buf[19]) << 18;
1598
1599 digest[14] = (l >> 0) & 0xff;
1600 digest[13] = (l >> 8) & 0xff;
1601 digest[12] = (l >> 16) & 0xff;
1602
1603 l = itoa64_to_int (buf[20]) << 0;
1604 l |= itoa64_to_int (buf[21]) << 6;
1605 l |= itoa64_to_int (buf[22]) << 12;
1606 l |= itoa64_to_int (buf[23]) << 18;
1607
1608 digest[17] = (l >> 0) & 0xff;
1609 digest[16] = (l >> 8) & 0xff;
1610 digest[15] = (l >> 16) & 0xff;
1611
1612 l = itoa64_to_int (buf[24]) << 0;
1613 l |= itoa64_to_int (buf[25]) << 6;
1614 l |= itoa64_to_int (buf[26]) << 12;
1615 l |= itoa64_to_int (buf[27]) << 18;
1616
1617 digest[20] = (l >> 0) & 0xff;
1618 digest[19] = (l >> 8) & 0xff;
1619 digest[18] = (l >> 16) & 0xff;
1620
1621 l = itoa64_to_int (buf[28]) << 0;
1622 l |= itoa64_to_int (buf[29]) << 6;
1623 l |= itoa64_to_int (buf[30]) << 12;
1624 l |= itoa64_to_int (buf[31]) << 18;
1625
1626 digest[23] = (l >> 0) & 0xff;
1627 digest[22] = (l >> 8) & 0xff;
1628 digest[21] = (l >> 16) & 0xff;
1629
1630 l = itoa64_to_int (buf[32]) << 0;
1631 l |= itoa64_to_int (buf[33]) << 6;
1632 l |= itoa64_to_int (buf[34]) << 12;
1633 l |= itoa64_to_int (buf[35]) << 18;
1634
1635 digest[26] = (l >> 0) & 0xff;
1636 digest[25] = (l >> 8) & 0xff;
1637 digest[24] = (l >> 16) & 0xff;
1638
1639 l = itoa64_to_int (buf[36]) << 0;
1640 l |= itoa64_to_int (buf[37]) << 6;
1641 l |= itoa64_to_int (buf[38]) << 12;
1642 l |= itoa64_to_int (buf[39]) << 18;
1643
1644 digest[29] = (l >> 0) & 0xff;
1645 digest[28] = (l >> 8) & 0xff;
1646 digest[27] = (l >> 16) & 0xff;
1647
1648 l = itoa64_to_int (buf[40]) << 0;
1649 l |= itoa64_to_int (buf[41]) << 6;
1650 l |= itoa64_to_int (buf[42]) << 12;
1651 l |= itoa64_to_int (buf[43]) << 18;
1652
1653 digest[32] = (l >> 0) & 0xff;
1654 digest[31] = (l >> 8) & 0xff;
1655 digest[30] = (l >> 16) & 0xff;
1656
1657 l = itoa64_to_int (buf[44]) << 0;
1658 l |= itoa64_to_int (buf[45]) << 6;
1659 l |= itoa64_to_int (buf[46]) << 12;
1660 l |= itoa64_to_int (buf[47]) << 18;
1661
1662 digest[35] = (l >> 0) & 0xff;
1663 digest[34] = (l >> 8) & 0xff;
1664 digest[33] = (l >> 16) & 0xff;
1665
1666 l = itoa64_to_int (buf[48]) << 0;
1667 l |= itoa64_to_int (buf[49]) << 6;
1668 l |= itoa64_to_int (buf[50]) << 12;
1669 l |= itoa64_to_int (buf[51]) << 18;
1670
1671 digest[38] = (l >> 0) & 0xff;
1672 digest[37] = (l >> 8) & 0xff;
1673 digest[36] = (l >> 16) & 0xff;
1674
1675 l = itoa64_to_int (buf[52]) << 0;
1676 l |= itoa64_to_int (buf[53]) << 6;
1677 l |= itoa64_to_int (buf[54]) << 12;
1678 l |= itoa64_to_int (buf[55]) << 18;
1679
1680 digest[41] = (l >> 0) & 0xff;
1681 digest[40] = (l >> 8) & 0xff;
1682 digest[39] = (l >> 16) & 0xff;
1683
1684 l = itoa64_to_int (buf[56]) << 0;
1685 l |= itoa64_to_int (buf[57]) << 6;
1686 l |= itoa64_to_int (buf[58]) << 12;
1687 l |= itoa64_to_int (buf[59]) << 18;
1688
1689 digest[44] = (l >> 0) & 0xff;
1690 digest[43] = (l >> 8) & 0xff;
1691 digest[42] = (l >> 16) & 0xff;
1692
1693 l = itoa64_to_int (buf[60]) << 0;
1694 l |= itoa64_to_int (buf[61]) << 6;
1695 l |= itoa64_to_int (buf[62]) << 12;
1696 l |= itoa64_to_int (buf[63]) << 18;
1697
1698 digest[47] = (l >> 0) & 0xff;
1699 digest[46] = (l >> 8) & 0xff;
1700 digest[45] = (l >> 16) & 0xff;
1701
1702 l = itoa64_to_int (buf[64]) << 0;
1703 l |= itoa64_to_int (buf[65]) << 6;
1704 l |= itoa64_to_int (buf[66]) << 12;
1705 l |= itoa64_to_int (buf[67]) << 18;
1706
1707 digest[50] = (l >> 0) & 0xff;
1708 digest[49] = (l >> 8) & 0xff;
1709 digest[48] = (l >> 16) & 0xff;
1710
1711 l = itoa64_to_int (buf[68]) << 0;
1712 l |= itoa64_to_int (buf[69]) << 6;
1713 l |= itoa64_to_int (buf[70]) << 12;
1714 l |= itoa64_to_int (buf[71]) << 18;
1715
1716 digest[53] = (l >> 0) & 0xff;
1717 digest[52] = (l >> 8) & 0xff;
1718 digest[51] = (l >> 16) & 0xff;
1719
1720 l = itoa64_to_int (buf[72]) << 0;
1721 l |= itoa64_to_int (buf[73]) << 6;
1722 l |= itoa64_to_int (buf[74]) << 12;
1723 l |= itoa64_to_int (buf[75]) << 18;
1724
1725 digest[56] = (l >> 0) & 0xff;
1726 digest[55] = (l >> 8) & 0xff;
1727 digest[54] = (l >> 16) & 0xff;
1728
1729 l = itoa64_to_int (buf[76]) << 0;
1730 l |= itoa64_to_int (buf[77]) << 6;
1731 l |= itoa64_to_int (buf[78]) << 12;
1732 l |= itoa64_to_int (buf[79]) << 18;
1733
1734 digest[59] = (l >> 0) & 0xff;
1735 digest[58] = (l >> 8) & 0xff;
1736 digest[57] = (l >> 16) & 0xff;
1737
1738 l = itoa64_to_int (buf[80]) << 0;
1739 l |= itoa64_to_int (buf[81]) << 6;
1740 l |= itoa64_to_int (buf[82]) << 12;
1741 l |= itoa64_to_int (buf[83]) << 18;
1742
1743 digest[62] = (l >> 0) & 0xff;
1744 digest[61] = (l >> 8) & 0xff;
1745 digest[60] = (l >> 16) & 0xff;
1746
1747 l = itoa64_to_int (buf[84]) << 0;
1748 l |= itoa64_to_int (buf[85]) << 6;
1749
1750 digest[63] = (l >> 16) & 0xff;
1751 }
1752
1753 void sha512aix_encode (u8 digest[64], u8 buf[86])
1754 {
1755 int l;
1756
1757 l = (digest[ 2] << 0) | (digest[ 1] << 8) | (digest[ 0] << 16);
1758
1759 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1760 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1761 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1762 buf[ 3] = int_to_itoa64 (l & 0x3f);
1763
1764 l = (digest[ 5] << 0) | (digest[ 4] << 8) | (digest[ 3] << 16);
1765
1766 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1767 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1768 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1769 buf[ 7] = int_to_itoa64 (l & 0x3f);
1770
1771 l = (digest[ 8] << 0) | (digest[ 7] << 8) | (digest[ 6] << 16);
1772
1773 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1774 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1775 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1776 buf[11] = int_to_itoa64 (l & 0x3f);
1777
1778 l = (digest[11] << 0) | (digest[10] << 8) | (digest[ 9] << 16);
1779
1780 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1781 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1782 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1783 buf[15] = int_to_itoa64 (l & 0x3f);
1784
1785 l = (digest[14] << 0) | (digest[13] << 8) | (digest[12] << 16);
1786
1787 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1788 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1789 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1790 buf[19] = int_to_itoa64 (l & 0x3f);
1791
1792 l = (digest[17] << 0) | (digest[16] << 8) | (digest[15] << 16);
1793
1794 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1795 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1796 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1797 buf[23] = int_to_itoa64 (l & 0x3f);
1798
1799 l = (digest[20] << 0) | (digest[19] << 8) | (digest[18] << 16);
1800
1801 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1802 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1803 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
1804 buf[27] = int_to_itoa64 (l & 0x3f);
1805
1806 l = (digest[23] << 0) | (digest[22] << 8) | (digest[21] << 16);
1807
1808 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
1809 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
1810 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
1811 buf[31] = int_to_itoa64 (l & 0x3f);
1812
1813 l = (digest[26] << 0) | (digest[25] << 8) | (digest[24] << 16);
1814
1815 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
1816 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
1817 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
1818 buf[35] = int_to_itoa64 (l & 0x3f);
1819
1820 l = (digest[29] << 0) | (digest[28] << 8) | (digest[27] << 16);
1821
1822 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
1823 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
1824 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
1825 buf[39] = int_to_itoa64 (l & 0x3f);
1826
1827 l = (digest[32] << 0) | (digest[31] << 8) | (digest[30] << 16);
1828
1829 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
1830 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
1831 buf[42] = int_to_itoa64 (l & 0x3f); l >>= 6;
1832 buf[43] = int_to_itoa64 (l & 0x3f);
1833
1834 l = (digest[35] << 0) | (digest[34] << 8) | (digest[33] << 16);
1835
1836 buf[44] = int_to_itoa64 (l & 0x3f); l >>= 6;
1837 buf[45] = int_to_itoa64 (l & 0x3f); l >>= 6;
1838 buf[46] = int_to_itoa64 (l & 0x3f); l >>= 6;
1839 buf[47] = int_to_itoa64 (l & 0x3f);
1840
1841 l = (digest[38] << 0) | (digest[37] << 8) | (digest[36] << 16);
1842
1843 buf[48] = int_to_itoa64 (l & 0x3f); l >>= 6;
1844 buf[49] = int_to_itoa64 (l & 0x3f); l >>= 6;
1845 buf[50] = int_to_itoa64 (l & 0x3f); l >>= 6;
1846 buf[51] = int_to_itoa64 (l & 0x3f);
1847
1848 l = (digest[41] << 0) | (digest[40] << 8) | (digest[39] << 16);
1849
1850 buf[52] = int_to_itoa64 (l & 0x3f); l >>= 6;
1851 buf[53] = int_to_itoa64 (l & 0x3f); l >>= 6;
1852 buf[54] = int_to_itoa64 (l & 0x3f); l >>= 6;
1853 buf[55] = int_to_itoa64 (l & 0x3f);
1854
1855 l = (digest[44] << 0) | (digest[43] << 8) | (digest[42] << 16);
1856
1857 buf[56] = int_to_itoa64 (l & 0x3f); l >>= 6;
1858 buf[57] = int_to_itoa64 (l & 0x3f); l >>= 6;
1859 buf[58] = int_to_itoa64 (l & 0x3f); l >>= 6;
1860 buf[59] = int_to_itoa64 (l & 0x3f);
1861
1862 l = (digest[47] << 0) | (digest[46] << 8) | (digest[45] << 16);
1863
1864 buf[60] = int_to_itoa64 (l & 0x3f); l >>= 6;
1865 buf[61] = int_to_itoa64 (l & 0x3f); l >>= 6;
1866 buf[62] = int_to_itoa64 (l & 0x3f); l >>= 6;
1867 buf[63] = int_to_itoa64 (l & 0x3f);
1868
1869 l = (digest[50] << 0) | (digest[49] << 8) | (digest[48] << 16);
1870
1871 buf[64] = int_to_itoa64 (l & 0x3f); l >>= 6;
1872 buf[65] = int_to_itoa64 (l & 0x3f); l >>= 6;
1873 buf[66] = int_to_itoa64 (l & 0x3f); l >>= 6;
1874 buf[67] = int_to_itoa64 (l & 0x3f);
1875
1876 l = (digest[53] << 0) | (digest[52] << 8) | (digest[51] << 16);
1877
1878 buf[68] = int_to_itoa64 (l & 0x3f); l >>= 6;
1879 buf[69] = int_to_itoa64 (l & 0x3f); l >>= 6;
1880 buf[70] = int_to_itoa64 (l & 0x3f); l >>= 6;
1881 buf[71] = int_to_itoa64 (l & 0x3f);
1882
1883 l = (digest[56] << 0) | (digest[55] << 8) | (digest[54] << 16);
1884
1885 buf[72] = int_to_itoa64 (l & 0x3f); l >>= 6;
1886 buf[73] = int_to_itoa64 (l & 0x3f); l >>= 6;
1887 buf[74] = int_to_itoa64 (l & 0x3f); l >>= 6;
1888 buf[75] = int_to_itoa64 (l & 0x3f);
1889
1890 l = (digest[59] << 0) | (digest[58] << 8) | (digest[57] << 16);
1891
1892 buf[76] = int_to_itoa64 (l & 0x3f); l >>= 6;
1893 buf[77] = int_to_itoa64 (l & 0x3f); l >>= 6;
1894 buf[78] = int_to_itoa64 (l & 0x3f); l >>= 6;
1895 buf[79] = int_to_itoa64 (l & 0x3f);
1896
1897 l = (digest[62] << 0) | (digest[61] << 8) | (digest[60] << 16);
1898
1899 buf[80] = int_to_itoa64 (l & 0x3f); l >>= 6;
1900 buf[81] = int_to_itoa64 (l & 0x3f); l >>= 6;
1901 buf[82] = int_to_itoa64 (l & 0x3f); l >>= 6;
1902 buf[83] = int_to_itoa64 (l & 0x3f);
1903
1904 l = 0 | 0 | (digest[63] << 16);
1905
1906 buf[84] = int_to_itoa64 (l & 0x3f); l >>= 6;
1907 buf[85] = int_to_itoa64 (l & 0x3f); l >>= 6;
1908 }
1909
1910 void sha256crypt_decode (u8 digest[32], u8 buf[43])
1911 {
1912 int l;
1913
1914 l = itoa64_to_int (buf[ 0]) << 0;
1915 l |= itoa64_to_int (buf[ 1]) << 6;
1916 l |= itoa64_to_int (buf[ 2]) << 12;
1917 l |= itoa64_to_int (buf[ 3]) << 18;
1918
1919 digest[ 0] = (l >> 16) & 0xff;
1920 digest[10] = (l >> 8) & 0xff;
1921 digest[20] = (l >> 0) & 0xff;
1922
1923 l = itoa64_to_int (buf[ 4]) << 0;
1924 l |= itoa64_to_int (buf[ 5]) << 6;
1925 l |= itoa64_to_int (buf[ 6]) << 12;
1926 l |= itoa64_to_int (buf[ 7]) << 18;
1927
1928 digest[21] = (l >> 16) & 0xff;
1929 digest[ 1] = (l >> 8) & 0xff;
1930 digest[11] = (l >> 0) & 0xff;
1931
1932 l = itoa64_to_int (buf[ 8]) << 0;
1933 l |= itoa64_to_int (buf[ 9]) << 6;
1934 l |= itoa64_to_int (buf[10]) << 12;
1935 l |= itoa64_to_int (buf[11]) << 18;
1936
1937 digest[12] = (l >> 16) & 0xff;
1938 digest[22] = (l >> 8) & 0xff;
1939 digest[ 2] = (l >> 0) & 0xff;
1940
1941 l = itoa64_to_int (buf[12]) << 0;
1942 l |= itoa64_to_int (buf[13]) << 6;
1943 l |= itoa64_to_int (buf[14]) << 12;
1944 l |= itoa64_to_int (buf[15]) << 18;
1945
1946 digest[ 3] = (l >> 16) & 0xff;
1947 digest[13] = (l >> 8) & 0xff;
1948 digest[23] = (l >> 0) & 0xff;
1949
1950 l = itoa64_to_int (buf[16]) << 0;
1951 l |= itoa64_to_int (buf[17]) << 6;
1952 l |= itoa64_to_int (buf[18]) << 12;
1953 l |= itoa64_to_int (buf[19]) << 18;
1954
1955 digest[24] = (l >> 16) & 0xff;
1956 digest[ 4] = (l >> 8) & 0xff;
1957 digest[14] = (l >> 0) & 0xff;
1958
1959 l = itoa64_to_int (buf[20]) << 0;
1960 l |= itoa64_to_int (buf[21]) << 6;
1961 l |= itoa64_to_int (buf[22]) << 12;
1962 l |= itoa64_to_int (buf[23]) << 18;
1963
1964 digest[15] = (l >> 16) & 0xff;
1965 digest[25] = (l >> 8) & 0xff;
1966 digest[ 5] = (l >> 0) & 0xff;
1967
1968 l = itoa64_to_int (buf[24]) << 0;
1969 l |= itoa64_to_int (buf[25]) << 6;
1970 l |= itoa64_to_int (buf[26]) << 12;
1971 l |= itoa64_to_int (buf[27]) << 18;
1972
1973 digest[ 6] = (l >> 16) & 0xff;
1974 digest[16] = (l >> 8) & 0xff;
1975 digest[26] = (l >> 0) & 0xff;
1976
1977 l = itoa64_to_int (buf[28]) << 0;
1978 l |= itoa64_to_int (buf[29]) << 6;
1979 l |= itoa64_to_int (buf[30]) << 12;
1980 l |= itoa64_to_int (buf[31]) << 18;
1981
1982 digest[27] = (l >> 16) & 0xff;
1983 digest[ 7] = (l >> 8) & 0xff;
1984 digest[17] = (l >> 0) & 0xff;
1985
1986 l = itoa64_to_int (buf[32]) << 0;
1987 l |= itoa64_to_int (buf[33]) << 6;
1988 l |= itoa64_to_int (buf[34]) << 12;
1989 l |= itoa64_to_int (buf[35]) << 18;
1990
1991 digest[18] = (l >> 16) & 0xff;
1992 digest[28] = (l >> 8) & 0xff;
1993 digest[ 8] = (l >> 0) & 0xff;
1994
1995 l = itoa64_to_int (buf[36]) << 0;
1996 l |= itoa64_to_int (buf[37]) << 6;
1997 l |= itoa64_to_int (buf[38]) << 12;
1998 l |= itoa64_to_int (buf[39]) << 18;
1999
2000 digest[ 9] = (l >> 16) & 0xff;
2001 digest[19] = (l >> 8) & 0xff;
2002 digest[29] = (l >> 0) & 0xff;
2003
2004 l = itoa64_to_int (buf[40]) << 0;
2005 l |= itoa64_to_int (buf[41]) << 6;
2006 l |= itoa64_to_int (buf[42]) << 12;
2007
2008 digest[31] = (l >> 8) & 0xff;
2009 digest[30] = (l >> 0) & 0xff;
2010 }
2011
2012 void sha256crypt_encode (u8 digest[32], u8 buf[43])
2013 {
2014 int l;
2015
2016 l = (digest[ 0] << 16) | (digest[10] << 8) | (digest[20] << 0);
2017
2018 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
2019 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
2020 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
2021 buf[ 3] = int_to_itoa64 (l & 0x3f); l >>= 6;
2022
2023 l = (digest[21] << 16) | (digest[ 1] << 8) | (digest[11] << 0);
2024
2025 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
2026 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
2027 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
2028 buf[ 7] = int_to_itoa64 (l & 0x3f); l >>= 6;
2029
2030 l = (digest[12] << 16) | (digest[22] << 8) | (digest[ 2] << 0);
2031
2032 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
2033 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
2034 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
2035 buf[11] = int_to_itoa64 (l & 0x3f); l >>= 6;
2036
2037 l = (digest[ 3] << 16) | (digest[13] << 8) | (digest[23] << 0);
2038
2039 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
2040 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
2041 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
2042 buf[15] = int_to_itoa64 (l & 0x3f); l >>= 6;
2043
2044 l = (digest[24] << 16) | (digest[ 4] << 8) | (digest[14] << 0);
2045
2046 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
2047 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
2048 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
2049 buf[19] = int_to_itoa64 (l & 0x3f); l >>= 6;
2050
2051 l = (digest[15] << 16) | (digest[25] << 8) | (digest[ 5] << 0);
2052
2053 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
2054 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
2055 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
2056 buf[23] = int_to_itoa64 (l & 0x3f); l >>= 6;
2057
2058 l = (digest[ 6] << 16) | (digest[16] << 8) | (digest[26] << 0);
2059
2060 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
2061 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
2062 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
2063 buf[27] = int_to_itoa64 (l & 0x3f); l >>= 6;
2064
2065 l = (digest[27] << 16) | (digest[ 7] << 8) | (digest[17] << 0);
2066
2067 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
2068 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
2069 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
2070 buf[31] = int_to_itoa64 (l & 0x3f); l >>= 6;
2071
2072 l = (digest[18] << 16) | (digest[28] << 8) | (digest[ 8] << 0);
2073
2074 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
2075 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
2076 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
2077 buf[35] = int_to_itoa64 (l & 0x3f); l >>= 6;
2078
2079 l = (digest[ 9] << 16) | (digest[19] << 8) | (digest[29] << 0);
2080
2081 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
2082 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
2083 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
2084 buf[39] = int_to_itoa64 (l & 0x3f); l >>= 6;
2085
2086 l = 0 | (digest[31] << 8) | (digest[30] << 0);
2087
2088 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
2089 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
2090 buf[42] = int_to_itoa64 (l & 0x3f);
2091 }
2092
2093 void drupal7_decode (u8 digest[64], u8 buf[44])
2094 {
2095 int l;
2096
2097 l = itoa64_to_int (buf[ 0]) << 0;
2098 l |= itoa64_to_int (buf[ 1]) << 6;
2099 l |= itoa64_to_int (buf[ 2]) << 12;
2100 l |= itoa64_to_int (buf[ 3]) << 18;
2101
2102 digest[ 0] = (l >> 0) & 0xff;
2103 digest[ 1] = (l >> 8) & 0xff;
2104 digest[ 2] = (l >> 16) & 0xff;
2105
2106 l = itoa64_to_int (buf[ 4]) << 0;
2107 l |= itoa64_to_int (buf[ 5]) << 6;
2108 l |= itoa64_to_int (buf[ 6]) << 12;
2109 l |= itoa64_to_int (buf[ 7]) << 18;
2110
2111 digest[ 3] = (l >> 0) & 0xff;
2112 digest[ 4] = (l >> 8) & 0xff;
2113 digest[ 5] = (l >> 16) & 0xff;
2114
2115 l = itoa64_to_int (buf[ 8]) << 0;
2116 l |= itoa64_to_int (buf[ 9]) << 6;
2117 l |= itoa64_to_int (buf[10]) << 12;
2118 l |= itoa64_to_int (buf[11]) << 18;
2119
2120 digest[ 6] = (l >> 0) & 0xff;
2121 digest[ 7] = (l >> 8) & 0xff;
2122 digest[ 8] = (l >> 16) & 0xff;
2123
2124 l = itoa64_to_int (buf[12]) << 0;
2125 l |= itoa64_to_int (buf[13]) << 6;
2126 l |= itoa64_to_int (buf[14]) << 12;
2127 l |= itoa64_to_int (buf[15]) << 18;
2128
2129 digest[ 9] = (l >> 0) & 0xff;
2130 digest[10] = (l >> 8) & 0xff;
2131 digest[11] = (l >> 16) & 0xff;
2132
2133 l = itoa64_to_int (buf[16]) << 0;
2134 l |= itoa64_to_int (buf[17]) << 6;
2135 l |= itoa64_to_int (buf[18]) << 12;
2136 l |= itoa64_to_int (buf[19]) << 18;
2137
2138 digest[12] = (l >> 0) & 0xff;
2139 digest[13] = (l >> 8) & 0xff;
2140 digest[14] = (l >> 16) & 0xff;
2141
2142 l = itoa64_to_int (buf[20]) << 0;
2143 l |= itoa64_to_int (buf[21]) << 6;
2144 l |= itoa64_to_int (buf[22]) << 12;
2145 l |= itoa64_to_int (buf[23]) << 18;
2146
2147 digest[15] = (l >> 0) & 0xff;
2148 digest[16] = (l >> 8) & 0xff;
2149 digest[17] = (l >> 16) & 0xff;
2150
2151 l = itoa64_to_int (buf[24]) << 0;
2152 l |= itoa64_to_int (buf[25]) << 6;
2153 l |= itoa64_to_int (buf[26]) << 12;
2154 l |= itoa64_to_int (buf[27]) << 18;
2155
2156 digest[18] = (l >> 0) & 0xff;
2157 digest[19] = (l >> 8) & 0xff;
2158 digest[20] = (l >> 16) & 0xff;
2159
2160 l = itoa64_to_int (buf[28]) << 0;
2161 l |= itoa64_to_int (buf[29]) << 6;
2162 l |= itoa64_to_int (buf[30]) << 12;
2163 l |= itoa64_to_int (buf[31]) << 18;
2164
2165 digest[21] = (l >> 0) & 0xff;
2166 digest[22] = (l >> 8) & 0xff;
2167 digest[23] = (l >> 16) & 0xff;
2168
2169 l = itoa64_to_int (buf[32]) << 0;
2170 l |= itoa64_to_int (buf[33]) << 6;
2171 l |= itoa64_to_int (buf[34]) << 12;
2172 l |= itoa64_to_int (buf[35]) << 18;
2173
2174 digest[24] = (l >> 0) & 0xff;
2175 digest[25] = (l >> 8) & 0xff;
2176 digest[26] = (l >> 16) & 0xff;
2177
2178 l = itoa64_to_int (buf[36]) << 0;
2179 l |= itoa64_to_int (buf[37]) << 6;
2180 l |= itoa64_to_int (buf[38]) << 12;
2181 l |= itoa64_to_int (buf[39]) << 18;
2182
2183 digest[27] = (l >> 0) & 0xff;
2184 digest[28] = (l >> 8) & 0xff;
2185 digest[29] = (l >> 16) & 0xff;
2186
2187 l = itoa64_to_int (buf[40]) << 0;
2188 l |= itoa64_to_int (buf[41]) << 6;
2189 l |= itoa64_to_int (buf[42]) << 12;
2190 l |= itoa64_to_int (buf[43]) << 18;
2191
2192 digest[30] = (l >> 0) & 0xff;
2193 digest[31] = (l >> 8) & 0xff;
2194 digest[32] = (l >> 16) & 0xff;
2195
2196 digest[33] = 0;
2197 digest[34] = 0;
2198 digest[35] = 0;
2199 digest[36] = 0;
2200 digest[37] = 0;
2201 digest[38] = 0;
2202 digest[39] = 0;
2203 digest[40] = 0;
2204 digest[41] = 0;
2205 digest[42] = 0;
2206 digest[43] = 0;
2207 digest[44] = 0;
2208 digest[45] = 0;
2209 digest[46] = 0;
2210 digest[47] = 0;
2211 digest[48] = 0;
2212 digest[49] = 0;
2213 digest[50] = 0;
2214 digest[51] = 0;
2215 digest[52] = 0;
2216 digest[53] = 0;
2217 digest[54] = 0;
2218 digest[55] = 0;
2219 digest[56] = 0;
2220 digest[57] = 0;
2221 digest[58] = 0;
2222 digest[59] = 0;
2223 digest[60] = 0;
2224 digest[61] = 0;
2225 digest[62] = 0;
2226 digest[63] = 0;
2227 }
2228
2229 void drupal7_encode (u8 digest[64], u8 buf[43])
2230 {
2231 int l;
2232
2233 l = (digest[ 0] << 0) | (digest[ 1] << 8) | (digest[ 2] << 16);
2234
2235 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
2236 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
2237 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
2238 buf[ 3] = int_to_itoa64 (l & 0x3f);
2239
2240 l = (digest[ 3] << 0) | (digest[ 4] << 8) | (digest[ 5] << 16);
2241
2242 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
2243 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
2244 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
2245 buf[ 7] = int_to_itoa64 (l & 0x3f);
2246
2247 l = (digest[ 6] << 0) | (digest[ 7] << 8) | (digest[ 8] << 16);
2248
2249 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
2250 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
2251 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
2252 buf[11] = int_to_itoa64 (l & 0x3f);
2253
2254 l = (digest[ 9] << 0) | (digest[10] << 8) | (digest[11] << 16);
2255
2256 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
2257 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
2258 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
2259 buf[15] = int_to_itoa64 (l & 0x3f);
2260
2261 l = (digest[12] << 0) | (digest[13] << 8) | (digest[14] << 16);
2262
2263 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
2264 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
2265 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
2266 buf[19] = int_to_itoa64 (l & 0x3f);
2267
2268 l = (digest[15] << 0) | (digest[16] << 8) | (digest[17] << 16);
2269
2270 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
2271 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
2272 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
2273 buf[23] = int_to_itoa64 (l & 0x3f);
2274
2275 l = (digest[18] << 0) | (digest[19] << 8) | (digest[20] << 16);
2276
2277 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
2278 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
2279 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
2280 buf[27] = int_to_itoa64 (l & 0x3f);
2281
2282 l = (digest[21] << 0) | (digest[22] << 8) | (digest[23] << 16);
2283
2284 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
2285 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
2286 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
2287 buf[31] = int_to_itoa64 (l & 0x3f);
2288
2289 l = (digest[24] << 0) | (digest[25] << 8) | (digest[26] << 16);
2290
2291 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
2292 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
2293 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
2294 buf[35] = int_to_itoa64 (l & 0x3f);
2295
2296 l = (digest[27] << 0) | (digest[28] << 8) | (digest[29] << 16);
2297
2298 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
2299 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
2300 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
2301 buf[39] = int_to_itoa64 (l & 0x3f);
2302
2303 l = (digest[30] << 0) | (digest[31] << 8) | (digest[32] << 16);
2304
2305 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
2306 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
2307 buf[42] = int_to_itoa64 (l & 0x3f); l >>= 6;
2308 //buf[43] = int_to_itoa64 (l & 0x3f);
2309 }
2310
2311 /**
2312 * tty
2313 */
2314
2315 #ifdef LINUX
2316 static struct termio savemodes;
2317 static int havemodes = 0;
2318
2319 int tty_break()
2320 {
2321 struct termio modmodes;
2322
2323 if (ioctl (fileno (stdin), TCGETA, &savemodes) < 0) return -1;
2324
2325 havemodes = 1;
2326
2327 modmodes = savemodes;
2328 modmodes.c_lflag &= ~ICANON;
2329 modmodes.c_cc[VMIN] = 1;
2330 modmodes.c_cc[VTIME] = 0;
2331
2332 return ioctl (fileno (stdin), TCSETAW, &modmodes);
2333 }
2334
2335 int tty_getchar()
2336 {
2337 fd_set rfds;
2338
2339 FD_ZERO (&rfds);
2340
2341 FD_SET (fileno (stdin), &rfds);
2342
2343 struct timeval tv;
2344
2345 tv.tv_sec = 1;
2346 tv.tv_usec = 0;
2347
2348 int retval = select (1, &rfds, NULL, NULL, &tv);
2349
2350 if (retval == 0) return 0;
2351 if (retval == -1) return -1;
2352
2353 return getchar();
2354 }
2355
2356 int tty_fix()
2357 {
2358 if (!havemodes) return 0;
2359
2360 return ioctl (fileno (stdin), TCSETAW, &savemodes);
2361 }
2362 #endif
2363
2364 #ifdef OSX
2365 static struct termios savemodes;
2366 static int havemodes = 0;
2367
2368 int tty_break()
2369 {
2370 struct termios modmodes;
2371
2372 if (ioctl (fileno (stdin), TIOCGETA, &savemodes) < 0) return -1;
2373
2374 havemodes = 1;
2375
2376 modmodes = savemodes;
2377 modmodes.c_lflag &= ~ICANON;
2378 modmodes.c_cc[VMIN] = 1;
2379 modmodes.c_cc[VTIME] = 0;
2380
2381 return ioctl (fileno (stdin), TIOCSETAW, &modmodes);
2382 }
2383
2384 int tty_getchar()
2385 {
2386 fd_set rfds;
2387
2388 FD_ZERO (&rfds);
2389
2390 FD_SET (fileno (stdin), &rfds);
2391
2392 struct timeval tv;
2393
2394 tv.tv_sec = 1;
2395 tv.tv_usec = 0;
2396
2397 int retval = select (1, &rfds, NULL, NULL, &tv);
2398
2399 if (retval == 0) return 0;
2400 if (retval == -1) return -1;
2401
2402 return getchar();
2403 }
2404
2405 int tty_fix()
2406 {
2407 if (!havemodes) return 0;
2408
2409 return ioctl (fileno (stdin), TIOCSETAW, &savemodes);
2410 }
2411 #endif
2412
2413 #ifdef WIN
2414 static DWORD saveMode = 0;
2415
2416 int tty_break()
2417 {
2418 HANDLE stdinHandle = GetStdHandle (STD_INPUT_HANDLE);
2419
2420 GetConsoleMode (stdinHandle, &saveMode);
2421 SetConsoleMode (stdinHandle, ENABLE_PROCESSED_INPUT);
2422
2423 return 0;
2424 }
2425
2426 int tty_getchar()
2427 {
2428 HANDLE stdinHandle = GetStdHandle (STD_INPUT_HANDLE);
2429
2430 DWORD rc = WaitForSingleObject (stdinHandle, 1000);
2431
2432 if (rc == WAIT_TIMEOUT) return 0;
2433 if (rc == WAIT_ABANDONED) return -1;
2434 if (rc == WAIT_FAILED) return -1;
2435
2436 // The whole ReadConsoleInput () part is a workaround.
2437 // For some unknown reason, maybe a mingw bug, a random signal
2438 // is sent to stdin which unblocks WaitForSingleObject () and sets rc 0.
2439 // Then it wants to read with getche () a keyboard input
2440 // which has never been made.
2441
2442 INPUT_RECORD buf[100];
2443
2444 DWORD num = 0;
2445
2446 memset (buf, 0, sizeof (buf));
2447
2448 ReadConsoleInput (stdinHandle, buf, 100, &num);
2449
2450 FlushConsoleInputBuffer (stdinHandle);
2451
2452 for (uint i = 0; i < num; i++)
2453 {
2454 if (buf[i].EventType != KEY_EVENT) continue;
2455
2456 KEY_EVENT_RECORD KeyEvent = buf[i].Event.KeyEvent;
2457
2458 if (KeyEvent.bKeyDown != TRUE) continue;
2459
2460 return KeyEvent.uChar.AsciiChar;
2461 }
2462
2463 return 0;
2464 }
2465
2466 int tty_fix()
2467 {
2468 HANDLE stdinHandle = GetStdHandle (STD_INPUT_HANDLE);
2469
2470 SetConsoleMode (stdinHandle, saveMode);
2471
2472 return 0;
2473 }
2474 #endif
2475
2476 /**
2477 * mem alloc
2478 */
2479
2480 #define MSG_ENOMEM "Insufficient memory available"
2481
2482 void *mycalloc (size_t nmemb, size_t size)
2483 {
2484 void *p = calloc (nmemb, size);
2485
2486 if (p == NULL)
2487 {
2488 log_error ("ERROR: %s", MSG_ENOMEM);
2489
2490 exit (-1);
2491 }
2492
2493 return (p);
2494 }
2495
2496 void *mymalloc (size_t size)
2497 {
2498 void *p = malloc (size);
2499
2500 if (p == NULL)
2501 {
2502 log_error ("ERROR: %s", MSG_ENOMEM);
2503
2504 exit (-1);
2505 }
2506
2507 memset (p, 0, size);
2508
2509 return (p);
2510 }
2511
2512 void myfree (void *ptr)
2513 {
2514 if (ptr == NULL) return;
2515
2516 free (ptr);
2517 }
2518
2519 void *myrealloc (void *ptr, size_t oldsz, size_t add)
2520 {
2521 void *p = realloc (ptr, oldsz + add);
2522
2523 if (p == NULL)
2524 {
2525 log_error ("ERROR: %s", MSG_ENOMEM);
2526
2527 exit (-1);
2528 }
2529
2530 memset ((char *) p + oldsz, 0, add);
2531
2532 return (p);
2533 }
2534
2535 char *mystrdup (const char *s)
2536 {
2537 const size_t len = strlen (s);
2538
2539 char *b = (char *) mymalloc (len + 1);
2540
2541 memcpy (b, s, len);
2542
2543 return (b);
2544 }
2545
2546 FILE *logfile_open (char *logfile)
2547 {
2548 FILE *fp = fopen (logfile, "ab");
2549
2550 if (fp == NULL)
2551 {
2552 fp = stdout;
2553 }
2554
2555 return fp;
2556 }
2557
2558 void logfile_close (FILE *fp)
2559 {
2560 if (fp == stdout) return;
2561
2562 fclose (fp);
2563 }
2564
2565 void logfile_append (const char *fmt, ...)
2566 {
2567 if (data.logfile_disable == 1) return;
2568
2569 FILE *fp = logfile_open (data.logfile);
2570
2571 va_list ap;
2572
2573 va_start (ap, fmt);
2574
2575 vfprintf (fp, fmt, ap);
2576
2577 va_end (ap);
2578
2579 fputc ('\n', fp);
2580
2581 fflush (fp);
2582
2583 logfile_close (fp);
2584 }
2585
2586 int logfile_generate_id ()
2587 {
2588 const int n = rand ();
2589
2590 time_t t;
2591
2592 time (&t);
2593
2594 return t + n;
2595 }
2596
2597 char *logfile_generate_topid ()
2598 {
2599 const int id = logfile_generate_id ();
2600
2601 char *topid = (char *) mymalloc (1 + 16 + 1);
2602
2603 snprintf (topid, 1 + 16, "TOP%08x", id);
2604
2605 return topid;
2606 }
2607
2608 char *logfile_generate_subid ()
2609 {
2610 const int id = logfile_generate_id ();
2611
2612 char *subid = (char *) mymalloc (1 + 16 + 1);
2613
2614 snprintf (subid, 1 + 16, "SUB%08x", id);
2615
2616 return subid;
2617 }
2618
2619 /**
2620 * system
2621 */
2622
2623 #if F_SETLKW
2624 void lock_file (FILE *fp)
2625 {
2626 struct flock lock;
2627
2628 memset (&lock, 0, sizeof (struct flock));
2629
2630 lock.l_type = F_WRLCK;
2631 while (fcntl(fileno(fp), F_SETLKW, &lock))
2632 {
2633 if (errno != EINTR)
2634 {
2635 log_error ("ERROR: failed acquiring write lock: %s", strerror (errno));
2636
2637 exit (-1);
2638 }
2639 }
2640 }
2641
2642 void unlock_file (FILE *fp)
2643 {
2644 struct flock lock;
2645
2646 memset (&lock, 0, sizeof (struct flock));
2647
2648 lock.l_type = F_UNLCK;
2649 fcntl(fileno(fp), F_SETLK, &lock);
2650 }
2651 #endif // F_SETLKW
2652
2653 #ifdef _WIN
2654 void fsync (int fd)
2655 {
2656 HANDLE h = (HANDLE) _get_osfhandle (fd);
2657
2658 FlushFileBuffers (h);
2659 }
2660 #endif
2661
2662 /**
2663 * thermal
2664 */
2665
2666 #ifdef HAVE_HWMON
2667 #if defined(_WIN) && defined(HAVE_NVAPI)
2668 int hm_get_adapter_index_nv (HM_ADAPTER_NV nvGPUHandle[DEVICES_MAX])
2669 {
2670 NvU32 pGpuCount;
2671
2672 if (hm_NvAPI_EnumPhysicalGPUs (data.hm_nv, nvGPUHandle, &pGpuCount) != NVAPI_OK) return (0);
2673
2674 if (pGpuCount == 0)
2675 {
2676 log_info ("WARN: No NvAPI adapters found");
2677
2678 return (0);
2679 }
2680
2681 return (pGpuCount);
2682 }
2683 #endif // _WIN && HAVE_NVAPI
2684
2685 #if defined(LINUX) && defined(HAVE_NVML)
2686 int hm_get_adapter_index_nv (HM_ADAPTER_NV nvGPUHandle[DEVICES_MAX])
2687 {
2688 int pGpuCount = 0;
2689
2690 for (uint i = 0; i < DEVICES_MAX; i++)
2691 {
2692 if (hm_NVML_nvmlDeviceGetHandleByIndex (data.hm_nv, 1, i, &nvGPUHandle[i]) != NVML_SUCCESS) break;
2693
2694 // can be used to determine if the device by index matches the cuda device by index
2695 // char name[100]; memset (name, 0, sizeof (name));
2696 // hm_NVML_nvmlDeviceGetName (data.hm_nv, nvGPUHandle[i], name, sizeof (name) - 1);
2697
2698 pGpuCount++;
2699 }
2700
2701 if (pGpuCount == 0)
2702 {
2703 log_info ("WARN: No NVML adapters found");
2704
2705 return (0);
2706 }
2707
2708 return (pGpuCount);
2709 }
2710 #endif // LINUX && HAVE_NVML
2711
2712 #ifdef HAVE_ADL
2713 int get_adapters_num_amd (void *adl, int *iNumberAdapters)
2714 {
2715 if (hm_ADL_Adapter_NumberOfAdapters_Get ((ADL_PTR *) adl, iNumberAdapters) != ADL_OK) return -1;
2716
2717 if (iNumberAdapters == 0)
2718 {
2719 log_info ("WARN: No ADL adapters found.");
2720
2721 return -1;
2722 }
2723
2724 return 0;
2725 }
2726
2727 /*
2728 int hm_show_performance_level (HM_LIB hm_dll, int iAdapterIndex)
2729 {
2730 ADLODPerformanceLevels *lpOdPerformanceLevels = NULL;
2731 ADLODParameters lpOdParameters;
2732
2733 lpOdParameters.iSize = sizeof (ADLODParameters);
2734 size_t plevels_size = 0;
2735
2736 if (hm_ADL_Overdrive_ODParameters_Get (hm_dll, iAdapterIndex, &lpOdParameters) != ADL_OK) return -1;
2737
2738 log_info ("[DEBUG] %s, adapter %d performance level (%d) : %s %s",
2739 __func__, iAdapterIndex,
2740 lpOdParameters.iNumberOfPerformanceLevels,
2741 (lpOdParameters.iActivityReportingSupported) ? "activity reporting" : "",
2742 (lpOdParameters.iDiscretePerformanceLevels) ? "discrete performance levels" : "performance ranges");
2743
2744 plevels_size = sizeof (ADLODPerformanceLevels) + sizeof (ADLODPerformanceLevel) * (lpOdParameters.iNumberOfPerformanceLevels - 1);
2745
2746 lpOdPerformanceLevels = (ADLODPerformanceLevels *) mymalloc (plevels_size);
2747
2748 lpOdPerformanceLevels->iSize = sizeof (ADLODPerformanceLevels) + sizeof (ADLODPerformanceLevel) * (lpOdParameters.iNumberOfPerformanceLevels - 1);
2749
2750 if (hm_ADL_Overdrive_ODPerformanceLevels_Get (hm_dll, iAdapterIndex, 0, lpOdPerformanceLevels) != ADL_OK) return -1;
2751
2752 for (int j = 0; j < lpOdParameters.iNumberOfPerformanceLevels; j++)
2753 log_info ("[DEBUG] %s, adapter %d, level %d : engine %d, memory %d, voltage: %d",
2754 __func__, iAdapterIndex, j,
2755 lpOdPerformanceLevels->aLevels[j].iEngineClock / 100, lpOdPerformanceLevels->aLevels[j].iMemoryClock / 100, lpOdPerformanceLevels->aLevels[j].iVddc);
2756
2757 myfree (lpOdPerformanceLevels);
2758
2759 return 0;
2760 }
2761 */
2762
2763 LPAdapterInfo hm_get_adapter_info_amd (void *adl, int iNumberAdapters)
2764 {
2765 size_t AdapterInfoSize = iNumberAdapters * sizeof (AdapterInfo);
2766
2767 LPAdapterInfo lpAdapterInfo = (LPAdapterInfo) mymalloc (AdapterInfoSize);
2768
2769 if (hm_ADL_Adapter_AdapterInfo_Get ((ADL_PTR *) adl, lpAdapterInfo, AdapterInfoSize) != ADL_OK) return NULL;
2770
2771 return lpAdapterInfo;
2772 }
2773
2774 /*
2775 //
2776 // does not help at all, since AMD does not assign different bus id, device id when we have multi GPU setups
2777 //
2778
2779 int hm_get_opencl_device_index (hm_attrs_t *hm_device, uint num_adl_adapters, int bus_num, int dev_num)
2780 {
2781 u32 idx = -1;
2782
2783 for (uint i = 0; i < num_adl_adapters; i++)
2784 {
2785 int opencl_bus_num = hm_device[i].busid;
2786 int opencl_dev_num = hm_device[i].devid;
2787
2788 if ((opencl_bus_num == bus_num) && (opencl_dev_num == dev_num))
2789 {
2790 idx = i;
2791
2792 break;
2793 }
2794 }
2795
2796 if (idx >= DEVICES_MAX) return -1;
2797
2798 return idx;
2799 }
2800
2801 void hm_get_opencl_busid_devid (hm_attrs_t *hm_device, uint opencl_num_devices, cl_device_id *devices)
2802 {
2803 for (uint i = 0; i < opencl_num_devices; i++)
2804 {
2805 cl_device_topology_amd device_topology;
2806
2807 hc_clGetDeviceInfo (devices[i], CL_DEVICE_TOPOLOGY_AMD, sizeof (device_topology), &device_topology, NULL);
2808
2809 hm_device[i].busid = device_topology.pcie.bus;
2810 hm_device[i].devid = device_topology.pcie.device;
2811 }
2812 }
2813 */
2814
2815 void hm_sort_adl_adapters_by_busid_devid (u32 *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2816 {
2817 // basically bubble sort
2818
2819 for (int i = 0; i < num_adl_adapters; i++)
2820 {
2821 for (int j = 0; j < num_adl_adapters - 1; j++)
2822 {
2823 // get info of adapter [x]
2824
2825 u32 adapter_index_x = valid_adl_device_list[j];
2826 AdapterInfo info_x = lpAdapterInfo[adapter_index_x];
2827
2828 u32 bus_num_x = info_x.iBusNumber;
2829 u32 dev_num_x = info_x.iDeviceNumber;
2830
2831 // get info of adapter [y]
2832
2833 u32 adapter_index_y = valid_adl_device_list[j + 1];
2834 AdapterInfo info_y = lpAdapterInfo[adapter_index_y];
2835
2836 u32 bus_num_y = info_y.iBusNumber;
2837 u32 dev_num_y = info_y.iDeviceNumber;
2838
2839 uint need_swap = 0;
2840
2841 if (bus_num_y < bus_num_x)
2842 {
2843 need_swap = 1;
2844 }
2845 else if (bus_num_y == bus_num_x)
2846 {
2847 if (dev_num_y < dev_num_x)
2848 {
2849 need_swap = 1;
2850 }
2851 }
2852
2853 if (need_swap == 1)
2854 {
2855 u32 temp = valid_adl_device_list[j + 1];
2856
2857 valid_adl_device_list[j + 1] = valid_adl_device_list[j];
2858 valid_adl_device_list[j + 0] = temp;
2859 }
2860 }
2861 }
2862 }
2863
2864 u32 *hm_get_list_valid_adl_adapters (int iNumberAdapters, int *num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2865 {
2866 *num_adl_adapters = 0;
2867
2868 u32 *adl_adapters = NULL;
2869
2870 int *bus_numbers = NULL;
2871 int *device_numbers = NULL;
2872
2873 for (int i = 0; i < iNumberAdapters; i++)
2874 {
2875 AdapterInfo info = lpAdapterInfo[i];
2876
2877 if (strlen (info.strUDID) < 1) continue;
2878
2879 #ifdef WIN
2880 if (info.iVendorID != 1002) continue;
2881 #else
2882 if (info.iVendorID != 0x1002) continue;
2883 #endif
2884
2885 if (info.iBusNumber < 0) continue;
2886 if (info.iDeviceNumber < 0) continue;
2887
2888 int found = 0;
2889
2890 for (int pos = 0; pos < *num_adl_adapters; pos++)
2891 {
2892 if ((bus_numbers[pos] == info.iBusNumber) && (device_numbers[pos] == info.iDeviceNumber))
2893 {
2894 found = 1;
2895 break;
2896 }
2897 }
2898
2899 if (found) continue;
2900
2901 // add it to the list
2902
2903 adl_adapters = (u32 *) myrealloc (adl_adapters, (*num_adl_adapters) * sizeof (int), sizeof (int));
2904
2905 adl_adapters[*num_adl_adapters] = i;
2906
2907 // rest is just bookkeeping
2908
2909 bus_numbers = (int*) myrealloc (bus_numbers, (*num_adl_adapters) * sizeof (int), sizeof (int));
2910 device_numbers = (int*) myrealloc (device_numbers, (*num_adl_adapters) * sizeof (int), sizeof (int));
2911
2912 bus_numbers[*num_adl_adapters] = info.iBusNumber;
2913 device_numbers[*num_adl_adapters] = info.iDeviceNumber;
2914
2915 (*num_adl_adapters)++;
2916 }
2917
2918 myfree (bus_numbers);
2919 myfree (device_numbers);
2920
2921 // sort the list by increasing bus id, device id number
2922
2923 hm_sort_adl_adapters_by_busid_devid (adl_adapters, *num_adl_adapters, lpAdapterInfo);
2924
2925 return adl_adapters;
2926 }
2927
2928 int hm_check_fanspeed_control (void *adl, hm_attrs_t *hm_device, u32 *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2929 {
2930 // loop through all valid devices
2931
2932 for (int i = 0; i < num_adl_adapters; i++)
2933 {
2934 u32 adapter_index = valid_adl_device_list[i];
2935
2936 // get AdapterInfo
2937
2938 AdapterInfo info = lpAdapterInfo[adapter_index];
2939
2940 // unfortunately this doesn't work since bus id and dev id are not unique
2941 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
2942 // if (opencl_device_index == -1) continue;
2943
2944 int opencl_device_index = i;
2945
2946 // if (hm_show_performance_level (adl, info.iAdapterIndex) != 0) return -1;
2947
2948 // get fanspeed info
2949
2950 if (hm_device[opencl_device_index].od_version == 5)
2951 {
2952 ADLFanSpeedInfo FanSpeedInfo;
2953
2954 memset (&FanSpeedInfo, 0, sizeof (ADLFanSpeedInfo));
2955
2956 FanSpeedInfo.iSize = sizeof (ADLFanSpeedInfo);
2957
2958 if (hm_ADL_Overdrive5_FanSpeedInfo_Get (adl, info.iAdapterIndex, 0, &FanSpeedInfo) != ADL_OK) return -1;
2959
2960 // check read and write capability in fanspeedinfo
2961
2962 if ((FanSpeedInfo.iFlags & ADL_DL_FANCTRL_SUPPORTS_PERCENT_READ) &&
2963 (FanSpeedInfo.iFlags & ADL_DL_FANCTRL_SUPPORTS_PERCENT_WRITE))
2964 {
2965 hm_device[opencl_device_index].fan_supported = 1;
2966 }
2967 else
2968 {
2969 hm_device[opencl_device_index].fan_supported = 0;
2970 }
2971 }
2972 else // od_version == 6
2973 {
2974 ADLOD6FanSpeedInfo faninfo;
2975
2976 memset (&faninfo, 0, sizeof (faninfo));
2977
2978 if (hm_ADL_Overdrive6_FanSpeed_Get (adl, info.iAdapterIndex, &faninfo) != ADL_OK) return -1;
2979
2980 // check read capability in fanspeedinfo
2981
2982 if (faninfo.iSpeedType & ADL_OD6_FANSPEED_TYPE_PERCENT)
2983 {
2984 hm_device[opencl_device_index].fan_supported = 1;
2985 }
2986 else
2987 {
2988 hm_device[opencl_device_index].fan_supported = 0;
2989 }
2990 }
2991 }
2992
2993 return 0;
2994 }
2995
2996 int hm_get_overdrive_version (void *adl, hm_attrs_t *hm_device, u32 *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2997 {
2998 for (int i = 0; i < num_adl_adapters; i++)
2999 {
3000 u32 adapter_index = valid_adl_device_list[i];
3001
3002 // get AdapterInfo
3003
3004 AdapterInfo info = lpAdapterInfo[adapter_index];
3005
3006 // get overdrive version
3007
3008 int od_supported = 0;
3009 int od_enabled = 0;
3010 int od_version = 0;
3011
3012 if (hm_ADL_Overdrive_Caps (adl, info.iAdapterIndex, &od_supported, &od_enabled, &od_version) != ADL_OK) return -1;
3013
3014 // store the overdrive version in hm_device
3015
3016 // unfortunately this doesn't work since bus id and dev id are not unique
3017 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
3018 // if (opencl_device_index == -1) continue;
3019
3020 int opencl_device_index = i;
3021
3022 hm_device[opencl_device_index].od_version = od_version;
3023 }
3024
3025 return 0;
3026 }
3027
3028 int hm_get_adapter_index_amd (hm_attrs_t *hm_device, u32 *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
3029 {
3030 for (int i = 0; i < num_adl_adapters; i++)
3031 {
3032 u32 adapter_index = valid_adl_device_list[i];
3033
3034 // get AdapterInfo
3035
3036 AdapterInfo info = lpAdapterInfo[adapter_index];
3037
3038 // store the iAdapterIndex in hm_device
3039
3040 // unfortunately this doesn't work since bus id and dev id are not unique
3041 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
3042 // if (opencl_device_index == -1) continue;
3043
3044 int opencl_device_index = i;
3045
3046 hm_device[opencl_device_index].adapter_index.amd = info.iAdapterIndex;
3047 }
3048
3049 return num_adl_adapters;
3050 }
3051 #endif // HAVE_ADL
3052
3053 int hm_get_temperature_with_device_id (const uint device_id)
3054 {
3055 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3056
3057 #ifdef HAVE_ADL
3058 if (data.devices_param[device_id].vendor_id == VENDOR_ID_AMD)
3059 {
3060 if (data.hm_amd)
3061 {
3062 if (data.hm_device[device_id].od_version == 5)
3063 {
3064 ADLTemperature Temperature;
3065
3066 Temperature.iSize = sizeof (ADLTemperature);
3067
3068 if (hm_ADL_Overdrive5_Temperature_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, 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 (hm_ADL_Overdrive6_Temperature_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, &Temperature) != ADL_OK) return -1;
3077
3078 return Temperature / 1000;
3079 }
3080 }
3081 }
3082 #endif
3083
3084 #if defined(HAVE_NVML) || defined(HAVE_NVAPI)
3085 if (data.devices_param[device_id].vendor_id == VENDOR_ID_NV)
3086 {
3087 #if defined(LINUX) && defined(HAVE_NVML)
3088 int temperature = 0;
3089
3090 hm_NVML_nvmlDeviceGetTemperature (data.hm_nv, data.hm_device[device_id].adapter_index.nv, NVML_TEMPERATURE_GPU, (unsigned int *) &temperature);
3091
3092 return temperature;
3093 #endif
3094
3095 #if defined(WIN) && defined(HAVE_NVAPI)
3096 NV_GPU_THERMAL_SETTINGS pThermalSettings;
3097
3098 pThermalSettings.version = NV_GPU_THERMAL_SETTINGS_VER;
3099 pThermalSettings.count = NVAPI_MAX_THERMAL_SENSORS_PER_GPU;
3100 pThermalSettings.sensor[0].controller = NVAPI_THERMAL_CONTROLLER_UNKNOWN;
3101 pThermalSettings.sensor[0].target = NVAPI_THERMAL_TARGET_GPU;
3102
3103 if (hm_NvAPI_GPU_GetThermalSettings (data.hm_nv, data.hm_device[device_id].adapter_index.nv, 0, &pThermalSettings) != NVAPI_OK) return -1;
3104
3105 return pThermalSettings.sensor[0].currentTemp;
3106 #endif // WIN && HAVE_NVAPI
3107 }
3108 #endif // HAVE_NVML || HAVE_NVAPI
3109
3110 return -1;
3111 }
3112
3113 int hm_get_fanspeed_with_device_id (const uint device_id)
3114 {
3115 // we shouldn't really need this extra CL_DEVICE_TYPE_GPU check, because fan_supported should not be set w/ CPUs
3116 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3117
3118 if (data.hm_device[device_id].fan_supported == 1)
3119 {
3120 #ifdef HAVE_ADL
3121 if (data.devices_param[device_id].vendor_id == VENDOR_ID_AMD)
3122 {
3123 if (data.hm_amd)
3124 {
3125 if (data.hm_device[device_id].od_version == 5)
3126 {
3127 ADLFanSpeedValue lpFanSpeedValue;
3128
3129 memset (&lpFanSpeedValue, 0, sizeof (lpFanSpeedValue));
3130
3131 lpFanSpeedValue.iSize = sizeof (lpFanSpeedValue);
3132 lpFanSpeedValue.iSpeedType = ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
3133 lpFanSpeedValue.iFlags = ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED;
3134
3135 if (hm_ADL_Overdrive5_FanSpeed_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, 0, &lpFanSpeedValue) != ADL_OK) return -1;
3136
3137 return lpFanSpeedValue.iFanSpeed;
3138 }
3139 else // od_version == 6
3140 {
3141 ADLOD6FanSpeedInfo faninfo;
3142
3143 memset (&faninfo, 0, sizeof (faninfo));
3144
3145 if (hm_ADL_Overdrive6_FanSpeed_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, &faninfo) != ADL_OK) return -1;
3146
3147 return faninfo.iFanSpeedPercent;
3148 }
3149 }
3150 }
3151 #endif // HAVE_ADL
3152
3153 #if defined(HAVE_NVML) || defined(HAVE_NVAPI)
3154 if (data.devices_param[device_id].vendor_id == VENDOR_ID_NV)
3155 {
3156 #if defined(LINUX) && defined(HAVE_NVML)
3157 int speed = 0;
3158
3159 hm_NVML_nvmlDeviceGetFanSpeed (data.hm_nv, 1, data.hm_device[device_id].adapter_index.nv, (unsigned int *) &speed);
3160
3161 return speed;
3162 #endif
3163
3164 #if defined(WIN) && defined(HAVE_NVAPI)
3165
3166 NV_GPU_COOLER_SETTINGS pCoolerSettings;
3167
3168 pCoolerSettings.Version = GPU_COOLER_SETTINGS_VER | sizeof (NV_GPU_COOLER_SETTINGS);
3169
3170 hm_NvAPI_GPU_GetCoolerSettings (data.hm_nv, data.hm_device[device_id].adapter_index.nv, 0, &pCoolerSettings);
3171
3172 return pCoolerSettings.Cooler[0].CurrentLevel;
3173 #endif
3174 }
3175 #endif // HAVE_NVML || HAVE_NVAPI
3176 }
3177
3178 return -1;
3179 }
3180
3181 int hm_get_utilization_with_device_id (const uint device_id)
3182 {
3183 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3184
3185 #ifdef HAVE_ADL
3186 if (data.devices_param[device_id].vendor_id == VENDOR_ID_AMD)
3187 {
3188 if (data.hm_amd)
3189 {
3190 ADLPMActivity PMActivity;
3191
3192 PMActivity.iSize = sizeof (ADLPMActivity);
3193
3194 if (hm_ADL_Overdrive_CurrentActivity_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, &PMActivity) != ADL_OK) return -1;
3195
3196 return PMActivity.iActivityPercent;
3197 }
3198 }
3199 #endif // HAVE_ADL
3200
3201 #if defined(HAVE_NVML) || defined(HAVE_NVAPI)
3202 if (data.devices_param[device_id].vendor_id == VENDOR_ID_NV)
3203 {
3204 #if defined(LINUX) && defined(HAVE_NVML)
3205 nvmlUtilization_t utilization;
3206
3207 hm_NVML_nvmlDeviceGetUtilizationRates (data.hm_nv, data.hm_device[device_id].adapter_index.nv, &utilization);
3208
3209 return utilization.gpu;
3210 #endif
3211
3212 #if defined(WIN) && defined(HAVE_NVAPI)
3213 NV_GPU_DYNAMIC_PSTATES_INFO_EX pDynamicPstatesInfoEx;
3214
3215 pDynamicPstatesInfoEx.version = NV_GPU_DYNAMIC_PSTATES_INFO_EX_VER;
3216
3217 if (hm_NvAPI_GPU_GetDynamicPstatesInfoEx (data.hm_nv, data.hm_device[device_id].adapter_index.nv, &pDynamicPstatesInfoEx) != NVAPI_OK) return -1;
3218
3219 return pDynamicPstatesInfoEx.utilization[0].percentage;
3220 #endif
3221 }
3222 #endif // HAVE_NVML || HAVE_NVAPI
3223
3224 return -1;
3225 }
3226
3227 #ifdef HAVE_ADL
3228 int hm_set_fanspeed_with_device_id_amd (const uint device_id, const int fanspeed)
3229 {
3230 if (data.hm_device[device_id].fan_supported == 1)
3231 {
3232 if (data.hm_amd)
3233 {
3234 if (data.hm_device[device_id].od_version == 5)
3235 {
3236 ADLFanSpeedValue lpFanSpeedValue;
3237
3238 memset (&lpFanSpeedValue, 0, sizeof (lpFanSpeedValue));
3239
3240 lpFanSpeedValue.iSize = sizeof (lpFanSpeedValue);
3241 lpFanSpeedValue.iSpeedType = ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
3242 lpFanSpeedValue.iFlags = ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED;
3243 lpFanSpeedValue.iFanSpeed = fanspeed;
3244
3245 if (hm_ADL_Overdrive5_FanSpeed_Set (data.hm_amd, data.hm_device[device_id].adapter_index.amd, 0, &lpFanSpeedValue) != ADL_OK) return -1;
3246
3247 return 0;
3248 }
3249 else // od_version == 6
3250 {
3251 ADLOD6FanSpeedValue fan_speed_value;
3252
3253 memset (&fan_speed_value, 0, sizeof (fan_speed_value));
3254
3255 fan_speed_value.iSpeedType = ADL_OD6_FANSPEED_TYPE_PERCENT;
3256 fan_speed_value.iFanSpeed = fanspeed;
3257
3258 if (hm_ADL_Overdrive6_FanSpeed_Set (data.hm_amd, data.hm_device[device_id].adapter_index.amd, &fan_speed_value) != ADL_OK) return -1;
3259
3260 return 0;
3261 }
3262 }
3263 }
3264
3265 return -1;
3266 }
3267 #endif
3268
3269 // helper function for status display
3270
3271 void hm_device_val_to_str (char *target_buf, int max_buf_size, char *suffix, int value)
3272 {
3273 #define VALUE_NOT_AVAILABLE "N/A"
3274
3275 if (value == -1)
3276 {
3277 snprintf (target_buf, max_buf_size, VALUE_NOT_AVAILABLE);
3278 }
3279 else
3280 {
3281 snprintf (target_buf, max_buf_size, "%2d%s", value, suffix);
3282 }
3283 }
3284 #endif // HAVE_HWMON
3285
3286 /**
3287 * maskprocessor
3288 */
3289
3290 void mp_css_to_uniq_tbl (uint css_cnt, cs_t *css, uint uniq_tbls[SP_PW_MAX][CHARSIZ])
3291 {
3292 /* generates a lookup table where key is the char itself for fastest possible lookup performance */
3293
3294 if (css_cnt > SP_PW_MAX)
3295 {
3296 log_error ("ERROR: mask length is too long");
3297
3298 exit (-1);
3299 }
3300
3301 for (uint css_pos = 0; css_pos < css_cnt; css_pos++)
3302 {
3303 uint *uniq_tbl = uniq_tbls[css_pos];
3304
3305 uint *cs_buf = css[css_pos].cs_buf;
3306 uint cs_len = css[css_pos].cs_len;
3307
3308 for (uint cs_pos = 0; cs_pos < cs_len; cs_pos++)
3309 {
3310 uint c = cs_buf[cs_pos] & 0xff;
3311
3312 uniq_tbl[c] = 1;
3313 }
3314 }
3315 }
3316
3317 void mp_add_cs_buf (uint *in_buf, size_t in_len, cs_t *css, int css_cnt)
3318 {
3319 cs_t *cs = &css[css_cnt];
3320
3321 size_t css_uniq_sz = CHARSIZ * sizeof (uint);
3322
3323 uint *css_uniq = (uint *) mymalloc (css_uniq_sz);
3324
3325 size_t i;
3326
3327 for (i = 0; i < cs->cs_len; i++)
3328 {
3329 const uint u = cs->cs_buf[i];
3330
3331 css_uniq[u] = 1;
3332 }
3333
3334 for (i = 0; i < in_len; i++)
3335 {
3336 uint u = in_buf[i] & 0xff;
3337
3338 if (data.opts_type & OPTS_TYPE_PT_UPPER) u = toupper (u);
3339
3340 if (css_uniq[u] == 1) continue;
3341
3342 css_uniq[u] = 1;
3343
3344 cs->cs_buf[cs->cs_len] = u;
3345
3346 cs->cs_len++;
3347 }
3348
3349 myfree (css_uniq);
3350 }
3351
3352 void mp_expand (char *in_buf, size_t in_len, cs_t *mp_sys, cs_t *mp_usr, int mp_usr_offset, int interpret)
3353 {
3354 size_t in_pos;
3355
3356 for (in_pos = 0; in_pos < in_len; in_pos++)
3357 {
3358 uint p0 = in_buf[in_pos] & 0xff;
3359
3360 if (interpret == 1 && p0 == '?')
3361 {
3362 in_pos++;
3363
3364 if (in_pos == in_len) break;
3365
3366 uint p1 = in_buf[in_pos] & 0xff;
3367
3368 switch (p1)
3369 {
3370 case 'l': mp_add_cs_buf (mp_sys[0].cs_buf, mp_sys[0].cs_len, mp_usr, mp_usr_offset);
3371 break;
3372 case 'u': mp_add_cs_buf (mp_sys[1].cs_buf, mp_sys[1].cs_len, mp_usr, mp_usr_offset);
3373 break;
3374 case 'd': mp_add_cs_buf (mp_sys[2].cs_buf, mp_sys[2].cs_len, mp_usr, mp_usr_offset);
3375 break;
3376 case 's': mp_add_cs_buf (mp_sys[3].cs_buf, mp_sys[3].cs_len, mp_usr, mp_usr_offset);
3377 break;
3378 case 'a': mp_add_cs_buf (mp_sys[4].cs_buf, mp_sys[4].cs_len, mp_usr, mp_usr_offset);
3379 break;
3380 case 'b': mp_add_cs_buf (mp_sys[5].cs_buf, mp_sys[5].cs_len, mp_usr, mp_usr_offset);
3381 break;
3382 case '1': if (mp_usr[0].cs_len == 0) { log_error ("ERROR: Custom-charset 1 is undefined\n"); exit (-1); }
3383 mp_add_cs_buf (mp_usr[0].cs_buf, mp_usr[0].cs_len, mp_usr, mp_usr_offset);
3384 break;
3385 case '2': if (mp_usr[1].cs_len == 0) { log_error ("ERROR: Custom-charset 2 is undefined\n"); exit (-1); }
3386 mp_add_cs_buf (mp_usr[1].cs_buf, mp_usr[1].cs_len, mp_usr, mp_usr_offset);
3387 break;
3388 case '3': if (mp_usr[2].cs_len == 0) { log_error ("ERROR: Custom-charset 3 is undefined\n"); exit (-1); }
3389 mp_add_cs_buf (mp_usr[2].cs_buf, mp_usr[2].cs_len, mp_usr, mp_usr_offset);
3390 break;
3391 case '4': if (mp_usr[3].cs_len == 0) { log_error ("ERROR: Custom-charset 4 is undefined\n"); exit (-1); }
3392 mp_add_cs_buf (mp_usr[3].cs_buf, mp_usr[3].cs_len, mp_usr, mp_usr_offset);
3393 break;
3394 case '?': mp_add_cs_buf (&p0, 1, mp_usr, mp_usr_offset);
3395 break;
3396 default: log_error ("Syntax error: %s", in_buf);
3397 exit (-1);
3398 }
3399 }
3400 else
3401 {
3402 if (data.hex_charset)
3403 {
3404 in_pos++;
3405
3406 if (in_pos == in_len)
3407 {
3408 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", in_buf);
3409
3410 exit (-1);
3411 }
3412
3413 uint p1 = in_buf[in_pos] & 0xff;
3414
3415 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3416 {
3417 log_error ("ERROR: invalid hex character detected in mask %s", in_buf);
3418
3419 exit (-1);
3420 }
3421
3422 uint chr = 0;
3423
3424 chr = hex_convert (p1) << 0;
3425 chr |= hex_convert (p0) << 4;
3426
3427 mp_add_cs_buf (&chr, 1, mp_usr, mp_usr_offset);
3428 }
3429 else
3430 {
3431 uint chr = p0;
3432
3433 mp_add_cs_buf (&chr, 1, mp_usr, mp_usr_offset);
3434 }
3435 }
3436 }
3437 }
3438
3439 u64 mp_get_sum (uint css_cnt, cs_t *css)
3440 {
3441 u64 sum = 1;
3442
3443 for (uint css_pos = 0; css_pos < css_cnt; css_pos++)
3444 {
3445 sum *= css[css_pos].cs_len;
3446 }
3447
3448 return (sum);
3449 }
3450
3451 cs_t *mp_gen_css (char *mask_buf, size_t mask_len, cs_t *mp_sys, cs_t *mp_usr, uint *css_cnt)
3452 {
3453 cs_t *css = (cs_t *) mycalloc (256, sizeof (cs_t));
3454
3455 uint mask_pos;
3456 uint css_pos;
3457
3458 for (mask_pos = 0, css_pos = 0; mask_pos < mask_len; mask_pos++, css_pos++)
3459 {
3460 char p0 = mask_buf[mask_pos];
3461
3462 if (p0 == '?')
3463 {
3464 mask_pos++;
3465
3466 if (mask_pos == mask_len) break;
3467
3468 char p1 = mask_buf[mask_pos];
3469
3470 uint chr = p1;
3471
3472 switch (p1)
3473 {
3474 case 'l': mp_add_cs_buf (mp_sys[0].cs_buf, mp_sys[0].cs_len, css, css_pos);
3475 break;
3476 case 'u': mp_add_cs_buf (mp_sys[1].cs_buf, mp_sys[1].cs_len, css, css_pos);
3477 break;
3478 case 'd': mp_add_cs_buf (mp_sys[2].cs_buf, mp_sys[2].cs_len, css, css_pos);
3479 break;
3480 case 's': mp_add_cs_buf (mp_sys[3].cs_buf, mp_sys[3].cs_len, css, css_pos);
3481 break;
3482 case 'a': mp_add_cs_buf (mp_sys[4].cs_buf, mp_sys[4].cs_len, css, css_pos);
3483 break;
3484 case 'b': mp_add_cs_buf (mp_sys[5].cs_buf, mp_sys[5].cs_len, css, css_pos);
3485 break;
3486 case '1': if (mp_usr[0].cs_len == 0) { log_error ("ERROR: Custom-charset 1 is undefined\n"); exit (-1); }
3487 mp_add_cs_buf (mp_usr[0].cs_buf, mp_usr[0].cs_len, css, css_pos);
3488 break;
3489 case '2': if (mp_usr[1].cs_len == 0) { log_error ("ERROR: Custom-charset 2 is undefined\n"); exit (-1); }
3490 mp_add_cs_buf (mp_usr[1].cs_buf, mp_usr[1].cs_len, css, css_pos);
3491 break;
3492 case '3': if (mp_usr[2].cs_len == 0) { log_error ("ERROR: Custom-charset 3 is undefined\n"); exit (-1); }
3493 mp_add_cs_buf (mp_usr[2].cs_buf, mp_usr[2].cs_len, css, css_pos);
3494 break;
3495 case '4': if (mp_usr[3].cs_len == 0) { log_error ("ERROR: Custom-charset 4 is undefined\n"); exit (-1); }
3496 mp_add_cs_buf (mp_usr[3].cs_buf, mp_usr[3].cs_len, css, css_pos);
3497 break;
3498 case '?': mp_add_cs_buf (&chr, 1, css, css_pos);
3499 break;
3500 default: log_error ("ERROR: syntax error: %s", mask_buf);
3501 exit (-1);
3502 }
3503 }
3504 else
3505 {
3506 if (data.hex_charset)
3507 {
3508 mask_pos++;
3509
3510 // if there is no 2nd hex character, show an error:
3511
3512 if (mask_pos == mask_len)
3513 {
3514 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", mask_buf);
3515
3516 exit (-1);
3517 }
3518
3519 char p1 = mask_buf[mask_pos];
3520
3521 // if they are not valid hex character, show an error:
3522
3523 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3524 {
3525 log_error ("ERROR: invalid hex character detected in mask %s", mask_buf);
3526
3527 exit (-1);
3528 }
3529
3530 uint chr = 0;
3531
3532 chr |= hex_convert (p1) << 0;
3533 chr |= hex_convert (p0) << 4;
3534
3535 mp_add_cs_buf (&chr, 1, css, css_pos);
3536 }
3537 else
3538 {
3539 uint chr = p0;
3540
3541 mp_add_cs_buf (&chr, 1, css, css_pos);
3542 }
3543 }
3544 }
3545
3546 if (css_pos == 0)
3547 {
3548 log_error ("ERROR: invalid mask length (0)");
3549
3550 exit (-1);
3551 }
3552
3553 *css_cnt = css_pos;
3554
3555 return (css);
3556 }
3557
3558 void mp_exec (u64 val, char *buf, cs_t *css, int css_cnt)
3559 {
3560 for (int i = 0; i < css_cnt; i++)
3561 {
3562 uint len = css[i].cs_len;
3563 u64 next = val / len;
3564 uint pos = val % len;
3565 buf[i] = (char) css[i].cs_buf[pos] & 0xff;
3566 val = next;
3567 }
3568 }
3569
3570 void mp_cut_at (char *mask, uint max)
3571 {
3572 uint i;
3573 uint j;
3574 uint mask_len = strlen (mask);
3575
3576 for (i = 0, j = 0; i < mask_len && j < max; i++, j++)
3577 {
3578 if (mask[i] == '?') i++;
3579 }
3580
3581 mask[i] = 0;
3582 }
3583
3584 void mp_setup_sys (cs_t *mp_sys)
3585 {
3586 uint pos;
3587 uint chr;
3588 uint donec[CHARSIZ] = { 0 };
3589
3590 for (pos = 0, chr = 'a'; chr <= 'z'; chr++) { donec[chr] = 1;
3591 mp_sys[0].cs_buf[pos++] = chr;
3592 mp_sys[0].cs_len = pos; }
3593
3594 for (pos = 0, chr = 'A'; chr <= 'Z'; chr++) { donec[chr] = 1;
3595 mp_sys[1].cs_buf[pos++] = chr;
3596 mp_sys[1].cs_len = pos; }
3597
3598 for (pos = 0, chr = '0'; chr <= '9'; chr++) { donec[chr] = 1;
3599 mp_sys[2].cs_buf[pos++] = chr;
3600 mp_sys[2].cs_len = pos; }
3601
3602 for (pos = 0, chr = 0x20; chr <= 0x7e; chr++) { if (donec[chr]) continue;
3603 mp_sys[3].cs_buf[pos++] = chr;
3604 mp_sys[3].cs_len = pos; }
3605
3606 for (pos = 0, chr = 0x20; chr <= 0x7e; chr++) { mp_sys[4].cs_buf[pos++] = chr;
3607 mp_sys[4].cs_len = pos; }
3608
3609 for (pos = 0, chr = 0x00; chr <= 0xff; chr++) { mp_sys[5].cs_buf[pos++] = chr;
3610 mp_sys[5].cs_len = pos; }
3611 }
3612
3613 void mp_setup_usr (cs_t *mp_sys, cs_t *mp_usr, char *buf, uint index)
3614 {
3615 FILE *fp = fopen (buf, "rb");
3616
3617 if (fp == NULL || feof (fp)) // feof() in case if file is empty
3618 {
3619 mp_expand (buf, strlen (buf), mp_sys, mp_usr, index, 1);
3620 }
3621 else
3622 {
3623 char mp_file[1024] = { 0 };
3624
3625 size_t len = fread (mp_file, 1, sizeof (mp_file) - 1, fp);
3626
3627 fclose (fp);
3628
3629 len = in_superchop (mp_file);
3630
3631 if (len == 0)
3632 {
3633 log_info ("WARNING: charset file corrupted");
3634
3635 mp_expand (buf, strlen (buf), mp_sys, mp_usr, index, 1);
3636 }
3637 else
3638 {
3639 mp_expand (mp_file, len, mp_sys, mp_usr, index, 0);
3640 }
3641 }
3642 }
3643
3644 void mp_reset_usr (cs_t *mp_usr, uint index)
3645 {
3646 mp_usr[index].cs_len = 0;
3647
3648 memset (mp_usr[index].cs_buf, 0, sizeof (mp_usr[index].cs_buf));
3649 }
3650
3651 char *mp_get_truncated_mask (char *mask_buf, size_t mask_len, uint len)
3652 {
3653 char *new_mask_buf = (char *) mymalloc (256);
3654
3655 uint mask_pos;
3656
3657 uint css_pos;
3658
3659 for (mask_pos = 0, css_pos = 0; mask_pos < mask_len; mask_pos++, css_pos++)
3660 {
3661 if (css_pos == len) break;
3662
3663 char p0 = mask_buf[mask_pos];
3664
3665 new_mask_buf[mask_pos] = p0;
3666
3667 if (p0 == '?')
3668 {
3669 mask_pos++;
3670
3671 if (mask_pos == mask_len) break;
3672
3673 new_mask_buf[mask_pos] = mask_buf[mask_pos];
3674 }
3675 else
3676 {
3677 if (data.hex_charset)
3678 {
3679 mask_pos++;
3680
3681 if (mask_pos == mask_len)
3682 {
3683 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", mask_buf);
3684
3685 exit (-1);
3686 }
3687
3688 char p1 = mask_buf[mask_pos];
3689
3690 // if they are not valid hex character, show an error:
3691
3692 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3693 {
3694 log_error ("ERROR: invalid hex character detected in mask: %s", mask_buf);
3695
3696 exit (-1);
3697 }
3698
3699 new_mask_buf[mask_pos] = p1;
3700 }
3701 }
3702 }
3703
3704 if (css_pos == len) return (new_mask_buf);
3705
3706 myfree (new_mask_buf);
3707
3708 return (NULL);
3709 }
3710
3711 /**
3712 * statprocessor
3713 */
3714
3715 u64 sp_get_sum (uint start, uint stop, cs_t *root_css_buf)
3716 {
3717 u64 sum = 1;
3718
3719 uint i;
3720
3721 for (i = start; i < stop; i++)
3722 {
3723 sum *= root_css_buf[i].cs_len;
3724 }
3725
3726 return (sum);
3727 }
3728
3729 void sp_exec (u64 ctx, char *pw_buf, cs_t *root_css_buf, cs_t *markov_css_buf, uint start, uint stop)
3730 {
3731 u64 v = ctx;
3732
3733 cs_t *cs = &root_css_buf[start];
3734
3735 uint i;
3736
3737 for (i = start; i < stop; i++)
3738 {
3739 const u64 m = v % cs->cs_len;
3740 const u64 d = v / cs->cs_len;
3741
3742 v = d;
3743
3744 const uint k = cs->cs_buf[m];
3745
3746 pw_buf[i - start] = (char) k;
3747
3748 cs = &markov_css_buf[(i * CHARSIZ) + k];
3749 }
3750 }
3751
3752 int sp_comp_val (const void *p1, const void *p2)
3753 {
3754 hcstat_table_t *b1 = (hcstat_table_t *) p1;
3755 hcstat_table_t *b2 = (hcstat_table_t *) p2;
3756
3757 return b2->val - b1->val;
3758 }
3759
3760 void sp_setup_tbl (const char *shared_dir, char *hcstat, uint disable, uint classic, hcstat_table_t *root_table_buf, hcstat_table_t *markov_table_buf)
3761 {
3762 uint i;
3763 uint j;
3764 uint k;
3765
3766 /**
3767 * Initialize hcstats
3768 */
3769
3770 u64 *root_stats_buf = (u64 *) mycalloc (SP_ROOT_CNT, sizeof (u64));
3771
3772 u64 *root_stats_ptr = root_stats_buf;
3773
3774 u64 *root_stats_buf_by_pos[SP_PW_MAX];
3775
3776 for (i = 0; i < SP_PW_MAX; i++)
3777 {
3778 root_stats_buf_by_pos[i] = root_stats_ptr;
3779
3780 root_stats_ptr += CHARSIZ;
3781 }
3782
3783 u64 *markov_stats_buf = (u64 *) mycalloc (SP_MARKOV_CNT, sizeof (u64));
3784
3785 u64 *markov_stats_ptr = markov_stats_buf;
3786
3787 u64 *markov_stats_buf_by_key[SP_PW_MAX][CHARSIZ];
3788
3789 for (i = 0; i < SP_PW_MAX; i++)
3790 {
3791 for (j = 0; j < CHARSIZ; j++)
3792 {
3793 markov_stats_buf_by_key[i][j] = markov_stats_ptr;
3794
3795 markov_stats_ptr += CHARSIZ;
3796 }
3797 }
3798
3799 /**
3800 * Load hcstats File
3801 */
3802
3803 if (hcstat == NULL)
3804 {
3805 char hcstat_tmp[256] = { 0 };
3806
3807 snprintf (hcstat_tmp, sizeof (hcstat_tmp) - 1, "%s/%s", shared_dir, SP_HCSTAT);
3808
3809 hcstat = hcstat_tmp;
3810 }
3811
3812 FILE *fd = fopen (hcstat, "rb");
3813
3814 if (fd == NULL)
3815 {
3816 log_error ("%s: %s", hcstat, strerror (errno));
3817
3818 exit (-1);
3819 }
3820
3821 if (fread (root_stats_buf, sizeof (u64), SP_ROOT_CNT, fd) != SP_ROOT_CNT)
3822 {
3823 log_error ("%s: Could not load data", hcstat);
3824
3825 fclose (fd);
3826
3827 exit (-1);
3828 }
3829
3830 if (fread (markov_stats_buf, sizeof (u64), SP_MARKOV_CNT, fd) != SP_MARKOV_CNT)
3831 {
3832 log_error ("%s: Could not load data", hcstat);
3833
3834 fclose (fd);
3835
3836 exit (-1);
3837 }
3838
3839 fclose (fd);
3840
3841 /**
3842 * Markov modifier of hcstat_table on user request
3843 */
3844
3845 if (disable)
3846 {
3847 memset (root_stats_buf, 0, SP_ROOT_CNT * sizeof (u64));
3848 memset (markov_stats_buf, 0, SP_MARKOV_CNT * sizeof (u64));
3849 }
3850
3851 if (classic)
3852 {
3853 /* Add all stats to first position */
3854
3855 for (i = 1; i < SP_PW_MAX; i++)
3856 {
3857 u64 *out = root_stats_buf_by_pos[0];
3858 u64 *in = root_stats_buf_by_pos[i];
3859
3860 for (j = 0; j < CHARSIZ; j++)
3861 {
3862 *out++ += *in++;
3863 }
3864 }
3865
3866 for (i = 1; i < SP_PW_MAX; i++)
3867 {
3868 u64 *out = markov_stats_buf_by_key[0][0];
3869 u64 *in = markov_stats_buf_by_key[i][0];
3870
3871 for (j = 0; j < CHARSIZ; j++)
3872 {
3873 for (k = 0; k < CHARSIZ; k++)
3874 {
3875 *out++ += *in++;
3876 }
3877 }
3878 }
3879
3880 /* copy them to all pw_positions */
3881
3882 for (i = 1; i < SP_PW_MAX; i++)
3883 {
3884 memcpy (root_stats_buf_by_pos[i], root_stats_buf_by_pos[0], CHARSIZ * sizeof (u64));
3885 }
3886
3887 for (i = 1; i < SP_PW_MAX; i++)
3888 {
3889 memcpy (markov_stats_buf_by_key[i][0], markov_stats_buf_by_key[0][0], CHARSIZ * CHARSIZ * sizeof (u64));
3890 }
3891 }
3892
3893 /**
3894 * Initialize tables
3895 */
3896
3897 hcstat_table_t *root_table_ptr = root_table_buf;
3898
3899 hcstat_table_t *root_table_buf_by_pos[SP_PW_MAX];
3900
3901 for (i = 0; i < SP_PW_MAX; i++)
3902 {
3903 root_table_buf_by_pos[i] = root_table_ptr;
3904
3905 root_table_ptr += CHARSIZ;
3906 }
3907
3908 hcstat_table_t *markov_table_ptr = markov_table_buf;
3909
3910 hcstat_table_t *markov_table_buf_by_key[SP_PW_MAX][CHARSIZ];
3911
3912 for (i = 0; i < SP_PW_MAX; i++)
3913 {
3914 for (j = 0; j < CHARSIZ; j++)
3915 {
3916 markov_table_buf_by_key[i][j] = markov_table_ptr;
3917
3918 markov_table_ptr += CHARSIZ;
3919 }
3920 }
3921
3922 /**
3923 * Convert hcstat to tables
3924 */
3925
3926 for (i = 0; i < SP_ROOT_CNT; i++)
3927 {
3928 uint key = i % CHARSIZ;
3929
3930 root_table_buf[i].key = key;
3931 root_table_buf[i].val = root_stats_buf[i];
3932 }
3933
3934 for (i = 0; i < SP_MARKOV_CNT; i++)
3935 {
3936 uint key = i % CHARSIZ;
3937
3938 markov_table_buf[i].key = key;
3939 markov_table_buf[i].val = markov_stats_buf[i];
3940 }
3941
3942 myfree (root_stats_buf);
3943 myfree (markov_stats_buf);
3944
3945 /**
3946 * Finally sort them
3947 */
3948
3949 for (i = 0; i < SP_PW_MAX; i++)
3950 {
3951 qsort (root_table_buf_by_pos[i], CHARSIZ, sizeof (hcstat_table_t), sp_comp_val);
3952 }
3953
3954 for (i = 0; i < SP_PW_MAX; i++)
3955 {
3956 for (j = 0; j < CHARSIZ; j++)
3957 {
3958 qsort (markov_table_buf_by_key[i][j], CHARSIZ, sizeof (hcstat_table_t), sp_comp_val);
3959 }
3960 }
3961 }
3962
3963 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])
3964 {
3965 /**
3966 * Convert tables to css
3967 */
3968
3969 for (uint i = 0; i < SP_ROOT_CNT; i++)
3970 {
3971 uint pw_pos = i / CHARSIZ;
3972
3973 cs_t *cs = &root_css_buf[pw_pos];
3974
3975 if (cs->cs_len == threshold) continue;
3976
3977 uint key = root_table_buf[i].key;
3978
3979 if (uniq_tbls[pw_pos][key] == 0) continue;
3980
3981 cs->cs_buf[cs->cs_len] = key;
3982
3983 cs->cs_len++;
3984 }
3985
3986 /**
3987 * Convert table to css
3988 */
3989
3990 for (uint i = 0; i < SP_MARKOV_CNT; i++)
3991 {
3992 uint c = i / CHARSIZ;
3993
3994 cs_t *cs = &markov_css_buf[c];
3995
3996 if (cs->cs_len == threshold) continue;
3997
3998 uint pw_pos = c / CHARSIZ;
3999
4000 uint key = markov_table_buf[i].key;
4001
4002 if ((pw_pos + 1) < SP_PW_MAX) if (uniq_tbls[pw_pos + 1][key] == 0) continue;
4003
4004 cs->cs_buf[cs->cs_len] = key;
4005
4006 cs->cs_len++;
4007 }
4008
4009 /*
4010 for (uint i = 0; i < 8; i++)
4011 {
4012 for (uint j = 0x20; j < 0x80; j++)
4013 {
4014 cs_t *ptr = &markov_css_buf[(i * CHARSIZ) + j];
4015
4016 printf ("pos:%u key:%u len:%u\n", i, j, ptr->cs_len);
4017
4018 for (uint k = 0; k < 10; k++)
4019 {
4020 printf (" %u\n", ptr->cs_buf[k]);
4021 }
4022 }
4023 }
4024 */
4025 }
4026
4027 void sp_stretch_root (hcstat_table_t *in, hcstat_table_t *out)
4028 {
4029 for (uint i = 0; i < SP_PW_MAX; i += 2)
4030 {
4031 memcpy (out, in, CHARSIZ * sizeof (hcstat_table_t));
4032
4033 out += CHARSIZ;
4034 in += CHARSIZ;
4035
4036 out->key = 0;
4037 out->val = 1;
4038
4039 out++;
4040
4041 for (uint j = 1; j < CHARSIZ; j++)
4042 {
4043 out->key = j;
4044 out->val = 0;
4045
4046 out++;
4047 }
4048 }
4049 }
4050
4051 void sp_stretch_markov (hcstat_table_t *in, hcstat_table_t *out)
4052 {
4053 for (uint i = 0; i < SP_PW_MAX; i += 2)
4054 {
4055 memcpy (out, in, CHARSIZ * CHARSIZ * sizeof (hcstat_table_t));
4056
4057 out += CHARSIZ * CHARSIZ;
4058 in += CHARSIZ * CHARSIZ;
4059
4060 for (uint j = 0; j < CHARSIZ; j++)
4061 {
4062 out->key = 0;
4063 out->val = 1;
4064
4065 out++;
4066
4067 for (uint k = 1; k < CHARSIZ; k++)
4068 {
4069 out->key = k;
4070 out->val = 0;
4071
4072 out++;
4073 }
4074 }
4075 }
4076 }
4077
4078 /**
4079 * mixed shared functions
4080 */
4081
4082 void dump_hex (const u8 *s, const int sz)
4083 {
4084 for (int i = 0; i < sz; i++)
4085 {
4086 log_info_nn ("%02x ", s[i]);
4087 }
4088
4089 log_info ("");
4090 }
4091
4092 void usage_mini_print (const char *progname)
4093 {
4094 for (uint i = 0; USAGE_MINI[i] != NULL; i++) log_info (USAGE_MINI[i], progname);
4095 }
4096
4097 void usage_big_print (const char *progname)
4098 {
4099 for (uint i = 0; USAGE_BIG[i] != NULL; i++) log_info (USAGE_BIG[i], progname);
4100 }
4101
4102 char *get_exec_path ()
4103 {
4104 int exec_path_len = 1024;
4105
4106 char *exec_path = (char *) mymalloc (exec_path_len);
4107
4108 #ifdef LINUX
4109
4110 char tmp[32] = { 0 };
4111
4112 snprintf (tmp, sizeof (tmp) - 1, "/proc/%d/exe", getpid ());
4113
4114 const int len = readlink (tmp, exec_path, exec_path_len - 1);
4115
4116 #elif WIN
4117
4118 const int len = GetModuleFileName (NULL, exec_path, exec_path_len - 1);
4119
4120 #elif OSX
4121
4122 uint size = exec_path_len;
4123
4124 if (_NSGetExecutablePath (exec_path, &size) != 0)
4125 {
4126 log_error("! executable path buffer too small\n");
4127
4128 exit (-1);
4129 }
4130
4131 const int len = strlen (exec_path);
4132
4133 #else
4134 #error Your Operating System is not supported or detected
4135 #endif
4136
4137 exec_path[len] = 0;
4138
4139 return exec_path;
4140 }
4141
4142 char *get_install_dir (const char *progname)
4143 {
4144 char *install_dir = mystrdup (progname);
4145 char *last_slash = NULL;
4146
4147 if ((last_slash = strrchr (install_dir, '/')) != NULL)
4148 {
4149 *last_slash = 0;
4150 }
4151 else if ((last_slash = strrchr (install_dir, '\\')) != NULL)
4152 {
4153 *last_slash = 0;
4154 }
4155 else
4156 {
4157 install_dir[0] = '.';
4158 install_dir[1] = 0;
4159 }
4160
4161 return (install_dir);
4162 }
4163
4164 char *get_profile_dir (const char *homedir)
4165 {
4166 #define DOT_HASHCAT ".hashcat"
4167
4168 size_t len = strlen (homedir) + 1 + strlen (DOT_HASHCAT) + 1;
4169
4170 char *profile_dir = (char *) mymalloc (len + 1);
4171
4172 snprintf (profile_dir, len, "%s/%s", homedir, DOT_HASHCAT);
4173
4174 return profile_dir;
4175 }
4176
4177 char *get_session_dir (const char *profile_dir)
4178 {
4179 #define SESSIONS_FOLDER "sessions"
4180
4181 size_t len = strlen (profile_dir) + 1 + strlen (SESSIONS_FOLDER) + 1;
4182
4183 char *session_dir = (char *) mymalloc (len + 1);
4184
4185 snprintf (session_dir, len, "%s/%s", profile_dir, SESSIONS_FOLDER);
4186
4187 return session_dir;
4188 }
4189
4190 uint count_lines (FILE *fd)
4191 {
4192 uint cnt = 0;
4193
4194 char *buf = (char *) mymalloc (BUFSIZ + 1);
4195
4196 char prev = '\n';
4197
4198 while (!feof (fd))
4199 {
4200 size_t nread = fread (buf, sizeof (char), BUFSIZ, fd);
4201
4202 if (nread < 1) continue;
4203
4204 size_t i;
4205
4206 for (i = 0; i < nread; i++)
4207 {
4208 if (prev == '\n') cnt++;
4209
4210 prev = buf[i];
4211 }
4212 }
4213
4214 myfree (buf);
4215
4216 return cnt;
4217 }
4218
4219 void truecrypt_crc32 (const char *filename, u8 keytab[64])
4220 {
4221 uint crc = ~0;
4222
4223 FILE *fd = fopen (filename, "rb");
4224
4225 if (fd == NULL)
4226 {
4227 log_error ("%s: %s", filename, strerror (errno));
4228
4229 exit (-1);
4230 }
4231
4232 #define MAX_KEY_SIZE (1024 * 1024)
4233
4234 u8 *buf = (u8 *) mymalloc (MAX_KEY_SIZE + 1);
4235
4236 int nread = fread (buf, sizeof (u8), MAX_KEY_SIZE, fd);
4237
4238 fclose (fd);
4239
4240 int kpos = 0;
4241
4242 for (int fpos = 0; fpos < nread; fpos++)
4243 {
4244 crc = crc32tab[(crc ^ buf[fpos]) & 0xff] ^ (crc >> 8);
4245
4246 keytab[kpos++] += (crc >> 24) & 0xff;
4247 keytab[kpos++] += (crc >> 16) & 0xff;
4248 keytab[kpos++] += (crc >> 8) & 0xff;
4249 keytab[kpos++] += (crc >> 0) & 0xff;
4250
4251 if (kpos >= 64) kpos = 0;
4252 }
4253
4254 myfree (buf);
4255 }
4256
4257 #ifdef OSX
4258 int pthread_setaffinity_np (pthread_t thread, size_t cpu_size, cpu_set_t *cpu_set)
4259 {
4260 int core;
4261
4262 for (core = 0; core < (8 * (int)cpu_size); core++)
4263 if (CPU_ISSET(core, cpu_set)) break;
4264
4265 thread_affinity_policy_data_t policy = { core };
4266
4267 const int rc = thread_policy_set (pthread_mach_thread_np (thread), THREAD_AFFINITY_POLICY, (thread_policy_t) &policy, 1);
4268
4269 if (data.quiet == 0)
4270 {
4271 if (rc != KERN_SUCCESS)
4272 {
4273 log_error ("ERROR: %s : %d", "thread_policy_set()", rc);
4274 }
4275 }
4276
4277 return rc;
4278 }
4279 #endif
4280
4281 void set_cpu_affinity (char *cpu_affinity)
4282 {
4283 #ifdef WIN
4284 DWORD_PTR aff_mask = 0;
4285 #elif _POSIX
4286 cpu_set_t cpuset;
4287 CPU_ZERO (&cpuset);
4288 #endif
4289
4290 if (cpu_affinity)
4291 {
4292 char *devices = strdup (cpu_affinity);
4293
4294 char *next = strtok (devices, ",");
4295
4296 do
4297 {
4298 uint cpu_id = atoi (next);
4299
4300 if (cpu_id == 0)
4301 {
4302 #ifdef WIN
4303 aff_mask = 0;
4304 #elif _POSIX
4305 CPU_ZERO (&cpuset);
4306 #endif
4307
4308 break;
4309 }
4310
4311 if (cpu_id > 32)
4312 {
4313 log_error ("ERROR: invalid cpu_id %u specified", cpu_id);
4314
4315 exit (-1);
4316 }
4317
4318 #ifdef WIN
4319 aff_mask |= 1 << (cpu_id - 1);
4320 #elif _POSIX
4321 CPU_SET ((cpu_id - 1), &cpuset);
4322 #endif
4323
4324 } while ((next = strtok (NULL, ",")) != NULL);
4325
4326 free (devices);
4327 }
4328
4329 #ifdef WIN
4330 SetProcessAffinityMask (GetCurrentProcess (), aff_mask);
4331 SetThreadAffinityMask (GetCurrentThread (), aff_mask);
4332 #elif _POSIX
4333 pthread_t thread = pthread_self ();
4334 pthread_setaffinity_np (thread, sizeof (cpu_set_t), &cpuset);
4335 #endif
4336 }
4337
4338 void *rulefind (const void *key, void *base, int nmemb, size_t size, int (*compar) (const void *, const void *))
4339 {
4340 char *element, *end;
4341
4342 end = (char *) base + nmemb * size;
4343
4344 for (element = (char *) base; element < end; element += size)
4345 if (!compar (element, key))
4346 return element;
4347
4348 return NULL;
4349 }
4350
4351 int sort_by_salt (const void *v1, const void *v2)
4352 {
4353 const salt_t *s1 = (const salt_t *) v1;
4354 const salt_t *s2 = (const salt_t *) v2;
4355
4356 const int res1 = s1->salt_len - s2->salt_len;
4357
4358 if (res1 != 0) return (res1);
4359
4360 const int res2 = s1->salt_iter - s2->salt_iter;
4361
4362 if (res2 != 0) return (res2);
4363
4364 uint n;
4365
4366 n = 16;
4367
4368 while (n--)
4369 {
4370 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4371 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4372 }
4373
4374 n = 8;
4375
4376 while (n--)
4377 {
4378 if (s1->salt_buf_pc[n] > s2->salt_buf_pc[n]) return ( 1);
4379 if (s1->salt_buf_pc[n] < s2->salt_buf_pc[n]) return (-1);
4380 }
4381
4382 return (0);
4383 }
4384
4385 int sort_by_salt_buf (const void *v1, const void *v2)
4386 {
4387 const pot_t *p1 = (const pot_t *) v1;
4388 const pot_t *p2 = (const pot_t *) v2;
4389
4390 const hash_t *h1 = &p1->hash;
4391 const hash_t *h2 = &p2->hash;
4392
4393 const salt_t *s1 = h1->salt;
4394 const salt_t *s2 = h2->salt;
4395
4396 uint n = 16;
4397
4398 while (n--)
4399 {
4400 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4401 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4402 }
4403
4404 return 0;
4405 }
4406
4407 int sort_by_hash_t_salt (const void *v1, const void *v2)
4408 {
4409 const hash_t *h1 = (const hash_t *) v1;
4410 const hash_t *h2 = (const hash_t *) v2;
4411
4412 const salt_t *s1 = h1->salt;
4413 const salt_t *s2 = h2->salt;
4414
4415 // testphase: this should work
4416 uint n = 16;
4417
4418 while (n--)
4419 {
4420 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4421 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4422 }
4423
4424 /* original code, seems buggy since salt_len can be very big (had a case with 131 len)
4425 also it thinks salt_buf[x] is a char but its a uint so salt_len should be / 4
4426 if (s1->salt_len > s2->salt_len) return ( 1);
4427 if (s1->salt_len < s2->salt_len) return (-1);
4428
4429 uint n = s1->salt_len;
4430
4431 while (n--)
4432 {
4433 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4434 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4435 }
4436 */
4437
4438 return 0;
4439 }
4440
4441 int sort_by_hash_t_salt_hccap (const void *v1, const void *v2)
4442 {
4443 const hash_t *h1 = (const hash_t *) v1;
4444 const hash_t *h2 = (const hash_t *) v2;
4445
4446 const salt_t *s1 = h1->salt;
4447 const salt_t *s2 = h2->salt;
4448
4449 // 16 - 2 (since last 2 uints contain the digest)
4450 uint n = 14;
4451
4452 while (n--)
4453 {
4454 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4455 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4456 }
4457
4458 return 0;
4459 }
4460
4461 int sort_by_hash_no_salt (const void *v1, const void *v2)
4462 {
4463 const hash_t *h1 = (const hash_t *) v1;
4464 const hash_t *h2 = (const hash_t *) v2;
4465
4466 const void *d1 = h1->digest;
4467 const void *d2 = h2->digest;
4468
4469 return data.sort_by_digest (d1, d2);
4470 }
4471
4472 int sort_by_hash (const void *v1, const void *v2)
4473 {
4474 const hash_t *h1 = (const hash_t *) v1;
4475 const hash_t *h2 = (const hash_t *) v2;
4476
4477 if (data.isSalted)
4478 {
4479 const salt_t *s1 = h1->salt;
4480 const salt_t *s2 = h2->salt;
4481
4482 int res = sort_by_salt (s1, s2);
4483
4484 if (res != 0) return (res);
4485 }
4486
4487 const void *d1 = h1->digest;
4488 const void *d2 = h2->digest;
4489
4490 return data.sort_by_digest (d1, d2);
4491 }
4492
4493 int sort_by_pot (const void *v1, const void *v2)
4494 {
4495 const pot_t *p1 = (const pot_t *) v1;
4496 const pot_t *p2 = (const pot_t *) v2;
4497
4498 const hash_t *h1 = &p1->hash;
4499 const hash_t *h2 = &p2->hash;
4500
4501 return sort_by_hash (h1, h2);
4502 }
4503
4504 int sort_by_mtime (const void *p1, const void *p2)
4505 {
4506 const char **f1 = (const char **) p1;
4507 const char **f2 = (const char **) p2;
4508
4509 struct stat s1; stat (*f1, &s1);
4510 struct stat s2; stat (*f2, &s2);
4511
4512 return s2.st_mtime - s1.st_mtime;
4513 }
4514
4515 int sort_by_cpu_rule (const void *p1, const void *p2)
4516 {
4517 const cpu_rule_t *r1 = (const cpu_rule_t *) p1;
4518 const cpu_rule_t *r2 = (const cpu_rule_t *) p2;
4519
4520 return memcmp (r1, r2, sizeof (cpu_rule_t));
4521 }
4522
4523 int sort_by_kernel_rule (const void *p1, const void *p2)
4524 {
4525 const kernel_rule_t *r1 = (const kernel_rule_t *) p1;
4526 const kernel_rule_t *r2 = (const kernel_rule_t *) p2;
4527
4528 return memcmp (r1, r2, sizeof (kernel_rule_t));
4529 }
4530
4531 int sort_by_stringptr (const void *p1, const void *p2)
4532 {
4533 const char **s1 = (const char **) p1;
4534 const char **s2 = (const char **) p2;
4535
4536 return strcmp (*s1, *s2);
4537 }
4538
4539 int sort_by_dictstat (const void *s1, const void *s2)
4540 {
4541 dictstat_t *d1 = (dictstat_t *) s1;
4542 dictstat_t *d2 = (dictstat_t *) s2;
4543
4544 #ifdef LINUX
4545 d2->stat.st_atim = d1->stat.st_atim;
4546 #else
4547 d2->stat.st_atime = d1->stat.st_atime;
4548 #endif
4549
4550 return memcmp (&d1->stat, &d2->stat, sizeof (struct stat));
4551 }
4552
4553 int sort_by_bitmap (const void *p1, const void *p2)
4554 {
4555 const bitmap_result_t *b1 = (const bitmap_result_t *) p1;
4556 const bitmap_result_t *b2 = (const bitmap_result_t *) p2;
4557
4558 return b1->collisions - b2->collisions;
4559 }
4560
4561 int sort_by_digest_4_2 (const void *v1, const void *v2)
4562 {
4563 const u32 *d1 = (const u32 *) v1;
4564 const u32 *d2 = (const u32 *) v2;
4565
4566 uint n = 2;
4567
4568 while (n--)
4569 {
4570 if (d1[n] > d2[n]) return ( 1);
4571 if (d1[n] < d2[n]) return (-1);
4572 }
4573
4574 return (0);
4575 }
4576
4577 int sort_by_digest_4_4 (const void *v1, const void *v2)
4578 {
4579 const u32 *d1 = (const u32 *) v1;
4580 const u32 *d2 = (const u32 *) v2;
4581
4582 uint n = 4;
4583
4584 while (n--)
4585 {
4586 if (d1[n] > d2[n]) return ( 1);
4587 if (d1[n] < d2[n]) return (-1);
4588 }
4589
4590 return (0);
4591 }
4592
4593 int sort_by_digest_4_5 (const void *v1, const void *v2)
4594 {
4595 const u32 *d1 = (const u32 *) v1;
4596 const u32 *d2 = (const u32 *) v2;
4597
4598 uint n = 5;
4599
4600 while (n--)
4601 {
4602 if (d1[n] > d2[n]) return ( 1);
4603 if (d1[n] < d2[n]) return (-1);
4604 }
4605
4606 return (0);
4607 }
4608
4609 int sort_by_digest_4_6 (const void *v1, const void *v2)
4610 {
4611 const u32 *d1 = (const u32 *) v1;
4612 const u32 *d2 = (const u32 *) v2;
4613
4614 uint n = 6;
4615
4616 while (n--)
4617 {
4618 if (d1[n] > d2[n]) return ( 1);
4619 if (d1[n] < d2[n]) return (-1);
4620 }
4621
4622 return (0);
4623 }
4624
4625 int sort_by_digest_4_8 (const void *v1, const void *v2)
4626 {
4627 const u32 *d1 = (const u32 *) v1;
4628 const u32 *d2 = (const u32 *) v2;
4629
4630 uint n = 8;
4631
4632 while (n--)
4633 {
4634 if (d1[n] > d2[n]) return ( 1);
4635 if (d1[n] < d2[n]) return (-1);
4636 }
4637
4638 return (0);
4639 }
4640
4641 int sort_by_digest_4_16 (const void *v1, const void *v2)
4642 {
4643 const u32 *d1 = (const u32 *) v1;
4644 const u32 *d2 = (const u32 *) v2;
4645
4646 uint n = 16;
4647
4648 while (n--)
4649 {
4650 if (d1[n] > d2[n]) return ( 1);
4651 if (d1[n] < d2[n]) return (-1);
4652 }
4653
4654 return (0);
4655 }
4656
4657 int sort_by_digest_4_32 (const void *v1, const void *v2)
4658 {
4659 const u32 *d1 = (const u32 *) v1;
4660 const u32 *d2 = (const u32 *) v2;
4661
4662 uint n = 32;
4663
4664 while (n--)
4665 {
4666 if (d1[n] > d2[n]) return ( 1);
4667 if (d1[n] < d2[n]) return (-1);
4668 }
4669
4670 return (0);
4671 }
4672
4673 int sort_by_digest_4_64 (const void *v1, const void *v2)
4674 {
4675 const u32 *d1 = (const u32 *) v1;
4676 const u32 *d2 = (const u32 *) v2;
4677
4678 uint n = 64;
4679
4680 while (n--)
4681 {
4682 if (d1[n] > d2[n]) return ( 1);
4683 if (d1[n] < d2[n]) return (-1);
4684 }
4685
4686 return (0);
4687 }
4688
4689 int sort_by_digest_8_8 (const void *v1, const void *v2)
4690 {
4691 const u64 *d1 = (const u64 *) v1;
4692 const u64 *d2 = (const u64 *) v2;
4693
4694 uint n = 8;
4695
4696 while (n--)
4697 {
4698 if (d1[n] > d2[n]) return ( 1);
4699 if (d1[n] < d2[n]) return (-1);
4700 }
4701
4702 return (0);
4703 }
4704
4705 int sort_by_digest_8_16 (const void *v1, const void *v2)
4706 {
4707 const u64 *d1 = (const u64 *) v1;
4708 const u64 *d2 = (const u64 *) v2;
4709
4710 uint n = 16;
4711
4712 while (n--)
4713 {
4714 if (d1[n] > d2[n]) return ( 1);
4715 if (d1[n] < d2[n]) return (-1);
4716 }
4717
4718 return (0);
4719 }
4720
4721 int sort_by_digest_8_25 (const void *v1, const void *v2)
4722 {
4723 const u64 *d1 = (const u64 *) v1;
4724 const u64 *d2 = (const u64 *) v2;
4725
4726 uint n = 25;
4727
4728 while (n--)
4729 {
4730 if (d1[n] > d2[n]) return ( 1);
4731 if (d1[n] < d2[n]) return (-1);
4732 }
4733
4734 return (0);
4735 }
4736
4737 int sort_by_digest_p0p1 (const void *v1, const void *v2)
4738 {
4739 const u32 *d1 = (const u32 *) v1;
4740 const u32 *d2 = (const u32 *) v2;
4741
4742 const uint dgst_pos0 = data.dgst_pos0;
4743 const uint dgst_pos1 = data.dgst_pos1;
4744 const uint dgst_pos2 = data.dgst_pos2;
4745 const uint dgst_pos3 = data.dgst_pos3;
4746
4747 if (d1[dgst_pos3] > d2[dgst_pos3]) return ( 1);
4748 if (d1[dgst_pos3] < d2[dgst_pos3]) return (-1);
4749 if (d1[dgst_pos2] > d2[dgst_pos2]) return ( 1);
4750 if (d1[dgst_pos2] < d2[dgst_pos2]) return (-1);
4751 if (d1[dgst_pos1] > d2[dgst_pos1]) return ( 1);
4752 if (d1[dgst_pos1] < d2[dgst_pos1]) return (-1);
4753 if (d1[dgst_pos0] > d2[dgst_pos0]) return ( 1);
4754 if (d1[dgst_pos0] < d2[dgst_pos0]) return (-1);
4755
4756 return (0);
4757 }
4758
4759 int sort_by_tuning_db_alias (const void *v1, const void *v2)
4760 {
4761 const tuning_db_alias_t *t1 = (const tuning_db_alias_t *) v1;
4762 const tuning_db_alias_t *t2 = (const tuning_db_alias_t *) v2;
4763
4764 const int res1 = strcmp (t1->device_name, t2->device_name);
4765
4766 if (res1 != 0) return (res1);
4767
4768 return 0;
4769 }
4770
4771 int sort_by_tuning_db_entry (const void *v1, const void *v2)
4772 {
4773 const tuning_db_entry_t *t1 = (const tuning_db_entry_t *) v1;
4774 const tuning_db_entry_t *t2 = (const tuning_db_entry_t *) v2;
4775
4776 const int res1 = strcmp (t1->device_name, t2->device_name);
4777
4778 if (res1 != 0) return (res1);
4779
4780 const int res2 = t1->attack_mode
4781 - t2->attack_mode;
4782
4783 if (res2 != 0) return (res2);
4784
4785 const int res3 = t1->hash_type
4786 - t2->hash_type;
4787
4788 if (res3 != 0) return (res3);
4789
4790 return 0;
4791 }
4792
4793 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)
4794 {
4795 uint outfile_autohex = data.outfile_autohex;
4796
4797 unsigned char *rule_ptr = (unsigned char *) rule_buf;
4798
4799 FILE *debug_fp = NULL;
4800
4801 if (debug_file != NULL)
4802 {
4803 debug_fp = fopen (debug_file, "ab");
4804
4805 lock_file (debug_fp);
4806 }
4807 else
4808 {
4809 debug_fp = stderr;
4810 }
4811
4812 if (debug_fp == NULL)
4813 {
4814 log_info ("WARNING: Could not open debug-file for writing");
4815 }
4816 else
4817 {
4818 if ((debug_mode == 2) || (debug_mode == 3) || (debug_mode == 4))
4819 {
4820 format_plain (debug_fp, orig_plain_ptr, orig_plain_len, outfile_autohex);
4821
4822 if ((debug_mode == 3) || (debug_mode == 4)) fputc (':', debug_fp);
4823 }
4824
4825 fwrite (rule_ptr, rule_len, 1, debug_fp);
4826
4827 if (debug_mode == 4)
4828 {
4829 fputc (':', debug_fp);
4830
4831 format_plain (debug_fp, mod_plain_ptr, mod_plain_len, outfile_autohex);
4832 }
4833
4834 fputc ('\n', debug_fp);
4835
4836 if (debug_file != NULL) fclose (debug_fp);
4837 }
4838 }
4839
4840 void format_plain (FILE *fp, unsigned char *plain_ptr, uint plain_len, uint outfile_autohex)
4841 {
4842 int needs_hexify = 0;
4843
4844 if (outfile_autohex == 1)
4845 {
4846 for (uint i = 0; i < plain_len; i++)
4847 {
4848 if (plain_ptr[i] < 0x20)
4849 {
4850 needs_hexify = 1;
4851
4852 break;
4853 }
4854
4855 if (plain_ptr[i] > 0x7f)
4856 {
4857 needs_hexify = 1;
4858
4859 break;
4860 }
4861 }
4862 }
4863
4864 if (needs_hexify == 1)
4865 {
4866 fprintf (fp, "$HEX[");
4867
4868 for (uint i = 0; i < plain_len; i++)
4869 {
4870 fprintf (fp, "%02x", plain_ptr[i]);
4871 }
4872
4873 fprintf (fp, "]");
4874 }
4875 else
4876 {
4877 fwrite (plain_ptr, plain_len, 1, fp);
4878 }
4879 }
4880
4881 void format_output (FILE *out_fp, char *out_buf, unsigned char *plain_ptr, const uint plain_len, const u64 crackpos, unsigned char *username, const uint user_len)
4882 {
4883 uint outfile_format = data.outfile_format;
4884
4885 char separator = data.separator;
4886
4887 if (outfile_format & OUTFILE_FMT_HASH)
4888 {
4889 fprintf (out_fp, "%s", out_buf);
4890
4891 if (outfile_format & (OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
4892 {
4893 fputc (separator, out_fp);
4894 }
4895 }
4896 else if (data.username)
4897 {
4898 if (username != NULL)
4899 {
4900 for (uint i = 0; i < user_len; i++)
4901 {
4902 fprintf (out_fp, "%c", username[i]);
4903 }
4904
4905 if (outfile_format & (OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
4906 {
4907 fputc (separator, out_fp);
4908 }
4909 }
4910 }
4911
4912 if (outfile_format & OUTFILE_FMT_PLAIN)
4913 {
4914 format_plain (out_fp, plain_ptr, plain_len, data.outfile_autohex);
4915
4916 if (outfile_format & (OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
4917 {
4918 fputc (separator, out_fp);
4919 }
4920 }
4921
4922 if (outfile_format & OUTFILE_FMT_HEXPLAIN)
4923 {
4924 for (uint i = 0; i < plain_len; i++)
4925 {
4926 fprintf (out_fp, "%02x", plain_ptr[i]);
4927 }
4928
4929 if (outfile_format & (OUTFILE_FMT_CRACKPOS))
4930 {
4931 fputc (separator, out_fp);
4932 }
4933 }
4934
4935 if (outfile_format & OUTFILE_FMT_CRACKPOS)
4936 {
4937 #ifdef _WIN
4938 __mingw_fprintf (out_fp, "%llu", crackpos);
4939 #endif
4940
4941 #ifdef _POSIX
4942 #ifdef __x86_64__
4943 fprintf (out_fp, "%lu", (unsigned long) crackpos);
4944 #else
4945 fprintf (out_fp, "%llu", crackpos);
4946 #endif
4947 #endif
4948 }
4949
4950 fputc ('\n', out_fp);
4951 }
4952
4953 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)
4954 {
4955 pot_t pot_key;
4956
4957 pot_key.hash.salt = hashes_buf->salt;
4958 pot_key.hash.digest = hashes_buf->digest;
4959
4960 pot_t *pot_ptr = (pot_t *) bsearch (&pot_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
4961
4962 if (pot_ptr)
4963 {
4964 log_info_nn ("");
4965
4966 input_buf[input_len] = 0;
4967
4968 // user
4969 unsigned char *username = NULL;
4970 uint user_len = 0;
4971
4972 if (data.username)
4973 {
4974 user_t *user = hashes_buf->hash_info->user;
4975
4976 if (user)
4977 {
4978 username = (unsigned char *) (user->user_name);
4979
4980 user_len = user->user_len;
4981 }
4982 }
4983
4984 // do output the line
4985 format_output (out_fp, input_buf, (unsigned char *) pot_ptr->plain_buf, pot_ptr->plain_len, 0, username, user_len);
4986 }
4987 }
4988
4989 #define LM_WEAK_HASH "\x4e\xcf\x0d\x0c\x0a\xe2\xfb\xc1"
4990 #define LM_MASKED_PLAIN "[notfound]"
4991
4992 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)
4993 {
4994 // left
4995
4996 pot_t pot_left_key;
4997
4998 pot_left_key.hash.salt = hash_left->salt;
4999 pot_left_key.hash.digest = hash_left->digest;
5000
5001 pot_t *pot_left_ptr = (pot_t *) bsearch (&pot_left_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5002
5003 // right
5004
5005 uint weak_hash_found = 0;
5006
5007 pot_t pot_right_key;
5008
5009 pot_right_key.hash.salt = hash_right->salt;
5010 pot_right_key.hash.digest = hash_right->digest;
5011
5012 pot_t *pot_right_ptr = (pot_t *) bsearch (&pot_right_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5013
5014 if (pot_right_ptr == NULL)
5015 {
5016 // special case, if "weak hash"
5017
5018 if (memcmp (hash_right->digest, LM_WEAK_HASH, 8) == 0)
5019 {
5020 weak_hash_found = 1;
5021
5022 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5023
5024 // in theory this is not needed, but we are paranoia:
5025
5026 memset (pot_right_ptr->plain_buf, 0, sizeof (pot_right_ptr->plain_buf));
5027 pot_right_ptr->plain_len = 0;
5028 }
5029 }
5030
5031 if ((pot_left_ptr == NULL) && (pot_right_ptr == NULL))
5032 {
5033 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
5034
5035 return;
5036 }
5037
5038 // at least one half was found:
5039
5040 log_info_nn ("");
5041
5042 input_buf[input_len] = 0;
5043
5044 // user
5045
5046 unsigned char *username = NULL;
5047 uint user_len = 0;
5048
5049 if (data.username)
5050 {
5051 user_t *user = hash_left->hash_info->user;
5052
5053 if (user)
5054 {
5055 username = (unsigned char *) (user->user_name);
5056
5057 user_len = user->user_len;
5058 }
5059 }
5060
5061 // mask the part which was not found
5062
5063 uint left_part_masked = 0;
5064 uint right_part_masked = 0;
5065
5066 uint mask_plain_len = strlen (LM_MASKED_PLAIN);
5067
5068 if (pot_left_ptr == NULL)
5069 {
5070 left_part_masked = 1;
5071
5072 pot_left_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5073
5074 memset (pot_left_ptr->plain_buf, 0, sizeof (pot_left_ptr->plain_buf));
5075
5076 memcpy (pot_left_ptr->plain_buf, LM_MASKED_PLAIN, mask_plain_len);
5077 pot_left_ptr->plain_len = mask_plain_len;
5078 }
5079
5080 if (pot_right_ptr == NULL)
5081 {
5082 right_part_masked = 1;
5083
5084 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5085
5086 memset (pot_right_ptr->plain_buf, 0, sizeof (pot_right_ptr->plain_buf));
5087
5088 memcpy (pot_right_ptr->plain_buf, LM_MASKED_PLAIN, mask_plain_len);
5089 pot_right_ptr->plain_len = mask_plain_len;
5090 }
5091
5092 // create the pot_ptr out of pot_left_ptr and pot_right_ptr
5093
5094 pot_t pot_ptr;
5095
5096 pot_ptr.plain_len = pot_left_ptr->plain_len + pot_right_ptr->plain_len;
5097
5098 memcpy (pot_ptr.plain_buf, pot_left_ptr->plain_buf, pot_left_ptr->plain_len);
5099
5100 memcpy (pot_ptr.plain_buf + pot_left_ptr->plain_len, pot_right_ptr->plain_buf, pot_right_ptr->plain_len);
5101
5102 // do output the line
5103
5104 format_output (out_fp, input_buf, (unsigned char *) pot_ptr.plain_buf, pot_ptr.plain_len, 0, username, user_len);
5105
5106 if (weak_hash_found == 1) myfree (pot_right_ptr);
5107
5108 if (left_part_masked == 1) myfree (pot_left_ptr);
5109 if (right_part_masked == 1) myfree (pot_right_ptr);
5110 }
5111
5112 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)
5113 {
5114 pot_t pot_key;
5115
5116 memcpy (&pot_key.hash, hashes_buf, sizeof (hash_t));
5117
5118 pot_t *pot_ptr = (pot_t *) bsearch (&pot_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5119
5120 if (pot_ptr == NULL)
5121 {
5122 log_info_nn ("");
5123
5124 input_buf[input_len] = 0;
5125
5126 format_output (out_fp, input_buf, NULL, 0, 0, NULL, 0);
5127 }
5128 }
5129
5130 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)
5131 {
5132 // left
5133
5134 pot_t pot_left_key;
5135
5136 memcpy (&pot_left_key.hash, hash_left, sizeof (hash_t));
5137
5138 pot_t *pot_left_ptr = (pot_t *) bsearch (&pot_left_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5139
5140 // right
5141
5142 pot_t pot_right_key;
5143
5144 memcpy (&pot_right_key.hash, hash_right, sizeof (hash_t));
5145
5146 pot_t *pot_right_ptr = (pot_t *) bsearch (&pot_right_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5147
5148 uint weak_hash_found = 0;
5149
5150 if (pot_right_ptr == NULL)
5151 {
5152 // special case, if "weak hash"
5153
5154 if (memcmp (hash_right->digest, LM_WEAK_HASH, 8) == 0)
5155 {
5156 weak_hash_found = 1;
5157
5158 // we just need that pot_right_ptr is not a NULL pointer
5159
5160 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5161 }
5162 }
5163
5164 if ((pot_left_ptr != NULL) && (pot_right_ptr != NULL))
5165 {
5166 if (weak_hash_found == 1) myfree (pot_right_ptr);
5167
5168 return;
5169 }
5170
5171 // ... at least one part was not cracked
5172
5173 log_info_nn ("");
5174
5175 input_buf[input_len] = 0;
5176
5177 // only show the hash part which is still not cracked
5178
5179 uint user_len = input_len - 32;
5180
5181 char *hash_output = (char *) mymalloc (33);
5182
5183 memcpy (hash_output, input_buf, input_len);
5184
5185 if (pot_left_ptr != NULL)
5186 {
5187 // only show right part (because left part was already found)
5188
5189 memcpy (hash_output + user_len, input_buf + user_len + 16, 16);
5190
5191 hash_output[user_len + 16] = 0;
5192 }
5193
5194 if (pot_right_ptr != NULL)
5195 {
5196 // only show left part (because right part was already found)
5197
5198 memcpy (hash_output + user_len, input_buf + user_len, 16);
5199
5200 hash_output[user_len + 16] = 0;
5201 }
5202
5203 format_output (out_fp, hash_output, NULL, 0, 0, NULL, 0);
5204
5205 myfree (hash_output);
5206
5207 if (weak_hash_found == 1) myfree (pot_right_ptr);
5208 }
5209
5210 uint setup_opencl_platforms_filter (char *opencl_platforms)
5211 {
5212 uint opencl_platforms_filter = 0;
5213
5214 if (opencl_platforms)
5215 {
5216 char *platforms = strdup (opencl_platforms);
5217
5218 char *next = strtok (platforms, ",");
5219
5220 do
5221 {
5222 int platform = atoi (next);
5223
5224 if (platform < 1 || platform > 32)
5225 {
5226 log_error ("ERROR: invalid OpenCL platform %u specified", platform);
5227
5228 exit (-1);
5229 }
5230
5231 opencl_platforms_filter |= 1 << (platform - 1);
5232
5233 } while ((next = strtok (NULL, ",")) != NULL);
5234
5235 free (platforms);
5236 }
5237 else
5238 {
5239 opencl_platforms_filter = -1;
5240 }
5241
5242 return opencl_platforms_filter;
5243 }
5244
5245 u32 setup_devices_filter (char *opencl_devices)
5246 {
5247 u32 devices_filter = 0;
5248
5249 if (opencl_devices)
5250 {
5251 char *devices = strdup (opencl_devices);
5252
5253 char *next = strtok (devices, ",");
5254
5255 do
5256 {
5257 int device_id = atoi (next);
5258
5259 if (device_id < 1 || device_id > 32)
5260 {
5261 log_error ("ERROR: invalid device_id %u specified", device_id);
5262
5263 exit (-1);
5264 }
5265
5266 devices_filter |= 1 << (device_id - 1);
5267
5268 } while ((next = strtok (NULL, ",")) != NULL);
5269
5270 free (devices);
5271 }
5272 else
5273 {
5274 devices_filter = -1;
5275 }
5276
5277 return devices_filter;
5278 }
5279
5280 cl_device_type setup_device_types_filter (char *opencl_device_types)
5281 {
5282 cl_device_type device_types_filter = 0;
5283
5284 if (opencl_device_types)
5285 {
5286 char *device_types = strdup (opencl_device_types);
5287
5288 char *next = strtok (device_types, ",");
5289
5290 do
5291 {
5292 int device_type = atoi (next);
5293
5294 if (device_type < 1 || device_type > 3)
5295 {
5296 log_error ("ERROR: invalid device_type %u specified", device_type);
5297
5298 exit (-1);
5299 }
5300
5301 device_types_filter |= 1 << device_type;
5302
5303 } while ((next = strtok (NULL, ",")) != NULL);
5304
5305 free (device_types);
5306 }
5307 else
5308 {
5309 // Do not use CPU by default, this often reduces GPU performance because
5310 // the CPU is too busy to handle GPU synchronization
5311
5312 device_types_filter = CL_DEVICE_TYPE_ALL & ~CL_DEVICE_TYPE_CPU;
5313 }
5314
5315 return device_types_filter;
5316 }
5317
5318 u32 get_random_num (const u32 min, const u32 max)
5319 {
5320 if (min == max) return (min);
5321
5322 return ((rand () % (max - min)) + min);
5323 }
5324
5325 u32 mydivc32 (const u32 dividend, const u32 divisor)
5326 {
5327 u32 quotient = dividend / divisor;
5328
5329 if (dividend % divisor) quotient++;
5330
5331 return quotient;
5332 }
5333
5334 u64 mydivc64 (const u64 dividend, const u64 divisor)
5335 {
5336 u64 quotient = dividend / divisor;
5337
5338 if (dividend % divisor) quotient++;
5339
5340 return quotient;
5341 }
5342
5343 void format_timer_display (struct tm *tm, char *buf, size_t len)
5344 {
5345 const char *time_entities_s[] = { "year", "day", "hour", "min", "sec" };
5346 const char *time_entities_m[] = { "years", "days", "hours", "mins", "secs" };
5347
5348 if (tm->tm_year - 70)
5349 {
5350 char *time_entity1 = ((tm->tm_year - 70) == 1) ? (char *) time_entities_s[0] : (char *) time_entities_m[0];
5351 char *time_entity2 = ( tm->tm_yday == 1) ? (char *) time_entities_s[1] : (char *) time_entities_m[1];
5352
5353 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_year - 70, time_entity1, tm->tm_yday, time_entity2);
5354 }
5355 else if (tm->tm_yday)
5356 {
5357 char *time_entity1 = (tm->tm_yday == 1) ? (char *) time_entities_s[1] : (char *) time_entities_m[1];
5358 char *time_entity2 = (tm->tm_hour == 1) ? (char *) time_entities_s[2] : (char *) time_entities_m[2];
5359
5360 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_yday, time_entity1, tm->tm_hour, time_entity2);
5361 }
5362 else if (tm->tm_hour)
5363 {
5364 char *time_entity1 = (tm->tm_hour == 1) ? (char *) time_entities_s[2] : (char *) time_entities_m[2];
5365 char *time_entity2 = (tm->tm_min == 1) ? (char *) time_entities_s[3] : (char *) time_entities_m[3];
5366
5367 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_hour, time_entity1, tm->tm_min, time_entity2);
5368 }
5369 else if (tm->tm_min)
5370 {
5371 char *time_entity1 = (tm->tm_min == 1) ? (char *) time_entities_s[3] : (char *) time_entities_m[3];
5372 char *time_entity2 = (tm->tm_sec == 1) ? (char *) time_entities_s[4] : (char *) time_entities_m[4];
5373
5374 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_min, time_entity1, tm->tm_sec, time_entity2);
5375 }
5376 else
5377 {
5378 char *time_entity1 = (tm->tm_sec == 1) ? (char *) time_entities_s[4] : (char *) time_entities_m[4];
5379
5380 snprintf (buf, len - 1, "%d %s", tm->tm_sec, time_entity1);
5381 }
5382 }
5383
5384 void format_speed_display (float val, char *buf, size_t len)
5385 {
5386 if (val <= 0)
5387 {
5388 buf[0] = '0';
5389 buf[1] = ' ';
5390 buf[2] = 0;
5391
5392 return;
5393 }
5394
5395 char units[7] = { ' ', 'k', 'M', 'G', 'T', 'P', 'E' };
5396
5397 uint level = 0;
5398
5399 while (val > 99999)
5400 {
5401 val /= 1000;
5402
5403 level++;
5404 }
5405
5406 /* generate output */
5407
5408 if (level == 0)
5409 {
5410 snprintf (buf, len - 1, "%.0f ", val);
5411 }
5412 else
5413 {
5414 snprintf (buf, len - 1, "%.1f %c", val, units[level]);
5415 }
5416 }
5417
5418 void lowercase (u8 *buf, int len)
5419 {
5420 for (int i = 0; i < len; i++) buf[i] = tolower (buf[i]);
5421 }
5422
5423 void uppercase (u8 *buf, int len)
5424 {
5425 for (int i = 0; i < len; i++) buf[i] = toupper (buf[i]);
5426 }
5427
5428 int fgetl (FILE *fp, char *line_buf)
5429 {
5430 int line_len = 0;
5431
5432 while (!feof (fp))
5433 {
5434 const int c = fgetc (fp);
5435
5436 if (c == EOF) break;
5437
5438 line_buf[line_len] = (char) c;
5439
5440 line_len++;
5441
5442 if (line_len == BUFSIZ) line_len--;
5443
5444 if (c == '\n') break;
5445 }
5446
5447 if (line_len == 0) return 0;
5448
5449 if (line_buf[line_len - 1] == '\n')
5450 {
5451 line_len--;
5452
5453 line_buf[line_len] = 0;
5454 }
5455
5456 if (line_len == 0) return 0;
5457
5458 if (line_buf[line_len - 1] == '\r')
5459 {
5460 line_len--;
5461
5462 line_buf[line_len] = 0;
5463 }
5464
5465 return (line_len);
5466 }
5467
5468 int in_superchop (char *buf)
5469 {
5470 int len = strlen (buf);
5471
5472 while (len)
5473 {
5474 if (buf[len - 1] == '\n')
5475 {
5476 len--;
5477
5478 continue;
5479 }
5480
5481 if (buf[len - 1] == '\r')
5482 {
5483 len--;
5484
5485 continue;
5486 }
5487
5488 break;
5489 }
5490
5491 buf[len] = 0;
5492
5493 return len;
5494 }
5495
5496 char **scan_directory (const char *path)
5497 {
5498 char *tmp_path = mystrdup (path);
5499
5500 size_t tmp_path_len = strlen (tmp_path);
5501
5502 while (tmp_path[tmp_path_len - 1] == '/' || tmp_path[tmp_path_len - 1] == '\\')
5503 {
5504 tmp_path[tmp_path_len - 1] = 0;
5505
5506 tmp_path_len = strlen (tmp_path);
5507 }
5508
5509 char **files = NULL;
5510
5511 int num_files = 0;
5512
5513 DIR *d = NULL;
5514
5515 if ((d = opendir (tmp_path)) != NULL)
5516 {
5517 #ifdef OSX
5518 struct dirent e;
5519
5520 for (;;) {
5521 memset (&e, 0, sizeof (e));
5522 struct dirent *de = NULL;
5523
5524 if (readdir_r (d, &e, &de) != 0)
5525 {
5526 log_error ("ERROR: readdir_r() failed");
5527
5528 break;
5529 }
5530
5531 if (de == NULL) break;
5532 #else
5533 struct dirent *de;
5534
5535 while ((de = readdir (d)) != NULL)
5536 {
5537 #endif
5538 if ((strcmp (de->d_name, ".") == 0) || (strcmp (de->d_name, "..") == 0)) continue;
5539
5540 int path_size = strlen (tmp_path) + 1 + strlen (de->d_name);
5541
5542 char *path_file = (char *) mymalloc (path_size + 1);
5543
5544 snprintf (path_file, path_size + 1, "%s/%s", tmp_path, de->d_name);
5545
5546 path_file[path_size] = 0;
5547
5548 DIR *d_test;
5549
5550 if ((d_test = opendir (path_file)) != NULL)
5551 {
5552 closedir (d_test);
5553
5554 myfree (path_file);
5555 }
5556 else
5557 {
5558 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5559
5560 num_files++;
5561
5562 files[num_files - 1] = path_file;
5563 }
5564 }
5565
5566 closedir (d);
5567 }
5568 else if (errno == ENOTDIR)
5569 {
5570 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5571
5572 num_files++;
5573
5574 files[num_files - 1] = mystrdup (path);
5575 }
5576
5577 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5578
5579 num_files++;
5580
5581 files[num_files - 1] = NULL;
5582
5583 myfree (tmp_path);
5584
5585 return (files);
5586 }
5587
5588 int count_dictionaries (char **dictionary_files)
5589 {
5590 if (dictionary_files == NULL) return 0;
5591
5592 int cnt = 0;
5593
5594 for (int d = 0; dictionary_files[d] != NULL; d++)
5595 {
5596 cnt++;
5597 }
5598
5599 return (cnt);
5600 }
5601
5602 char *stroptitype (const uint opti_type)
5603 {
5604 switch (opti_type)
5605 {
5606 case OPTI_TYPE_ZERO_BYTE: return ((char *) OPTI_STR_ZERO_BYTE); break;
5607 case OPTI_TYPE_PRECOMPUTE_INIT: return ((char *) OPTI_STR_PRECOMPUTE_INIT); break;
5608 case OPTI_TYPE_PRECOMPUTE_MERKLE: return ((char *) OPTI_STR_PRECOMPUTE_MERKLE); break;
5609 case OPTI_TYPE_PRECOMPUTE_PERMUT: return ((char *) OPTI_STR_PRECOMPUTE_PERMUT); break;
5610 case OPTI_TYPE_MEET_IN_MIDDLE: return ((char *) OPTI_STR_MEET_IN_MIDDLE); break;
5611 case OPTI_TYPE_EARLY_SKIP: return ((char *) OPTI_STR_EARLY_SKIP); break;
5612 case OPTI_TYPE_NOT_SALTED: return ((char *) OPTI_STR_NOT_SALTED); break;
5613 case OPTI_TYPE_NOT_ITERATED: return ((char *) OPTI_STR_NOT_ITERATED); break;
5614 case OPTI_TYPE_PREPENDED_SALT: return ((char *) OPTI_STR_PREPENDED_SALT); break;
5615 case OPTI_TYPE_APPENDED_SALT: return ((char *) OPTI_STR_APPENDED_SALT); break;
5616 case OPTI_TYPE_SINGLE_HASH: return ((char *) OPTI_STR_SINGLE_HASH); break;
5617 case OPTI_TYPE_SINGLE_SALT: return ((char *) OPTI_STR_SINGLE_SALT); break;
5618 case OPTI_TYPE_BRUTE_FORCE: return ((char *) OPTI_STR_BRUTE_FORCE); break;
5619 case OPTI_TYPE_RAW_HASH: return ((char *) OPTI_STR_RAW_HASH); break;
5620 case OPTI_TYPE_USES_BITS_8: return ((char *) OPTI_STR_USES_BITS_8); break;
5621 case OPTI_TYPE_USES_BITS_16: return ((char *) OPTI_STR_USES_BITS_16); break;
5622 case OPTI_TYPE_USES_BITS_32: return ((char *) OPTI_STR_USES_BITS_32); break;
5623 case OPTI_TYPE_USES_BITS_64: return ((char *) OPTI_STR_USES_BITS_64); break;
5624 }
5625
5626 return (NULL);
5627 }
5628
5629 char *strparser (const uint parser_status)
5630 {
5631 switch (parser_status)
5632 {
5633 case PARSER_OK: return ((char *) PA_000); break;
5634 case PARSER_COMMENT: return ((char *) PA_001); break;
5635 case PARSER_GLOBAL_ZERO: return ((char *) PA_002); break;
5636 case PARSER_GLOBAL_LENGTH: return ((char *) PA_003); break;
5637 case PARSER_HASH_LENGTH: return ((char *) PA_004); break;
5638 case PARSER_HASH_VALUE: return ((char *) PA_005); break;
5639 case PARSER_SALT_LENGTH: return ((char *) PA_006); break;
5640 case PARSER_SALT_VALUE: return ((char *) PA_007); break;
5641 case PARSER_SALT_ITERATION: return ((char *) PA_008); break;
5642 case PARSER_SEPARATOR_UNMATCHED: return ((char *) PA_009); break;
5643 case PARSER_SIGNATURE_UNMATCHED: return ((char *) PA_010); break;
5644 case PARSER_HCCAP_FILE_SIZE: return ((char *) PA_011); break;
5645 case PARSER_HCCAP_EAPOL_SIZE: return ((char *) PA_012); break;
5646 case PARSER_PSAFE2_FILE_SIZE: return ((char *) PA_013); break;
5647 case PARSER_PSAFE3_FILE_SIZE: return ((char *) PA_014); break;
5648 case PARSER_TC_FILE_SIZE: return ((char *) PA_015); break;
5649 case PARSER_SIP_AUTH_DIRECTIVE: return ((char *) PA_016); break;
5650 }
5651
5652 return ((char *) PA_255);
5653 }
5654
5655 char *strhashtype (const uint hash_mode)
5656 {
5657 switch (hash_mode)
5658 {
5659 case 0: return ((char *) HT_00000); break;
5660 case 10: return ((char *) HT_00010); break;
5661 case 11: return ((char *) HT_00011); break;
5662 case 12: return ((char *) HT_00012); break;
5663 case 20: return ((char *) HT_00020); break;
5664 case 21: return ((char *) HT_00021); break;
5665 case 22: return ((char *) HT_00022); break;
5666 case 23: return ((char *) HT_00023); break;
5667 case 30: return ((char *) HT_00030); break;
5668 case 40: return ((char *) HT_00040); break;
5669 case 50: return ((char *) HT_00050); break;
5670 case 60: return ((char *) HT_00060); break;
5671 case 100: return ((char *) HT_00100); break;
5672 case 101: return ((char *) HT_00101); break;
5673 case 110: return ((char *) HT_00110); break;
5674 case 111: return ((char *) HT_00111); break;
5675 case 112: return ((char *) HT_00112); break;
5676 case 120: return ((char *) HT_00120); break;
5677 case 121: return ((char *) HT_00121); break;
5678 case 122: return ((char *) HT_00122); break;
5679 case 124: return ((char *) HT_00124); break;
5680 case 130: return ((char *) HT_00130); break;
5681 case 131: return ((char *) HT_00131); break;
5682 case 132: return ((char *) HT_00132); break;
5683 case 133: return ((char *) HT_00133); break;
5684 case 140: return ((char *) HT_00140); break;
5685 case 141: return ((char *) HT_00141); break;
5686 case 150: return ((char *) HT_00150); break;
5687 case 160: return ((char *) HT_00160); break;
5688 case 190: return ((char *) HT_00190); break;
5689 case 200: return ((char *) HT_00200); break;
5690 case 300: return ((char *) HT_00300); break;
5691 case 400: return ((char *) HT_00400); break;
5692 case 500: return ((char *) HT_00500); break;
5693 case 501: return ((char *) HT_00501); break;
5694 case 900: return ((char *) HT_00900); break;
5695 case 910: return ((char *) HT_00910); break;
5696 case 1000: return ((char *) HT_01000); break;
5697 case 1100: return ((char *) HT_01100); break;
5698 case 1400: return ((char *) HT_01400); break;
5699 case 1410: return ((char *) HT_01410); break;
5700 case 1420: return ((char *) HT_01420); break;
5701 case 1421: return ((char *) HT_01421); break;
5702 case 1430: return ((char *) HT_01430); break;
5703 case 1440: return ((char *) HT_01440); break;
5704 case 1441: return ((char *) HT_01441); break;
5705 case 1450: return ((char *) HT_01450); break;
5706 case 1460: return ((char *) HT_01460); break;
5707 case 1500: return ((char *) HT_01500); break;
5708 case 1600: return ((char *) HT_01600); break;
5709 case 1700: return ((char *) HT_01700); break;
5710 case 1710: return ((char *) HT_01710); break;
5711 case 1711: return ((char *) HT_01711); break;
5712 case 1720: return ((char *) HT_01720); break;
5713 case 1722: return ((char *) HT_01722); break;
5714 case 1730: return ((char *) HT_01730); break;
5715 case 1731: return ((char *) HT_01731); break;
5716 case 1740: return ((char *) HT_01740); break;
5717 case 1750: return ((char *) HT_01750); break;
5718 case 1760: return ((char *) HT_01760); break;
5719 case 1800: return ((char *) HT_01800); break;
5720 case 2100: return ((char *) HT_02100); break;
5721 case 2400: return ((char *) HT_02400); break;
5722 case 2410: return ((char *) HT_02410); break;
5723 case 2500: return ((char *) HT_02500); break;
5724 case 2600: return ((char *) HT_02600); break;
5725 case 2611: return ((char *) HT_02611); break;
5726 case 2612: return ((char *) HT_02612); break;
5727 case 2711: return ((char *) HT_02711); break;
5728 case 2811: return ((char *) HT_02811); break;
5729 case 3000: return ((char *) HT_03000); break;
5730 case 3100: return ((char *) HT_03100); break;
5731 case 3200: return ((char *) HT_03200); break;
5732 case 3710: return ((char *) HT_03710); break;
5733 case 3711: return ((char *) HT_03711); break;
5734 case 3800: return ((char *) HT_03800); break;
5735 case 4300: return ((char *) HT_04300); break;
5736 case 4400: return ((char *) HT_04400); break;
5737 case 4500: return ((char *) HT_04500); break;
5738 case 4700: return ((char *) HT_04700); break;
5739 case 4800: return ((char *) HT_04800); break;
5740 case 4900: return ((char *) HT_04900); break;
5741 case 5000: return ((char *) HT_05000); break;
5742 case 5100: return ((char *) HT_05100); break;
5743 case 5200: return ((char *) HT_05200); break;
5744 case 5300: return ((char *) HT_05300); break;
5745 case 5400: return ((char *) HT_05400); break;
5746 case 5500: return ((char *) HT_05500); break;
5747 case 5600: return ((char *) HT_05600); break;
5748 case 5700: return ((char *) HT_05700); break;
5749 case 5800: return ((char *) HT_05800); break;
5750 case 6000: return ((char *) HT_06000); break;
5751 case 6100: return ((char *) HT_06100); break;
5752 case 6211: return ((char *) HT_06211); break;
5753 case 6212: return ((char *) HT_06212); break;
5754 case 6213: return ((char *) HT_06213); break;
5755 case 6221: return ((char *) HT_06221); break;
5756 case 6222: return ((char *) HT_06222); break;
5757 case 6223: return ((char *) HT_06223); break;
5758 case 6231: return ((char *) HT_06231); break;
5759 case 6232: return ((char *) HT_06232); break;
5760 case 6233: return ((char *) HT_06233); break;
5761 case 6241: return ((char *) HT_06241); break;
5762 case 6242: return ((char *) HT_06242); break;
5763 case 6243: return ((char *) HT_06243); break;
5764 case 6300: return ((char *) HT_06300); break;
5765 case 6400: return ((char *) HT_06400); break;
5766 case 6500: return ((char *) HT_06500); break;
5767 case 6600: return ((char *) HT_06600); break;
5768 case 6700: return ((char *) HT_06700); break;
5769 case 6800: return ((char *) HT_06800); break;
5770 case 6900: return ((char *) HT_06900); break;
5771 case 7100: return ((char *) HT_07100); break;
5772 case 7200: return ((char *) HT_07200); break;
5773 case 7300: return ((char *) HT_07300); break;
5774 case 7400: return ((char *) HT_07400); break;
5775 case 7500: return ((char *) HT_07500); break;
5776 case 7600: return ((char *) HT_07600); break;
5777 case 7700: return ((char *) HT_07700); break;
5778 case 7800: return ((char *) HT_07800); break;
5779 case 7900: return ((char *) HT_07900); break;
5780 case 8000: return ((char *) HT_08000); break;
5781 case 8100: return ((char *) HT_08100); break;
5782 case 8200: return ((char *) HT_08200); break;
5783 case 8300: return ((char *) HT_08300); break;
5784 case 8400: return ((char *) HT_08400); break;
5785 case 8500: return ((char *) HT_08500); break;
5786 case 8600: return ((char *) HT_08600); break;
5787 case 8700: return ((char *) HT_08700); break;
5788 case 8800: return ((char *) HT_08800); break;
5789 case 8900: return ((char *) HT_08900); break;
5790 case 9000: return ((char *) HT_09000); break;
5791 case 9100: return ((char *) HT_09100); break;
5792 case 9200: return ((char *) HT_09200); break;
5793 case 9300: return ((char *) HT_09300); break;
5794 case 9400: return ((char *) HT_09400); break;
5795 case 9500: return ((char *) HT_09500); break;
5796 case 9600: return ((char *) HT_09600); break;
5797 case 9700: return ((char *) HT_09700); break;
5798 case 9710: return ((char *) HT_09710); break;
5799 case 9720: return ((char *) HT_09720); break;
5800 case 9800: return ((char *) HT_09800); break;
5801 case 9810: return ((char *) HT_09810); break;
5802 case 9820: return ((char *) HT_09820); break;
5803 case 9900: return ((char *) HT_09900); break;
5804 case 10000: return ((char *) HT_10000); break;
5805 case 10100: return ((char *) HT_10100); break;
5806 case 10200: return ((char *) HT_10200); break;
5807 case 10300: return ((char *) HT_10300); break;
5808 case 10400: return ((char *) HT_10400); break;
5809 case 10410: return ((char *) HT_10410); break;
5810 case 10420: return ((char *) HT_10420); break;
5811 case 10500: return ((char *) HT_10500); break;
5812 case 10600: return ((char *) HT_10600); break;
5813 case 10700: return ((char *) HT_10700); break;
5814 case 10800: return ((char *) HT_10800); break;
5815 case 10900: return ((char *) HT_10900); break;
5816 case 11000: return ((char *) HT_11000); break;
5817 case 11100: return ((char *) HT_11100); break;
5818 case 11200: return ((char *) HT_11200); break;
5819 case 11300: return ((char *) HT_11300); break;
5820 case 11400: return ((char *) HT_11400); break;
5821 case 11500: return ((char *) HT_11500); break;
5822 case 11600: return ((char *) HT_11600); break;
5823 case 11700: return ((char *) HT_11700); break;
5824 case 11800: return ((char *) HT_11800); break;
5825 case 11900: return ((char *) HT_11900); break;
5826 case 12000: return ((char *) HT_12000); break;
5827 case 12100: return ((char *) HT_12100); break;
5828 case 12200: return ((char *) HT_12200); break;
5829 case 12300: return ((char *) HT_12300); break;
5830 case 12400: return ((char *) HT_12400); break;
5831 case 12500: return ((char *) HT_12500); break;
5832 case 12600: return ((char *) HT_12600); break;
5833 case 12700: return ((char *) HT_12700); break;
5834 case 12800: return ((char *) HT_12800); break;
5835 case 12900: return ((char *) HT_12900); break;
5836 case 13000: return ((char *) HT_13000); break;
5837 }
5838
5839 return ((char *) "Unknown");
5840 }
5841
5842 char *strstatus (const uint devices_status)
5843 {
5844 switch (devices_status)
5845 {
5846 case STATUS_INIT: return ((char *) ST_0000); break;
5847 case STATUS_STARTING: return ((char *) ST_0001); break;
5848 case STATUS_RUNNING: return ((char *) ST_0002); break;
5849 case STATUS_PAUSED: return ((char *) ST_0003); break;
5850 case STATUS_EXHAUSTED: return ((char *) ST_0004); break;
5851 case STATUS_CRACKED: return ((char *) ST_0005); break;
5852 case STATUS_ABORTED: return ((char *) ST_0006); break;
5853 case STATUS_QUIT: return ((char *) ST_0007); break;
5854 case STATUS_BYPASS: return ((char *) ST_0008); break;
5855 case STATUS_STOP_AT_CHECKPOINT: return ((char *) ST_0009); break;
5856 }
5857
5858 return ((char *) "Unknown");
5859 }
5860
5861 void ascii_digest (char out_buf[4096], uint salt_pos, uint digest_pos)
5862 {
5863 uint hash_type = data.hash_type;
5864 uint hash_mode = data.hash_mode;
5865 uint salt_type = data.salt_type;
5866 uint opts_type = data.opts_type;
5867 uint opti_type = data.opti_type;
5868 uint dgst_size = data.dgst_size;
5869
5870 char *hashfile = data.hashfile;
5871
5872 uint len = 4096;
5873
5874 uint digest_buf[64] = { 0 };
5875
5876 u64 *digest_buf64 = (u64 *) digest_buf;
5877
5878 char *digests_buf_ptr = (char *) data.digests_buf;
5879
5880 memcpy (digest_buf, digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size), dgst_size);
5881
5882 if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT)
5883 {
5884 uint tt;
5885
5886 switch (hash_type)
5887 {
5888 case HASH_TYPE_DESCRYPT:
5889 FP (digest_buf[1], digest_buf[0], tt);
5890 break;
5891
5892 case HASH_TYPE_DESRACF:
5893 digest_buf[0] = rotl32 (digest_buf[0], 29);
5894 digest_buf[1] = rotl32 (digest_buf[1], 29);
5895
5896 FP (digest_buf[1], digest_buf[0], tt);
5897 break;
5898
5899 case HASH_TYPE_LM:
5900 FP (digest_buf[1], digest_buf[0], tt);
5901 break;
5902
5903 case HASH_TYPE_NETNTLM:
5904 digest_buf[0] = rotl32 (digest_buf[0], 29);
5905 digest_buf[1] = rotl32 (digest_buf[1], 29);
5906 digest_buf[2] = rotl32 (digest_buf[2], 29);
5907 digest_buf[3] = rotl32 (digest_buf[3], 29);
5908
5909 FP (digest_buf[1], digest_buf[0], tt);
5910 FP (digest_buf[3], digest_buf[2], tt);
5911 break;
5912
5913 case HASH_TYPE_BSDICRYPT:
5914 digest_buf[0] = rotl32 (digest_buf[0], 31);
5915 digest_buf[1] = rotl32 (digest_buf[1], 31);
5916
5917 FP (digest_buf[1], digest_buf[0], tt);
5918 break;
5919 }
5920 }
5921
5922 if (opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE)
5923 {
5924 switch (hash_type)
5925 {
5926 case HASH_TYPE_MD4:
5927 digest_buf[0] += MD4M_A;
5928 digest_buf[1] += MD4M_B;
5929 digest_buf[2] += MD4M_C;
5930 digest_buf[3] += MD4M_D;
5931 break;
5932
5933 case HASH_TYPE_MD5:
5934 digest_buf[0] += MD5M_A;
5935 digest_buf[1] += MD5M_B;
5936 digest_buf[2] += MD5M_C;
5937 digest_buf[3] += MD5M_D;
5938 break;
5939
5940 case HASH_TYPE_SHA1:
5941 digest_buf[0] += SHA1M_A;
5942 digest_buf[1] += SHA1M_B;
5943 digest_buf[2] += SHA1M_C;
5944 digest_buf[3] += SHA1M_D;
5945 digest_buf[4] += SHA1M_E;
5946 break;
5947
5948 case HASH_TYPE_SHA256:
5949 digest_buf[0] += SHA256M_A;
5950 digest_buf[1] += SHA256M_B;
5951 digest_buf[2] += SHA256M_C;
5952 digest_buf[3] += SHA256M_D;
5953 digest_buf[4] += SHA256M_E;
5954 digest_buf[5] += SHA256M_F;
5955 digest_buf[6] += SHA256M_G;
5956 digest_buf[7] += SHA256M_H;
5957 break;
5958
5959 case HASH_TYPE_SHA384:
5960 digest_buf64[0] += SHA384M_A;
5961 digest_buf64[1] += SHA384M_B;
5962 digest_buf64[2] += SHA384M_C;
5963 digest_buf64[3] += SHA384M_D;
5964 digest_buf64[4] += SHA384M_E;
5965 digest_buf64[5] += SHA384M_F;
5966 digest_buf64[6] += 0;
5967 digest_buf64[7] += 0;
5968 break;
5969
5970 case HASH_TYPE_SHA512:
5971 digest_buf64[0] += SHA512M_A;
5972 digest_buf64[1] += SHA512M_B;
5973 digest_buf64[2] += SHA512M_C;
5974 digest_buf64[3] += SHA512M_D;
5975 digest_buf64[4] += SHA512M_E;
5976 digest_buf64[5] += SHA512M_F;
5977 digest_buf64[6] += SHA512M_G;
5978 digest_buf64[7] += SHA512M_H;
5979 break;
5980 }
5981 }
5982
5983 if (opts_type & OPTS_TYPE_PT_GENERATE_LE)
5984 {
5985 if (dgst_size == DGST_SIZE_4_2)
5986 {
5987 for (int i = 0; i < 2; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5988 }
5989 else if (dgst_size == DGST_SIZE_4_4)
5990 {
5991 for (int i = 0; i < 4; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5992 }
5993 else if (dgst_size == DGST_SIZE_4_5)
5994 {
5995 for (int i = 0; i < 5; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5996 }
5997 else if (dgst_size == DGST_SIZE_4_6)
5998 {
5999 for (int i = 0; i < 6; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6000 }
6001 else if (dgst_size == DGST_SIZE_4_8)
6002 {
6003 for (int i = 0; i < 8; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6004 }
6005 else if ((dgst_size == DGST_SIZE_4_16) || (dgst_size == DGST_SIZE_8_8)) // same size, same result :)
6006 {
6007 if (hash_type == HASH_TYPE_WHIRLPOOL)
6008 {
6009 for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6010 }
6011 else if (hash_type == HASH_TYPE_SHA384)
6012 {
6013 for (int i = 0; i < 8; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
6014 }
6015 else if (hash_type == HASH_TYPE_SHA512)
6016 {
6017 for (int i = 0; i < 8; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
6018 }
6019 else if (hash_type == HASH_TYPE_GOST)
6020 {
6021 for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6022 }
6023 }
6024 else if (dgst_size == DGST_SIZE_4_64)
6025 {
6026 for (int i = 0; i < 64; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6027 }
6028 else if (dgst_size == DGST_SIZE_8_25)
6029 {
6030 for (int i = 0; i < 25; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
6031 }
6032 }
6033
6034 uint isSalted = ((data.salt_type == SALT_TYPE_INTERN)
6035 | (data.salt_type == SALT_TYPE_EXTERN)
6036 | (data.salt_type == SALT_TYPE_EMBEDDED));
6037
6038 salt_t salt;
6039
6040 if (isSalted)
6041 {
6042 memset (&salt, 0, sizeof (salt_t));
6043
6044 memcpy (&salt, &data.salts_buf[salt_pos], sizeof (salt_t));
6045
6046 char *ptr = (char *) salt.salt_buf;
6047
6048 uint len = salt.salt_len;
6049
6050 if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT)
6051 {
6052 uint tt;
6053
6054 switch (hash_type)
6055 {
6056 case HASH_TYPE_NETNTLM:
6057
6058 salt.salt_buf[0] = rotr32 (salt.salt_buf[0], 3);
6059 salt.salt_buf[1] = rotr32 (salt.salt_buf[1], 3);
6060
6061 FP (salt.salt_buf[1], salt.salt_buf[0], tt);
6062
6063 break;
6064 }
6065 }
6066
6067 if (opts_type & OPTS_TYPE_ST_UNICODE)
6068 {
6069 for (uint i = 0, j = 0; i < len; i += 1, j += 2)
6070 {
6071 ptr[i] = ptr[j];
6072 }
6073
6074 len = len / 2;
6075 }
6076
6077 if (opts_type & OPTS_TYPE_ST_GENERATE_LE)
6078 {
6079 uint max = salt.salt_len / 4;
6080
6081 if (len % 4) max++;
6082
6083 for (uint i = 0; i < max; i++)
6084 {
6085 salt.salt_buf[i] = byte_swap_32 (salt.salt_buf[i]);
6086 }
6087 }
6088
6089 if (opts_type & OPTS_TYPE_ST_HEX)
6090 {
6091 char tmp[64] = { 0 };
6092
6093 for (uint i = 0, j = 0; i < len; i += 1, j += 2)
6094 {
6095 sprintf (tmp + j, "%02x", (unsigned char) ptr[i]);
6096 }
6097
6098 len = len * 2;
6099
6100 memcpy (ptr, tmp, len);
6101 }
6102
6103 uint memset_size = ((48 - (int) len) > 0) ? (48 - len) : 0;
6104
6105 memset (ptr + len, 0, memset_size);
6106
6107 salt.salt_len = len;
6108 }
6109
6110 //
6111 // some modes require special encoding
6112 //
6113
6114 uint out_buf_plain[256] = { 0 };
6115 uint out_buf_salt[256] = { 0 };
6116
6117 char tmp_buf[1024] = { 0 };
6118
6119 char *ptr_plain = (char *) out_buf_plain;
6120 char *ptr_salt = (char *) out_buf_salt;
6121
6122 if (hash_mode == 22)
6123 {
6124 char username[30] = { 0 };
6125
6126 memcpy (username, salt.salt_buf, salt.salt_len - 22);
6127
6128 char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' };
6129
6130 u16 *ptr = (u16 *) digest_buf;
6131
6132 tmp_buf[ 0] = sig[0];
6133 tmp_buf[ 1] = int_to_base64 (((ptr[1]) >> 12) & 0x3f);
6134 tmp_buf[ 2] = int_to_base64 (((ptr[1]) >> 6) & 0x3f);
6135 tmp_buf[ 3] = int_to_base64 (((ptr[1]) >> 0) & 0x3f);
6136 tmp_buf[ 4] = int_to_base64 (((ptr[0]) >> 12) & 0x3f);
6137 tmp_buf[ 5] = int_to_base64 (((ptr[0]) >> 6) & 0x3f);
6138 tmp_buf[ 6] = sig[1];
6139 tmp_buf[ 7] = int_to_base64 (((ptr[0]) >> 0) & 0x3f);
6140 tmp_buf[ 8] = int_to_base64 (((ptr[3]) >> 12) & 0x3f);
6141 tmp_buf[ 9] = int_to_base64 (((ptr[3]) >> 6) & 0x3f);
6142 tmp_buf[10] = int_to_base64 (((ptr[3]) >> 0) & 0x3f);
6143 tmp_buf[11] = int_to_base64 (((ptr[2]) >> 12) & 0x3f);
6144 tmp_buf[12] = sig[2];
6145 tmp_buf[13] = int_to_base64 (((ptr[2]) >> 6) & 0x3f);
6146 tmp_buf[14] = int_to_base64 (((ptr[2]) >> 0) & 0x3f);
6147 tmp_buf[15] = int_to_base64 (((ptr[5]) >> 12) & 0x3f);
6148 tmp_buf[16] = int_to_base64 (((ptr[5]) >> 6) & 0x3f);
6149 tmp_buf[17] = sig[3];
6150 tmp_buf[18] = int_to_base64 (((ptr[5]) >> 0) & 0x3f);
6151 tmp_buf[19] = int_to_base64 (((ptr[4]) >> 12) & 0x3f);
6152 tmp_buf[20] = int_to_base64 (((ptr[4]) >> 6) & 0x3f);
6153 tmp_buf[21] = int_to_base64 (((ptr[4]) >> 0) & 0x3f);
6154 tmp_buf[22] = int_to_base64 (((ptr[7]) >> 12) & 0x3f);
6155 tmp_buf[23] = sig[4];
6156 tmp_buf[24] = int_to_base64 (((ptr[7]) >> 6) & 0x3f);
6157 tmp_buf[25] = int_to_base64 (((ptr[7]) >> 0) & 0x3f);
6158 tmp_buf[26] = int_to_base64 (((ptr[6]) >> 12) & 0x3f);
6159 tmp_buf[27] = int_to_base64 (((ptr[6]) >> 6) & 0x3f);
6160 tmp_buf[28] = int_to_base64 (((ptr[6]) >> 0) & 0x3f);
6161 tmp_buf[29] = sig[5];
6162
6163 snprintf (out_buf, len-1, "%s:%s",
6164 tmp_buf,
6165 username);
6166 }
6167 else if (hash_mode == 23)
6168 {
6169 // do not show the \nskyper\n part in output
6170
6171 char *salt_buf_ptr = (char *) salt.salt_buf;
6172
6173 salt_buf_ptr[salt.salt_len - 8] = 0;
6174
6175 snprintf (out_buf, len-1, "%08x%08x%08x%08x:%s",
6176 digest_buf[0],
6177 digest_buf[1],
6178 digest_buf[2],
6179 digest_buf[3],
6180 salt_buf_ptr);
6181 }
6182 else if (hash_mode == 101)
6183 {
6184 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6185
6186 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6187 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6188 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6189 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6190 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6191
6192 memcpy (tmp_buf, digest_buf, 20);
6193
6194 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6195
6196 snprintf (out_buf, len-1, "{SHA}%s", ptr_plain);
6197 }
6198 else if (hash_mode == 111)
6199 {
6200 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6201
6202 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6203 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6204 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6205 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6206 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6207
6208 memcpy (tmp_buf, digest_buf, 20);
6209 memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len);
6210
6211 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20 + salt.salt_len, (u8 *) ptr_plain);
6212
6213 snprintf (out_buf, len-1, "{SSHA}%s", ptr_plain);
6214 }
6215 else if (hash_mode == 122)
6216 {
6217 snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x",
6218 (char *) salt.salt_buf,
6219 digest_buf[0],
6220 digest_buf[1],
6221 digest_buf[2],
6222 digest_buf[3],
6223 digest_buf[4]);
6224 }
6225 else if (hash_mode == 124)
6226 {
6227 snprintf (out_buf, len-1, "sha1$%s$%08x%08x%08x%08x%08x",
6228 (char *) salt.salt_buf,
6229 digest_buf[0],
6230 digest_buf[1],
6231 digest_buf[2],
6232 digest_buf[3],
6233 digest_buf[4]);
6234 }
6235 else if (hash_mode == 131)
6236 {
6237 snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6238 (char *) salt.salt_buf,
6239 0, 0, 0, 0, 0,
6240 digest_buf[0],
6241 digest_buf[1],
6242 digest_buf[2],
6243 digest_buf[3],
6244 digest_buf[4]);
6245 }
6246 else if (hash_mode == 132)
6247 {
6248 snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x",
6249 (char *) salt.salt_buf,
6250 digest_buf[0],
6251 digest_buf[1],
6252 digest_buf[2],
6253 digest_buf[3],
6254 digest_buf[4]);
6255 }
6256 else if (hash_mode == 133)
6257 {
6258 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6259
6260 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6261 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6262 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6263 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6264 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6265
6266 memcpy (tmp_buf, digest_buf, 20);
6267
6268 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6269
6270 snprintf (out_buf, len-1, "%s", ptr_plain);
6271 }
6272 else if (hash_mode == 141)
6273 {
6274 memcpy (tmp_buf, salt.salt_buf, salt.salt_len);
6275
6276 base64_encode (int_to_base64, (const u8 *) tmp_buf, salt.salt_len, (u8 *) ptr_salt);
6277
6278 memset (tmp_buf, 0, sizeof (tmp_buf));
6279
6280 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6281
6282 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6283 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6284 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6285 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6286 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6287
6288 memcpy (tmp_buf, digest_buf, 20);
6289
6290 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6291
6292 ptr_plain[27] = 0;
6293
6294 snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER, ptr_salt, ptr_plain);
6295 }
6296 else if (hash_mode == 400)
6297 {
6298 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6299
6300 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6301 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6302 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6303 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6304
6305 phpass_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6306
6307 snprintf (out_buf, len-1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, (char *) ptr_plain);
6308 }
6309 else if (hash_mode == 500)
6310 {
6311 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6312
6313 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6314 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6315 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6316 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6317
6318 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6319
6320 if (salt.salt_iter == ROUNDS_MD5CRYPT)
6321 {
6322 snprintf (out_buf, len-1, "$1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6323 }
6324 else
6325 {
6326 snprintf (out_buf, len-1, "$1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6327 }
6328 }
6329 else if (hash_mode == 501)
6330 {
6331 uint digest_idx = salt.digests_offset + digest_pos;
6332
6333 hashinfo_t **hashinfo_ptr = data.hash_info;
6334 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
6335
6336 snprintf (out_buf, len-1, "%s", hash_buf);
6337 }
6338 else if (hash_mode == 1421)
6339 {
6340 u8 *salt_ptr = (u8 *) salt.salt_buf;
6341
6342 snprintf (out_buf, len-1, "%c%c%c%c%c%c%08x%08x%08x%08x%08x%08x%08x%08x",
6343 salt_ptr[0],
6344 salt_ptr[1],
6345 salt_ptr[2],
6346 salt_ptr[3],
6347 salt_ptr[4],
6348 salt_ptr[5],
6349 digest_buf[0],
6350 digest_buf[1],
6351 digest_buf[2],
6352 digest_buf[3],
6353 digest_buf[4],
6354 digest_buf[5],
6355 digest_buf[6],
6356 digest_buf[7]);
6357 }
6358 else if (hash_mode == 1441)
6359 {
6360 memcpy (tmp_buf, salt.salt_buf, salt.salt_len);
6361
6362 base64_encode (int_to_base64, (const u8 *) tmp_buf, salt.salt_len, (u8 *) ptr_salt);
6363
6364 memset (tmp_buf, 0, sizeof (tmp_buf));
6365
6366 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6367
6368 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6369 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6370 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6371 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6372 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6373 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6374 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6375 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6376
6377 memcpy (tmp_buf, digest_buf, 32);
6378
6379 base64_encode (int_to_base64, (const u8 *) tmp_buf, 32, (u8 *) ptr_plain);
6380
6381 ptr_plain[43] = 0;
6382
6383 snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER4, ptr_salt, ptr_plain);
6384 }
6385 else if (hash_mode == 1500)
6386 {
6387 out_buf[0] = salt.salt_sign[0] & 0xff;
6388 out_buf[1] = salt.salt_sign[1] & 0xff;
6389 //original method, but changed because of this ticket: https://hashcat.net/trac/ticket/269
6390 //out_buf[0] = int_to_itoa64 ((salt.salt_buf[0] >> 0) & 0x3f);
6391 //out_buf[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f);
6392
6393 memset (tmp_buf, 0, sizeof (tmp_buf));
6394
6395 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6396
6397 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6398 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6399
6400 memcpy (tmp_buf, digest_buf, 8);
6401
6402 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 8, (u8 *) ptr_plain);
6403
6404 snprintf (out_buf + 2, len-1-2, "%s", ptr_plain);
6405
6406 out_buf[13] = 0;
6407 }
6408 else if (hash_mode == 1600)
6409 {
6410 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6411
6412 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6413 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6414 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6415 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6416
6417 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6418
6419 if (salt.salt_iter == ROUNDS_MD5CRYPT)
6420 {
6421 snprintf (out_buf, len-1, "$apr1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6422 }
6423 else
6424 {
6425 snprintf (out_buf, len-1, "$apr1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6426 }
6427 }
6428 else if (hash_mode == 1711)
6429 {
6430 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6431
6432 digest_buf64[0] = byte_swap_64 (digest_buf64[0]);
6433 digest_buf64[1] = byte_swap_64 (digest_buf64[1]);
6434 digest_buf64[2] = byte_swap_64 (digest_buf64[2]);
6435 digest_buf64[3] = byte_swap_64 (digest_buf64[3]);
6436 digest_buf64[4] = byte_swap_64 (digest_buf64[4]);
6437 digest_buf64[5] = byte_swap_64 (digest_buf64[5]);
6438 digest_buf64[6] = byte_swap_64 (digest_buf64[6]);
6439 digest_buf64[7] = byte_swap_64 (digest_buf64[7]);
6440
6441 memcpy (tmp_buf, digest_buf, 64);
6442 memcpy (tmp_buf + 64, salt.salt_buf, salt.salt_len);
6443
6444 base64_encode (int_to_base64, (const u8 *) tmp_buf, 64 + salt.salt_len, (u8 *) ptr_plain);
6445
6446 snprintf (out_buf, len-1, "%s%s", SIGNATURE_SHA512B64S, ptr_plain);
6447 }
6448 else if (hash_mode == 1722)
6449 {
6450 uint *ptr = digest_buf;
6451
6452 snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6453 (unsigned char *) salt.salt_buf,
6454 ptr[ 1], ptr[ 0],
6455 ptr[ 3], ptr[ 2],
6456 ptr[ 5], ptr[ 4],
6457 ptr[ 7], ptr[ 6],
6458 ptr[ 9], ptr[ 8],
6459 ptr[11], ptr[10],
6460 ptr[13], ptr[12],
6461 ptr[15], ptr[14]);
6462 }
6463 else if (hash_mode == 1731)
6464 {
6465 uint *ptr = digest_buf;
6466
6467 snprintf (out_buf, len-1, "0x0200%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6468 (unsigned char *) salt.salt_buf,
6469 ptr[ 1], ptr[ 0],
6470 ptr[ 3], ptr[ 2],
6471 ptr[ 5], ptr[ 4],
6472 ptr[ 7], ptr[ 6],
6473 ptr[ 9], ptr[ 8],
6474 ptr[11], ptr[10],
6475 ptr[13], ptr[12],
6476 ptr[15], ptr[14]);
6477 }
6478 else if (hash_mode == 1800)
6479 {
6480 // temp workaround
6481
6482 digest_buf64[0] = byte_swap_64 (digest_buf64[0]);
6483 digest_buf64[1] = byte_swap_64 (digest_buf64[1]);
6484 digest_buf64[2] = byte_swap_64 (digest_buf64[2]);
6485 digest_buf64[3] = byte_swap_64 (digest_buf64[3]);
6486 digest_buf64[4] = byte_swap_64 (digest_buf64[4]);
6487 digest_buf64[5] = byte_swap_64 (digest_buf64[5]);
6488 digest_buf64[6] = byte_swap_64 (digest_buf64[6]);
6489 digest_buf64[7] = byte_swap_64 (digest_buf64[7]);
6490
6491 sha512crypt_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
6492
6493 if (salt.salt_iter == ROUNDS_SHA512CRYPT)
6494 {
6495 snprintf (out_buf, len-1, "$6$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6496 }
6497 else
6498 {
6499 snprintf (out_buf, len-1, "$6$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6500 }
6501 }
6502 else if (hash_mode == 2100)
6503 {
6504 uint pos = 0;
6505
6506 snprintf (out_buf + pos, len-1, "%s%i#",
6507 SIGNATURE_DCC2,
6508 salt.salt_iter + 1);
6509
6510 uint signature_len = strlen (out_buf);
6511
6512 pos += signature_len;
6513 len -= signature_len;
6514
6515 char *salt_ptr = (char *) salt.salt_buf;
6516
6517 for (uint i = 0; i < salt.salt_len; i++, pos++, len--) snprintf (out_buf + pos, len-1, "%c", salt_ptr[i]);
6518
6519 snprintf (out_buf + pos, len-1, "#%08x%08x%08x%08x",
6520 byte_swap_32 (digest_buf[0]),
6521 byte_swap_32 (digest_buf[1]),
6522 byte_swap_32 (digest_buf[2]),
6523 byte_swap_32 (digest_buf[3]));
6524 }
6525 else if ((hash_mode == 2400) || (hash_mode == 2410))
6526 {
6527 memcpy (tmp_buf, digest_buf, 16);
6528
6529 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6530
6531 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6532 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6533 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6534 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6535
6536 out_buf[ 0] = int_to_itoa64 ((digest_buf[0] >> 0) & 0x3f);
6537 out_buf[ 1] = int_to_itoa64 ((digest_buf[0] >> 6) & 0x3f);
6538 out_buf[ 2] = int_to_itoa64 ((digest_buf[0] >> 12) & 0x3f);
6539 out_buf[ 3] = int_to_itoa64 ((digest_buf[0] >> 18) & 0x3f);
6540
6541 out_buf[ 4] = int_to_itoa64 ((digest_buf[1] >> 0) & 0x3f);
6542 out_buf[ 5] = int_to_itoa64 ((digest_buf[1] >> 6) & 0x3f);
6543 out_buf[ 6] = int_to_itoa64 ((digest_buf[1] >> 12) & 0x3f);
6544 out_buf[ 7] = int_to_itoa64 ((digest_buf[1] >> 18) & 0x3f);
6545
6546 out_buf[ 8] = int_to_itoa64 ((digest_buf[2] >> 0) & 0x3f);
6547 out_buf[ 9] = int_to_itoa64 ((digest_buf[2] >> 6) & 0x3f);
6548 out_buf[10] = int_to_itoa64 ((digest_buf[2] >> 12) & 0x3f);
6549 out_buf[11] = int_to_itoa64 ((digest_buf[2] >> 18) & 0x3f);
6550
6551 out_buf[12] = int_to_itoa64 ((digest_buf[3] >> 0) & 0x3f);
6552 out_buf[13] = int_to_itoa64 ((digest_buf[3] >> 6) & 0x3f);
6553 out_buf[14] = int_to_itoa64 ((digest_buf[3] >> 12) & 0x3f);
6554 out_buf[15] = int_to_itoa64 ((digest_buf[3] >> 18) & 0x3f);
6555
6556 out_buf[16] = 0;
6557 }
6558 else if (hash_mode == 2500)
6559 {
6560 wpa_t *wpas = (wpa_t *) data.esalts_buf;
6561
6562 wpa_t *wpa = &wpas[salt_pos];
6563
6564 uint pke[25] = { 0 };
6565
6566 char *pke_ptr = (char *) pke;
6567
6568 for (uint i = 0; i < 25; i++)
6569 {
6570 pke[i] = byte_swap_32 (wpa->pke[i]);
6571 }
6572
6573 unsigned char mac1[6] = { 0 };
6574 unsigned char mac2[6] = { 0 };
6575
6576 memcpy (mac1, pke_ptr + 23, 6);
6577 memcpy (mac2, pke_ptr + 29, 6);
6578
6579 snprintf (out_buf, len-1, "%s:%02x%02x%02x%02x%02x%02x:%02x%02x%02x%02x%02x%02x",
6580 (char *) salt.salt_buf,
6581 mac1[0],
6582 mac1[1],
6583 mac1[2],
6584 mac1[3],
6585 mac1[4],
6586 mac1[5],
6587 mac2[0],
6588 mac2[1],
6589 mac2[2],
6590 mac2[3],
6591 mac2[4],
6592 mac2[5]);
6593 }
6594 else if (hash_mode == 4400)
6595 {
6596 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
6597 byte_swap_32 (digest_buf[0]),
6598 byte_swap_32 (digest_buf[1]),
6599 byte_swap_32 (digest_buf[2]),
6600 byte_swap_32 (digest_buf[3]));
6601 }
6602 else if (hash_mode == 4700)
6603 {
6604 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6605 byte_swap_32 (digest_buf[0]),
6606 byte_swap_32 (digest_buf[1]),
6607 byte_swap_32 (digest_buf[2]),
6608 byte_swap_32 (digest_buf[3]),
6609 byte_swap_32 (digest_buf[4]));
6610 }
6611 else if (hash_mode == 4800)
6612 {
6613 u8 chap_id_byte = (u8) salt.salt_buf[4];
6614
6615 snprintf (out_buf, len-1, "%08x%08x%08x%08x:%08x%08x%08x%08x:%02x",
6616 digest_buf[0],
6617 digest_buf[1],
6618 digest_buf[2],
6619 digest_buf[3],
6620 byte_swap_32 (salt.salt_buf[0]),
6621 byte_swap_32 (salt.salt_buf[1]),
6622 byte_swap_32 (salt.salt_buf[2]),
6623 byte_swap_32 (salt.salt_buf[3]),
6624 chap_id_byte);
6625 }
6626 else if (hash_mode == 4900)
6627 {
6628 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6629 byte_swap_32 (digest_buf[0]),
6630 byte_swap_32 (digest_buf[1]),
6631 byte_swap_32 (digest_buf[2]),
6632 byte_swap_32 (digest_buf[3]),
6633 byte_swap_32 (digest_buf[4]));
6634 }
6635 else if (hash_mode == 5100)
6636 {
6637 snprintf (out_buf, len-1, "%08x%08x",
6638 digest_buf[0],
6639 digest_buf[1]);
6640 }
6641 else if (hash_mode == 5200)
6642 {
6643 snprintf (out_buf, len-1, "%s", hashfile);
6644 }
6645 else if (hash_mode == 5300)
6646 {
6647 ikepsk_t *ikepsks = (ikepsk_t *) data.esalts_buf;
6648
6649 ikepsk_t *ikepsk = &ikepsks[salt_pos];
6650
6651 int buf_len = len -1;
6652
6653 // msg_buf
6654
6655 uint ikepsk_msg_len = ikepsk->msg_len / 4;
6656
6657 for (uint i = 0; i < ikepsk_msg_len; i++)
6658 {
6659 if ((i == 32) || (i == 64) || (i == 66) || (i == 68) || (i == 108))
6660 {
6661 snprintf (out_buf, buf_len, ":");
6662
6663 buf_len--;
6664 out_buf++;
6665 }
6666
6667 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->msg_buf[i]));
6668
6669 buf_len -= 8;
6670 out_buf += 8;
6671 }
6672
6673 // nr_buf
6674
6675 uint ikepsk_nr_len = ikepsk->nr_len / 4;
6676
6677 for (uint i = 0; i < ikepsk_nr_len; i++)
6678 {
6679 if ((i == 0) || (i == 5))
6680 {
6681 snprintf (out_buf, buf_len, ":");
6682
6683 buf_len--;
6684 out_buf++;
6685 }
6686
6687 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->nr_buf[i]));
6688
6689 buf_len -= 8;
6690 out_buf += 8;
6691 }
6692
6693 // digest_buf
6694
6695 for (uint i = 0; i < 4; i++)
6696 {
6697 if (i == 0)
6698 {
6699 snprintf (out_buf, buf_len, ":");
6700
6701 buf_len--;
6702 out_buf++;
6703 }
6704
6705 snprintf (out_buf, buf_len, "%08x", digest_buf[i]);
6706
6707 buf_len -= 8;
6708 out_buf += 8;
6709 }
6710 }
6711 else if (hash_mode == 5400)
6712 {
6713 ikepsk_t *ikepsks = (ikepsk_t *) data.esalts_buf;
6714
6715 ikepsk_t *ikepsk = &ikepsks[salt_pos];
6716
6717 int buf_len = len -1;
6718
6719 // msg_buf
6720
6721 uint ikepsk_msg_len = ikepsk->msg_len / 4;
6722
6723 for (uint i = 0; i < ikepsk_msg_len; i++)
6724 {
6725 if ((i == 32) || (i == 64) || (i == 66) || (i == 68) || (i == 108))
6726 {
6727 snprintf (out_buf, buf_len, ":");
6728
6729 buf_len--;
6730 out_buf++;
6731 }
6732
6733 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->msg_buf[i]));
6734
6735 buf_len -= 8;
6736 out_buf += 8;
6737 }
6738
6739 // nr_buf
6740
6741 uint ikepsk_nr_len = ikepsk->nr_len / 4;
6742
6743 for (uint i = 0; i < ikepsk_nr_len; i++)
6744 {
6745 if ((i == 0) || (i == 5))
6746 {
6747 snprintf (out_buf, buf_len, ":");
6748
6749 buf_len--;
6750 out_buf++;
6751 }
6752
6753 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->nr_buf[i]));
6754
6755 buf_len -= 8;
6756 out_buf += 8;
6757 }
6758
6759 // digest_buf
6760
6761 for (uint i = 0; i < 5; i++)
6762 {
6763 if (i == 0)
6764 {
6765 snprintf (out_buf, buf_len, ":");
6766
6767 buf_len--;
6768 out_buf++;
6769 }
6770
6771 snprintf (out_buf, buf_len, "%08x", digest_buf[i]);
6772
6773 buf_len -= 8;
6774 out_buf += 8;
6775 }
6776 }
6777 else if (hash_mode == 5500)
6778 {
6779 netntlm_t *netntlms = (netntlm_t *) data.esalts_buf;
6780
6781 netntlm_t *netntlm = &netntlms[salt_pos];
6782
6783 char user_buf[64] = { 0 };
6784 char domain_buf[64] = { 0 };
6785 char srvchall_buf[1024] = { 0 };
6786 char clichall_buf[1024] = { 0 };
6787
6788 for (uint i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2)
6789 {
6790 char *ptr = (char *) netntlm->userdomain_buf;
6791
6792 user_buf[i] = ptr[j];
6793 }
6794
6795 for (uint i = 0, j = 0; j < netntlm->domain_len; i += 1, j += 2)
6796 {
6797 char *ptr = (char *) netntlm->userdomain_buf;
6798
6799 domain_buf[i] = ptr[netntlm->user_len + j];
6800 }
6801
6802 for (uint i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2)
6803 {
6804 u8 *ptr = (u8 *) netntlm->chall_buf;
6805
6806 sprintf (srvchall_buf + j, "%02x", ptr[i]);
6807 }
6808
6809 for (uint i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2)
6810 {
6811 u8 *ptr = (u8 *) netntlm->chall_buf;
6812
6813 sprintf (clichall_buf + j, "%02x", ptr[netntlm->srvchall_len + i]);
6814 }
6815
6816 snprintf (out_buf, len-1, "%s::%s:%s:%08x%08x%08x%08x%08x%08x:%s",
6817 user_buf,
6818 domain_buf,
6819 srvchall_buf,
6820 digest_buf[0],
6821 digest_buf[1],
6822 digest_buf[2],
6823 digest_buf[3],
6824 byte_swap_32 (salt.salt_buf_pc[0]),
6825 byte_swap_32 (salt.salt_buf_pc[1]),
6826 clichall_buf);
6827 }
6828 else if (hash_mode == 5600)
6829 {
6830 netntlm_t *netntlms = (netntlm_t *) data.esalts_buf;
6831
6832 netntlm_t *netntlm = &netntlms[salt_pos];
6833
6834 char user_buf[64] = { 0 };
6835 char domain_buf[64] = { 0 };
6836 char srvchall_buf[1024] = { 0 };
6837 char clichall_buf[1024] = { 0 };
6838
6839 for (uint i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2)
6840 {
6841 char *ptr = (char *) netntlm->userdomain_buf;
6842
6843 user_buf[i] = ptr[j];
6844 }
6845
6846 for (uint i = 0, j = 0; j < netntlm->domain_len; i += 1, j += 2)
6847 {
6848 char *ptr = (char *) netntlm->userdomain_buf;
6849
6850 domain_buf[i] = ptr[netntlm->user_len + j];
6851 }
6852
6853 for (uint i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2)
6854 {
6855 u8 *ptr = (u8 *) netntlm->chall_buf;
6856
6857 sprintf (srvchall_buf + j, "%02x", ptr[i]);
6858 }
6859
6860 for (uint i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2)
6861 {
6862 u8 *ptr = (u8 *) netntlm->chall_buf;
6863
6864 sprintf (clichall_buf + j, "%02x", ptr[netntlm->srvchall_len + i]);
6865 }
6866
6867 snprintf (out_buf, len-1, "%s::%s:%s:%08x%08x%08x%08x:%s",
6868 user_buf,
6869 domain_buf,
6870 srvchall_buf,
6871 digest_buf[0],
6872 digest_buf[1],
6873 digest_buf[2],
6874 digest_buf[3],
6875 clichall_buf);
6876 }
6877 else if (hash_mode == 5700)
6878 {
6879 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6880
6881 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6882 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6883 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6884 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6885 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6886 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6887 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6888 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6889
6890 memcpy (tmp_buf, digest_buf, 32);
6891
6892 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 32, (u8 *) ptr_plain);
6893
6894 ptr_plain[43] = 0;
6895
6896 snprintf (out_buf, len-1, "%s", ptr_plain);
6897 }
6898 else if (hash_mode == 5800)
6899 {
6900 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6901 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6902 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6903 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6904 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6905
6906 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6907 digest_buf[0],
6908 digest_buf[1],
6909 digest_buf[2],
6910 digest_buf[3],
6911 digest_buf[4]);
6912 }
6913 else if ((hash_mode >= 6200) && (hash_mode <= 6299))
6914 {
6915 snprintf (out_buf, len-1, "%s", hashfile);
6916 }
6917 else if (hash_mode == 6300)
6918 {
6919 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6920
6921 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6922 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6923 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6924 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6925
6926 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6927
6928 snprintf (out_buf, len-1, "{smd5}%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6929 }
6930 else if (hash_mode == 6400)
6931 {
6932 sha256aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6933
6934 snprintf (out_buf, len-1, "{ssha256}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
6935 }
6936 else if (hash_mode == 6500)
6937 {
6938 sha512aix_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
6939
6940 snprintf (out_buf, len-1, "{ssha512}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
6941 }
6942 else if (hash_mode == 6600)
6943 {
6944 agilekey_t *agilekeys = (agilekey_t *) data.esalts_buf;
6945
6946 agilekey_t *agilekey = &agilekeys[salt_pos];
6947
6948 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
6949 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
6950
6951 uint buf_len = len - 1;
6952
6953 uint off = snprintf (out_buf, buf_len, "%d:%08x%08x:", salt.salt_iter + 1, salt.salt_buf[0], salt.salt_buf[1]);
6954 buf_len -= 22;
6955
6956 for (uint i = 0, j = off; i < 1040; i++, j += 2)
6957 {
6958 snprintf (out_buf + j, buf_len, "%02x", agilekey->cipher[i]);
6959
6960 buf_len -= 2;
6961 }
6962 }
6963 else if (hash_mode == 6700)
6964 {
6965 sha1aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6966
6967 snprintf (out_buf, len-1, "{ssha1}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
6968 }
6969 else if (hash_mode == 6800)
6970 {
6971 snprintf (out_buf, len-1, "%s", (char *) salt.salt_buf);
6972 }
6973 else if (hash_mode == 7100)
6974 {
6975 uint *ptr = digest_buf;
6976
6977 pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) data.esalts_buf;
6978
6979 pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[salt_pos];
6980
6981 uint esalt[8] = { 0 };
6982
6983 esalt[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]);
6984 esalt[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]);
6985 esalt[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]);
6986 esalt[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]);
6987 esalt[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]);
6988 esalt[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]);
6989 esalt[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]);
6990 esalt[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]);
6991
6992 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",
6993 SIGNATURE_SHA512OSX,
6994 salt.salt_iter + 1,
6995 esalt[ 0], esalt[ 1],
6996 esalt[ 2], esalt[ 3],
6997 esalt[ 4], esalt[ 5],
6998 esalt[ 6], esalt[ 7],
6999 ptr [ 1], ptr [ 0],
7000 ptr [ 3], ptr [ 2],
7001 ptr [ 5], ptr [ 4],
7002 ptr [ 7], ptr [ 6],
7003 ptr [ 9], ptr [ 8],
7004 ptr [11], ptr [10],
7005 ptr [13], ptr [12],
7006 ptr [15], ptr [14]);
7007 }
7008 else if (hash_mode == 7200)
7009 {
7010 uint *ptr = digest_buf;
7011
7012 pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) data.esalts_buf;
7013
7014 pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[salt_pos];
7015
7016 uint len_used = 0;
7017
7018 snprintf (out_buf + len_used, len - len_used - 1, "%s%i.", SIGNATURE_SHA512GRUB, salt.salt_iter + 1);
7019
7020 len_used = strlen (out_buf);
7021
7022 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha512->salt_buf;
7023
7024 for (uint i = 0; i < salt.salt_len; i++, len_used += 2)
7025 {
7026 snprintf (out_buf + len_used, len - len_used - 1, "%02x", salt_buf_ptr[i]);
7027 }
7028
7029 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",
7030 ptr [ 1], ptr [ 0],
7031 ptr [ 3], ptr [ 2],
7032 ptr [ 5], ptr [ 4],
7033 ptr [ 7], ptr [ 6],
7034 ptr [ 9], ptr [ 8],
7035 ptr [11], ptr [10],
7036 ptr [13], ptr [12],
7037 ptr [15], ptr [14]);
7038 }
7039 else if (hash_mode == 7300)
7040 {
7041 rakp_t *rakps = (rakp_t *) data.esalts_buf;
7042
7043 rakp_t *rakp = &rakps[salt_pos];
7044
7045 for (uint i = 0, j = 0; (i * 4) < rakp->salt_len; i += 1, j += 8)
7046 {
7047 sprintf (out_buf + j, "%08x", rakp->salt_buf[i]);
7048 }
7049
7050 snprintf (out_buf + rakp->salt_len * 2, len - 1, ":%08x%08x%08x%08x%08x",
7051 digest_buf[0],
7052 digest_buf[1],
7053 digest_buf[2],
7054 digest_buf[3],
7055 digest_buf[4]);
7056 }
7057 else if (hash_mode == 7400)
7058 {
7059 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
7060
7061 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7062 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7063 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7064 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7065 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7066 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7067 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7068 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7069
7070 sha256crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
7071
7072 if (salt.salt_iter == ROUNDS_SHA256CRYPT)
7073 {
7074 snprintf (out_buf, len-1, "$5$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
7075 }
7076 else
7077 {
7078 snprintf (out_buf, len-1, "$5$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
7079 }
7080 }
7081 else if (hash_mode == 7500)
7082 {
7083 krb5pa_t *krb5pas = (krb5pa_t *) data.esalts_buf;
7084
7085 krb5pa_t *krb5pa = &krb5pas[salt_pos];
7086
7087 u8 *ptr_timestamp = (u8 *) krb5pa->timestamp;
7088 u8 *ptr_checksum = (u8 *) krb5pa->checksum;
7089
7090 char data[128] = { 0 };
7091
7092 char *ptr_data = data;
7093
7094 for (uint i = 0; i < 36; i++, ptr_data += 2)
7095 {
7096 sprintf (ptr_data, "%02x", ptr_timestamp[i]);
7097 }
7098
7099 for (uint i = 0; i < 16; i++, ptr_data += 2)
7100 {
7101 sprintf (ptr_data, "%02x", ptr_checksum[i]);
7102 }
7103
7104 *ptr_data = 0;
7105
7106 snprintf (out_buf, len-1, "%s$%s$%s$%s$%s",
7107 SIGNATURE_KRB5PA,
7108 (char *) krb5pa->user,
7109 (char *) krb5pa->realm,
7110 (char *) krb5pa->salt,
7111 data);
7112 }
7113 else if (hash_mode == 7700)
7114 {
7115 snprintf (out_buf, len-1, "%s$%08X%08X",
7116 (char *) salt.salt_buf,
7117 digest_buf[0],
7118 digest_buf[1]);
7119 }
7120 else if (hash_mode == 7800)
7121 {
7122 snprintf (out_buf, len-1, "%s$%08X%08X%08X%08X%08X",
7123 (char *) salt.salt_buf,
7124 digest_buf[0],
7125 digest_buf[1],
7126 digest_buf[2],
7127 digest_buf[3],
7128 digest_buf[4]);
7129 }
7130 else if (hash_mode == 7900)
7131 {
7132 drupal7_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
7133
7134 // ugly hack start
7135
7136 char *tmp = (char *) salt.salt_buf_pc;
7137
7138 ptr_plain[42] = tmp[0];
7139
7140 // ugly hack end
7141
7142 ptr_plain[43] = 0;
7143
7144 snprintf (out_buf, len-1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, (char *) ptr_plain);
7145 }
7146 else if (hash_mode == 8000)
7147 {
7148 snprintf (out_buf, len-1, "0xc007%s%08x%08x%08x%08x%08x%08x%08x%08x",
7149 (unsigned char *) salt.salt_buf,
7150 digest_buf[0],
7151 digest_buf[1],
7152 digest_buf[2],
7153 digest_buf[3],
7154 digest_buf[4],
7155 digest_buf[5],
7156 digest_buf[6],
7157 digest_buf[7]);
7158 }
7159 else if (hash_mode == 8100)
7160 {
7161 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
7162 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
7163
7164 snprintf (out_buf, len-1, "1%s%08x%08x%08x%08x%08x",
7165 (unsigned char *) salt.salt_buf,
7166 digest_buf[0],
7167 digest_buf[1],
7168 digest_buf[2],
7169 digest_buf[3],
7170 digest_buf[4]);
7171 }
7172 else if (hash_mode == 8200)
7173 {
7174 cloudkey_t *cloudkeys = (cloudkey_t *) data.esalts_buf;
7175
7176 cloudkey_t *cloudkey = &cloudkeys[salt_pos];
7177
7178 char data_buf[4096] = { 0 };
7179
7180 for (int i = 0, j = 0; i < 512; i += 1, j += 8)
7181 {
7182 sprintf (data_buf + j, "%08x", cloudkey->data_buf[i]);
7183 }
7184
7185 data_buf[cloudkey->data_len * 2] = 0;
7186
7187 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7188 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7189 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7190 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7191 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7192 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7193 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7194 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7195
7196 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
7197 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
7198 salt.salt_buf[2] = byte_swap_32 (salt.salt_buf[2]);
7199 salt.salt_buf[3] = byte_swap_32 (salt.salt_buf[3]);
7200
7201 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x:%08x%08x%08x%08x:%u:%s",
7202 digest_buf[0],
7203 digest_buf[1],
7204 digest_buf[2],
7205 digest_buf[3],
7206 digest_buf[4],
7207 digest_buf[5],
7208 digest_buf[6],
7209 digest_buf[7],
7210 salt.salt_buf[0],
7211 salt.salt_buf[1],
7212 salt.salt_buf[2],
7213 salt.salt_buf[3],
7214 salt.salt_iter + 1,
7215 data_buf);
7216 }
7217 else if (hash_mode == 8300)
7218 {
7219 char digest_buf_c[34] = { 0 };
7220
7221 base32_encode (int_to_itoa32, (const u8 *) digest_buf, 20, (u8 *) digest_buf_c);
7222
7223 digest_buf_c[32] = 0;
7224
7225 // domain
7226
7227 const uint salt_pc_len = salt.salt_buf_pc[7]; // what a hack
7228
7229 char domain_buf_c[33] = { 0 };
7230
7231 memcpy (domain_buf_c, (char *) salt.salt_buf_pc, salt_pc_len);
7232
7233 for (uint i = 0; i < salt_pc_len; i++)
7234 {
7235 const char next = domain_buf_c[i];
7236
7237 domain_buf_c[i] = '.';
7238
7239 i += next;
7240 }
7241
7242 domain_buf_c[salt_pc_len] = 0;
7243
7244 // final
7245
7246 snprintf (out_buf, len-1, "%s:%s:%s:%u", digest_buf_c, domain_buf_c, (char *) salt.salt_buf, salt.salt_iter);
7247 }
7248 else if (hash_mode == 8500)
7249 {
7250 snprintf (out_buf, len-1, "%s*%s*%08X%08X", SIGNATURE_RACF, (char *) salt.salt_buf, digest_buf[0], digest_buf[1]);
7251 }
7252 else if (hash_mode == 2612)
7253 {
7254 snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x",
7255 SIGNATURE_PHPS,
7256 (char *) salt.salt_buf,
7257 digest_buf[0],
7258 digest_buf[1],
7259 digest_buf[2],
7260 digest_buf[3]);
7261 }
7262 else if (hash_mode == 3711)
7263 {
7264 char *salt_ptr = (char *) salt.salt_buf;
7265
7266 salt_ptr[salt.salt_len - 1] = 0;
7267
7268 snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x",
7269 SIGNATURE_MEDIAWIKI_B,
7270 salt_ptr,
7271 digest_buf[0],
7272 digest_buf[1],
7273 digest_buf[2],
7274 digest_buf[3]);
7275 }
7276 else if (hash_mode == 8800)
7277 {
7278 androidfde_t *androidfdes = (androidfde_t *) data.esalts_buf;
7279
7280 androidfde_t *androidfde = &androidfdes[salt_pos];
7281
7282 char tmp[3073] = { 0 };
7283
7284 for (uint i = 0, j = 0; i < 384; i += 1, j += 8)
7285 {
7286 sprintf (tmp + j, "%08x", androidfde->data[i]);
7287 }
7288
7289 tmp[3072] = 0;
7290
7291 snprintf (out_buf, len-1, "%s16$%08x%08x%08x%08x$16$%08x%08x%08x%08x$%s",
7292 SIGNATURE_ANDROIDFDE,
7293 byte_swap_32 (salt.salt_buf[0]),
7294 byte_swap_32 (salt.salt_buf[1]),
7295 byte_swap_32 (salt.salt_buf[2]),
7296 byte_swap_32 (salt.salt_buf[3]),
7297 byte_swap_32 (digest_buf[0]),
7298 byte_swap_32 (digest_buf[1]),
7299 byte_swap_32 (digest_buf[2]),
7300 byte_swap_32 (digest_buf[3]),
7301 tmp);
7302 }
7303 else if (hash_mode == 8900)
7304 {
7305 uint N = salt.scrypt_N;
7306 uint r = salt.scrypt_r;
7307 uint p = salt.scrypt_p;
7308
7309 char base64_salt[32] = { 0 };
7310
7311 base64_encode (int_to_base64, (const u8 *) salt.salt_buf, salt.salt_len, (u8 *) base64_salt);
7312
7313 memset (tmp_buf, 0, 46);
7314
7315 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7316 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7317 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7318 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7319 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7320 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7321 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7322 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7323 digest_buf[8] = 0; // needed for base64_encode ()
7324
7325 base64_encode (int_to_base64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7326
7327 snprintf (out_buf, len-1, "%s:%i:%i:%i:%s:%s",
7328 SIGNATURE_SCRYPT,
7329 N,
7330 r,
7331 p,
7332 base64_salt,
7333 tmp_buf);
7334 }
7335 else if (hash_mode == 9000)
7336 {
7337 snprintf (out_buf, len-1, "%s", hashfile);
7338 }
7339 else if (hash_mode == 9200)
7340 {
7341 // salt
7342
7343 pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) data.esalts_buf;
7344
7345 pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[salt_pos];
7346
7347 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf;
7348
7349 // hash
7350
7351 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7352 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7353 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7354 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7355 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7356 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7357 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7358 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7359 digest_buf[8] = 0; // needed for base64_encode ()
7360
7361 char tmp_buf[64] = { 0 };
7362
7363 base64_encode (int_to_itoa64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7364 tmp_buf[43] = 0; // cut it here
7365
7366 // output
7367
7368 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO8, salt_buf_ptr, tmp_buf);
7369 }
7370 else if (hash_mode == 9300)
7371 {
7372 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7373 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7374 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7375 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7376 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7377 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7378 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7379 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7380 digest_buf[8] = 0; // needed for base64_encode ()
7381
7382 char tmp_buf[64] = { 0 };
7383
7384 base64_encode (int_to_itoa64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7385 tmp_buf[43] = 0; // cut it here
7386
7387 unsigned char *salt_buf_ptr = (unsigned char *) salt.salt_buf;
7388
7389 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO9, salt_buf_ptr, tmp_buf);
7390 }
7391 else if (hash_mode == 9400)
7392 {
7393 office2007_t *office2007s = (office2007_t *) data.esalts_buf;
7394
7395 office2007_t *office2007 = &office2007s[salt_pos];
7396
7397 snprintf (out_buf, len-1, "%s*%u*%u*%u*%u*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7398 SIGNATURE_OFFICE2007,
7399 2007,
7400 20,
7401 office2007->keySize,
7402 16,
7403 salt.salt_buf[0],
7404 salt.salt_buf[1],
7405 salt.salt_buf[2],
7406 salt.salt_buf[3],
7407 office2007->encryptedVerifier[0],
7408 office2007->encryptedVerifier[1],
7409 office2007->encryptedVerifier[2],
7410 office2007->encryptedVerifier[3],
7411 office2007->encryptedVerifierHash[0],
7412 office2007->encryptedVerifierHash[1],
7413 office2007->encryptedVerifierHash[2],
7414 office2007->encryptedVerifierHash[3],
7415 office2007->encryptedVerifierHash[4]);
7416 }
7417 else if (hash_mode == 9500)
7418 {
7419 office2010_t *office2010s = (office2010_t *) data.esalts_buf;
7420
7421 office2010_t *office2010 = &office2010s[salt_pos];
7422
7423 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,
7424
7425 salt.salt_buf[0],
7426 salt.salt_buf[1],
7427 salt.salt_buf[2],
7428 salt.salt_buf[3],
7429 office2010->encryptedVerifier[0],
7430 office2010->encryptedVerifier[1],
7431 office2010->encryptedVerifier[2],
7432 office2010->encryptedVerifier[3],
7433 office2010->encryptedVerifierHash[0],
7434 office2010->encryptedVerifierHash[1],
7435 office2010->encryptedVerifierHash[2],
7436 office2010->encryptedVerifierHash[3],
7437 office2010->encryptedVerifierHash[4],
7438 office2010->encryptedVerifierHash[5],
7439 office2010->encryptedVerifierHash[6],
7440 office2010->encryptedVerifierHash[7]);
7441 }
7442 else if (hash_mode == 9600)
7443 {
7444 office2013_t *office2013s = (office2013_t *) data.esalts_buf;
7445
7446 office2013_t *office2013 = &office2013s[salt_pos];
7447
7448 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,
7449
7450 salt.salt_buf[0],
7451 salt.salt_buf[1],
7452 salt.salt_buf[2],
7453 salt.salt_buf[3],
7454 office2013->encryptedVerifier[0],
7455 office2013->encryptedVerifier[1],
7456 office2013->encryptedVerifier[2],
7457 office2013->encryptedVerifier[3],
7458 office2013->encryptedVerifierHash[0],
7459 office2013->encryptedVerifierHash[1],
7460 office2013->encryptedVerifierHash[2],
7461 office2013->encryptedVerifierHash[3],
7462 office2013->encryptedVerifierHash[4],
7463 office2013->encryptedVerifierHash[5],
7464 office2013->encryptedVerifierHash[6],
7465 office2013->encryptedVerifierHash[7]);
7466 }
7467 else if (hash_mode == 9700)
7468 {
7469 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7470
7471 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7472
7473 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7474 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7475 byte_swap_32 (salt.salt_buf[0]),
7476 byte_swap_32 (salt.salt_buf[1]),
7477 byte_swap_32 (salt.salt_buf[2]),
7478 byte_swap_32 (salt.salt_buf[3]),
7479 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7480 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7481 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7482 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7483 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7484 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7485 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7486 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]));
7487 }
7488 else if (hash_mode == 9710)
7489 {
7490 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7491
7492 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7493
7494 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7495 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7496 byte_swap_32 (salt.salt_buf[0]),
7497 byte_swap_32 (salt.salt_buf[1]),
7498 byte_swap_32 (salt.salt_buf[2]),
7499 byte_swap_32 (salt.salt_buf[3]),
7500 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7501 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7502 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7503 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7504 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7505 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7506 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7507 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]));
7508 }
7509 else if (hash_mode == 9720)
7510 {
7511 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7512
7513 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7514
7515 u8 *rc4key = (u8 *) oldoffice01->rc4key;
7516
7517 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7518 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7519 byte_swap_32 (salt.salt_buf[0]),
7520 byte_swap_32 (salt.salt_buf[1]),
7521 byte_swap_32 (salt.salt_buf[2]),
7522 byte_swap_32 (salt.salt_buf[3]),
7523 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7524 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7525 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7526 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7527 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7528 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7529 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7530 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]),
7531 rc4key[0],
7532 rc4key[1],
7533 rc4key[2],
7534 rc4key[3],
7535 rc4key[4]);
7536 }
7537 else if (hash_mode == 9800)
7538 {
7539 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7540
7541 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7542
7543 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7544 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7545 salt.salt_buf[0],
7546 salt.salt_buf[1],
7547 salt.salt_buf[2],
7548 salt.salt_buf[3],
7549 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7550 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7551 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7552 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7553 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7554 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7555 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7556 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7557 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]));
7558 }
7559 else if (hash_mode == 9810)
7560 {
7561 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7562
7563 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7564
7565 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7566 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7567 salt.salt_buf[0],
7568 salt.salt_buf[1],
7569 salt.salt_buf[2],
7570 salt.salt_buf[3],
7571 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7572 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7573 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7574 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7575 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7576 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7577 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7578 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7579 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]));
7580 }
7581 else if (hash_mode == 9820)
7582 {
7583 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7584
7585 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7586
7587 u8 *rc4key = (u8 *) oldoffice34->rc4key;
7588
7589 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7590 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7591 salt.salt_buf[0],
7592 salt.salt_buf[1],
7593 salt.salt_buf[2],
7594 salt.salt_buf[3],
7595 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7596 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7597 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7598 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7599 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7600 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7601 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7602 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7603 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]),
7604 rc4key[0],
7605 rc4key[1],
7606 rc4key[2],
7607 rc4key[3],
7608 rc4key[4]);
7609 }
7610 else if (hash_mode == 10000)
7611 {
7612 // salt
7613
7614 pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) data.esalts_buf;
7615
7616 pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[salt_pos];
7617
7618 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf;
7619
7620 // hash
7621
7622 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7623 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7624 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7625 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7626 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7627 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7628 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7629 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7630 digest_buf[8] = 0; // needed for base64_encode ()
7631
7632 char tmp_buf[64] = { 0 };
7633
7634 base64_encode (int_to_base64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7635
7636 // output
7637
7638 snprintf (out_buf, len-1, "%s%i$%s$%s", SIGNATURE_DJANGOPBKDF2, salt.salt_iter + 1, salt_buf_ptr, tmp_buf);
7639 }
7640 else if (hash_mode == 10100)
7641 {
7642 snprintf (out_buf, len-1, "%08x%08x:%u:%u:%08x%08x%08x%08x",
7643 digest_buf[0],
7644 digest_buf[1],
7645 2,
7646 4,
7647 byte_swap_32 (salt.salt_buf[0]),
7648 byte_swap_32 (salt.salt_buf[1]),
7649 byte_swap_32 (salt.salt_buf[2]),
7650 byte_swap_32 (salt.salt_buf[3]));
7651 }
7652 else if (hash_mode == 10200)
7653 {
7654 cram_md5_t *cram_md5s = (cram_md5_t *) data.esalts_buf;
7655
7656 cram_md5_t *cram_md5 = &cram_md5s[salt_pos];
7657
7658 // challenge
7659
7660 char challenge[100] = { 0 };
7661
7662 base64_encode (int_to_base64, (const u8 *) salt.salt_buf, salt.salt_len, (u8 *) challenge);
7663
7664 // response
7665
7666 char tmp_buf[100] = { 0 };
7667
7668 uint tmp_len = snprintf (tmp_buf, 100, "%s %08x%08x%08x%08x",
7669 (char *) cram_md5->user,
7670 digest_buf[0],
7671 digest_buf[1],
7672 digest_buf[2],
7673 digest_buf[3]);
7674
7675 char response[100] = { 0 };
7676
7677 base64_encode (int_to_base64, (const u8 *) tmp_buf, tmp_len, (u8 *) response);
7678
7679 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CRAM_MD5, challenge, response);
7680 }
7681 else if (hash_mode == 10300)
7682 {
7683 char tmp_buf[100] = { 0 };
7684
7685 memcpy (tmp_buf + 0, digest_buf, 20);
7686 memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len);
7687
7688 uint tmp_len = 20 + salt.salt_len;
7689
7690 // base64 encode it
7691
7692 char base64_encoded[100] = { 0 };
7693
7694 base64_encode (int_to_base64, (const u8 *) tmp_buf, tmp_len, (u8 *) base64_encoded);
7695
7696 snprintf (out_buf, len-1, "%s%i}%s", SIGNATURE_SAPH_SHA1, salt.salt_iter + 1, base64_encoded);
7697 }
7698 else if (hash_mode == 10400)
7699 {
7700 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7701
7702 pdf_t *pdf = &pdfs[salt_pos];
7703
7704 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",
7705
7706 pdf->V,
7707 pdf->R,
7708 40,
7709 pdf->P,
7710 pdf->enc_md,
7711 pdf->id_len,
7712 byte_swap_32 (pdf->id_buf[0]),
7713 byte_swap_32 (pdf->id_buf[1]),
7714 byte_swap_32 (pdf->id_buf[2]),
7715 byte_swap_32 (pdf->id_buf[3]),
7716 pdf->u_len,
7717 byte_swap_32 (pdf->u_buf[0]),
7718 byte_swap_32 (pdf->u_buf[1]),
7719 byte_swap_32 (pdf->u_buf[2]),
7720 byte_swap_32 (pdf->u_buf[3]),
7721 byte_swap_32 (pdf->u_buf[4]),
7722 byte_swap_32 (pdf->u_buf[5]),
7723 byte_swap_32 (pdf->u_buf[6]),
7724 byte_swap_32 (pdf->u_buf[7]),
7725 pdf->o_len,
7726 byte_swap_32 (pdf->o_buf[0]),
7727 byte_swap_32 (pdf->o_buf[1]),
7728 byte_swap_32 (pdf->o_buf[2]),
7729 byte_swap_32 (pdf->o_buf[3]),
7730 byte_swap_32 (pdf->o_buf[4]),
7731 byte_swap_32 (pdf->o_buf[5]),
7732 byte_swap_32 (pdf->o_buf[6]),
7733 byte_swap_32 (pdf->o_buf[7])
7734 );
7735 }
7736 else if (hash_mode == 10410)
7737 {
7738 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7739
7740 pdf_t *pdf = &pdfs[salt_pos];
7741
7742 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",
7743
7744 pdf->V,
7745 pdf->R,
7746 40,
7747 pdf->P,
7748 pdf->enc_md,
7749 pdf->id_len,
7750 byte_swap_32 (pdf->id_buf[0]),
7751 byte_swap_32 (pdf->id_buf[1]),
7752 byte_swap_32 (pdf->id_buf[2]),
7753 byte_swap_32 (pdf->id_buf[3]),
7754 pdf->u_len,
7755 byte_swap_32 (pdf->u_buf[0]),
7756 byte_swap_32 (pdf->u_buf[1]),
7757 byte_swap_32 (pdf->u_buf[2]),
7758 byte_swap_32 (pdf->u_buf[3]),
7759 byte_swap_32 (pdf->u_buf[4]),
7760 byte_swap_32 (pdf->u_buf[5]),
7761 byte_swap_32 (pdf->u_buf[6]),
7762 byte_swap_32 (pdf->u_buf[7]),
7763 pdf->o_len,
7764 byte_swap_32 (pdf->o_buf[0]),
7765 byte_swap_32 (pdf->o_buf[1]),
7766 byte_swap_32 (pdf->o_buf[2]),
7767 byte_swap_32 (pdf->o_buf[3]),
7768 byte_swap_32 (pdf->o_buf[4]),
7769 byte_swap_32 (pdf->o_buf[5]),
7770 byte_swap_32 (pdf->o_buf[6]),
7771 byte_swap_32 (pdf->o_buf[7])
7772 );
7773 }
7774 else if (hash_mode == 10420)
7775 {
7776 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7777
7778 pdf_t *pdf = &pdfs[salt_pos];
7779
7780 u8 *rc4key = (u8 *) pdf->rc4key;
7781
7782 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",
7783
7784 pdf->V,
7785 pdf->R,
7786 40,
7787 pdf->P,
7788 pdf->enc_md,
7789 pdf->id_len,
7790 byte_swap_32 (pdf->id_buf[0]),
7791 byte_swap_32 (pdf->id_buf[1]),
7792 byte_swap_32 (pdf->id_buf[2]),
7793 byte_swap_32 (pdf->id_buf[3]),
7794 pdf->u_len,
7795 byte_swap_32 (pdf->u_buf[0]),
7796 byte_swap_32 (pdf->u_buf[1]),
7797 byte_swap_32 (pdf->u_buf[2]),
7798 byte_swap_32 (pdf->u_buf[3]),
7799 byte_swap_32 (pdf->u_buf[4]),
7800 byte_swap_32 (pdf->u_buf[5]),
7801 byte_swap_32 (pdf->u_buf[6]),
7802 byte_swap_32 (pdf->u_buf[7]),
7803 pdf->o_len,
7804 byte_swap_32 (pdf->o_buf[0]),
7805 byte_swap_32 (pdf->o_buf[1]),
7806 byte_swap_32 (pdf->o_buf[2]),
7807 byte_swap_32 (pdf->o_buf[3]),
7808 byte_swap_32 (pdf->o_buf[4]),
7809 byte_swap_32 (pdf->o_buf[5]),
7810 byte_swap_32 (pdf->o_buf[6]),
7811 byte_swap_32 (pdf->o_buf[7]),
7812 rc4key[0],
7813 rc4key[1],
7814 rc4key[2],
7815 rc4key[3],
7816 rc4key[4]
7817 );
7818 }
7819 else if (hash_mode == 10500)
7820 {
7821 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7822
7823 pdf_t *pdf = &pdfs[salt_pos];
7824
7825 if (pdf->id_len == 32)
7826 {
7827 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",
7828
7829 pdf->V,
7830 pdf->R,
7831 128,
7832 pdf->P,
7833 pdf->enc_md,
7834 pdf->id_len,
7835 byte_swap_32 (pdf->id_buf[0]),
7836 byte_swap_32 (pdf->id_buf[1]),
7837 byte_swap_32 (pdf->id_buf[2]),
7838 byte_swap_32 (pdf->id_buf[3]),
7839 byte_swap_32 (pdf->id_buf[4]),
7840 byte_swap_32 (pdf->id_buf[5]),
7841 byte_swap_32 (pdf->id_buf[6]),
7842 byte_swap_32 (pdf->id_buf[7]),
7843 pdf->u_len,
7844 byte_swap_32 (pdf->u_buf[0]),
7845 byte_swap_32 (pdf->u_buf[1]),
7846 byte_swap_32 (pdf->u_buf[2]),
7847 byte_swap_32 (pdf->u_buf[3]),
7848 byte_swap_32 (pdf->u_buf[4]),
7849 byte_swap_32 (pdf->u_buf[5]),
7850 byte_swap_32 (pdf->u_buf[6]),
7851 byte_swap_32 (pdf->u_buf[7]),
7852 pdf->o_len,
7853 byte_swap_32 (pdf->o_buf[0]),
7854 byte_swap_32 (pdf->o_buf[1]),
7855 byte_swap_32 (pdf->o_buf[2]),
7856 byte_swap_32 (pdf->o_buf[3]),
7857 byte_swap_32 (pdf->o_buf[4]),
7858 byte_swap_32 (pdf->o_buf[5]),
7859 byte_swap_32 (pdf->o_buf[6]),
7860 byte_swap_32 (pdf->o_buf[7])
7861 );
7862 }
7863 else
7864 {
7865 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",
7866
7867 pdf->V,
7868 pdf->R,
7869 128,
7870 pdf->P,
7871 pdf->enc_md,
7872 pdf->id_len,
7873 byte_swap_32 (pdf->id_buf[0]),
7874 byte_swap_32 (pdf->id_buf[1]),
7875 byte_swap_32 (pdf->id_buf[2]),
7876 byte_swap_32 (pdf->id_buf[3]),
7877 pdf->u_len,
7878 byte_swap_32 (pdf->u_buf[0]),
7879 byte_swap_32 (pdf->u_buf[1]),
7880 byte_swap_32 (pdf->u_buf[2]),
7881 byte_swap_32 (pdf->u_buf[3]),
7882 byte_swap_32 (pdf->u_buf[4]),
7883 byte_swap_32 (pdf->u_buf[5]),
7884 byte_swap_32 (pdf->u_buf[6]),
7885 byte_swap_32 (pdf->u_buf[7]),
7886 pdf->o_len,
7887 byte_swap_32 (pdf->o_buf[0]),
7888 byte_swap_32 (pdf->o_buf[1]),
7889 byte_swap_32 (pdf->o_buf[2]),
7890 byte_swap_32 (pdf->o_buf[3]),
7891 byte_swap_32 (pdf->o_buf[4]),
7892 byte_swap_32 (pdf->o_buf[5]),
7893 byte_swap_32 (pdf->o_buf[6]),
7894 byte_swap_32 (pdf->o_buf[7])
7895 );
7896 }
7897 }
7898 else if (hash_mode == 10600)
7899 {
7900 uint digest_idx = salt.digests_offset + digest_pos;
7901
7902 hashinfo_t **hashinfo_ptr = data.hash_info;
7903 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7904
7905 snprintf (out_buf, len-1, "%s", hash_buf);
7906 }
7907 else if (hash_mode == 10700)
7908 {
7909 uint digest_idx = salt.digests_offset + digest_pos;
7910
7911 hashinfo_t **hashinfo_ptr = data.hash_info;
7912 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7913
7914 snprintf (out_buf, len-1, "%s", hash_buf);
7915 }
7916 else if (hash_mode == 10900)
7917 {
7918 uint digest_idx = salt.digests_offset + digest_pos;
7919
7920 hashinfo_t **hashinfo_ptr = data.hash_info;
7921 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7922
7923 snprintf (out_buf, len-1, "%s", hash_buf);
7924 }
7925 else if (hash_mode == 11100)
7926 {
7927 u32 salt_challenge = salt.salt_buf[0];
7928
7929 salt_challenge = byte_swap_32 (salt_challenge);
7930
7931 unsigned char *user_name = (unsigned char *) (salt.salt_buf + 1);
7932
7933 snprintf (out_buf, len-1, "%s%s*%08x*%08x%08x%08x%08x",
7934 SIGNATURE_POSTGRESQL_AUTH,
7935 user_name,
7936 salt_challenge,
7937 digest_buf[0],
7938 digest_buf[1],
7939 digest_buf[2],
7940 digest_buf[3]);
7941 }
7942 else if (hash_mode == 11200)
7943 {
7944 snprintf (out_buf, len-1, "%s%s*%08x%08x%08x%08x%08x",
7945 SIGNATURE_MYSQL_AUTH,
7946 (unsigned char *) salt.salt_buf,
7947 digest_buf[0],
7948 digest_buf[1],
7949 digest_buf[2],
7950 digest_buf[3],
7951 digest_buf[4]);
7952 }
7953 else if (hash_mode == 11300)
7954 {
7955 bitcoin_wallet_t *bitcoin_wallets = (bitcoin_wallet_t *) data.esalts_buf;
7956
7957 bitcoin_wallet_t *bitcoin_wallet = &bitcoin_wallets[salt_pos];
7958
7959 const uint cry_master_len = bitcoin_wallet->cry_master_len;
7960 const uint ckey_len = bitcoin_wallet->ckey_len;
7961 const uint public_key_len = bitcoin_wallet->public_key_len;
7962
7963 char *cry_master_buf = (char *) mymalloc ((cry_master_len * 2) + 1);
7964 char *ckey_buf = (char *) mymalloc ((ckey_len * 2) + 1);
7965 char *public_key_buf = (char *) mymalloc ((public_key_len * 2) + 1);
7966
7967 for (uint i = 0, j = 0; i < cry_master_len; i += 1, j += 2)
7968 {
7969 const u8 *ptr = (const u8 *) bitcoin_wallet->cry_master_buf;
7970
7971 sprintf (cry_master_buf + j, "%02x", ptr[i]);
7972 }
7973
7974 for (uint i = 0, j = 0; i < ckey_len; i += 1, j += 2)
7975 {
7976 const u8 *ptr = (const u8 *) bitcoin_wallet->ckey_buf;
7977
7978 sprintf (ckey_buf + j, "%02x", ptr[i]);
7979 }
7980
7981 for (uint i = 0, j = 0; i < public_key_len; i += 1, j += 2)
7982 {
7983 const u8 *ptr = (const u8 *) bitcoin_wallet->public_key_buf;
7984
7985 sprintf (public_key_buf + j, "%02x", ptr[i]);
7986 }
7987
7988 snprintf (out_buf, len-1, "%s%d$%s$%d$%s$%d$%d$%s$%d$%s",
7989 SIGNATURE_BITCOIN_WALLET,
7990 cry_master_len * 2,
7991 cry_master_buf,
7992 salt.salt_len,
7993 (unsigned char *) salt.salt_buf,
7994 salt.salt_iter + 1,
7995 ckey_len * 2,
7996 ckey_buf,
7997 public_key_len * 2,
7998 public_key_buf
7999 );
8000
8001 free (cry_master_buf);
8002 free (ckey_buf);
8003 free (public_key_buf);
8004 }
8005 else if (hash_mode == 11400)
8006 {
8007 uint digest_idx = salt.digests_offset + digest_pos;
8008
8009 hashinfo_t **hashinfo_ptr = data.hash_info;
8010 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8011
8012 snprintf (out_buf, len-1, "%s", hash_buf);
8013 }
8014 else if (hash_mode == 11600)
8015 {
8016 seven_zip_t *seven_zips = (seven_zip_t *) data.esalts_buf;
8017
8018 seven_zip_t *seven_zip = &seven_zips[salt_pos];
8019
8020 const uint data_len = seven_zip->data_len;
8021
8022 char *data_buf = (char *) mymalloc ((data_len * 2) + 1);
8023
8024 for (uint i = 0, j = 0; i < data_len; i += 1, j += 2)
8025 {
8026 const u8 *ptr = (const u8 *) seven_zip->data_buf;
8027
8028 sprintf (data_buf + j, "%02x", ptr[i]);
8029 }
8030
8031 snprintf (out_buf, len-1, "%s%u$%u$%u$%s$%u$%08x%08x%08x%08x$%u$%u$%u$%s",
8032 SIGNATURE_SEVEN_ZIP,
8033 0,
8034 salt.salt_sign[0],
8035 0,
8036 (char *) seven_zip->salt_buf,
8037 seven_zip->iv_len,
8038 seven_zip->iv_buf[0],
8039 seven_zip->iv_buf[1],
8040 seven_zip->iv_buf[2],
8041 seven_zip->iv_buf[3],
8042 seven_zip->crc,
8043 seven_zip->data_len,
8044 seven_zip->unpack_size,
8045 data_buf);
8046
8047 free (data_buf);
8048 }
8049 else if (hash_mode == 11700)
8050 {
8051 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8052 digest_buf[0],
8053 digest_buf[1],
8054 digest_buf[2],
8055 digest_buf[3],
8056 digest_buf[4],
8057 digest_buf[5],
8058 digest_buf[6],
8059 digest_buf[7]);
8060 }
8061 else if (hash_mode == 11800)
8062 {
8063 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8064 digest_buf[ 0],
8065 digest_buf[ 1],
8066 digest_buf[ 2],
8067 digest_buf[ 3],
8068 digest_buf[ 4],
8069 digest_buf[ 5],
8070 digest_buf[ 6],
8071 digest_buf[ 7],
8072 digest_buf[ 8],
8073 digest_buf[ 9],
8074 digest_buf[10],
8075 digest_buf[11],
8076 digest_buf[12],
8077 digest_buf[13],
8078 digest_buf[14],
8079 digest_buf[15]);
8080 }
8081 else if (hash_mode == 11900)
8082 {
8083 uint digest_idx = salt.digests_offset + digest_pos;
8084
8085 hashinfo_t **hashinfo_ptr = data.hash_info;
8086 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8087
8088 snprintf (out_buf, len-1, "%s", hash_buf);
8089 }
8090 else if (hash_mode == 12000)
8091 {
8092 uint digest_idx = salt.digests_offset + digest_pos;
8093
8094 hashinfo_t **hashinfo_ptr = data.hash_info;
8095 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8096
8097 snprintf (out_buf, len-1, "%s", hash_buf);
8098 }
8099 else if (hash_mode == 12100)
8100 {
8101 uint digest_idx = salt.digests_offset + digest_pos;
8102
8103 hashinfo_t **hashinfo_ptr = data.hash_info;
8104 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8105
8106 snprintf (out_buf, len-1, "%s", hash_buf);
8107 }
8108 else if (hash_mode == 12200)
8109 {
8110 uint *ptr_digest = digest_buf;
8111 uint *ptr_salt = salt.salt_buf;
8112
8113 snprintf (out_buf, len-1, "%s0$1$%08x%08x$%08x%08x",
8114 SIGNATURE_ECRYPTFS,
8115 ptr_salt[0],
8116 ptr_salt[1],
8117 ptr_digest[0],
8118 ptr_digest[1]);
8119 }
8120 else if (hash_mode == 12300)
8121 {
8122 uint *ptr_digest = digest_buf;
8123 uint *ptr_salt = salt.salt_buf;
8124
8125 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",
8126 ptr_digest[ 0], ptr_digest[ 1],
8127 ptr_digest[ 2], ptr_digest[ 3],
8128 ptr_digest[ 4], ptr_digest[ 5],
8129 ptr_digest[ 6], ptr_digest[ 7],
8130 ptr_digest[ 8], ptr_digest[ 9],
8131 ptr_digest[10], ptr_digest[11],
8132 ptr_digest[12], ptr_digest[13],
8133 ptr_digest[14], ptr_digest[15],
8134 ptr_salt[0],
8135 ptr_salt[1],
8136 ptr_salt[2],
8137 ptr_salt[3]);
8138 }
8139 else if (hash_mode == 12400)
8140 {
8141 // encode iteration count
8142
8143 char salt_iter[5] = { 0 };
8144
8145 salt_iter[0] = int_to_itoa64 ((salt.salt_iter ) & 0x3f);
8146 salt_iter[1] = int_to_itoa64 ((salt.salt_iter >> 6) & 0x3f);
8147 salt_iter[2] = int_to_itoa64 ((salt.salt_iter >> 12) & 0x3f);
8148 salt_iter[3] = int_to_itoa64 ((salt.salt_iter >> 18) & 0x3f);
8149 salt_iter[4] = 0;
8150
8151 // encode salt
8152
8153 ptr_salt[0] = int_to_itoa64 ((salt.salt_buf[0] ) & 0x3f);
8154 ptr_salt[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f);
8155 ptr_salt[2] = int_to_itoa64 ((salt.salt_buf[0] >> 12) & 0x3f);
8156 ptr_salt[3] = int_to_itoa64 ((salt.salt_buf[0] >> 18) & 0x3f);
8157 ptr_salt[4] = 0;
8158
8159 // encode digest
8160
8161 memset (tmp_buf, 0, sizeof (tmp_buf));
8162
8163 digest_buf[0] = byte_swap_32 (digest_buf[0]);
8164 digest_buf[1] = byte_swap_32 (digest_buf[1]);
8165
8166 memcpy (tmp_buf, digest_buf, 8);
8167
8168 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 8, (u8 *) ptr_plain);
8169
8170 ptr_plain[11] = 0;
8171
8172 // fill the resulting buffer
8173
8174 snprintf (out_buf, len - 1, "_%s%s%s", salt_iter, ptr_salt, ptr_plain);
8175 }
8176 else if (hash_mode == 12500)
8177 {
8178 snprintf (out_buf, len - 1, "%s*0*%08x%08x*%08x%08x%08x%08x",
8179 SIGNATURE_RAR3,
8180 byte_swap_32 (salt.salt_buf[0]),
8181 byte_swap_32 (salt.salt_buf[1]),
8182 salt.salt_buf[2],
8183 salt.salt_buf[3],
8184 salt.salt_buf[4],
8185 salt.salt_buf[5]);
8186 }
8187 else if (hash_mode == 12600)
8188 {
8189 snprintf (out_buf, len - 1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8190 digest_buf[0] + salt.salt_buf_pc[0],
8191 digest_buf[1] + salt.salt_buf_pc[1],
8192 digest_buf[2] + salt.salt_buf_pc[2],
8193 digest_buf[3] + salt.salt_buf_pc[3],
8194 digest_buf[4] + salt.salt_buf_pc[4],
8195 digest_buf[5] + salt.salt_buf_pc[5],
8196 digest_buf[6] + salt.salt_buf_pc[6],
8197 digest_buf[7] + salt.salt_buf_pc[7]);
8198 }
8199 else if (hash_mode == 12700)
8200 {
8201 uint digest_idx = salt.digests_offset + digest_pos;
8202
8203 hashinfo_t **hashinfo_ptr = data.hash_info;
8204 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8205
8206 snprintf (out_buf, len-1, "%s", hash_buf);
8207 }
8208 else if (hash_mode == 12800)
8209 {
8210 const u8 *ptr = (const u8 *) salt.salt_buf;
8211
8212 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",
8213 SIGNATURE_MS_DRSR,
8214 ptr[0],
8215 ptr[1],
8216 ptr[2],
8217 ptr[3],
8218 ptr[4],
8219 ptr[5],
8220 ptr[6],
8221 ptr[7],
8222 ptr[8],
8223 ptr[9],
8224 salt.salt_iter + 1,
8225 byte_swap_32 (digest_buf[0]),
8226 byte_swap_32 (digest_buf[1]),
8227 byte_swap_32 (digest_buf[2]),
8228 byte_swap_32 (digest_buf[3]),
8229 byte_swap_32 (digest_buf[4]),
8230 byte_swap_32 (digest_buf[5]),
8231 byte_swap_32 (digest_buf[6]),
8232 byte_swap_32 (digest_buf[7])
8233 );
8234 }
8235 else if (hash_mode == 12900)
8236 {
8237 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",
8238 salt.salt_buf[ 4],
8239 salt.salt_buf[ 5],
8240 salt.salt_buf[ 6],
8241 salt.salt_buf[ 7],
8242 salt.salt_buf[ 8],
8243 salt.salt_buf[ 9],
8244 salt.salt_buf[10],
8245 salt.salt_buf[11],
8246 byte_swap_32 (digest_buf[0]),
8247 byte_swap_32 (digest_buf[1]),
8248 byte_swap_32 (digest_buf[2]),
8249 byte_swap_32 (digest_buf[3]),
8250 byte_swap_32 (digest_buf[4]),
8251 byte_swap_32 (digest_buf[5]),
8252 byte_swap_32 (digest_buf[6]),
8253 byte_swap_32 (digest_buf[7]),
8254 salt.salt_buf[ 0],
8255 salt.salt_buf[ 1],
8256 salt.salt_buf[ 2],
8257 salt.salt_buf[ 3]
8258 );
8259 }
8260 else if (hash_mode == 13000)
8261 {
8262 rar5_t *rar5s = (rar5_t *) data.esalts_buf;
8263
8264 rar5_t *rar5 = &rar5s[salt_pos];
8265
8266 snprintf (out_buf, len-1, "$rar5$16$%08x%08x%08x%08x$%u$%08x%08x%08x%08x$8$%08x%08x",
8267 salt.salt_buf[0],
8268 salt.salt_buf[1],
8269 salt.salt_buf[2],
8270 salt.salt_buf[3],
8271 salt.salt_sign[0],
8272 rar5->iv[0],
8273 rar5->iv[1],
8274 rar5->iv[2],
8275 rar5->iv[3],
8276 byte_swap_32 (digest_buf[0]),
8277 byte_swap_32 (digest_buf[1])
8278 );
8279 }
8280 else
8281 {
8282 if (hash_type == HASH_TYPE_MD4)
8283 {
8284 snprintf (out_buf, 255, "%08x%08x%08x%08x",
8285 digest_buf[0],
8286 digest_buf[1],
8287 digest_buf[2],
8288 digest_buf[3]);
8289 }
8290 else if (hash_type == HASH_TYPE_MD5)
8291 {
8292 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
8293 digest_buf[0],
8294 digest_buf[1],
8295 digest_buf[2],
8296 digest_buf[3]);
8297 }
8298 else if (hash_type == HASH_TYPE_SHA1)
8299 {
8300 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
8301 digest_buf[0],
8302 digest_buf[1],
8303 digest_buf[2],
8304 digest_buf[3],
8305 digest_buf[4]);
8306 }
8307 else if (hash_type == HASH_TYPE_SHA256)
8308 {
8309 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8310 digest_buf[0],
8311 digest_buf[1],
8312 digest_buf[2],
8313 digest_buf[3],
8314 digest_buf[4],
8315 digest_buf[5],
8316 digest_buf[6],
8317 digest_buf[7]);
8318 }
8319 else if (hash_type == HASH_TYPE_SHA384)
8320 {
8321 uint *ptr = digest_buf;
8322
8323 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8324 ptr[ 1], ptr[ 0],
8325 ptr[ 3], ptr[ 2],
8326 ptr[ 5], ptr[ 4],
8327 ptr[ 7], ptr[ 6],
8328 ptr[ 9], ptr[ 8],
8329 ptr[11], ptr[10]);
8330 }
8331 else if (hash_type == HASH_TYPE_SHA512)
8332 {
8333 uint *ptr = digest_buf;
8334
8335 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8336 ptr[ 1], ptr[ 0],
8337 ptr[ 3], ptr[ 2],
8338 ptr[ 5], ptr[ 4],
8339 ptr[ 7], ptr[ 6],
8340 ptr[ 9], ptr[ 8],
8341 ptr[11], ptr[10],
8342 ptr[13], ptr[12],
8343 ptr[15], ptr[14]);
8344 }
8345 else if (hash_type == HASH_TYPE_LM)
8346 {
8347 snprintf (out_buf, len-1, "%08x%08x",
8348 digest_buf[0],
8349 digest_buf[1]);
8350 }
8351 else if (hash_type == HASH_TYPE_ORACLEH)
8352 {
8353 snprintf (out_buf, len-1, "%08X%08X",
8354 digest_buf[0],
8355 digest_buf[1]);
8356 }
8357 else if (hash_type == HASH_TYPE_BCRYPT)
8358 {
8359 base64_encode (int_to_bf64, (const u8 *) salt.salt_buf, 16, (u8 *) tmp_buf + 0);
8360 base64_encode (int_to_bf64, (const u8 *) digest_buf, 23, (u8 *) tmp_buf + 22);
8361
8362 tmp_buf[22 + 31] = 0; // base64_encode wants to pad
8363
8364 snprintf (out_buf, len-1, "%s$%s", (char *) salt.salt_sign, tmp_buf);
8365 }
8366 else if (hash_type == HASH_TYPE_KECCAK)
8367 {
8368 uint *ptr = digest_buf;
8369
8370 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",
8371 ptr[ 1], ptr[ 0],
8372 ptr[ 3], ptr[ 2],
8373 ptr[ 5], ptr[ 4],
8374 ptr[ 7], ptr[ 6],
8375 ptr[ 9], ptr[ 8],
8376 ptr[11], ptr[10],
8377 ptr[13], ptr[12],
8378 ptr[15], ptr[14],
8379 ptr[17], ptr[16],
8380 ptr[19], ptr[18],
8381 ptr[21], ptr[20],
8382 ptr[23], ptr[22],
8383 ptr[25], ptr[24],
8384 ptr[27], ptr[26],
8385 ptr[29], ptr[28],
8386 ptr[31], ptr[30],
8387 ptr[33], ptr[32],
8388 ptr[35], ptr[34],
8389 ptr[37], ptr[36],
8390 ptr[39], ptr[38],
8391 ptr[41], ptr[30],
8392 ptr[43], ptr[42],
8393 ptr[45], ptr[44],
8394 ptr[47], ptr[46],
8395 ptr[49], ptr[48]
8396 );
8397
8398 out_buf[salt.keccak_mdlen * 2] = 0;
8399 }
8400 else if (hash_type == HASH_TYPE_RIPEMD160)
8401 {
8402 snprintf (out_buf, 255, "%08x%08x%08x%08x%08x",
8403 digest_buf[0],
8404 digest_buf[1],
8405 digest_buf[2],
8406 digest_buf[3],
8407 digest_buf[4]);
8408 }
8409 else if (hash_type == HASH_TYPE_WHIRLPOOL)
8410 {
8411 digest_buf[ 0] = digest_buf[ 0];
8412 digest_buf[ 1] = digest_buf[ 1];
8413 digest_buf[ 2] = digest_buf[ 2];
8414 digest_buf[ 3] = digest_buf[ 3];
8415 digest_buf[ 4] = digest_buf[ 4];
8416 digest_buf[ 5] = digest_buf[ 5];
8417 digest_buf[ 6] = digest_buf[ 6];
8418 digest_buf[ 7] = digest_buf[ 7];
8419 digest_buf[ 8] = digest_buf[ 8];
8420 digest_buf[ 9] = digest_buf[ 9];
8421 digest_buf[10] = digest_buf[10];
8422 digest_buf[11] = digest_buf[11];
8423 digest_buf[12] = digest_buf[12];
8424 digest_buf[13] = digest_buf[13];
8425 digest_buf[14] = digest_buf[14];
8426 digest_buf[15] = digest_buf[15];
8427
8428 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8429 digest_buf[ 0],
8430 digest_buf[ 1],
8431 digest_buf[ 2],
8432 digest_buf[ 3],
8433 digest_buf[ 4],
8434 digest_buf[ 5],
8435 digest_buf[ 6],
8436 digest_buf[ 7],
8437 digest_buf[ 8],
8438 digest_buf[ 9],
8439 digest_buf[10],
8440 digest_buf[11],
8441 digest_buf[12],
8442 digest_buf[13],
8443 digest_buf[14],
8444 digest_buf[15]);
8445 }
8446 else if (hash_type == HASH_TYPE_GOST)
8447 {
8448 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8449 digest_buf[0],
8450 digest_buf[1],
8451 digest_buf[2],
8452 digest_buf[3],
8453 digest_buf[4],
8454 digest_buf[5],
8455 digest_buf[6],
8456 digest_buf[7]);
8457 }
8458 else if (hash_type == HASH_TYPE_MYSQL)
8459 {
8460 snprintf (out_buf, len-1, "%08x%08x",
8461 digest_buf[0],
8462 digest_buf[1]);
8463 }
8464 else if (hash_type == HASH_TYPE_LOTUS5)
8465 {
8466 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
8467 digest_buf[0],
8468 digest_buf[1],
8469 digest_buf[2],
8470 digest_buf[3]);
8471 }
8472 else if (hash_type == HASH_TYPE_LOTUS6)
8473 {
8474 digest_buf[ 0] = byte_swap_32 (digest_buf[ 0]);
8475 digest_buf[ 1] = byte_swap_32 (digest_buf[ 1]);
8476 digest_buf[ 2] = byte_swap_32 (digest_buf[ 2]);
8477 digest_buf[ 3] = byte_swap_32 (digest_buf[ 3]);
8478
8479 char buf[16] = { 0 };
8480
8481 memcpy (buf + 0, salt.salt_buf, 5);
8482 memcpy (buf + 5, digest_buf, 9);
8483
8484 buf[3] -= -4;
8485
8486 base64_encode (int_to_lotus64, (const u8 *) buf, 14, (u8 *) tmp_buf);
8487
8488 tmp_buf[18] = salt.salt_buf_pc[7];
8489 tmp_buf[19] = 0;
8490
8491 snprintf (out_buf, len-1, "(G%s)", tmp_buf);
8492 }
8493 else if (hash_type == HASH_TYPE_LOTUS8)
8494 {
8495 char buf[52] = { 0 };
8496
8497 // salt
8498
8499 memcpy (buf + 0, salt.salt_buf, 16);
8500
8501 buf[3] -= -4;
8502
8503 // iteration
8504
8505 snprintf (buf + 16, 11, "%010i", salt.salt_iter + 1);
8506
8507 // chars
8508
8509 buf[26] = salt.salt_buf_pc[0];
8510 buf[27] = salt.salt_buf_pc[1];
8511
8512 // digest
8513
8514 memcpy (buf + 28, digest_buf, 8);
8515
8516 base64_encode (int_to_lotus64, (const u8 *) buf, 36, (u8 *) tmp_buf);
8517
8518 tmp_buf[49] = 0;
8519
8520 snprintf (out_buf, len-1, "(H%s)", tmp_buf);
8521 }
8522 else if (hash_type == HASH_TYPE_CRC32)
8523 {
8524 snprintf (out_buf, len-1, "%08x", byte_swap_32 (digest_buf[0]));
8525 }
8526 }
8527
8528 if (salt_type == SALT_TYPE_INTERN)
8529 {
8530 size_t pos = strlen (out_buf);
8531
8532 out_buf[pos] = data.separator;
8533
8534 char *ptr = (char *) salt.salt_buf;
8535
8536 memcpy (out_buf + pos + 1, ptr, salt.salt_len);
8537
8538 out_buf[pos + 1 + salt.salt_len] = 0;
8539 }
8540 }
8541
8542 void to_hccap_t (hccap_t *hccap, uint salt_pos, uint digest_pos)
8543 {
8544 memset (hccap, 0, sizeof (hccap_t));
8545
8546 salt_t *salt = &data.salts_buf[salt_pos];
8547
8548 memcpy (hccap->essid, salt->salt_buf, salt->salt_len);
8549
8550 wpa_t *wpas = (wpa_t *) data.esalts_buf;
8551 wpa_t *wpa = &wpas[salt_pos];
8552
8553 hccap->keyver = wpa->keyver;
8554
8555 hccap->eapol_size = wpa->eapol_size;
8556
8557 if (wpa->keyver != 1)
8558 {
8559 uint eapol_tmp[64] = { 0 };
8560
8561 for (uint i = 0; i < 64; i++)
8562 {
8563 eapol_tmp[i] = byte_swap_32 (wpa->eapol[i]);
8564 }
8565
8566 memcpy (hccap->eapol, eapol_tmp, wpa->eapol_size);
8567 }
8568 else
8569 {
8570 memcpy (hccap->eapol, wpa->eapol, wpa->eapol_size);
8571 }
8572
8573 uint pke_tmp[25] = { 0 };
8574
8575 for (int i = 5; i < 25; i++)
8576 {
8577 pke_tmp[i] = byte_swap_32 (wpa->pke[i]);
8578 }
8579
8580 char *pke_ptr = (char *) pke_tmp;
8581
8582 memcpy (hccap->mac1, pke_ptr + 23, 6);
8583 memcpy (hccap->mac2, pke_ptr + 29, 6);
8584 memcpy (hccap->nonce1, pke_ptr + 67, 32);
8585 memcpy (hccap->nonce2, pke_ptr + 35, 32);
8586
8587 char *digests_buf_ptr = (char *) data.digests_buf;
8588
8589 uint dgst_size = data.dgst_size;
8590
8591 uint *digest_ptr = (uint *) (digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size));
8592
8593 if (wpa->keyver != 1)
8594 {
8595 uint digest_tmp[4] = { 0 };
8596
8597 digest_tmp[0] = byte_swap_32 (digest_ptr[0]);
8598 digest_tmp[1] = byte_swap_32 (digest_ptr[1]);
8599 digest_tmp[2] = byte_swap_32 (digest_ptr[2]);
8600 digest_tmp[3] = byte_swap_32 (digest_ptr[3]);
8601
8602 memcpy (hccap->keymic, digest_tmp, 16);
8603 }
8604 else
8605 {
8606 memcpy (hccap->keymic, digest_ptr, 16);
8607 }
8608 }
8609
8610 void SuspendThreads ()
8611 {
8612 if (data.devices_status == STATUS_RUNNING)
8613 {
8614 hc_timer_set (&data.timer_paused);
8615
8616 data.devices_status = STATUS_PAUSED;
8617
8618 log_info ("Paused");
8619 }
8620 }
8621
8622 void ResumeThreads ()
8623 {
8624 if (data.devices_status == STATUS_PAUSED)
8625 {
8626 float ms_paused;
8627
8628 hc_timer_get (data.timer_paused, ms_paused);
8629
8630 data.ms_paused += ms_paused;
8631
8632 data.devices_status = STATUS_RUNNING;
8633
8634 log_info ("Resumed");
8635 }
8636 }
8637
8638 void bypass ()
8639 {
8640 if (data.devices_status != STATUS_RUNNING) return;
8641
8642 data.devices_status = STATUS_BYPASS;
8643
8644 log_info ("Next dictionary / mask in queue selected, bypassing current one");
8645 }
8646
8647 void stop_at_checkpoint ()
8648 {
8649 if (data.devices_status != STATUS_STOP_AT_CHECKPOINT)
8650 {
8651 if (data.devices_status != STATUS_RUNNING) return;
8652 }
8653
8654 // this feature only makes sense if --restore-disable was not specified
8655
8656 if (data.restore_disable == 1)
8657 {
8658 log_info ("WARNING: this feature is disabled when --restore-disable was specified");
8659
8660 return;
8661 }
8662
8663 // check if monitoring of Restore Point updates should be enabled or disabled
8664
8665 if (data.devices_status != STATUS_STOP_AT_CHECKPOINT)
8666 {
8667 data.devices_status = STATUS_STOP_AT_CHECKPOINT;
8668
8669 // save the current restore point value
8670
8671 data.checkpoint_cur_words = get_lowest_words_done ();
8672
8673 log_info ("Checkpoint enabled: will quit at next Restore Point update");
8674 }
8675 else
8676 {
8677 data.devices_status = STATUS_RUNNING;
8678
8679 // reset the global value for checkpoint checks
8680
8681 data.checkpoint_cur_words = 0;
8682
8683 log_info ("Checkpoint disabled: Restore Point updates will no longer be monitored");
8684 }
8685 }
8686
8687 void myabort ()
8688 {
8689 if (data.devices_status == STATUS_INIT) return;
8690 if (data.devices_status == STATUS_STARTING) return;
8691
8692 data.devices_status = STATUS_ABORTED;
8693 }
8694
8695 void myquit ()
8696 {
8697 if (data.devices_status == STATUS_INIT) return;
8698 if (data.devices_status == STATUS_STARTING) return;
8699
8700 data.devices_status = STATUS_QUIT;
8701 }
8702
8703 void load_kernel (const char *kernel_file, int num_devices, size_t *kernel_lengths, const u8 **kernel_sources)
8704 {
8705 FILE *fp = fopen (kernel_file, "rb");
8706
8707 if (fp != NULL)
8708 {
8709 struct stat st;
8710
8711 memset (&st, 0, sizeof (st));
8712
8713 stat (kernel_file, &st);
8714
8715 u8 *buf = (u8 *) mymalloc (st.st_size + 1);
8716
8717 size_t num_read = fread (buf, sizeof (u8), st.st_size, fp);
8718
8719 if (num_read != (size_t) st.st_size)
8720 {
8721 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
8722
8723 exit (-1);
8724 }
8725
8726 fclose (fp);
8727
8728 buf[st.st_size] = 0;
8729
8730 for (int i = 0; i < num_devices; i++)
8731 {
8732 kernel_lengths[i] = (size_t) st.st_size;
8733
8734 kernel_sources[i] = buf;
8735 }
8736 }
8737 else
8738 {
8739 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
8740
8741 exit (-1);
8742 }
8743
8744 return;
8745 }
8746
8747 void writeProgramBin (char *dst, u8 *binary, size_t binary_size)
8748 {
8749 if (binary_size > 0)
8750 {
8751 FILE *fp = fopen (dst, "wb");
8752
8753 lock_file (fp);
8754 fwrite (binary, sizeof (u8), binary_size, fp);
8755
8756 fflush (fp);
8757 fclose (fp);
8758 }
8759 }
8760
8761 /**
8762 * restore
8763 */
8764
8765 restore_data_t *init_restore (int argc, char **argv)
8766 {
8767 restore_data_t *rd = (restore_data_t *) mymalloc (sizeof (restore_data_t));
8768
8769 if (data.restore_disable == 0)
8770 {
8771 FILE *fp = fopen (data.eff_restore_file, "rb");
8772
8773 if (fp)
8774 {
8775 size_t nread = fread (rd, sizeof (restore_data_t), 1, fp);
8776
8777 if (nread != 1)
8778 {
8779 log_error ("ERROR: cannot read %s", data.eff_restore_file);
8780
8781 exit (-1);
8782 }
8783
8784 fclose (fp);
8785
8786 if (rd->pid)
8787 {
8788 char pidbin[BUFSIZ] = { 0 };
8789
8790 int pidbin_len = -1;
8791
8792 #ifdef _POSIX
8793 snprintf (pidbin, sizeof (pidbin) - 1, "/proc/%d/cmdline", rd->pid);
8794
8795 FILE *fd = fopen (pidbin, "rb");
8796
8797 if (fd)
8798 {
8799 pidbin_len = fread (pidbin, 1, BUFSIZ, fd);
8800
8801 pidbin[pidbin_len] = 0;
8802
8803 fclose (fd);
8804
8805 char *argv0_r = strrchr (argv[0], '/');
8806
8807 char *pidbin_r = strrchr (pidbin, '/');
8808
8809 if (argv0_r == NULL) argv0_r = argv[0];
8810
8811 if (pidbin_r == NULL) pidbin_r = pidbin;
8812
8813 if (strcmp (argv0_r, pidbin_r) == 0)
8814 {
8815 log_error ("ERROR: already an instance %s running on pid %d", pidbin, rd->pid);
8816
8817 exit (-1);
8818 }
8819 }
8820
8821 #elif _WIN
8822 HANDLE hProcess = OpenProcess (PROCESS_ALL_ACCESS, FALSE, rd->pid);
8823
8824 char pidbin2[BUFSIZ] = { 0 };
8825
8826 int pidbin2_len = -1;
8827
8828 pidbin_len = GetModuleFileName (NULL, pidbin, BUFSIZ);
8829 pidbin2_len = GetModuleFileNameEx (hProcess, NULL, pidbin2, BUFSIZ);
8830
8831 pidbin[pidbin_len] = 0;
8832 pidbin2[pidbin2_len] = 0;
8833
8834 if (pidbin2_len)
8835 {
8836 if (strcmp (pidbin, pidbin2) == 0)
8837 {
8838 log_error ("ERROR: already an instance %s running on pid %d", pidbin2, rd->pid);
8839
8840 exit (-1);
8841 }
8842 }
8843 #endif
8844 }
8845
8846 if (rd->version_bin < RESTORE_MIN)
8847 {
8848 log_error ("ERROR: cannot use outdated %s. Please remove it.", data.eff_restore_file);
8849
8850 exit (-1);
8851 }
8852 }
8853 }
8854
8855 memset (rd, 0, sizeof (restore_data_t));
8856
8857 rd->version_bin = VERSION_BIN;
8858
8859 #ifdef _POSIX
8860 rd->pid = getpid ();
8861 #elif _WIN
8862 rd->pid = GetCurrentProcessId ();
8863 #endif
8864
8865 if (getcwd (rd->cwd, 255) == NULL)
8866 {
8867 myfree (rd);
8868
8869 return (NULL);
8870 }
8871
8872 rd->argc = argc;
8873 rd->argv = argv;
8874
8875 return (rd);
8876 }
8877
8878 void read_restore (const char *eff_restore_file, restore_data_t *rd)
8879 {
8880 FILE *fp = fopen (eff_restore_file, "rb");
8881
8882 if (fp == NULL)
8883 {
8884 log_error ("ERROR: restore file '%s': %s", eff_restore_file, strerror (errno));
8885
8886 exit (-1);
8887 }
8888
8889 if (fread (rd, sizeof (restore_data_t), 1, fp) != 1)
8890 {
8891 log_error ("ERROR: cannot read %s", eff_restore_file);
8892
8893 exit (-1);
8894 }
8895
8896 rd->argv = (char **) mycalloc (rd->argc, sizeof (char *));
8897
8898 for (uint i = 0; i < rd->argc; i++)
8899 {
8900 char buf[BUFSIZ] = { 0 };
8901
8902 if (fgets (buf, BUFSIZ - 1, fp) == NULL)
8903 {
8904 log_error ("ERROR: cannot read %s", eff_restore_file);
8905
8906 exit (-1);
8907 }
8908
8909 size_t len = strlen (buf);
8910
8911 if (len) buf[len - 1] = 0;
8912
8913 rd->argv[i] = mystrdup (buf);
8914 }
8915
8916 fclose (fp);
8917
8918 char new_cwd[1024] = { 0 };
8919
8920 char *nwd = getcwd (new_cwd, sizeof (new_cwd));
8921
8922 if (nwd == NULL)
8923 {
8924 log_error ("Restore file is corrupted");
8925 }
8926
8927 if (strncmp (new_cwd, rd->cwd, sizeof (new_cwd)) != 0)
8928 {
8929 if (getcwd (rd->cwd, sizeof (rd->cwd)) == NULL)
8930 {
8931 log_error ("ERROR: could not determine current user path: %s", strerror (errno));
8932
8933 exit (-1);
8934 }
8935
8936 log_info ("WARNING: Found old restore file, updating path to %s...", new_cwd);
8937 }
8938
8939 if (chdir (rd->cwd))
8940 {
8941 log_error ("ERROR: cannot chdir to %s: %s", rd->cwd, strerror (errno));
8942
8943 exit (-1);
8944 }
8945 }
8946
8947 u64 get_lowest_words_done ()
8948 {
8949 u64 words_cur = -1;
8950
8951 for (uint device_id = 0; device_id < data.devices_cnt; device_id++)
8952 {
8953 hc_device_param_t *device_param = &data.devices_param[device_id];
8954
8955 if (device_param->skipped) continue;
8956
8957 const u64 words_done = device_param->words_done;
8958
8959 if (words_done < words_cur) words_cur = words_done;
8960 }
8961
8962 // It's possible that a device's workload isn't finished right after a restore-case.
8963 // In that case, this function would return 0 and overwrite the real restore point
8964 // There's also data.words_cur which is set to rd->words_cur but it changes while
8965 // the attack is running therefore we should stick to rd->words_cur.
8966 // Note that -s influences rd->words_cur we should keep a close look on that.
8967
8968 if (words_cur < data.rd->words_cur) words_cur = data.rd->words_cur;
8969
8970 return words_cur;
8971 }
8972
8973 void write_restore (const char *new_restore_file, restore_data_t *rd)
8974 {
8975 u64 words_cur = get_lowest_words_done ();
8976
8977 rd->words_cur = words_cur;
8978
8979 FILE *fp = fopen (new_restore_file, "wb");
8980
8981 if (fp == NULL)
8982 {
8983 log_error ("ERROR: %s: %s", new_restore_file, strerror (errno));
8984
8985 exit (-1);
8986 }
8987
8988 if (setvbuf (fp, NULL, _IONBF, 0))
8989 {
8990 log_error ("ERROR: setvbuf file '%s': %s", new_restore_file, strerror (errno));
8991
8992 exit (-1);
8993 }
8994
8995 fwrite (rd, sizeof (restore_data_t), 1, fp);
8996
8997 for (uint i = 0; i < rd->argc; i++)
8998 {
8999 fprintf (fp, "%s", rd->argv[i]);
9000 fputc ('\n', fp);
9001 }
9002
9003 fflush (fp);
9004
9005 fsync (fileno (fp));
9006
9007 fclose (fp);
9008 }
9009
9010 void cycle_restore ()
9011 {
9012 const char *eff_restore_file = data.eff_restore_file;
9013 const char *new_restore_file = data.new_restore_file;
9014
9015 restore_data_t *rd = data.rd;
9016
9017 write_restore (new_restore_file, rd);
9018
9019 struct stat st;
9020
9021 memset (&st, 0, sizeof(st));
9022
9023 if (stat (eff_restore_file, &st) == 0)
9024 {
9025 if (unlink (eff_restore_file))
9026 {
9027 log_info ("WARN: unlink file '%s': %s", eff_restore_file, strerror (errno));
9028 }
9029 }
9030
9031 if (rename (new_restore_file, eff_restore_file))
9032 {
9033 log_info ("WARN: rename file '%s' to '%s': %s", new_restore_file, eff_restore_file, strerror (errno));
9034 }
9035 }
9036
9037 void check_checkpoint ()
9038 {
9039 // if (data.restore_disable == 1) break; (this is already implied by previous checks)
9040
9041 u64 words_cur = get_lowest_words_done ();
9042
9043 if (words_cur != data.checkpoint_cur_words)
9044 {
9045 myabort ();
9046 }
9047 }
9048
9049 /**
9050 * tuning db
9051 */
9052
9053 void tuning_db_destroy (tuning_db_t *tuning_db)
9054 {
9055 int i;
9056
9057 for (i = 0; i < tuning_db->alias_cnt; i++)
9058 {
9059 tuning_db_alias_t *alias = &tuning_db->alias_buf[i];
9060
9061 myfree (alias->device_name);
9062 myfree (alias->alias_name);
9063 }
9064
9065 for (i = 0; i < tuning_db->entry_cnt; i++)
9066 {
9067 tuning_db_entry_t *entry = &tuning_db->entry_buf[i];
9068
9069 myfree (entry->device_name);
9070 }
9071
9072 myfree (tuning_db->alias_buf);
9073 myfree (tuning_db->entry_buf);
9074
9075 myfree (tuning_db);
9076 }
9077
9078 tuning_db_t *tuning_db_alloc (FILE *fp)
9079 {
9080 tuning_db_t *tuning_db = (tuning_db_t *) mymalloc (sizeof (tuning_db_t));
9081
9082 int num_lines = count_lines (fp);
9083
9084 // a bit over-allocated
9085
9086 tuning_db->alias_buf = (tuning_db_alias_t *) mycalloc (num_lines + 1, sizeof (tuning_db_alias_t));
9087 tuning_db->alias_cnt = 0;
9088
9089 tuning_db->entry_buf = (tuning_db_entry_t *) mycalloc (num_lines + 1, sizeof (tuning_db_entry_t));
9090 tuning_db->entry_cnt = 0;
9091
9092 return tuning_db;
9093 }
9094
9095 tuning_db_t *tuning_db_init (const char *tuning_db_file)
9096 {
9097 FILE *fp = fopen (tuning_db_file, "rb");
9098
9099 if (fp == NULL)
9100 {
9101 log_error ("%s: %s", tuning_db_file, strerror (errno));
9102
9103 exit (-1);
9104 }
9105
9106 tuning_db_t *tuning_db = tuning_db_alloc (fp);
9107
9108 rewind (fp);
9109
9110 int line_num = 0;
9111
9112 while (!feof (fp))
9113 {
9114 char buf[BUFSIZ];
9115
9116 char *line_buf = fgets (buf, sizeof (buf) - 1, fp);
9117
9118 if (line_buf == NULL) break;
9119
9120 line_num++;
9121
9122 const int line_len = in_superchop (line_buf);
9123
9124 if (line_len == 0) continue;
9125
9126 if (line_buf[0] == '#') continue;
9127
9128 // start processing
9129
9130 char *token_ptr[7] = { NULL };
9131
9132 int token_cnt = 0;
9133
9134 char *next = strtok (line_buf, "\t ");
9135
9136 token_ptr[token_cnt] = next;
9137
9138 token_cnt++;
9139
9140 while ((next = strtok (NULL, "\t ")) != NULL)
9141 {
9142 token_ptr[token_cnt] = next;
9143
9144 token_cnt++;
9145 }
9146
9147 if (token_cnt == 2)
9148 {
9149 char *device_name = token_ptr[0];
9150 char *alias_name = token_ptr[1];
9151
9152 tuning_db_alias_t *alias = &tuning_db->alias_buf[tuning_db->alias_cnt];
9153
9154 alias->device_name = mystrdup (device_name);
9155 alias->alias_name = mystrdup (alias_name);
9156
9157 tuning_db->alias_cnt++;
9158 }
9159 else if (token_cnt == 6)
9160 {
9161 if ((token_ptr[1][0] != '0') &&
9162 (token_ptr[1][0] != '1') &&
9163 (token_ptr[1][0] != '3') &&
9164 (token_ptr[1][0] != '*'))
9165 {
9166 log_info ("WARNING: Tuning-db: Invalid attack_mode '%c' in Line '%u'", token_ptr[1][0], line_num);
9167
9168 continue;
9169 }
9170
9171 if ((token_ptr[3][0] != '1') &&
9172 (token_ptr[3][0] != '2') &&
9173 (token_ptr[3][0] != '4') &&
9174 (token_ptr[3][0] != '8') &&
9175 (token_ptr[3][0] != 'N'))
9176 {
9177 log_info ("WARNING: Tuning-db: Invalid vector_width '%c' in Line '%u'", token_ptr[3][0], line_num);
9178
9179 continue;
9180 }
9181
9182 char *device_name = token_ptr[0];
9183
9184 int attack_mode = -1;
9185 int hash_type = -1;
9186 int vector_width = -1;
9187 int kernel_accel = -1;
9188 int kernel_loops = -1;
9189
9190 if (token_ptr[1][0] != '*') attack_mode = atoi (token_ptr[1]);
9191 if (token_ptr[2][0] != '*') hash_type = atoi (token_ptr[2]);
9192 if (token_ptr[3][0] != 'N') vector_width = atoi (token_ptr[3]);
9193
9194 kernel_accel = atoi (token_ptr[4]);
9195
9196 if ((kernel_accel < 1) || (kernel_accel > 1024))
9197 {
9198 log_info ("WARNING: Tuning-db: Invalid kernel_accel '%d' in Line '%u'", kernel_accel, line_num);
9199
9200 continue;
9201 }
9202
9203 kernel_loops = atoi (token_ptr[5]);
9204
9205 if ((kernel_loops < 1) || (kernel_loops > 1024))
9206 {
9207 log_info ("WARNING: Tuning-db: Invalid kernel_loops '%d' in Line '%u'", kernel_loops, line_num);
9208
9209 continue;
9210 }
9211
9212 tuning_db_entry_t *entry = &tuning_db->entry_buf[tuning_db->entry_cnt];
9213
9214 entry->device_name = mystrdup (device_name);
9215 entry->attack_mode = attack_mode;
9216 entry->hash_type = hash_type;
9217 entry->vector_width = vector_width;
9218 entry->kernel_accel = kernel_accel;
9219 entry->kernel_loops = kernel_loops;
9220
9221 tuning_db->entry_cnt++;
9222 }
9223 else
9224 {
9225 // todo: some warning message
9226
9227 continue;
9228 }
9229 }
9230
9231 fclose (fp);
9232
9233 // todo: print loaded 'cnt' message
9234
9235 // sort the database
9236
9237 qsort (tuning_db->alias_buf, tuning_db->alias_cnt, sizeof (tuning_db_alias_t), sort_by_tuning_db_alias);
9238 qsort (tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry);
9239
9240 return tuning_db;
9241 }
9242
9243 tuning_db_entry_t *tuning_db_search (tuning_db_t *tuning_db, char *device_name, int attack_mode, int hash_type)
9244 {
9245 static tuning_db_entry_t s;
9246
9247 // first we need to convert all spaces in the device_name to underscore
9248
9249 char *device_name_nospace = strdup (device_name);
9250
9251 int device_name_length = strlen (device_name_nospace);
9252
9253 int i;
9254
9255 for (i = 0; i < device_name_length; i++)
9256 {
9257 if (device_name_nospace[i] == ' ') device_name_nospace[i] = '_';
9258 }
9259
9260 // find out if there's an alias configured
9261
9262 tuning_db_alias_t a;
9263
9264 a.device_name = device_name_nospace;
9265
9266 tuning_db_alias_t *alias = bsearch (&a, tuning_db->alias_buf, tuning_db->alias_cnt, sizeof (tuning_db_alias_t), sort_by_tuning_db_alias);
9267
9268 char *alias_name = (alias == NULL) ? NULL : alias->alias_name;
9269
9270 // attack-mode 6 and 7 are attack-mode 1 basically
9271
9272 if (attack_mode == 6) attack_mode = 1;
9273 if (attack_mode == 7) attack_mode = 1;
9274
9275 // bsearch is not ideal but fast enough
9276
9277 s.device_name = device_name_nospace;
9278 s.attack_mode = attack_mode;
9279 s.hash_type = hash_type;
9280
9281 tuning_db_entry_t *entry = NULL;
9282
9283 // this will produce all 2^3 combinations required
9284
9285 for (i = 0; i < 8; i++)
9286 {
9287 s.device_name = (i & 1) ? "*" : device_name_nospace;
9288 s.attack_mode = (i & 2) ? -1 : attack_mode;
9289 s.hash_type = (i & 4) ? -1 : hash_type;
9290
9291 entry = bsearch (&s, tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry);
9292
9293 if (entry != NULL) break;
9294
9295 // in non-wildcard mode also check the alias_name
9296
9297 if (((i & 1) == 0) && (alias_name != NULL))
9298 {
9299 s.device_name = alias_name;
9300
9301 entry = bsearch (&s, tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry);
9302
9303 if (entry != NULL) break;
9304 }
9305 }
9306
9307 // if still not found use some defaults
9308
9309 if (entry == NULL)
9310 {
9311 s.vector_width = TUNING_DB_DEFAULT_VECTOR_WIDTH;
9312 s.kernel_accel = TUNING_DB_DEFAULT_KERNEL_ACCEL;
9313 s.kernel_loops = TUNING_DB_DEFAULT_KERNEL_LOOPS;
9314
9315 return &s;
9316 }
9317
9318 // free converted device_name
9319
9320 myfree (device_name_nospace);
9321
9322 return entry;
9323 }
9324
9325 /**
9326 * parser
9327 */
9328
9329 uint parse_and_store_salt (char *out, char *in, uint salt_len)
9330 {
9331 u8 tmp[256] = { 0 };
9332
9333 if (salt_len > sizeof (tmp))
9334 {
9335 return UINT_MAX;
9336 }
9337
9338 memcpy (tmp, in, salt_len);
9339
9340 if (data.opts_type & OPTS_TYPE_ST_HEX)
9341 {
9342 if ((salt_len % 2) == 0)
9343 {
9344 u32 new_salt_len = salt_len / 2;
9345
9346 for (uint i = 0, j = 0; i < new_salt_len; i += 1, j += 2)
9347 {
9348 u8 p0 = tmp[j + 0];
9349 u8 p1 = tmp[j + 1];
9350
9351 tmp[i] = hex_convert (p1) << 0;
9352 tmp[i] |= hex_convert (p0) << 4;
9353 }
9354
9355 salt_len = new_salt_len;
9356 }
9357 else
9358 {
9359 return UINT_MAX;
9360 }
9361 }
9362 else if (data.opts_type & OPTS_TYPE_ST_BASE64)
9363 {
9364 salt_len = base64_decode (base64_to_int, (const u8 *) in, salt_len, (u8 *) tmp);
9365 }
9366
9367 memset (tmp + salt_len, 0, sizeof (tmp) - salt_len);
9368
9369 if (data.opts_type & OPTS_TYPE_ST_UNICODE)
9370 {
9371 if (salt_len < 20)
9372 {
9373 u32 *tmp_uint = (u32 *) tmp;
9374
9375 tmp_uint[9] = ((tmp_uint[4] >> 8) & 0x00FF0000) | ((tmp_uint[4] >> 16) & 0x000000FF);
9376 tmp_uint[8] = ((tmp_uint[4] << 8) & 0x00FF0000) | ((tmp_uint[4] >> 0) & 0x000000FF);
9377 tmp_uint[7] = ((tmp_uint[3] >> 8) & 0x00FF0000) | ((tmp_uint[3] >> 16) & 0x000000FF);
9378 tmp_uint[6] = ((tmp_uint[3] << 8) & 0x00FF0000) | ((tmp_uint[3] >> 0) & 0x000000FF);
9379 tmp_uint[5] = ((tmp_uint[2] >> 8) & 0x00FF0000) | ((tmp_uint[2] >> 16) & 0x000000FF);
9380 tmp_uint[4] = ((tmp_uint[2] << 8) & 0x00FF0000) | ((tmp_uint[2] >> 0) & 0x000000FF);
9381 tmp_uint[3] = ((tmp_uint[1] >> 8) & 0x00FF0000) | ((tmp_uint[1] >> 16) & 0x000000FF);
9382 tmp_uint[2] = ((tmp_uint[1] << 8) & 0x00FF0000) | ((tmp_uint[1] >> 0) & 0x000000FF);
9383 tmp_uint[1] = ((tmp_uint[0] >> 8) & 0x00FF0000) | ((tmp_uint[0] >> 16) & 0x000000FF);
9384 tmp_uint[0] = ((tmp_uint[0] << 8) & 0x00FF0000) | ((tmp_uint[0] >> 0) & 0x000000FF);
9385
9386 salt_len = salt_len * 2;
9387 }
9388 else
9389 {
9390 return UINT_MAX;
9391 }
9392 }
9393
9394 if (data.opts_type & OPTS_TYPE_ST_LOWER)
9395 {
9396 lowercase (tmp, salt_len);
9397 }
9398
9399 if (data.opts_type & OPTS_TYPE_ST_UPPER)
9400 {
9401 uppercase (tmp, salt_len);
9402 }
9403
9404 u32 len = salt_len;
9405
9406 if (data.opts_type & OPTS_TYPE_ST_ADD80)
9407 {
9408 tmp[len++] = 0x80;
9409 }
9410
9411 if (data.opts_type & OPTS_TYPE_ST_ADD01)
9412 {
9413 tmp[len++] = 0x01;
9414 }
9415
9416 if (data.opts_type & OPTS_TYPE_ST_GENERATE_LE)
9417 {
9418 u32 *tmp_uint = (uint *) tmp;
9419
9420 u32 max = len / 4;
9421
9422 if (len % 4) max++;
9423
9424 for (u32 i = 0; i < max; i++)
9425 {
9426 tmp_uint[i] = byte_swap_32 (tmp_uint[i]);
9427 }
9428
9429 // Important: we may need to increase the length of memcpy since
9430 // we don't want to "loose" some swapped bytes (could happen if
9431 // they do not perfectly fit in the 4-byte blocks)
9432 // Memcpy does always copy the bytes in the BE order, but since
9433 // we swapped them, some important bytes could be in positions
9434 // we normally skip with the original len
9435
9436 if (len % 4) len += 4 - (len % 4);
9437 }
9438
9439 memcpy (out, tmp, len);
9440
9441 return (salt_len);
9442 }
9443
9444 int bcrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9445 {
9446 if ((input_len < DISPLAY_LEN_MIN_3200) || (input_len > DISPLAY_LEN_MAX_3200)) return (PARSER_GLOBAL_LENGTH);
9447
9448 if ((memcmp (SIGNATURE_BCRYPT1, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT2, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT3, input_buf, 4))) return (PARSER_SIGNATURE_UNMATCHED);
9449
9450 u32 *digest = (u32 *) hash_buf->digest;
9451
9452 salt_t *salt = hash_buf->salt;
9453
9454 memcpy ((char *) salt->salt_sign, input_buf, 6);
9455
9456 char *iter_pos = input_buf + 4;
9457
9458 salt->salt_iter = 1 << atoi (iter_pos);
9459
9460 char *salt_pos = strchr (iter_pos, '$');
9461
9462 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9463
9464 salt_pos++;
9465
9466 uint salt_len = 16;
9467
9468 salt->salt_len = salt_len;
9469
9470 u8 tmp_buf[100] = { 0 };
9471
9472 base64_decode (bf64_to_int, (const u8 *) salt_pos, 22, tmp_buf);
9473
9474 char *salt_buf_ptr = (char *) salt->salt_buf;
9475
9476 memcpy (salt_buf_ptr, tmp_buf, 16);
9477
9478 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
9479 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
9480 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
9481 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
9482
9483 char *hash_pos = salt_pos + 22;
9484
9485 memset (tmp_buf, 0, sizeof (tmp_buf));
9486
9487 base64_decode (bf64_to_int, (const u8 *) hash_pos, 31, tmp_buf);
9488
9489 memcpy (digest, tmp_buf, 24);
9490
9491 digest[0] = byte_swap_32 (digest[0]);
9492 digest[1] = byte_swap_32 (digest[1]);
9493 digest[2] = byte_swap_32 (digest[2]);
9494 digest[3] = byte_swap_32 (digest[3]);
9495 digest[4] = byte_swap_32 (digest[4]);
9496 digest[5] = byte_swap_32 (digest[5]);
9497
9498 digest[5] &= ~0xff; // its just 23 not 24 !
9499
9500 return (PARSER_OK);
9501 }
9502
9503 int cisco4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9504 {
9505 if ((input_len < DISPLAY_LEN_MIN_5700) || (input_len > DISPLAY_LEN_MAX_5700)) return (PARSER_GLOBAL_LENGTH);
9506
9507 u32 *digest = (u32 *) hash_buf->digest;
9508
9509 u8 tmp_buf[100] = { 0 };
9510
9511 base64_decode (itoa64_to_int, (const u8 *) input_buf, 43, tmp_buf);
9512
9513 memcpy (digest, tmp_buf, 32);
9514
9515 digest[0] = byte_swap_32 (digest[0]);
9516 digest[1] = byte_swap_32 (digest[1]);
9517 digest[2] = byte_swap_32 (digest[2]);
9518 digest[3] = byte_swap_32 (digest[3]);
9519 digest[4] = byte_swap_32 (digest[4]);
9520 digest[5] = byte_swap_32 (digest[5]);
9521 digest[6] = byte_swap_32 (digest[6]);
9522 digest[7] = byte_swap_32 (digest[7]);
9523
9524 digest[0] -= SHA256M_A;
9525 digest[1] -= SHA256M_B;
9526 digest[2] -= SHA256M_C;
9527 digest[3] -= SHA256M_D;
9528 digest[4] -= SHA256M_E;
9529 digest[5] -= SHA256M_F;
9530 digest[6] -= SHA256M_G;
9531 digest[7] -= SHA256M_H;
9532
9533 return (PARSER_OK);
9534 }
9535
9536 int lm_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9537 {
9538 if ((input_len < DISPLAY_LEN_MIN_3000) || (input_len > DISPLAY_LEN_MAX_3000)) return (PARSER_GLOBAL_LENGTH);
9539
9540 u32 *digest = (u32 *) hash_buf->digest;
9541
9542 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
9543 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
9544
9545 digest[0] = byte_swap_32 (digest[0]);
9546 digest[1] = byte_swap_32 (digest[1]);
9547
9548 uint tt;
9549
9550 IP (digest[0], digest[1], tt);
9551
9552 digest[0] = digest[0];
9553 digest[1] = digest[1];
9554 digest[2] = 0;
9555 digest[3] = 0;
9556
9557 return (PARSER_OK);
9558 }
9559
9560 int osx1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9561 {
9562 if ((input_len < DISPLAY_LEN_MIN_122) || (input_len > DISPLAY_LEN_MAX_122)) return (PARSER_GLOBAL_LENGTH);
9563
9564 u32 *digest = (u32 *) hash_buf->digest;
9565
9566 salt_t *salt = hash_buf->salt;
9567
9568 char *hash_pos = input_buf + 8;
9569
9570 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
9571 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
9572 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
9573 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
9574 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
9575
9576 digest[0] -= SHA1M_A;
9577 digest[1] -= SHA1M_B;
9578 digest[2] -= SHA1M_C;
9579 digest[3] -= SHA1M_D;
9580 digest[4] -= SHA1M_E;
9581
9582 uint salt_len = 8;
9583
9584 char *salt_buf_ptr = (char *) salt->salt_buf;
9585
9586 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
9587
9588 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9589
9590 salt->salt_len = salt_len;
9591
9592 return (PARSER_OK);
9593 }
9594
9595 int osx512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9596 {
9597 if ((input_len < DISPLAY_LEN_MIN_1722) || (input_len > DISPLAY_LEN_MAX_1722)) return (PARSER_GLOBAL_LENGTH);
9598
9599 u64 *digest = (u64 *) hash_buf->digest;
9600
9601 salt_t *salt = hash_buf->salt;
9602
9603 char *hash_pos = input_buf + 8;
9604
9605 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
9606 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
9607 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
9608 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
9609 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
9610 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
9611 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
9612 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
9613
9614 digest[0] -= SHA512M_A;
9615 digest[1] -= SHA512M_B;
9616 digest[2] -= SHA512M_C;
9617 digest[3] -= SHA512M_D;
9618 digest[4] -= SHA512M_E;
9619 digest[5] -= SHA512M_F;
9620 digest[6] -= SHA512M_G;
9621 digest[7] -= SHA512M_H;
9622
9623 uint salt_len = 8;
9624
9625 char *salt_buf_ptr = (char *) salt->salt_buf;
9626
9627 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
9628
9629 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9630
9631 salt->salt_len = salt_len;
9632
9633 return (PARSER_OK);
9634 }
9635
9636 int osc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9637 {
9638 if (data.opts_type & OPTS_TYPE_ST_HEX)
9639 {
9640 if ((input_len < DISPLAY_LEN_MIN_21H) || (input_len > DISPLAY_LEN_MAX_21H)) return (PARSER_GLOBAL_LENGTH);
9641 }
9642 else
9643 {
9644 if ((input_len < DISPLAY_LEN_MIN_21) || (input_len > DISPLAY_LEN_MAX_21)) return (PARSER_GLOBAL_LENGTH);
9645 }
9646
9647 u32 *digest = (u32 *) hash_buf->digest;
9648
9649 salt_t *salt = hash_buf->salt;
9650
9651 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
9652 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
9653 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
9654 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
9655
9656 digest[0] = byte_swap_32 (digest[0]);
9657 digest[1] = byte_swap_32 (digest[1]);
9658 digest[2] = byte_swap_32 (digest[2]);
9659 digest[3] = byte_swap_32 (digest[3]);
9660
9661 digest[0] -= MD5M_A;
9662 digest[1] -= MD5M_B;
9663 digest[2] -= MD5M_C;
9664 digest[3] -= MD5M_D;
9665
9666 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
9667
9668 uint salt_len = input_len - 32 - 1;
9669
9670 char *salt_buf = input_buf + 32 + 1;
9671
9672 char *salt_buf_ptr = (char *) salt->salt_buf;
9673
9674 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
9675
9676 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9677
9678 salt->salt_len = salt_len;
9679
9680 return (PARSER_OK);
9681 }
9682
9683 int netscreen_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9684 {
9685 if (data.opts_type & OPTS_TYPE_ST_HEX)
9686 {
9687 if ((input_len < DISPLAY_LEN_MIN_22H) || (input_len > DISPLAY_LEN_MAX_22H)) return (PARSER_GLOBAL_LENGTH);
9688 }
9689 else
9690 {
9691 if ((input_len < DISPLAY_LEN_MIN_22) || (input_len > DISPLAY_LEN_MAX_22)) return (PARSER_GLOBAL_LENGTH);
9692 }
9693
9694 // unscramble
9695
9696 char clean_input_buf[32] = { 0 };
9697
9698 char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' };
9699 int pos[6] = { 0, 6, 12, 17, 23, 29 };
9700
9701 for (int i = 0, j = 0, k = 0; i < 30; i++)
9702 {
9703 if (i == pos[j])
9704 {
9705 if (sig[j] != input_buf[i]) return (PARSER_SIGNATURE_UNMATCHED);
9706
9707 j++;
9708 }
9709 else
9710 {
9711 clean_input_buf[k] = input_buf[i];
9712
9713 k++;
9714 }
9715 }
9716
9717 // base64 decode
9718
9719 u32 *digest = (u32 *) hash_buf->digest;
9720
9721 salt_t *salt = hash_buf->salt;
9722
9723 u32 a, b, c, d, e, f;
9724
9725 a = base64_to_int (clean_input_buf[ 0] & 0x7f);
9726 b = base64_to_int (clean_input_buf[ 1] & 0x7f);
9727 c = base64_to_int (clean_input_buf[ 2] & 0x7f);
9728 d = base64_to_int (clean_input_buf[ 3] & 0x7f);
9729 e = base64_to_int (clean_input_buf[ 4] & 0x7f);
9730 f = base64_to_int (clean_input_buf[ 5] & 0x7f);
9731
9732 digest[0] = (((a << 12) | (b << 6) | (c)) << 16)
9733 | (((d << 12) | (e << 6) | (f)) << 0);
9734
9735 a = base64_to_int (clean_input_buf[ 6] & 0x7f);
9736 b = base64_to_int (clean_input_buf[ 7] & 0x7f);
9737 c = base64_to_int (clean_input_buf[ 8] & 0x7f);
9738 d = base64_to_int (clean_input_buf[ 9] & 0x7f);
9739 e = base64_to_int (clean_input_buf[10] & 0x7f);
9740 f = base64_to_int (clean_input_buf[11] & 0x7f);
9741
9742 digest[1] = (((a << 12) | (b << 6) | (c)) << 16)
9743 | (((d << 12) | (e << 6) | (f)) << 0);
9744
9745 a = base64_to_int (clean_input_buf[12] & 0x7f);
9746 b = base64_to_int (clean_input_buf[13] & 0x7f);
9747 c = base64_to_int (clean_input_buf[14] & 0x7f);
9748 d = base64_to_int (clean_input_buf[15] & 0x7f);
9749 e = base64_to_int (clean_input_buf[16] & 0x7f);
9750 f = base64_to_int (clean_input_buf[17] & 0x7f);
9751
9752 digest[2] = (((a << 12) | (b << 6) | (c)) << 16)
9753 | (((d << 12) | (e << 6) | (f)) << 0);
9754
9755 a = base64_to_int (clean_input_buf[18] & 0x7f);
9756 b = base64_to_int (clean_input_buf[19] & 0x7f);
9757 c = base64_to_int (clean_input_buf[20] & 0x7f);
9758 d = base64_to_int (clean_input_buf[21] & 0x7f);
9759 e = base64_to_int (clean_input_buf[22] & 0x7f);
9760 f = base64_to_int (clean_input_buf[23] & 0x7f);
9761
9762 digest[3] = (((a << 12) | (b << 6) | (c)) << 16)
9763 | (((d << 12) | (e << 6) | (f)) << 0);
9764
9765 digest[0] = byte_swap_32 (digest[0]);
9766 digest[1] = byte_swap_32 (digest[1]);
9767 digest[2] = byte_swap_32 (digest[2]);
9768 digest[3] = byte_swap_32 (digest[3]);
9769
9770 digest[0] -= MD5M_A;
9771 digest[1] -= MD5M_B;
9772 digest[2] -= MD5M_C;
9773 digest[3] -= MD5M_D;
9774
9775 if (input_buf[30] != ':') return (PARSER_SEPARATOR_UNMATCHED);
9776
9777 uint salt_len = input_len - 30 - 1;
9778
9779 char *salt_buf = input_buf + 30 + 1;
9780
9781 char *salt_buf_ptr = (char *) salt->salt_buf;
9782
9783 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
9784
9785 // max. salt length: salt_buf[32] => 32 - 22 (":Administration Tools:") = 10
9786 if (salt_len > 10) return (PARSER_SALT_LENGTH);
9787
9788 salt->salt_len = salt_len;
9789
9790 memcpy (salt_buf_ptr + salt_len, ":Administration Tools:", 22);
9791
9792 salt->salt_len += 22;
9793
9794 return (PARSER_OK);
9795 }
9796
9797 int smf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9798 {
9799 if (data.opts_type & OPTS_TYPE_ST_HEX)
9800 {
9801 if ((input_len < DISPLAY_LEN_MIN_121H) || (input_len > DISPLAY_LEN_MAX_121H)) return (PARSER_GLOBAL_LENGTH);
9802 }
9803 else
9804 {
9805 if ((input_len < DISPLAY_LEN_MIN_121) || (input_len > DISPLAY_LEN_MAX_121)) return (PARSER_GLOBAL_LENGTH);
9806 }
9807
9808 u32 *digest = (u32 *) hash_buf->digest;
9809
9810 salt_t *salt = hash_buf->salt;
9811
9812 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
9813 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
9814 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
9815 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
9816 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
9817
9818 digest[0] -= SHA1M_A;
9819 digest[1] -= SHA1M_B;
9820 digest[2] -= SHA1M_C;
9821 digest[3] -= SHA1M_D;
9822 digest[4] -= SHA1M_E;
9823
9824 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
9825
9826 uint salt_len = input_len - 40 - 1;
9827
9828 char *salt_buf = input_buf + 40 + 1;
9829
9830 char *salt_buf_ptr = (char *) salt->salt_buf;
9831
9832 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
9833
9834 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9835
9836 salt->salt_len = salt_len;
9837
9838 return (PARSER_OK);
9839 }
9840
9841 int dcc2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9842 {
9843 if (data.opts_type & OPTS_TYPE_ST_HEX)
9844 {
9845 if ((input_len < DISPLAY_LEN_MIN_2100H) || (input_len > DISPLAY_LEN_MAX_2100H)) return (PARSER_GLOBAL_LENGTH);
9846 }
9847 else
9848 {
9849 if ((input_len < DISPLAY_LEN_MIN_2100) || (input_len > DISPLAY_LEN_MAX_2100)) return (PARSER_GLOBAL_LENGTH);
9850 }
9851
9852 if (memcmp (SIGNATURE_DCC2, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
9853
9854 char *iter_pos = input_buf + 6;
9855
9856 salt_t *salt = hash_buf->salt;
9857
9858 uint iter = atoi (iter_pos);
9859
9860 if (iter < 1)
9861 {
9862 iter = ROUNDS_DCC2;
9863 }
9864
9865 salt->salt_iter = iter - 1;
9866
9867 char *salt_pos = strchr (iter_pos, '#');
9868
9869 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9870
9871 salt_pos++;
9872
9873 char *digest_pos = strchr (salt_pos, '#');
9874
9875 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9876
9877 digest_pos++;
9878
9879 uint salt_len = digest_pos - salt_pos - 1;
9880
9881 u32 *digest = (u32 *) hash_buf->digest;
9882
9883 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
9884 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
9885 digest[2] = hex_to_u32 ((const u8 *) &digest_pos[16]);
9886 digest[3] = hex_to_u32 ((const u8 *) &digest_pos[24]);
9887
9888 char *salt_buf_ptr = (char *) salt->salt_buf;
9889
9890 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
9891
9892 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9893
9894 salt->salt_len = salt_len;
9895
9896 return (PARSER_OK);
9897 }
9898
9899 int wpa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9900 {
9901 u32 *digest = (u32 *) hash_buf->digest;
9902
9903 salt_t *salt = hash_buf->salt;
9904
9905 wpa_t *wpa = (wpa_t *) hash_buf->esalt;
9906
9907 hccap_t in;
9908
9909 memcpy (&in, input_buf, input_len);
9910
9911 if (in.eapol_size < 1 || in.eapol_size > 255) return (PARSER_HCCAP_EAPOL_SIZE);
9912
9913 memcpy (digest, in.keymic, 16);
9914
9915 /*
9916 http://www.one-net.eu/jsw/j_sec/m_ptype.html
9917 The phrase "Pairwise key expansion"
9918 Access Point Address (referred to as Authenticator Address AA)
9919 Supplicant Address (referred to as Supplicant Address SA)
9920 Access Point Nonce (referred to as Authenticator Anonce)
9921 Wireless Device Nonce (referred to as Supplicant Nonce Snonce)
9922 */
9923
9924 uint salt_len = strlen (in.essid);
9925
9926 memcpy (salt->salt_buf, in.essid, salt_len);
9927
9928 salt->salt_len = salt_len;
9929
9930 salt->salt_iter = ROUNDS_WPA2 - 1;
9931
9932 unsigned char *pke_ptr = (unsigned char *) wpa->pke;
9933
9934 memcpy (pke_ptr, "Pairwise key expansion", 23);
9935
9936 if (memcmp (in.mac1, in.mac2, 6) < 0)
9937 {
9938 memcpy (pke_ptr + 23, in.mac1, 6);
9939 memcpy (pke_ptr + 29, in.mac2, 6);
9940 }
9941 else
9942 {
9943 memcpy (pke_ptr + 23, in.mac2, 6);
9944 memcpy (pke_ptr + 29, in.mac1, 6);
9945 }
9946
9947 if (memcmp (in.nonce1, in.nonce2, 32) < 0)
9948 {
9949 memcpy (pke_ptr + 35, in.nonce1, 32);
9950 memcpy (pke_ptr + 67, in.nonce2, 32);
9951 }
9952 else
9953 {
9954 memcpy (pke_ptr + 35, in.nonce2, 32);
9955 memcpy (pke_ptr + 67, in.nonce1, 32);
9956 }
9957
9958 for (int i = 0; i < 25; i++)
9959 {
9960 wpa->pke[i] = byte_swap_32 (wpa->pke[i]);
9961 }
9962
9963 wpa->keyver = in.keyver;
9964
9965 if (wpa->keyver > 255)
9966 {
9967 log_info ("ATTENTION!");
9968 log_info (" The WPA/WPA2 key version in your .hccap file is invalid!");
9969 log_info (" This could be due to a recent aircrack-ng bug.");
9970 log_info (" The key version was automatically reset to a reasonable value.");
9971 log_info ("");
9972
9973 wpa->keyver &= 0xff;
9974 }
9975
9976 wpa->eapol_size = in.eapol_size;
9977
9978 unsigned char *eapol_ptr = (unsigned char *) wpa->eapol;
9979
9980 memcpy (eapol_ptr, in.eapol, wpa->eapol_size);
9981
9982 memset (eapol_ptr + wpa->eapol_size, 0, 256 - wpa->eapol_size);
9983
9984 eapol_ptr[wpa->eapol_size] = (unsigned char) 0x80;
9985
9986 if (wpa->keyver == 1)
9987 {
9988 // nothing to do
9989 }
9990 else
9991 {
9992 digest[0] = byte_swap_32 (digest[0]);
9993 digest[1] = byte_swap_32 (digest[1]);
9994 digest[2] = byte_swap_32 (digest[2]);
9995 digest[3] = byte_swap_32 (digest[3]);
9996
9997 for (int i = 0; i < 64; i++)
9998 {
9999 wpa->eapol[i] = byte_swap_32 (wpa->eapol[i]);
10000 }
10001 }
10002
10003 salt->salt_buf[10] = digest[1];
10004 salt->salt_buf[11] = digest[2];
10005
10006 return (PARSER_OK);
10007 }
10008
10009 int psafe2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10010 {
10011 u32 *digest = (u32 *) hash_buf->digest;
10012
10013 salt_t *salt = hash_buf->salt;
10014
10015 if (input_len == 0)
10016 {
10017 log_error ("Password Safe v2 container not specified");
10018
10019 exit (-1);
10020 }
10021
10022 FILE *fp = fopen (input_buf, "rb");
10023
10024 if (fp == NULL)
10025 {
10026 log_error ("%s: %s", input_buf, strerror (errno));
10027
10028 exit (-1);
10029 }
10030
10031 psafe2_hdr buf;
10032
10033 memset (&buf, 0, sizeof (psafe2_hdr));
10034
10035 int n = fread (&buf, sizeof (psafe2_hdr), 1, fp);
10036
10037 fclose (fp);
10038
10039 if (n != 1) return (PARSER_PSAFE2_FILE_SIZE);
10040
10041 salt->salt_buf[0] = buf.random[0];
10042 salt->salt_buf[1] = buf.random[1];
10043
10044 salt->salt_len = 8;
10045 salt->salt_iter = 1000;
10046
10047 digest[0] = byte_swap_32 (buf.hash[0]);
10048 digest[1] = byte_swap_32 (buf.hash[1]);
10049 digest[2] = byte_swap_32 (buf.hash[2]);
10050 digest[3] = byte_swap_32 (buf.hash[3]);
10051 digest[4] = byte_swap_32 (buf.hash[4]);
10052
10053 return (PARSER_OK);
10054 }
10055
10056 int psafe3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10057 {
10058 u32 *digest = (u32 *) hash_buf->digest;
10059
10060 salt_t *salt = hash_buf->salt;
10061
10062 if (input_len == 0)
10063 {
10064 log_error (".psafe3 not specified");
10065
10066 exit (-1);
10067 }
10068
10069 FILE *fp = fopen (input_buf, "rb");
10070
10071 if (fp == NULL)
10072 {
10073 log_error ("%s: %s", input_buf, strerror (errno));
10074
10075 exit (-1);
10076 }
10077
10078 psafe3_t in;
10079
10080 int n = fread (&in, sizeof (psafe3_t), 1, fp);
10081
10082 fclose (fp);
10083
10084 data.hashfile = input_buf; // we will need this in case it gets cracked
10085
10086 if (memcmp (SIGNATURE_PSAFE3, in.signature, 4)) return (PARSER_SIGNATURE_UNMATCHED);
10087
10088 if (n != 1) return (PARSER_PSAFE3_FILE_SIZE);
10089
10090 salt->salt_iter = in.iterations + 1;
10091
10092 salt->salt_buf[0] = in.salt_buf[0];
10093 salt->salt_buf[1] = in.salt_buf[1];
10094 salt->salt_buf[2] = in.salt_buf[2];
10095 salt->salt_buf[3] = in.salt_buf[3];
10096 salt->salt_buf[4] = in.salt_buf[4];
10097 salt->salt_buf[5] = in.salt_buf[5];
10098 salt->salt_buf[6] = in.salt_buf[6];
10099 salt->salt_buf[7] = in.salt_buf[7];
10100
10101 salt->salt_len = 32;
10102
10103 digest[0] = in.hash_buf[0];
10104 digest[1] = in.hash_buf[1];
10105 digest[2] = in.hash_buf[2];
10106 digest[3] = in.hash_buf[3];
10107 digest[4] = in.hash_buf[4];
10108 digest[5] = in.hash_buf[5];
10109 digest[6] = in.hash_buf[6];
10110 digest[7] = in.hash_buf[7];
10111
10112 digest[0] = byte_swap_32 (digest[0]);
10113 digest[1] = byte_swap_32 (digest[1]);
10114 digest[2] = byte_swap_32 (digest[2]);
10115 digest[3] = byte_swap_32 (digest[3]);
10116 digest[4] = byte_swap_32 (digest[4]);
10117 digest[5] = byte_swap_32 (digest[5]);
10118 digest[6] = byte_swap_32 (digest[6]);
10119 digest[7] = byte_swap_32 (digest[7]);
10120
10121 return (PARSER_OK);
10122 }
10123
10124 int phpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10125 {
10126 if ((input_len < DISPLAY_LEN_MIN_400) || (input_len > DISPLAY_LEN_MAX_400)) return (PARSER_GLOBAL_LENGTH);
10127
10128 if ((memcmp (SIGNATURE_PHPASS1, input_buf, 3)) && (memcmp (SIGNATURE_PHPASS2, input_buf, 3))) return (PARSER_SIGNATURE_UNMATCHED);
10129
10130 u32 *digest = (u32 *) hash_buf->digest;
10131
10132 salt_t *salt = hash_buf->salt;
10133
10134 char *iter_pos = input_buf + 3;
10135
10136 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
10137
10138 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
10139
10140 memcpy ((char *) salt->salt_sign, input_buf, 4);
10141
10142 salt->salt_iter = salt_iter;
10143
10144 char *salt_pos = iter_pos + 1;
10145
10146 uint salt_len = 8;
10147
10148 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10149
10150 salt->salt_len = salt_len;
10151
10152 char *hash_pos = salt_pos + salt_len;
10153
10154 phpass_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10155
10156 return (PARSER_OK);
10157 }
10158
10159 int md5crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10160 {
10161 if (memcmp (SIGNATURE_MD5CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
10162
10163 u32 *digest = (u32 *) hash_buf->digest;
10164
10165 salt_t *salt = hash_buf->salt;
10166
10167 char *salt_pos = input_buf + 3;
10168
10169 uint iterations_len = 0;
10170
10171 if (memcmp (salt_pos, "rounds=", 7) == 0)
10172 {
10173 salt_pos += 7;
10174
10175 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10176
10177 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10178 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10179
10180 salt_pos[0] = 0x0;
10181
10182 salt->salt_iter = atoi (salt_pos - iterations_len);
10183
10184 salt_pos += 1;
10185
10186 iterations_len += 8;
10187 }
10188 else
10189 {
10190 salt->salt_iter = ROUNDS_MD5CRYPT;
10191 }
10192
10193 if ((input_len < DISPLAY_LEN_MIN_500) || (input_len > (DISPLAY_LEN_MAX_500 + iterations_len))) return (PARSER_GLOBAL_LENGTH);
10194
10195 char *hash_pos = strchr (salt_pos, '$');
10196
10197 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10198
10199 uint salt_len = hash_pos - salt_pos;
10200
10201 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10202
10203 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10204
10205 salt->salt_len = salt_len;
10206
10207 hash_pos++;
10208
10209 uint hash_len = input_len - 3 - iterations_len - salt_len - 1;
10210
10211 if (hash_len != 22) return (PARSER_HASH_LENGTH);
10212
10213 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10214
10215 return (PARSER_OK);
10216 }
10217
10218 int md5apr1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10219 {
10220 if (memcmp (SIGNATURE_MD5APR1, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
10221
10222 u32 *digest = (u32 *) hash_buf->digest;
10223
10224 salt_t *salt = hash_buf->salt;
10225
10226 char *salt_pos = input_buf + 6;
10227
10228 uint iterations_len = 0;
10229
10230 if (memcmp (salt_pos, "rounds=", 7) == 0)
10231 {
10232 salt_pos += 7;
10233
10234 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10235
10236 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10237 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10238
10239 salt_pos[0] = 0x0;
10240
10241 salt->salt_iter = atoi (salt_pos - iterations_len);
10242
10243 salt_pos += 1;
10244
10245 iterations_len += 8;
10246 }
10247 else
10248 {
10249 salt->salt_iter = ROUNDS_MD5CRYPT;
10250 }
10251
10252 if ((input_len < DISPLAY_LEN_MIN_1600) || (input_len > DISPLAY_LEN_MAX_1600 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
10253
10254 char *hash_pos = strchr (salt_pos, '$');
10255
10256 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10257
10258 uint salt_len = hash_pos - salt_pos;
10259
10260 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10261
10262 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10263
10264 salt->salt_len = salt_len;
10265
10266 hash_pos++;
10267
10268 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10269
10270 return (PARSER_OK);
10271 }
10272
10273 int episerver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10274 {
10275 if ((input_len < DISPLAY_LEN_MIN_141) || (input_len > DISPLAY_LEN_MAX_141)) return (PARSER_GLOBAL_LENGTH);
10276
10277 if (memcmp (SIGNATURE_EPISERVER, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
10278
10279 u32 *digest = (u32 *) hash_buf->digest;
10280
10281 salt_t *salt = hash_buf->salt;
10282
10283 char *salt_pos = input_buf + 14;
10284
10285 char *hash_pos = strchr (salt_pos, '*');
10286
10287 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10288
10289 hash_pos++;
10290
10291 uint salt_len = hash_pos - salt_pos - 1;
10292
10293 char *salt_buf_ptr = (char *) salt->salt_buf;
10294
10295 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
10296
10297 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10298
10299 salt->salt_len = salt_len;
10300
10301 u8 tmp_buf[100] = { 0 };
10302
10303 base64_decode (base64_to_int, (const u8 *) hash_pos, 27, tmp_buf);
10304
10305 memcpy (digest, tmp_buf, 20);
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 digest[4] = byte_swap_32 (digest[4]);
10312
10313 digest[0] -= SHA1M_A;
10314 digest[1] -= SHA1M_B;
10315 digest[2] -= SHA1M_C;
10316 digest[3] -= SHA1M_D;
10317 digest[4] -= SHA1M_E;
10318
10319 return (PARSER_OK);
10320 }
10321
10322 int descrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10323 {
10324 if ((input_len < DISPLAY_LEN_MIN_1500) || (input_len > DISPLAY_LEN_MAX_1500)) return (PARSER_GLOBAL_LENGTH);
10325
10326 unsigned char c12 = itoa64_to_int (input_buf[12]);
10327
10328 if (c12 & 3) return (PARSER_HASH_VALUE);
10329
10330 u32 *digest = (u32 *) hash_buf->digest;
10331
10332 salt_t *salt = hash_buf->salt;
10333
10334 // for ascii_digest
10335 salt->salt_sign[0] = input_buf[0];
10336 salt->salt_sign[1] = input_buf[1];
10337
10338 salt->salt_buf[0] = itoa64_to_int (input_buf[0])
10339 | itoa64_to_int (input_buf[1]) << 6;
10340
10341 salt->salt_len = 2;
10342
10343 u8 tmp_buf[100] = { 0 };
10344
10345 base64_decode (itoa64_to_int, (const u8 *) input_buf + 2, 11, tmp_buf);
10346
10347 memcpy (digest, tmp_buf, 8);
10348
10349 uint tt;
10350
10351 IP (digest[0], digest[1], tt);
10352
10353 digest[2] = 0;
10354 digest[3] = 0;
10355
10356 return (PARSER_OK);
10357 }
10358
10359 int md4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10360 {
10361 if ((input_len < DISPLAY_LEN_MIN_900) || (input_len > DISPLAY_LEN_MAX_900)) return (PARSER_GLOBAL_LENGTH);
10362
10363 u32 *digest = (u32 *) hash_buf->digest;
10364
10365 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10366 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10367 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10368 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10369
10370 digest[0] = byte_swap_32 (digest[0]);
10371 digest[1] = byte_swap_32 (digest[1]);
10372 digest[2] = byte_swap_32 (digest[2]);
10373 digest[3] = byte_swap_32 (digest[3]);
10374
10375 digest[0] -= MD4M_A;
10376 digest[1] -= MD4M_B;
10377 digest[2] -= MD4M_C;
10378 digest[3] -= MD4M_D;
10379
10380 return (PARSER_OK);
10381 }
10382
10383 int md4s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10384 {
10385 if (data.opts_type & OPTS_TYPE_ST_HEX)
10386 {
10387 if ((input_len < DISPLAY_LEN_MIN_910H) || (input_len > DISPLAY_LEN_MAX_910H)) return (PARSER_GLOBAL_LENGTH);
10388 }
10389 else
10390 {
10391 if ((input_len < DISPLAY_LEN_MIN_910) || (input_len > DISPLAY_LEN_MAX_910)) return (PARSER_GLOBAL_LENGTH);
10392 }
10393
10394 u32 *digest = (u32 *) hash_buf->digest;
10395
10396 salt_t *salt = hash_buf->salt;
10397
10398 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10399 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10400 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10401 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10402
10403 digest[0] = byte_swap_32 (digest[0]);
10404 digest[1] = byte_swap_32 (digest[1]);
10405 digest[2] = byte_swap_32 (digest[2]);
10406 digest[3] = byte_swap_32 (digest[3]);
10407
10408 digest[0] -= MD4M_A;
10409 digest[1] -= MD4M_B;
10410 digest[2] -= MD4M_C;
10411 digest[3] -= MD4M_D;
10412
10413 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10414
10415 uint salt_len = input_len - 32 - 1;
10416
10417 char *salt_buf = input_buf + 32 + 1;
10418
10419 char *salt_buf_ptr = (char *) salt->salt_buf;
10420
10421 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10422
10423 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10424
10425 salt->salt_len = salt_len;
10426
10427 return (PARSER_OK);
10428 }
10429
10430 int md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10431 {
10432 if ((input_len < DISPLAY_LEN_MIN_0) || (input_len > DISPLAY_LEN_MAX_0)) return (PARSER_GLOBAL_LENGTH);
10433
10434 u32 *digest = (u32 *) hash_buf->digest;
10435
10436 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10437 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10438 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10439 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10440
10441 digest[0] = byte_swap_32 (digest[0]);
10442 digest[1] = byte_swap_32 (digest[1]);
10443 digest[2] = byte_swap_32 (digest[2]);
10444 digest[3] = byte_swap_32 (digest[3]);
10445
10446 digest[0] -= MD5M_A;
10447 digest[1] -= MD5M_B;
10448 digest[2] -= MD5M_C;
10449 digest[3] -= MD5M_D;
10450
10451 return (PARSER_OK);
10452 }
10453
10454 int md5half_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10455 {
10456 if ((input_len < DISPLAY_LEN_MIN_5100) || (input_len > DISPLAY_LEN_MAX_5100)) return (PARSER_GLOBAL_LENGTH);
10457
10458 u32 *digest = (u32 *) hash_buf->digest;
10459
10460 digest[0] = hex_to_u32 ((const u8 *) &input_buf[0]);
10461 digest[1] = hex_to_u32 ((const u8 *) &input_buf[8]);
10462 digest[2] = 0;
10463 digest[3] = 0;
10464
10465 digest[0] = byte_swap_32 (digest[0]);
10466 digest[1] = byte_swap_32 (digest[1]);
10467
10468 return (PARSER_OK);
10469 }
10470
10471 int md5s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10472 {
10473 if (data.opts_type & OPTS_TYPE_ST_HEX)
10474 {
10475 if ((input_len < DISPLAY_LEN_MIN_10H) || (input_len > DISPLAY_LEN_MAX_10H)) return (PARSER_GLOBAL_LENGTH);
10476 }
10477 else
10478 {
10479 if ((input_len < DISPLAY_LEN_MIN_10) || (input_len > DISPLAY_LEN_MAX_10)) return (PARSER_GLOBAL_LENGTH);
10480 }
10481
10482 u32 *digest = (u32 *) hash_buf->digest;
10483
10484 salt_t *salt = hash_buf->salt;
10485
10486 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10487 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10488 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10489 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10490
10491 digest[0] = byte_swap_32 (digest[0]);
10492 digest[1] = byte_swap_32 (digest[1]);
10493 digest[2] = byte_swap_32 (digest[2]);
10494 digest[3] = byte_swap_32 (digest[3]);
10495
10496 digest[0] -= MD5M_A;
10497 digest[1] -= MD5M_B;
10498 digest[2] -= MD5M_C;
10499 digest[3] -= MD5M_D;
10500
10501 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10502
10503 uint salt_len = input_len - 32 - 1;
10504
10505 char *salt_buf = input_buf + 32 + 1;
10506
10507 char *salt_buf_ptr = (char *) salt->salt_buf;
10508
10509 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10510
10511 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10512
10513 salt->salt_len = salt_len;
10514
10515 return (PARSER_OK);
10516 }
10517
10518 int md5pix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10519 {
10520 if ((input_len < DISPLAY_LEN_MIN_2400) || (input_len > DISPLAY_LEN_MAX_2400)) return (PARSER_GLOBAL_LENGTH);
10521
10522 u32 *digest = (u32 *) hash_buf->digest;
10523
10524 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
10525 | itoa64_to_int (input_buf[ 1]) << 6
10526 | itoa64_to_int (input_buf[ 2]) << 12
10527 | itoa64_to_int (input_buf[ 3]) << 18;
10528 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
10529 | itoa64_to_int (input_buf[ 5]) << 6
10530 | itoa64_to_int (input_buf[ 6]) << 12
10531 | itoa64_to_int (input_buf[ 7]) << 18;
10532 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
10533 | itoa64_to_int (input_buf[ 9]) << 6
10534 | itoa64_to_int (input_buf[10]) << 12
10535 | itoa64_to_int (input_buf[11]) << 18;
10536 digest[3] = itoa64_to_int (input_buf[12]) << 0
10537 | itoa64_to_int (input_buf[13]) << 6
10538 | itoa64_to_int (input_buf[14]) << 12
10539 | itoa64_to_int (input_buf[15]) << 18;
10540
10541 digest[0] -= MD5M_A;
10542 digest[1] -= MD5M_B;
10543 digest[2] -= MD5M_C;
10544 digest[3] -= MD5M_D;
10545
10546 digest[0] &= 0x00ffffff;
10547 digest[1] &= 0x00ffffff;
10548 digest[2] &= 0x00ffffff;
10549 digest[3] &= 0x00ffffff;
10550
10551 return (PARSER_OK);
10552 }
10553
10554 int md5asa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10555 {
10556 if (data.opts_type & OPTS_TYPE_ST_HEX)
10557 {
10558 if ((input_len < DISPLAY_LEN_MIN_2410H) || (input_len > DISPLAY_LEN_MAX_2410H)) return (PARSER_GLOBAL_LENGTH);
10559 }
10560 else
10561 {
10562 if ((input_len < DISPLAY_LEN_MIN_2410) || (input_len > DISPLAY_LEN_MAX_2410)) return (PARSER_GLOBAL_LENGTH);
10563 }
10564
10565 u32 *digest = (u32 *) hash_buf->digest;
10566
10567 salt_t *salt = hash_buf->salt;
10568
10569 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
10570 | itoa64_to_int (input_buf[ 1]) << 6
10571 | itoa64_to_int (input_buf[ 2]) << 12
10572 | itoa64_to_int (input_buf[ 3]) << 18;
10573 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
10574 | itoa64_to_int (input_buf[ 5]) << 6
10575 | itoa64_to_int (input_buf[ 6]) << 12
10576 | itoa64_to_int (input_buf[ 7]) << 18;
10577 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
10578 | itoa64_to_int (input_buf[ 9]) << 6
10579 | itoa64_to_int (input_buf[10]) << 12
10580 | itoa64_to_int (input_buf[11]) << 18;
10581 digest[3] = itoa64_to_int (input_buf[12]) << 0
10582 | itoa64_to_int (input_buf[13]) << 6
10583 | itoa64_to_int (input_buf[14]) << 12
10584 | itoa64_to_int (input_buf[15]) << 18;
10585
10586 digest[0] -= MD5M_A;
10587 digest[1] -= MD5M_B;
10588 digest[2] -= MD5M_C;
10589 digest[3] -= MD5M_D;
10590
10591 digest[0] &= 0x00ffffff;
10592 digest[1] &= 0x00ffffff;
10593 digest[2] &= 0x00ffffff;
10594 digest[3] &= 0x00ffffff;
10595
10596 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10597
10598 uint salt_len = input_len - 16 - 1;
10599
10600 char *salt_buf = input_buf + 16 + 1;
10601
10602 char *salt_buf_ptr = (char *) salt->salt_buf;
10603
10604 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10605
10606 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10607
10608 salt->salt_len = salt_len;
10609
10610 return (PARSER_OK);
10611 }
10612
10613 void transform_netntlmv1_key (const u8 *nthash, u8 *key)
10614 {
10615 key[0] = (nthash[0] >> 0);
10616 key[1] = (nthash[0] << 7) | (nthash[1] >> 1);
10617 key[2] = (nthash[1] << 6) | (nthash[2] >> 2);
10618 key[3] = (nthash[2] << 5) | (nthash[3] >> 3);
10619 key[4] = (nthash[3] << 4) | (nthash[4] >> 4);
10620 key[5] = (nthash[4] << 3) | (nthash[5] >> 5);
10621 key[6] = (nthash[5] << 2) | (nthash[6] >> 6);
10622 key[7] = (nthash[6] << 1);
10623
10624 key[0] |= 0x01;
10625 key[1] |= 0x01;
10626 key[2] |= 0x01;
10627 key[3] |= 0x01;
10628 key[4] |= 0x01;
10629 key[5] |= 0x01;
10630 key[6] |= 0x01;
10631 key[7] |= 0x01;
10632 }
10633
10634 int netntlmv1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10635 {
10636 if ((input_len < DISPLAY_LEN_MIN_5500) || (input_len > DISPLAY_LEN_MAX_5500)) return (PARSER_GLOBAL_LENGTH);
10637
10638 u32 *digest = (u32 *) hash_buf->digest;
10639
10640 salt_t *salt = hash_buf->salt;
10641
10642 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
10643
10644 /**
10645 * parse line
10646 */
10647
10648 char *user_pos = input_buf;
10649
10650 char *unused_pos = strchr (user_pos, ':');
10651
10652 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10653
10654 uint user_len = unused_pos - user_pos;
10655
10656 if (user_len > 60) return (PARSER_SALT_LENGTH);
10657
10658 unused_pos++;
10659
10660 char *domain_pos = strchr (unused_pos, ':');
10661
10662 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10663
10664 uint unused_len = domain_pos - unused_pos;
10665
10666 if (unused_len != 0) return (PARSER_SALT_LENGTH);
10667
10668 domain_pos++;
10669
10670 char *srvchall_pos = strchr (domain_pos, ':');
10671
10672 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10673
10674 uint domain_len = srvchall_pos - domain_pos;
10675
10676 if (domain_len > 45) return (PARSER_SALT_LENGTH);
10677
10678 srvchall_pos++;
10679
10680 char *hash_pos = strchr (srvchall_pos, ':');
10681
10682 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10683
10684 uint srvchall_len = hash_pos - srvchall_pos;
10685
10686 // if (srvchall_len != 0) return (PARSER_SALT_LENGTH);
10687
10688 hash_pos++;
10689
10690 char *clichall_pos = strchr (hash_pos, ':');
10691
10692 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10693
10694 uint hash_len = clichall_pos - hash_pos;
10695
10696 if (hash_len != 48) return (PARSER_HASH_LENGTH);
10697
10698 clichall_pos++;
10699
10700 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
10701
10702 if (clichall_len != 16) return (PARSER_SALT_LENGTH);
10703
10704 /**
10705 * store some data for later use
10706 */
10707
10708 netntlm->user_len = user_len * 2;
10709 netntlm->domain_len = domain_len * 2;
10710 netntlm->srvchall_len = srvchall_len / 2;
10711 netntlm->clichall_len = clichall_len / 2;
10712
10713 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
10714 char *chall_ptr = (char *) netntlm->chall_buf;
10715
10716 /**
10717 * handle username and domainname
10718 */
10719
10720 for (uint i = 0; i < user_len; i++)
10721 {
10722 *userdomain_ptr++ = user_pos[i];
10723 *userdomain_ptr++ = 0;
10724 }
10725
10726 for (uint i = 0; i < domain_len; i++)
10727 {
10728 *userdomain_ptr++ = domain_pos[i];
10729 *userdomain_ptr++ = 0;
10730 }
10731
10732 /**
10733 * handle server challenge encoding
10734 */
10735
10736 for (uint i = 0; i < srvchall_len; i += 2)
10737 {
10738 const char p0 = srvchall_pos[i + 0];
10739 const char p1 = srvchall_pos[i + 1];
10740
10741 *chall_ptr++ = hex_convert (p1) << 0
10742 | hex_convert (p0) << 4;
10743 }
10744
10745 /**
10746 * handle client challenge encoding
10747 */
10748
10749 for (uint i = 0; i < clichall_len; i += 2)
10750 {
10751 const char p0 = clichall_pos[i + 0];
10752 const char p1 = clichall_pos[i + 1];
10753
10754 *chall_ptr++ = hex_convert (p1) << 0
10755 | hex_convert (p0) << 4;
10756 }
10757
10758 /**
10759 * store data
10760 */
10761
10762 char *salt_buf_ptr = (char *) salt->salt_buf;
10763
10764 uint salt_len = parse_and_store_salt (salt_buf_ptr, clichall_pos, clichall_len);
10765
10766 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10767
10768 salt->salt_len = salt_len;
10769
10770 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
10771 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
10772 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
10773 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
10774
10775 digest[0] = byte_swap_32 (digest[0]);
10776 digest[1] = byte_swap_32 (digest[1]);
10777 digest[2] = byte_swap_32 (digest[2]);
10778 digest[3] = byte_swap_32 (digest[3]);
10779
10780 /* special case, last 8 byte do not need to be checked since they are brute-forced next */
10781
10782 uint digest_tmp[2] = { 0 };
10783
10784 digest_tmp[0] = hex_to_u32 ((const u8 *) &hash_pos[32]);
10785 digest_tmp[1] = hex_to_u32 ((const u8 *) &hash_pos[40]);
10786
10787 digest_tmp[0] = byte_swap_32 (digest_tmp[0]);
10788 digest_tmp[1] = byte_swap_32 (digest_tmp[1]);
10789
10790 /* special case 2: ESS */
10791
10792 if (srvchall_len == 48)
10793 {
10794 if ((netntlm->chall_buf[2] == 0) && (netntlm->chall_buf[3] == 0) && (netntlm->chall_buf[4] == 0) && (netntlm->chall_buf[5] == 0))
10795 {
10796 uint w[16] = { 0 };
10797
10798 w[ 0] = netntlm->chall_buf[6];
10799 w[ 1] = netntlm->chall_buf[7];
10800 w[ 2] = netntlm->chall_buf[0];
10801 w[ 3] = netntlm->chall_buf[1];
10802 w[ 4] = 0x80;
10803 w[14] = 16 * 8;
10804
10805 uint dgst[4] = { 0 };
10806
10807 dgst[0] = MAGIC_A;
10808 dgst[1] = MAGIC_B;
10809 dgst[2] = MAGIC_C;
10810 dgst[3] = MAGIC_D;
10811
10812 md5_64 (w, dgst);
10813
10814 salt->salt_buf[0] = dgst[0];
10815 salt->salt_buf[1] = dgst[1];
10816 }
10817 }
10818
10819 /* precompute netntlmv1 exploit start */
10820
10821 for (uint i = 0; i < 0x10000; i++)
10822 {
10823 uint key_md4[2] = { i, 0 };
10824 uint key_des[2] = { 0, 0 };
10825
10826 transform_netntlmv1_key ((u8 *) key_md4, (u8 *) key_des);
10827
10828 uint Kc[16] = { 0 };
10829 uint Kd[16] = { 0 };
10830
10831 _des_keysetup (key_des, Kc, Kd, c_skb);
10832
10833 uint data3[2] = { salt->salt_buf[0], salt->salt_buf[1] };
10834
10835 _des_encrypt (data3, Kc, Kd, c_SPtrans);
10836
10837 if (data3[0] != digest_tmp[0]) continue;
10838 if (data3[1] != digest_tmp[1]) continue;
10839
10840 salt->salt_buf[2] = i;
10841
10842 salt->salt_len = 24;
10843
10844 break;
10845 }
10846
10847 salt->salt_buf_pc[0] = digest_tmp[0];
10848 salt->salt_buf_pc[1] = digest_tmp[1];
10849
10850 /* precompute netntlmv1 exploit stop */
10851
10852 u32 tt;
10853
10854 IP (digest[0], digest[1], tt);
10855 IP (digest[2], digest[3], tt);
10856
10857 digest[0] = rotr32 (digest[0], 29);
10858 digest[1] = rotr32 (digest[1], 29);
10859 digest[2] = rotr32 (digest[2], 29);
10860 digest[3] = rotr32 (digest[3], 29);
10861
10862 IP (salt->salt_buf[0], salt->salt_buf[1], tt);
10863
10864 salt->salt_buf[0] = rotl32 (salt->salt_buf[0], 3);
10865 salt->salt_buf[1] = rotl32 (salt->salt_buf[1], 3);
10866
10867 return (PARSER_OK);
10868 }
10869
10870 int netntlmv2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10871 {
10872 if ((input_len < DISPLAY_LEN_MIN_5600) || (input_len > DISPLAY_LEN_MAX_5600)) return (PARSER_GLOBAL_LENGTH);
10873
10874 u32 *digest = (u32 *) hash_buf->digest;
10875
10876 salt_t *salt = hash_buf->salt;
10877
10878 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
10879
10880 /**
10881 * parse line
10882 */
10883
10884 char *user_pos = input_buf;
10885
10886 char *unused_pos = strchr (user_pos, ':');
10887
10888 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10889
10890 uint user_len = unused_pos - user_pos;
10891
10892 if (user_len > 60) return (PARSER_SALT_LENGTH);
10893
10894 unused_pos++;
10895
10896 char *domain_pos = strchr (unused_pos, ':');
10897
10898 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10899
10900 uint unused_len = domain_pos - unused_pos;
10901
10902 if (unused_len != 0) return (PARSER_SALT_LENGTH);
10903
10904 domain_pos++;
10905
10906 char *srvchall_pos = strchr (domain_pos, ':');
10907
10908 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10909
10910 uint domain_len = srvchall_pos - domain_pos;
10911
10912 if (domain_len > 45) return (PARSER_SALT_LENGTH);
10913
10914 srvchall_pos++;
10915
10916 char *hash_pos = strchr (srvchall_pos, ':');
10917
10918 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10919
10920 uint srvchall_len = hash_pos - srvchall_pos;
10921
10922 if (srvchall_len != 16) return (PARSER_SALT_LENGTH);
10923
10924 hash_pos++;
10925
10926 char *clichall_pos = strchr (hash_pos, ':');
10927
10928 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10929
10930 uint hash_len = clichall_pos - hash_pos;
10931
10932 if (hash_len != 32) return (PARSER_HASH_LENGTH);
10933
10934 clichall_pos++;
10935
10936 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
10937
10938 if (clichall_len > 1024) return (PARSER_SALT_LENGTH);
10939
10940 if (clichall_len % 2) return (PARSER_SALT_VALUE);
10941
10942 /**
10943 * store some data for later use
10944 */
10945
10946 netntlm->user_len = user_len * 2;
10947 netntlm->domain_len = domain_len * 2;
10948 netntlm->srvchall_len = srvchall_len / 2;
10949 netntlm->clichall_len = clichall_len / 2;
10950
10951 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
10952 char *chall_ptr = (char *) netntlm->chall_buf;
10953
10954 /**
10955 * handle username and domainname
10956 */
10957
10958 for (uint i = 0; i < user_len; i++)
10959 {
10960 *userdomain_ptr++ = toupper (user_pos[i]);
10961 *userdomain_ptr++ = 0;
10962 }
10963
10964 for (uint i = 0; i < domain_len; i++)
10965 {
10966 *userdomain_ptr++ = domain_pos[i];
10967 *userdomain_ptr++ = 0;
10968 }
10969
10970 *userdomain_ptr++ = 0x80;
10971
10972 /**
10973 * handle server challenge encoding
10974 */
10975
10976 for (uint i = 0; i < srvchall_len; i += 2)
10977 {
10978 const char p0 = srvchall_pos[i + 0];
10979 const char p1 = srvchall_pos[i + 1];
10980
10981 *chall_ptr++ = hex_convert (p1) << 0
10982 | hex_convert (p0) << 4;
10983 }
10984
10985 /**
10986 * handle client challenge encoding
10987 */
10988
10989 for (uint i = 0; i < clichall_len; i += 2)
10990 {
10991 const char p0 = clichall_pos[i + 0];
10992 const char p1 = clichall_pos[i + 1];
10993
10994 *chall_ptr++ = hex_convert (p1) << 0
10995 | hex_convert (p0) << 4;
10996 }
10997
10998 *chall_ptr++ = 0x80;
10999
11000 /**
11001 * handle hash itself
11002 */
11003
11004 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11005 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11006 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11007 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11008
11009 digest[0] = byte_swap_32 (digest[0]);
11010 digest[1] = byte_swap_32 (digest[1]);
11011 digest[2] = byte_swap_32 (digest[2]);
11012 digest[3] = byte_swap_32 (digest[3]);
11013
11014 /**
11015 * reuse challange data as salt_buf, its the buffer that is most likely unique
11016 */
11017
11018 salt->salt_buf[0] = 0;
11019 salt->salt_buf[1] = 0;
11020 salt->salt_buf[2] = 0;
11021 salt->salt_buf[3] = 0;
11022 salt->salt_buf[4] = 0;
11023 salt->salt_buf[5] = 0;
11024 salt->salt_buf[6] = 0;
11025 salt->salt_buf[7] = 0;
11026
11027 uint *uptr;
11028
11029 uptr = (uint *) netntlm->userdomain_buf;
11030
11031 for (uint i = 0; i < 16; i += 16)
11032 {
11033 md5_64 (uptr, salt->salt_buf);
11034 }
11035
11036 uptr = (uint *) netntlm->chall_buf;
11037
11038 for (uint i = 0; i < 256; i += 16)
11039 {
11040 md5_64 (uptr, salt->salt_buf);
11041 }
11042
11043 salt->salt_len = 16;
11044
11045 return (PARSER_OK);
11046 }
11047
11048 int joomla_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11049 {
11050 if (data.opts_type & OPTS_TYPE_ST_HEX)
11051 {
11052 if ((input_len < DISPLAY_LEN_MIN_11H) || (input_len > DISPLAY_LEN_MAX_11H)) return (PARSER_GLOBAL_LENGTH);
11053 }
11054 else
11055 {
11056 if ((input_len < DISPLAY_LEN_MIN_11) || (input_len > DISPLAY_LEN_MAX_11)) return (PARSER_GLOBAL_LENGTH);
11057 }
11058
11059 u32 *digest = (u32 *) hash_buf->digest;
11060
11061 salt_t *salt = hash_buf->salt;
11062
11063 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11064 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11065 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11066 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11067
11068 digest[0] = byte_swap_32 (digest[0]);
11069 digest[1] = byte_swap_32 (digest[1]);
11070 digest[2] = byte_swap_32 (digest[2]);
11071 digest[3] = byte_swap_32 (digest[3]);
11072
11073 digest[0] -= MD5M_A;
11074 digest[1] -= MD5M_B;
11075 digest[2] -= MD5M_C;
11076 digest[3] -= MD5M_D;
11077
11078 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11079
11080 uint salt_len = input_len - 32 - 1;
11081
11082 char *salt_buf = input_buf + 32 + 1;
11083
11084 char *salt_buf_ptr = (char *) salt->salt_buf;
11085
11086 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11087
11088 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11089
11090 salt->salt_len = salt_len;
11091
11092 return (PARSER_OK);
11093 }
11094
11095 int postgresql_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11096 {
11097 if (data.opts_type & OPTS_TYPE_ST_HEX)
11098 {
11099 if ((input_len < DISPLAY_LEN_MIN_12H) || (input_len > DISPLAY_LEN_MAX_12H)) return (PARSER_GLOBAL_LENGTH);
11100 }
11101 else
11102 {
11103 if ((input_len < DISPLAY_LEN_MIN_12) || (input_len > DISPLAY_LEN_MAX_12)) return (PARSER_GLOBAL_LENGTH);
11104 }
11105
11106 u32 *digest = (u32 *) hash_buf->digest;
11107
11108 salt_t *salt = hash_buf->salt;
11109
11110 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11111 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11112 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11113 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11114
11115 digest[0] = byte_swap_32 (digest[0]);
11116 digest[1] = byte_swap_32 (digest[1]);
11117 digest[2] = byte_swap_32 (digest[2]);
11118 digest[3] = byte_swap_32 (digest[3]);
11119
11120 digest[0] -= MD5M_A;
11121 digest[1] -= MD5M_B;
11122 digest[2] -= MD5M_C;
11123 digest[3] -= MD5M_D;
11124
11125 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11126
11127 uint salt_len = input_len - 32 - 1;
11128
11129 char *salt_buf = input_buf + 32 + 1;
11130
11131 char *salt_buf_ptr = (char *) salt->salt_buf;
11132
11133 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11134
11135 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11136
11137 salt->salt_len = salt_len;
11138
11139 return (PARSER_OK);
11140 }
11141
11142 int md5md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11143 {
11144 if ((input_len < DISPLAY_LEN_MIN_2600) || (input_len > DISPLAY_LEN_MAX_2600)) return (PARSER_GLOBAL_LENGTH);
11145
11146 u32 *digest = (u32 *) hash_buf->digest;
11147
11148 salt_t *salt = hash_buf->salt;
11149
11150 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11151 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11152 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11153 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11154
11155 digest[0] = byte_swap_32 (digest[0]);
11156 digest[1] = byte_swap_32 (digest[1]);
11157 digest[2] = byte_swap_32 (digest[2]);
11158 digest[3] = byte_swap_32 (digest[3]);
11159
11160 digest[0] -= MD5M_A;
11161 digest[1] -= MD5M_B;
11162 digest[2] -= MD5M_C;
11163 digest[3] -= MD5M_D;
11164
11165 /**
11166 * This is a virtual salt. While the algorithm is basically not salted
11167 * we can exploit the salt buffer to set the 0x80 and the w[14] value.
11168 * This way we can save a special md5md5 kernel and reuse the one from vbull.
11169 */
11170
11171 char *salt_buf_ptr = (char *) salt->salt_buf;
11172
11173 uint salt_len = parse_and_store_salt (salt_buf_ptr, (char *) "", 0);
11174
11175 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11176
11177 salt->salt_len = salt_len;
11178
11179 return (PARSER_OK);
11180 }
11181
11182 int vb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11183 {
11184 if (data.opts_type & OPTS_TYPE_ST_HEX)
11185 {
11186 if ((input_len < DISPLAY_LEN_MIN_2611H) || (input_len > DISPLAY_LEN_MAX_2611H)) return (PARSER_GLOBAL_LENGTH);
11187 }
11188 else
11189 {
11190 if ((input_len < DISPLAY_LEN_MIN_2611) || (input_len > DISPLAY_LEN_MAX_2611)) return (PARSER_GLOBAL_LENGTH);
11191 }
11192
11193 u32 *digest = (u32 *) hash_buf->digest;
11194
11195 salt_t *salt = hash_buf->salt;
11196
11197 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11198 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11199 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11200 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11201
11202 digest[0] = byte_swap_32 (digest[0]);
11203 digest[1] = byte_swap_32 (digest[1]);
11204 digest[2] = byte_swap_32 (digest[2]);
11205 digest[3] = byte_swap_32 (digest[3]);
11206
11207 digest[0] -= MD5M_A;
11208 digest[1] -= MD5M_B;
11209 digest[2] -= MD5M_C;
11210 digest[3] -= MD5M_D;
11211
11212 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11213
11214 uint salt_len = input_len - 32 - 1;
11215
11216 char *salt_buf = input_buf + 32 + 1;
11217
11218 char *salt_buf_ptr = (char *) salt->salt_buf;
11219
11220 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11221
11222 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11223
11224 salt->salt_len = salt_len;
11225
11226 return (PARSER_OK);
11227 }
11228
11229 int vb30_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11230 {
11231 if (data.opts_type & OPTS_TYPE_ST_HEX)
11232 {
11233 if ((input_len < DISPLAY_LEN_MIN_2711H) || (input_len > DISPLAY_LEN_MAX_2711H)) return (PARSER_GLOBAL_LENGTH);
11234 }
11235 else
11236 {
11237 if ((input_len < DISPLAY_LEN_MIN_2711) || (input_len > DISPLAY_LEN_MAX_2711)) return (PARSER_GLOBAL_LENGTH);
11238 }
11239
11240 u32 *digest = (u32 *) hash_buf->digest;
11241
11242 salt_t *salt = hash_buf->salt;
11243
11244 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11245 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11246 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11247 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11248
11249 digest[0] = byte_swap_32 (digest[0]);
11250 digest[1] = byte_swap_32 (digest[1]);
11251 digest[2] = byte_swap_32 (digest[2]);
11252 digest[3] = byte_swap_32 (digest[3]);
11253
11254 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11255
11256 uint salt_len = input_len - 32 - 1;
11257
11258 char *salt_buf = input_buf + 32 + 1;
11259
11260 char *salt_buf_ptr = (char *) salt->salt_buf;
11261
11262 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11263
11264 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11265
11266 salt->salt_len = salt_len;
11267
11268 return (PARSER_OK);
11269 }
11270
11271 int dcc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11272 {
11273 if (data.opts_type & OPTS_TYPE_ST_HEX)
11274 {
11275 if ((input_len < DISPLAY_LEN_MIN_1100H) || (input_len > DISPLAY_LEN_MAX_1100H)) return (PARSER_GLOBAL_LENGTH);
11276 }
11277 else
11278 {
11279 if ((input_len < DISPLAY_LEN_MIN_1100) || (input_len > DISPLAY_LEN_MAX_1100)) return (PARSER_GLOBAL_LENGTH);
11280 }
11281
11282 u32 *digest = (u32 *) hash_buf->digest;
11283
11284 salt_t *salt = hash_buf->salt;
11285
11286 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11287 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11288 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11289 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11290
11291 digest[0] = byte_swap_32 (digest[0]);
11292 digest[1] = byte_swap_32 (digest[1]);
11293 digest[2] = byte_swap_32 (digest[2]);
11294 digest[3] = byte_swap_32 (digest[3]);
11295
11296 digest[0] -= MD4M_A;
11297 digest[1] -= MD4M_B;
11298 digest[2] -= MD4M_C;
11299 digest[3] -= MD4M_D;
11300
11301 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11302
11303 uint salt_len = input_len - 32 - 1;
11304
11305 char *salt_buf = input_buf + 32 + 1;
11306
11307 char *salt_buf_ptr = (char *) salt->salt_buf;
11308
11309 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11310
11311 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11312
11313 salt->salt_len = salt_len;
11314
11315 return (PARSER_OK);
11316 }
11317
11318 int ipb2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11319 {
11320 if (data.opts_type & OPTS_TYPE_ST_HEX)
11321 {
11322 if ((input_len < DISPLAY_LEN_MIN_2811H) || (input_len > DISPLAY_LEN_MAX_2811H)) return (PARSER_GLOBAL_LENGTH);
11323 }
11324 else
11325 {
11326 if ((input_len < DISPLAY_LEN_MIN_2811) || (input_len > DISPLAY_LEN_MAX_2811)) return (PARSER_GLOBAL_LENGTH);
11327 }
11328
11329 u32 *digest = (u32 *) hash_buf->digest;
11330
11331 salt_t *salt = hash_buf->salt;
11332
11333 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11334 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11335 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11336 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11337
11338 digest[0] = byte_swap_32 (digest[0]);
11339 digest[1] = byte_swap_32 (digest[1]);
11340 digest[2] = byte_swap_32 (digest[2]);
11341 digest[3] = byte_swap_32 (digest[3]);
11342
11343 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11344
11345 uint salt_len = input_len - 32 - 1;
11346
11347 char *salt_buf = input_buf + 32 + 1;
11348
11349 uint salt_pc_block[16] = { 0 };
11350
11351 char *salt_pc_block_ptr = (char *) salt_pc_block;
11352
11353 salt_len = parse_and_store_salt (salt_pc_block_ptr, salt_buf, salt_len);
11354
11355 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11356
11357 salt_pc_block_ptr[salt_len] = (unsigned char) 0x80;
11358
11359 salt_pc_block[14] = salt_len * 8;
11360
11361 uint salt_pc_digest[4] = { MAGIC_A, MAGIC_B, MAGIC_C, MAGIC_D };
11362
11363 md5_64 (salt_pc_block, salt_pc_digest);
11364
11365 salt_pc_digest[0] = byte_swap_32 (salt_pc_digest[0]);
11366 salt_pc_digest[1] = byte_swap_32 (salt_pc_digest[1]);
11367 salt_pc_digest[2] = byte_swap_32 (salt_pc_digest[2]);
11368 salt_pc_digest[3] = byte_swap_32 (salt_pc_digest[3]);
11369
11370 u8 *salt_buf_ptr = (u8 *) salt->salt_buf;
11371
11372 memcpy (salt_buf_ptr, salt_buf, salt_len);
11373
11374 u8 *salt_buf_pc_ptr = (u8 *) salt->salt_buf_pc;
11375
11376 bin_to_hex_lower (salt_pc_digest[0], salt_buf_pc_ptr + 0);
11377 bin_to_hex_lower (salt_pc_digest[1], salt_buf_pc_ptr + 8);
11378 bin_to_hex_lower (salt_pc_digest[2], salt_buf_pc_ptr + 16);
11379 bin_to_hex_lower (salt_pc_digest[3], salt_buf_pc_ptr + 24);
11380
11381 salt->salt_len = 32; // changed, was salt_len before -- was a bug? 32 should be correct
11382
11383 return (PARSER_OK);
11384 }
11385
11386 int sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11387 {
11388 if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH);
11389
11390 u32 *digest = (u32 *) hash_buf->digest;
11391
11392 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11393 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11394 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11395 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11396 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11397
11398 digest[0] -= SHA1M_A;
11399 digest[1] -= SHA1M_B;
11400 digest[2] -= SHA1M_C;
11401 digest[3] -= SHA1M_D;
11402 digest[4] -= SHA1M_E;
11403
11404 return (PARSER_OK);
11405 }
11406
11407 int sha1linkedin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11408 {
11409 if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH);
11410
11411 u32 *digest = (u32 *) hash_buf->digest;
11412
11413 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11414 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11415 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11416 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11417 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11418
11419 return (PARSER_OK);
11420 }
11421
11422 int sha1s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11423 {
11424 if (data.opts_type & OPTS_TYPE_ST_HEX)
11425 {
11426 if ((input_len < DISPLAY_LEN_MIN_110H) || (input_len > DISPLAY_LEN_MAX_110H)) return (PARSER_GLOBAL_LENGTH);
11427 }
11428 else
11429 {
11430 if ((input_len < DISPLAY_LEN_MIN_110) || (input_len > DISPLAY_LEN_MAX_110)) return (PARSER_GLOBAL_LENGTH);
11431 }
11432
11433 u32 *digest = (u32 *) hash_buf->digest;
11434
11435 salt_t *salt = hash_buf->salt;
11436
11437 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11438 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11439 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11440 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11441 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11442
11443 digest[0] -= SHA1M_A;
11444 digest[1] -= SHA1M_B;
11445 digest[2] -= SHA1M_C;
11446 digest[3] -= SHA1M_D;
11447 digest[4] -= SHA1M_E;
11448
11449 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11450
11451 uint salt_len = input_len - 40 - 1;
11452
11453 char *salt_buf = input_buf + 40 + 1;
11454
11455 char *salt_buf_ptr = (char *) salt->salt_buf;
11456
11457 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11458
11459 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11460
11461 salt->salt_len = salt_len;
11462
11463 return (PARSER_OK);
11464 }
11465
11466 int sha1b64_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11467 {
11468 if ((input_len < DISPLAY_LEN_MIN_101) || (input_len > DISPLAY_LEN_MAX_101)) return (PARSER_GLOBAL_LENGTH);
11469
11470 if (memcmp (SIGNATURE_SHA1B64, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
11471
11472 u32 *digest = (u32 *) hash_buf->digest;
11473
11474 u8 tmp_buf[100] = { 0 };
11475
11476 base64_decode (base64_to_int, (const u8 *) input_buf + 5, input_len - 5, tmp_buf);
11477
11478 memcpy (digest, tmp_buf, 20);
11479
11480 digest[0] = byte_swap_32 (digest[0]);
11481 digest[1] = byte_swap_32 (digest[1]);
11482 digest[2] = byte_swap_32 (digest[2]);
11483 digest[3] = byte_swap_32 (digest[3]);
11484 digest[4] = byte_swap_32 (digest[4]);
11485
11486 digest[0] -= SHA1M_A;
11487 digest[1] -= SHA1M_B;
11488 digest[2] -= SHA1M_C;
11489 digest[3] -= SHA1M_D;
11490 digest[4] -= SHA1M_E;
11491
11492 return (PARSER_OK);
11493 }
11494
11495 int sha1b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11496 {
11497 if ((input_len < DISPLAY_LEN_MIN_111) || (input_len > DISPLAY_LEN_MAX_111)) return (PARSER_GLOBAL_LENGTH);
11498
11499 if (memcmp (SIGNATURE_SSHA1B64_lower, input_buf, 6) && memcmp (SIGNATURE_SSHA1B64_upper, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11500
11501 u32 *digest = (u32 *) hash_buf->digest;
11502
11503 salt_t *salt = hash_buf->salt;
11504
11505 u8 tmp_buf[100] = { 0 };
11506
11507 int tmp_len = base64_decode (base64_to_int, (const u8 *) input_buf + 6, input_len - 6, tmp_buf);
11508
11509 memcpy (digest, tmp_buf, 20);
11510
11511 salt->salt_len = tmp_len - 20;
11512
11513 memcpy (salt->salt_buf, tmp_buf + 20, salt->salt_len);
11514
11515 if (data.opts_type & OPTS_TYPE_ST_ADD80)
11516 {
11517 char *ptr = (char *) salt->salt_buf;
11518
11519 ptr[salt->salt_len] = 0x80;
11520 }
11521
11522 digest[0] = byte_swap_32 (digest[0]);
11523 digest[1] = byte_swap_32 (digest[1]);
11524 digest[2] = byte_swap_32 (digest[2]);
11525 digest[3] = byte_swap_32 (digest[3]);
11526 digest[4] = byte_swap_32 (digest[4]);
11527
11528 digest[0] -= SHA1M_A;
11529 digest[1] -= SHA1M_B;
11530 digest[2] -= SHA1M_C;
11531 digest[3] -= SHA1M_D;
11532 digest[4] -= SHA1M_E;
11533
11534 return (PARSER_OK);
11535 }
11536
11537 int mssql2000_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11538 {
11539 if ((input_len < DISPLAY_LEN_MIN_131) || (input_len > DISPLAY_LEN_MAX_131)) return (PARSER_GLOBAL_LENGTH);
11540
11541 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11542
11543 u32 *digest = (u32 *) hash_buf->digest;
11544
11545 salt_t *salt = hash_buf->salt;
11546
11547 char *salt_buf = input_buf + 6;
11548
11549 uint salt_len = 8;
11550
11551 char *salt_buf_ptr = (char *) salt->salt_buf;
11552
11553 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11554
11555 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11556
11557 salt->salt_len = salt_len;
11558
11559 char *hash_pos = input_buf + 6 + 8 + 40;
11560
11561 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11562 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11563 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11564 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11565 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
11566
11567 digest[0] -= SHA1M_A;
11568 digest[1] -= SHA1M_B;
11569 digest[2] -= SHA1M_C;
11570 digest[3] -= SHA1M_D;
11571 digest[4] -= SHA1M_E;
11572
11573 return (PARSER_OK);
11574 }
11575
11576 int mssql2005_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11577 {
11578 if ((input_len < DISPLAY_LEN_MIN_132) || (input_len > DISPLAY_LEN_MAX_132)) return (PARSER_GLOBAL_LENGTH);
11579
11580 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11581
11582 u32 *digest = (u32 *) hash_buf->digest;
11583
11584 salt_t *salt = hash_buf->salt;
11585
11586 char *salt_buf = input_buf + 6;
11587
11588 uint salt_len = 8;
11589
11590 char *salt_buf_ptr = (char *) salt->salt_buf;
11591
11592 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11593
11594 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11595
11596 salt->salt_len = salt_len;
11597
11598 char *hash_pos = input_buf + 6 + 8;
11599
11600 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11601 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11602 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11603 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11604 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
11605
11606 digest[0] -= SHA1M_A;
11607 digest[1] -= SHA1M_B;
11608 digest[2] -= SHA1M_C;
11609 digest[3] -= SHA1M_D;
11610 digest[4] -= SHA1M_E;
11611
11612 return (PARSER_OK);
11613 }
11614
11615 int mssql2012_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11616 {
11617 if ((input_len < DISPLAY_LEN_MIN_1731) || (input_len > DISPLAY_LEN_MAX_1731)) return (PARSER_GLOBAL_LENGTH);
11618
11619 if (memcmp (SIGNATURE_MSSQL2012, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11620
11621 u64 *digest = (u64 *) hash_buf->digest;
11622
11623 salt_t *salt = hash_buf->salt;
11624
11625 char *salt_buf = input_buf + 6;
11626
11627 uint salt_len = 8;
11628
11629 char *salt_buf_ptr = (char *) salt->salt_buf;
11630
11631 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11632
11633 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11634
11635 salt->salt_len = salt_len;
11636
11637 char *hash_pos = input_buf + 6 + 8;
11638
11639 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
11640 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
11641 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
11642 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
11643 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
11644 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
11645 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
11646 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
11647
11648 digest[0] -= SHA512M_A;
11649 digest[1] -= SHA512M_B;
11650 digest[2] -= SHA512M_C;
11651 digest[3] -= SHA512M_D;
11652 digest[4] -= SHA512M_E;
11653 digest[5] -= SHA512M_F;
11654 digest[6] -= SHA512M_G;
11655 digest[7] -= SHA512M_H;
11656
11657 return (PARSER_OK);
11658 }
11659
11660 int oracleh_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11661 {
11662 if (data.opts_type & OPTS_TYPE_ST_HEX)
11663 {
11664 if ((input_len < DISPLAY_LEN_MIN_3100H) || (input_len > DISPLAY_LEN_MAX_3100H)) return (PARSER_GLOBAL_LENGTH);
11665 }
11666 else
11667 {
11668 if ((input_len < DISPLAY_LEN_MIN_3100) || (input_len > DISPLAY_LEN_MAX_3100)) return (PARSER_GLOBAL_LENGTH);
11669 }
11670
11671 u32 *digest = (u32 *) hash_buf->digest;
11672
11673 salt_t *salt = hash_buf->salt;
11674
11675 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11676 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11677 digest[2] = 0;
11678 digest[3] = 0;
11679
11680 digest[0] = byte_swap_32 (digest[0]);
11681 digest[1] = byte_swap_32 (digest[1]);
11682
11683 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11684
11685 uint salt_len = input_len - 16 - 1;
11686
11687 char *salt_buf = input_buf + 16 + 1;
11688
11689 char *salt_buf_ptr = (char *) salt->salt_buf;
11690
11691 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11692
11693 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11694
11695 salt->salt_len = salt_len;
11696
11697 return (PARSER_OK);
11698 }
11699
11700 int oracles_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11701 {
11702 if ((input_len < DISPLAY_LEN_MIN_112) || (input_len > DISPLAY_LEN_MAX_112)) return (PARSER_GLOBAL_LENGTH);
11703
11704 u32 *digest = (u32 *) hash_buf->digest;
11705
11706 salt_t *salt = hash_buf->salt;
11707
11708 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11709 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11710 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11711 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11712 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11713
11714 digest[0] -= SHA1M_A;
11715 digest[1] -= SHA1M_B;
11716 digest[2] -= SHA1M_C;
11717 digest[3] -= SHA1M_D;
11718 digest[4] -= SHA1M_E;
11719
11720 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11721
11722 uint salt_len = input_len - 40 - 1;
11723
11724 char *salt_buf = input_buf + 40 + 1;
11725
11726 char *salt_buf_ptr = (char *) salt->salt_buf;
11727
11728 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11729
11730 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11731
11732 salt->salt_len = salt_len;
11733
11734 return (PARSER_OK);
11735 }
11736
11737 int oraclet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11738 {
11739 if ((input_len < DISPLAY_LEN_MIN_12300) || (input_len > DISPLAY_LEN_MAX_12300)) return (PARSER_GLOBAL_LENGTH);
11740
11741 u32 *digest = (u32 *) hash_buf->digest;
11742
11743 salt_t *salt = hash_buf->salt;
11744
11745 char *hash_pos = input_buf;
11746
11747 digest[ 0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11748 digest[ 1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11749 digest[ 2] = hex_to_u32 ((const u8 *) &hash_pos[ 16]);
11750 digest[ 3] = hex_to_u32 ((const u8 *) &hash_pos[ 24]);
11751 digest[ 4] = hex_to_u32 ((const u8 *) &hash_pos[ 32]);
11752 digest[ 5] = hex_to_u32 ((const u8 *) &hash_pos[ 40]);
11753 digest[ 6] = hex_to_u32 ((const u8 *) &hash_pos[ 48]);
11754 digest[ 7] = hex_to_u32 ((const u8 *) &hash_pos[ 56]);
11755 digest[ 8] = hex_to_u32 ((const u8 *) &hash_pos[ 64]);
11756 digest[ 9] = hex_to_u32 ((const u8 *) &hash_pos[ 72]);
11757 digest[10] = hex_to_u32 ((const u8 *) &hash_pos[ 80]);
11758 digest[11] = hex_to_u32 ((const u8 *) &hash_pos[ 88]);
11759 digest[12] = hex_to_u32 ((const u8 *) &hash_pos[ 96]);
11760 digest[13] = hex_to_u32 ((const u8 *) &hash_pos[104]);
11761 digest[14] = hex_to_u32 ((const u8 *) &hash_pos[112]);
11762 digest[15] = hex_to_u32 ((const u8 *) &hash_pos[120]);
11763
11764 char *salt_pos = input_buf + 128;
11765
11766 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
11767 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
11768 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
11769 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
11770
11771 salt->salt_iter = ROUNDS_ORACLET - 1;
11772 salt->salt_len = 16;
11773
11774 return (PARSER_OK);
11775 }
11776
11777 int sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11778 {
11779 if ((input_len < DISPLAY_LEN_MIN_1400) || (input_len > DISPLAY_LEN_MAX_1400)) return (PARSER_GLOBAL_LENGTH);
11780
11781 u32 *digest = (u32 *) hash_buf->digest;
11782
11783 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11784 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11785 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11786 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11787 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11788 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
11789 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
11790 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
11791
11792 digest[0] -= SHA256M_A;
11793 digest[1] -= SHA256M_B;
11794 digest[2] -= SHA256M_C;
11795 digest[3] -= SHA256M_D;
11796 digest[4] -= SHA256M_E;
11797 digest[5] -= SHA256M_F;
11798 digest[6] -= SHA256M_G;
11799 digest[7] -= SHA256M_H;
11800
11801 return (PARSER_OK);
11802 }
11803
11804 int sha256s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11805 {
11806 if (data.opts_type & OPTS_TYPE_ST_HEX)
11807 {
11808 if ((input_len < DISPLAY_LEN_MIN_1410H) || (input_len > DISPLAY_LEN_MAX_1410H)) return (PARSER_GLOBAL_LENGTH);
11809 }
11810 else
11811 {
11812 if ((input_len < DISPLAY_LEN_MIN_1410) || (input_len > DISPLAY_LEN_MAX_1410)) return (PARSER_GLOBAL_LENGTH);
11813 }
11814
11815 u32 *digest = (u32 *) hash_buf->digest;
11816
11817 salt_t *salt = hash_buf->salt;
11818
11819 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11820 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11821 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11822 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11823 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11824 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
11825 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
11826 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
11827
11828 digest[0] -= SHA256M_A;
11829 digest[1] -= SHA256M_B;
11830 digest[2] -= SHA256M_C;
11831 digest[3] -= SHA256M_D;
11832 digest[4] -= SHA256M_E;
11833 digest[5] -= SHA256M_F;
11834 digest[6] -= SHA256M_G;
11835 digest[7] -= SHA256M_H;
11836
11837 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11838
11839 uint salt_len = input_len - 64 - 1;
11840
11841 char *salt_buf = input_buf + 64 + 1;
11842
11843 char *salt_buf_ptr = (char *) salt->salt_buf;
11844
11845 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11846
11847 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11848
11849 salt->salt_len = salt_len;
11850
11851 return (PARSER_OK);
11852 }
11853
11854 int sha384_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11855 {
11856 if ((input_len < DISPLAY_LEN_MIN_10800) || (input_len > DISPLAY_LEN_MAX_10800)) return (PARSER_GLOBAL_LENGTH);
11857
11858 u64 *digest = (u64 *) hash_buf->digest;
11859
11860 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
11861 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
11862 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
11863 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
11864 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
11865 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
11866 digest[6] = 0;
11867 digest[7] = 0;
11868
11869 digest[0] -= SHA384M_A;
11870 digest[1] -= SHA384M_B;
11871 digest[2] -= SHA384M_C;
11872 digest[3] -= SHA384M_D;
11873 digest[4] -= SHA384M_E;
11874 digest[5] -= SHA384M_F;
11875 digest[6] -= 0;
11876 digest[7] -= 0;
11877
11878 return (PARSER_OK);
11879 }
11880
11881 int sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11882 {
11883 if ((input_len < DISPLAY_LEN_MIN_1700) || (input_len > DISPLAY_LEN_MAX_1700)) return (PARSER_GLOBAL_LENGTH);
11884
11885 u64 *digest = (u64 *) hash_buf->digest;
11886
11887 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
11888 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
11889 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
11890 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
11891 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
11892 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
11893 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
11894 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
11895
11896 digest[0] -= SHA512M_A;
11897 digest[1] -= SHA512M_B;
11898 digest[2] -= SHA512M_C;
11899 digest[3] -= SHA512M_D;
11900 digest[4] -= SHA512M_E;
11901 digest[5] -= SHA512M_F;
11902 digest[6] -= SHA512M_G;
11903 digest[7] -= SHA512M_H;
11904
11905 return (PARSER_OK);
11906 }
11907
11908 int sha512s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11909 {
11910 if (data.opts_type & OPTS_TYPE_ST_HEX)
11911 {
11912 if ((input_len < DISPLAY_LEN_MIN_1710H) || (input_len > DISPLAY_LEN_MAX_1710H)) return (PARSER_GLOBAL_LENGTH);
11913 }
11914 else
11915 {
11916 if ((input_len < DISPLAY_LEN_MIN_1710) || (input_len > DISPLAY_LEN_MAX_1710)) return (PARSER_GLOBAL_LENGTH);
11917 }
11918
11919 u64 *digest = (u64 *) hash_buf->digest;
11920
11921 salt_t *salt = hash_buf->salt;
11922
11923 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
11924 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
11925 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
11926 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
11927 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
11928 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
11929 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
11930 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
11931
11932 digest[0] -= SHA512M_A;
11933 digest[1] -= SHA512M_B;
11934 digest[2] -= SHA512M_C;
11935 digest[3] -= SHA512M_D;
11936 digest[4] -= SHA512M_E;
11937 digest[5] -= SHA512M_F;
11938 digest[6] -= SHA512M_G;
11939 digest[7] -= SHA512M_H;
11940
11941 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11942
11943 uint salt_len = input_len - 128 - 1;
11944
11945 char *salt_buf = input_buf + 128 + 1;
11946
11947 char *salt_buf_ptr = (char *) salt->salt_buf;
11948
11949 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11950
11951 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11952
11953 salt->salt_len = salt_len;
11954
11955 return (PARSER_OK);
11956 }
11957
11958 int sha512crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11959 {
11960 if (memcmp (SIGNATURE_SHA512CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
11961
11962 u64 *digest = (u64 *) hash_buf->digest;
11963
11964 salt_t *salt = hash_buf->salt;
11965
11966 char *salt_pos = input_buf + 3;
11967
11968 uint iterations_len = 0;
11969
11970 if (memcmp (salt_pos, "rounds=", 7) == 0)
11971 {
11972 salt_pos += 7;
11973
11974 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
11975
11976 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
11977 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
11978
11979 salt_pos[0] = 0x0;
11980
11981 salt->salt_iter = atoi (salt_pos - iterations_len);
11982
11983 salt_pos += 1;
11984
11985 iterations_len += 8;
11986 }
11987 else
11988 {
11989 salt->salt_iter = ROUNDS_SHA512CRYPT;
11990 }
11991
11992 if ((input_len < DISPLAY_LEN_MIN_1800) || (input_len > DISPLAY_LEN_MAX_1800 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
11993
11994 char *hash_pos = strchr (salt_pos, '$');
11995
11996 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11997
11998 uint salt_len = hash_pos - salt_pos;
11999
12000 if (salt_len > 16) return (PARSER_SALT_LENGTH);
12001
12002 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12003
12004 salt->salt_len = salt_len;
12005
12006 hash_pos++;
12007
12008 sha512crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12009
12010 return (PARSER_OK);
12011 }
12012
12013 int keccak_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12014 {
12015 if ((input_len < DISPLAY_LEN_MIN_5000) || (input_len > DISPLAY_LEN_MAX_5000)) return (PARSER_GLOBAL_LENGTH);
12016
12017 if (input_len % 16) return (PARSER_GLOBAL_LENGTH);
12018
12019 u64 *digest = (u64 *) hash_buf->digest;
12020
12021 salt_t *salt = hash_buf->salt;
12022
12023 uint keccak_mdlen = input_len / 2;
12024
12025 for (uint i = 0; i < keccak_mdlen / 8; i++)
12026 {
12027 digest[i] = hex_to_u64 ((const u8 *) &input_buf[i * 16]);
12028
12029 digest[i] = byte_swap_64 (digest[i]);
12030 }
12031
12032 salt->keccak_mdlen = keccak_mdlen;
12033
12034 return (PARSER_OK);
12035 }
12036
12037 int ikepsk_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12038 {
12039 if ((input_len < DISPLAY_LEN_MIN_5300) || (input_len > DISPLAY_LEN_MAX_5300)) return (PARSER_GLOBAL_LENGTH);
12040
12041 u32 *digest = (u32 *) hash_buf->digest;
12042
12043 salt_t *salt = hash_buf->salt;
12044
12045 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
12046
12047 /**
12048 * Parse that strange long line
12049 */
12050
12051 char *in_off[9];
12052
12053 size_t in_len[9] = { 0 };
12054
12055 in_off[0] = strtok (input_buf, ":");
12056
12057 in_len[0] = strlen (in_off[0]);
12058
12059 size_t i;
12060
12061 for (i = 1; i < 9; i++)
12062 {
12063 in_off[i] = strtok (NULL, ":");
12064
12065 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12066
12067 in_len[i] = strlen (in_off[i]);
12068 }
12069
12070 char *ptr = (char *) ikepsk->msg_buf;
12071
12072 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[0] + i);
12073 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[1] + i);
12074 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[2] + i);
12075 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[3] + i);
12076 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[4] + i);
12077 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[5] + i);
12078
12079 *ptr = 0x80;
12080
12081 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
12082
12083 ptr = (char *) ikepsk->nr_buf;
12084
12085 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[6] + i);
12086 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[7] + i);
12087
12088 *ptr = 0x80;
12089
12090 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
12091
12092 /**
12093 * Store to database
12094 */
12095
12096 ptr = in_off[8];
12097
12098 digest[0] = hex_to_u32 ((const u8 *) &ptr[ 0]);
12099 digest[1] = hex_to_u32 ((const u8 *) &ptr[ 8]);
12100 digest[2] = hex_to_u32 ((const u8 *) &ptr[16]);
12101 digest[3] = hex_to_u32 ((const u8 *) &ptr[24]);
12102
12103 digest[0] = byte_swap_32 (digest[0]);
12104 digest[1] = byte_swap_32 (digest[1]);
12105 digest[2] = byte_swap_32 (digest[2]);
12106 digest[3] = byte_swap_32 (digest[3]);
12107
12108 salt->salt_len = 32;
12109
12110 salt->salt_buf[0] = ikepsk->nr_buf[0];
12111 salt->salt_buf[1] = ikepsk->nr_buf[1];
12112 salt->salt_buf[2] = ikepsk->nr_buf[2];
12113 salt->salt_buf[3] = ikepsk->nr_buf[3];
12114 salt->salt_buf[4] = ikepsk->nr_buf[4];
12115 salt->salt_buf[5] = ikepsk->nr_buf[5];
12116 salt->salt_buf[6] = ikepsk->nr_buf[6];
12117 salt->salt_buf[7] = ikepsk->nr_buf[7];
12118
12119 return (PARSER_OK);
12120 }
12121
12122 int ikepsk_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12123 {
12124 if ((input_len < DISPLAY_LEN_MIN_5400) || (input_len > DISPLAY_LEN_MAX_5400)) return (PARSER_GLOBAL_LENGTH);
12125
12126 u32 *digest = (u32 *) hash_buf->digest;
12127
12128 salt_t *salt = hash_buf->salt;
12129
12130 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
12131
12132 /**
12133 * Parse that strange long line
12134 */
12135
12136 char *in_off[9];
12137
12138 size_t in_len[9] = { 0 };
12139
12140 in_off[0] = strtok (input_buf, ":");
12141
12142 in_len[0] = strlen (in_off[0]);
12143
12144 size_t i;
12145
12146 for (i = 1; i < 9; i++)
12147 {
12148 in_off[i] = strtok (NULL, ":");
12149
12150 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12151
12152 in_len[i] = strlen (in_off[i]);
12153 }
12154
12155 char *ptr = (char *) ikepsk->msg_buf;
12156
12157 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[0] + i);
12158 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[1] + i);
12159 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[2] + i);
12160 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[3] + i);
12161 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[4] + i);
12162 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[5] + i);
12163
12164 *ptr = 0x80;
12165
12166 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
12167
12168 ptr = (char *) ikepsk->nr_buf;
12169
12170 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[6] + i);
12171 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[7] + i);
12172
12173 *ptr = 0x80;
12174
12175 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
12176
12177 /**
12178 * Store to database
12179 */
12180
12181 ptr = in_off[8];
12182
12183 digest[0] = hex_to_u32 ((const u8 *) &ptr[ 0]);
12184 digest[1] = hex_to_u32 ((const u8 *) &ptr[ 8]);
12185 digest[2] = hex_to_u32 ((const u8 *) &ptr[16]);
12186 digest[3] = hex_to_u32 ((const u8 *) &ptr[24]);
12187 digest[4] = hex_to_u32 ((const u8 *) &ptr[32]);
12188
12189 salt->salt_len = 32;
12190
12191 salt->salt_buf[0] = ikepsk->nr_buf[0];
12192 salt->salt_buf[1] = ikepsk->nr_buf[1];
12193 salt->salt_buf[2] = ikepsk->nr_buf[2];
12194 salt->salt_buf[3] = ikepsk->nr_buf[3];
12195 salt->salt_buf[4] = ikepsk->nr_buf[4];
12196 salt->salt_buf[5] = ikepsk->nr_buf[5];
12197 salt->salt_buf[6] = ikepsk->nr_buf[6];
12198 salt->salt_buf[7] = ikepsk->nr_buf[7];
12199
12200 return (PARSER_OK);
12201 }
12202
12203 int ripemd160_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12204 {
12205 if ((input_len < DISPLAY_LEN_MIN_6000) || (input_len > DISPLAY_LEN_MAX_6000)) return (PARSER_GLOBAL_LENGTH);
12206
12207 u32 *digest = (u32 *) hash_buf->digest;
12208
12209 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12210 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12211 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12212 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12213 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12214
12215 digest[0] = byte_swap_32 (digest[0]);
12216 digest[1] = byte_swap_32 (digest[1]);
12217 digest[2] = byte_swap_32 (digest[2]);
12218 digest[3] = byte_swap_32 (digest[3]);
12219 digest[4] = byte_swap_32 (digest[4]);
12220
12221 return (PARSER_OK);
12222 }
12223
12224 int whirlpool_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12225 {
12226 if ((input_len < DISPLAY_LEN_MIN_6100) || (input_len > DISPLAY_LEN_MAX_6100)) return (PARSER_GLOBAL_LENGTH);
12227
12228 u32 *digest = (u32 *) hash_buf->digest;
12229
12230 digest[ 0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12231 digest[ 1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12232 digest[ 2] = hex_to_u32 ((const u8 *) &input_buf[ 16]);
12233 digest[ 3] = hex_to_u32 ((const u8 *) &input_buf[ 24]);
12234 digest[ 4] = hex_to_u32 ((const u8 *) &input_buf[ 32]);
12235 digest[ 5] = hex_to_u32 ((const u8 *) &input_buf[ 40]);
12236 digest[ 6] = hex_to_u32 ((const u8 *) &input_buf[ 48]);
12237 digest[ 7] = hex_to_u32 ((const u8 *) &input_buf[ 56]);
12238 digest[ 8] = hex_to_u32 ((const u8 *) &input_buf[ 64]);
12239 digest[ 9] = hex_to_u32 ((const u8 *) &input_buf[ 72]);
12240 digest[10] = hex_to_u32 ((const u8 *) &input_buf[ 80]);
12241 digest[11] = hex_to_u32 ((const u8 *) &input_buf[ 88]);
12242 digest[12] = hex_to_u32 ((const u8 *) &input_buf[ 96]);
12243 digest[13] = hex_to_u32 ((const u8 *) &input_buf[104]);
12244 digest[14] = hex_to_u32 ((const u8 *) &input_buf[112]);
12245 digest[15] = hex_to_u32 ((const u8 *) &input_buf[120]);
12246
12247 return (PARSER_OK);
12248 }
12249
12250 int androidpin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12251 {
12252 if ((input_len < DISPLAY_LEN_MIN_5800) || (input_len > DISPLAY_LEN_MAX_5800)) return (PARSER_GLOBAL_LENGTH);
12253
12254 u32 *digest = (u32 *) hash_buf->digest;
12255
12256 salt_t *salt = hash_buf->salt;
12257
12258 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12259 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12260 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12261 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12262 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12263
12264 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12265
12266 uint salt_len = input_len - 40 - 1;
12267
12268 char *salt_buf = input_buf + 40 + 1;
12269
12270 char *salt_buf_ptr = (char *) salt->salt_buf;
12271
12272 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12273
12274 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12275
12276 salt->salt_len = salt_len;
12277
12278 salt->salt_iter = ROUNDS_ANDROIDPIN - 1;
12279
12280 return (PARSER_OK);
12281 }
12282
12283 int truecrypt_parse_hash_1k (char *input_buf, uint input_len, hash_t *hash_buf)
12284 {
12285 u32 *digest = (u32 *) hash_buf->digest;
12286
12287 salt_t *salt = hash_buf->salt;
12288
12289 tc_t *tc = (tc_t *) hash_buf->esalt;
12290
12291 if (input_len == 0)
12292 {
12293 log_error ("TrueCrypt container not specified");
12294
12295 exit (-1);
12296 }
12297
12298 FILE *fp = fopen (input_buf, "rb");
12299
12300 if (fp == NULL)
12301 {
12302 log_error ("%s: %s", input_buf, strerror (errno));
12303
12304 exit (-1);
12305 }
12306
12307 char buf[512] = { 0 };
12308
12309 int n = fread (buf, 1, sizeof (buf), fp);
12310
12311 fclose (fp);
12312
12313 if (n != 512) return (PARSER_TC_FILE_SIZE);
12314
12315 memcpy (tc->salt_buf, buf, 64);
12316
12317 memcpy (tc->data_buf, buf + 64, 512 - 64);
12318
12319 salt->salt_buf[0] = tc->salt_buf[0];
12320
12321 salt->salt_len = 4;
12322
12323 salt->salt_iter = 1000 - 1;
12324
12325 digest[0] = tc->data_buf[0];
12326
12327 return (PARSER_OK);
12328 }
12329
12330 int truecrypt_parse_hash_2k (char *input_buf, uint input_len, hash_t *hash_buf)
12331 {
12332 u32 *digest = (u32 *) hash_buf->digest;
12333
12334 salt_t *salt = hash_buf->salt;
12335
12336 tc_t *tc = (tc_t *) hash_buf->esalt;
12337
12338 if (input_len == 0)
12339 {
12340 log_error ("TrueCrypt container not specified");
12341
12342 exit (-1);
12343 }
12344
12345 FILE *fp = fopen (input_buf, "rb");
12346
12347 if (fp == NULL)
12348 {
12349 log_error ("%s: %s", input_buf, strerror (errno));
12350
12351 exit (-1);
12352 }
12353
12354 char buf[512] = { 0 };
12355
12356 int n = fread (buf, 1, sizeof (buf), fp);
12357
12358 fclose (fp);
12359
12360 if (n != 512) return (PARSER_TC_FILE_SIZE);
12361
12362 memcpy (tc->salt_buf, buf, 64);
12363
12364 memcpy (tc->data_buf, buf + 64, 512 - 64);
12365
12366 salt->salt_buf[0] = tc->salt_buf[0];
12367
12368 salt->salt_len = 4;
12369
12370 salt->salt_iter = 2000 - 1;
12371
12372 digest[0] = tc->data_buf[0];
12373
12374 return (PARSER_OK);
12375 }
12376
12377 int md5aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12378 {
12379 if ((input_len < DISPLAY_LEN_MIN_6300) || (input_len > DISPLAY_LEN_MAX_6300)) return (PARSER_GLOBAL_LENGTH);
12380
12381 if (memcmp (SIGNATURE_MD5AIX, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
12382
12383 u32 *digest = (u32 *) hash_buf->digest;
12384
12385 salt_t *salt = hash_buf->salt;
12386
12387 char *salt_pos = input_buf + 6;
12388
12389 char *hash_pos = strchr (salt_pos, '$');
12390
12391 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12392
12393 uint salt_len = hash_pos - salt_pos;
12394
12395 if (salt_len < 8) return (PARSER_SALT_LENGTH);
12396
12397 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12398
12399 salt->salt_len = salt_len;
12400
12401 salt->salt_iter = 1000;
12402
12403 hash_pos++;
12404
12405 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12406
12407 return (PARSER_OK);
12408 }
12409
12410 int sha1aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12411 {
12412 if ((input_len < DISPLAY_LEN_MIN_6700) || (input_len > DISPLAY_LEN_MAX_6700)) return (PARSER_GLOBAL_LENGTH);
12413
12414 if (memcmp (SIGNATURE_SHA1AIX, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
12415
12416 u32 *digest = (u32 *) hash_buf->digest;
12417
12418 salt_t *salt = hash_buf->salt;
12419
12420 char *iter_pos = input_buf + 7;
12421
12422 char *salt_pos = strchr (iter_pos, '$');
12423
12424 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12425
12426 salt_pos++;
12427
12428 char *hash_pos = strchr (salt_pos, '$');
12429
12430 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12431
12432 uint salt_len = hash_pos - salt_pos;
12433
12434 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12435
12436 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12437
12438 salt->salt_len = salt_len;
12439
12440 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12441
12442 salt->salt_sign[0] = atoi (salt_iter);
12443
12444 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12445
12446 hash_pos++;
12447
12448 sha1aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12449
12450 digest[0] = byte_swap_32 (digest[0]);
12451 digest[1] = byte_swap_32 (digest[1]);
12452 digest[2] = byte_swap_32 (digest[2]);
12453 digest[3] = byte_swap_32 (digest[3]);
12454 digest[4] = byte_swap_32 (digest[4]);
12455
12456 return (PARSER_OK);
12457 }
12458
12459 int sha256aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12460 {
12461 if ((input_len < DISPLAY_LEN_MIN_6400) || (input_len > DISPLAY_LEN_MAX_6400)) return (PARSER_GLOBAL_LENGTH);
12462
12463 if (memcmp (SIGNATURE_SHA256AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
12464
12465 u32 *digest = (u32 *) hash_buf->digest;
12466
12467 salt_t *salt = hash_buf->salt;
12468
12469 char *iter_pos = input_buf + 9;
12470
12471 char *salt_pos = strchr (iter_pos, '$');
12472
12473 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12474
12475 salt_pos++;
12476
12477 char *hash_pos = strchr (salt_pos, '$');
12478
12479 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12480
12481 uint salt_len = hash_pos - salt_pos;
12482
12483 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12484
12485 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12486
12487 salt->salt_len = salt_len;
12488
12489 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12490
12491 salt->salt_sign[0] = atoi (salt_iter);
12492
12493 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12494
12495 hash_pos++;
12496
12497 sha256aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12498
12499 digest[0] = byte_swap_32 (digest[0]);
12500 digest[1] = byte_swap_32 (digest[1]);
12501 digest[2] = byte_swap_32 (digest[2]);
12502 digest[3] = byte_swap_32 (digest[3]);
12503 digest[4] = byte_swap_32 (digest[4]);
12504 digest[5] = byte_swap_32 (digest[5]);
12505 digest[6] = byte_swap_32 (digest[6]);
12506 digest[7] = byte_swap_32 (digest[7]);
12507
12508 return (PARSER_OK);
12509 }
12510
12511 int sha512aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12512 {
12513 if ((input_len < DISPLAY_LEN_MIN_6500) || (input_len > DISPLAY_LEN_MAX_6500)) return (PARSER_GLOBAL_LENGTH);
12514
12515 if (memcmp (SIGNATURE_SHA512AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
12516
12517 u64 *digest = (u64 *) hash_buf->digest;
12518
12519 salt_t *salt = hash_buf->salt;
12520
12521 char *iter_pos = input_buf + 9;
12522
12523 char *salt_pos = strchr (iter_pos, '$');
12524
12525 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12526
12527 salt_pos++;
12528
12529 char *hash_pos = strchr (salt_pos, '$');
12530
12531 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12532
12533 uint salt_len = hash_pos - salt_pos;
12534
12535 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12536
12537 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12538
12539 salt->salt_len = salt_len;
12540
12541 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12542
12543 salt->salt_sign[0] = atoi (salt_iter);
12544
12545 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12546
12547 hash_pos++;
12548
12549 sha512aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12550
12551 digest[0] = byte_swap_64 (digest[0]);
12552 digest[1] = byte_swap_64 (digest[1]);
12553 digest[2] = byte_swap_64 (digest[2]);
12554 digest[3] = byte_swap_64 (digest[3]);
12555 digest[4] = byte_swap_64 (digest[4]);
12556 digest[5] = byte_swap_64 (digest[5]);
12557 digest[6] = byte_swap_64 (digest[6]);
12558 digest[7] = byte_swap_64 (digest[7]);
12559
12560 return (PARSER_OK);
12561 }
12562
12563 int agilekey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12564 {
12565 if ((input_len < DISPLAY_LEN_MIN_6600) || (input_len > DISPLAY_LEN_MAX_6600)) return (PARSER_GLOBAL_LENGTH);
12566
12567 u32 *digest = (u32 *) hash_buf->digest;
12568
12569 salt_t *salt = hash_buf->salt;
12570
12571 agilekey_t *agilekey = (agilekey_t *) hash_buf->esalt;
12572
12573 /**
12574 * parse line
12575 */
12576
12577 char *iterations_pos = input_buf;
12578
12579 char *saltbuf_pos = strchr (iterations_pos, ':');
12580
12581 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12582
12583 uint iterations_len = saltbuf_pos - iterations_pos;
12584
12585 if (iterations_len > 6) return (PARSER_SALT_LENGTH);
12586
12587 saltbuf_pos++;
12588
12589 char *cipherbuf_pos = strchr (saltbuf_pos, ':');
12590
12591 if (cipherbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12592
12593 uint saltbuf_len = cipherbuf_pos - saltbuf_pos;
12594
12595 if (saltbuf_len != 16) return (PARSER_SALT_LENGTH);
12596
12597 uint cipherbuf_len = input_len - iterations_len - 1 - saltbuf_len - 1;
12598
12599 if (cipherbuf_len != 2080) return (PARSER_HASH_LENGTH);
12600
12601 cipherbuf_pos++;
12602
12603 /**
12604 * pbkdf2 iterations
12605 */
12606
12607 salt->salt_iter = atoi (iterations_pos) - 1;
12608
12609 /**
12610 * handle salt encoding
12611 */
12612
12613 char *saltbuf_ptr = (char *) salt->salt_buf;
12614
12615 for (uint i = 0; i < saltbuf_len; i += 2)
12616 {
12617 const char p0 = saltbuf_pos[i + 0];
12618 const char p1 = saltbuf_pos[i + 1];
12619
12620 *saltbuf_ptr++ = hex_convert (p1) << 0
12621 | hex_convert (p0) << 4;
12622 }
12623
12624 salt->salt_len = saltbuf_len / 2;
12625
12626 /**
12627 * handle cipher encoding
12628 */
12629
12630 uint *tmp = (uint *) mymalloc (32);
12631
12632 char *cipherbuf_ptr = (char *) tmp;
12633
12634 for (uint i = 2016; i < cipherbuf_len; i += 2)
12635 {
12636 const char p0 = cipherbuf_pos[i + 0];
12637 const char p1 = cipherbuf_pos[i + 1];
12638
12639 *cipherbuf_ptr++ = hex_convert (p1) << 0
12640 | hex_convert (p0) << 4;
12641 }
12642
12643 // iv is stored at salt_buf 4 (length 16)
12644 // data is stored at salt_buf 8 (length 16)
12645
12646 salt->salt_buf[ 4] = byte_swap_32 (tmp[0]);
12647 salt->salt_buf[ 5] = byte_swap_32 (tmp[1]);
12648 salt->salt_buf[ 6] = byte_swap_32 (tmp[2]);
12649 salt->salt_buf[ 7] = byte_swap_32 (tmp[3]);
12650
12651 salt->salt_buf[ 8] = byte_swap_32 (tmp[4]);
12652 salt->salt_buf[ 9] = byte_swap_32 (tmp[5]);
12653 salt->salt_buf[10] = byte_swap_32 (tmp[6]);
12654 salt->salt_buf[11] = byte_swap_32 (tmp[7]);
12655
12656 free (tmp);
12657
12658 for (uint i = 0, j = 0; i < 1040; i += 1, j += 2)
12659 {
12660 const char p0 = cipherbuf_pos[j + 0];
12661 const char p1 = cipherbuf_pos[j + 1];
12662
12663 agilekey->cipher[i] = hex_convert (p1) << 0
12664 | hex_convert (p0) << 4;
12665 }
12666
12667 /**
12668 * digest buf
12669 */
12670
12671 digest[0] = 0x10101010;
12672 digest[1] = 0x10101010;
12673 digest[2] = 0x10101010;
12674 digest[3] = 0x10101010;
12675
12676 return (PARSER_OK);
12677 }
12678
12679 int lastpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12680 {
12681 if ((input_len < DISPLAY_LEN_MIN_6800) || (input_len > DISPLAY_LEN_MAX_6800)) return (PARSER_GLOBAL_LENGTH);
12682
12683 u32 *digest = (u32 *) hash_buf->digest;
12684
12685 salt_t *salt = hash_buf->salt;
12686
12687 char *hashbuf_pos = input_buf;
12688
12689 char *iterations_pos = strchr (hashbuf_pos, ':');
12690
12691 if (iterations_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12692
12693 uint hash_len = iterations_pos - hashbuf_pos;
12694
12695 if ((hash_len != 32) && (hash_len != 64)) return (PARSER_HASH_LENGTH);
12696
12697 iterations_pos++;
12698
12699 char *saltbuf_pos = strchr (iterations_pos, ':');
12700
12701 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12702
12703 uint iterations_len = saltbuf_pos - iterations_pos;
12704
12705 saltbuf_pos++;
12706
12707 uint salt_len = input_len - hash_len - 1 - iterations_len - 1;
12708
12709 if (salt_len > 32) return (PARSER_SALT_LENGTH);
12710
12711 char *salt_buf_ptr = (char *) salt->salt_buf;
12712
12713 salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, salt_len);
12714
12715 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12716
12717 salt->salt_len = salt_len;
12718
12719 salt->salt_iter = atoi (iterations_pos) - 1;
12720
12721 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
12722 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
12723 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
12724 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
12725
12726 return (PARSER_OK);
12727 }
12728
12729 int gost_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12730 {
12731 if ((input_len < DISPLAY_LEN_MIN_6900) || (input_len > DISPLAY_LEN_MAX_6900)) return (PARSER_GLOBAL_LENGTH);
12732
12733 u32 *digest = (u32 *) hash_buf->digest;
12734
12735 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12736 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12737 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12738 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12739 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12740 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
12741 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
12742 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
12743
12744 digest[0] = byte_swap_32 (digest[0]);
12745 digest[1] = byte_swap_32 (digest[1]);
12746 digest[2] = byte_swap_32 (digest[2]);
12747 digest[3] = byte_swap_32 (digest[3]);
12748 digest[4] = byte_swap_32 (digest[4]);
12749 digest[5] = byte_swap_32 (digest[5]);
12750 digest[6] = byte_swap_32 (digest[6]);
12751 digest[7] = byte_swap_32 (digest[7]);
12752
12753 return (PARSER_OK);
12754 }
12755
12756 int sha256crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12757 {
12758 if (memcmp (SIGNATURE_SHA256CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
12759
12760 u32 *digest = (u32 *) hash_buf->digest;
12761
12762 salt_t *salt = hash_buf->salt;
12763
12764 char *salt_pos = input_buf + 3;
12765
12766 uint iterations_len = 0;
12767
12768 if (memcmp (salt_pos, "rounds=", 7) == 0)
12769 {
12770 salt_pos += 7;
12771
12772 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
12773
12774 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
12775 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
12776
12777 salt_pos[0] = 0x0;
12778
12779 salt->salt_iter = atoi (salt_pos - iterations_len);
12780
12781 salt_pos += 1;
12782
12783 iterations_len += 8;
12784 }
12785 else
12786 {
12787 salt->salt_iter = ROUNDS_SHA256CRYPT;
12788 }
12789
12790 if ((input_len < DISPLAY_LEN_MIN_7400) || (input_len > DISPLAY_LEN_MAX_7400 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
12791
12792 char *hash_pos = strchr (salt_pos, '$');
12793
12794 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12795
12796 uint salt_len = hash_pos - salt_pos;
12797
12798 if (salt_len > 16) return (PARSER_SALT_LENGTH);
12799
12800 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12801
12802 salt->salt_len = salt_len;
12803
12804 hash_pos++;
12805
12806 sha256crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12807
12808 return (PARSER_OK);
12809 }
12810
12811 int sha512osx_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12812 {
12813 uint max_len = DISPLAY_LEN_MAX_7100 + (2 * 128);
12814
12815 if ((input_len < DISPLAY_LEN_MIN_7100) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
12816
12817 if (memcmp (SIGNATURE_SHA512OSX, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
12818
12819 u64 *digest = (u64 *) hash_buf->digest;
12820
12821 salt_t *salt = hash_buf->salt;
12822
12823 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
12824
12825 char *iter_pos = input_buf + 4;
12826
12827 char *salt_pos = strchr (iter_pos, '$');
12828
12829 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12830
12831 salt_pos++;
12832
12833 char *hash_pos = strchr (salt_pos, '$');
12834
12835 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12836
12837 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
12838
12839 hash_pos++;
12840
12841 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
12842 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
12843 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
12844 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
12845 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
12846 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
12847 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
12848 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
12849
12850 uint salt_len = hash_pos - salt_pos - 1;
12851
12852 if ((salt_len % 2) != 0) return (PARSER_SALT_LENGTH);
12853
12854 salt->salt_len = salt_len / 2;
12855
12856 pbkdf2_sha512->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
12857 pbkdf2_sha512->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
12858 pbkdf2_sha512->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
12859 pbkdf2_sha512->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
12860 pbkdf2_sha512->salt_buf[4] = hex_to_u32 ((const u8 *) &salt_pos[32]);
12861 pbkdf2_sha512->salt_buf[5] = hex_to_u32 ((const u8 *) &salt_pos[40]);
12862 pbkdf2_sha512->salt_buf[6] = hex_to_u32 ((const u8 *) &salt_pos[48]);
12863 pbkdf2_sha512->salt_buf[7] = hex_to_u32 ((const u8 *) &salt_pos[56]);
12864
12865 pbkdf2_sha512->salt_buf[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]);
12866 pbkdf2_sha512->salt_buf[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]);
12867 pbkdf2_sha512->salt_buf[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]);
12868 pbkdf2_sha512->salt_buf[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]);
12869 pbkdf2_sha512->salt_buf[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]);
12870 pbkdf2_sha512->salt_buf[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]);
12871 pbkdf2_sha512->salt_buf[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]);
12872 pbkdf2_sha512->salt_buf[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]);
12873 pbkdf2_sha512->salt_buf[8] = 0x01000000;
12874 pbkdf2_sha512->salt_buf[9] = 0x80;
12875
12876 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
12877
12878 salt->salt_iter = atoi (iter_pos) - 1;
12879
12880 return (PARSER_OK);
12881 }
12882
12883 int episerver4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12884 {
12885 if ((input_len < DISPLAY_LEN_MIN_1441) || (input_len > DISPLAY_LEN_MAX_1441)) return (PARSER_GLOBAL_LENGTH);
12886
12887 if (memcmp (SIGNATURE_EPISERVER4, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
12888
12889 u32 *digest = (u32 *) hash_buf->digest;
12890
12891 salt_t *salt = hash_buf->salt;
12892
12893 char *salt_pos = input_buf + 14;
12894
12895 char *hash_pos = strchr (salt_pos, '*');
12896
12897 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12898
12899 hash_pos++;
12900
12901 uint salt_len = hash_pos - salt_pos - 1;
12902
12903 char *salt_buf_ptr = (char *) salt->salt_buf;
12904
12905 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
12906
12907 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12908
12909 salt->salt_len = salt_len;
12910
12911 u8 tmp_buf[100] = { 0 };
12912
12913 base64_decode (base64_to_int, (const u8 *) hash_pos, 43, tmp_buf);
12914
12915 memcpy (digest, tmp_buf, 32);
12916
12917 digest[0] = byte_swap_32 (digest[0]);
12918 digest[1] = byte_swap_32 (digest[1]);
12919 digest[2] = byte_swap_32 (digest[2]);
12920 digest[3] = byte_swap_32 (digest[3]);
12921 digest[4] = byte_swap_32 (digest[4]);
12922 digest[5] = byte_swap_32 (digest[5]);
12923 digest[6] = byte_swap_32 (digest[6]);
12924 digest[7] = byte_swap_32 (digest[7]);
12925
12926 digest[0] -= SHA256M_A;
12927 digest[1] -= SHA256M_B;
12928 digest[2] -= SHA256M_C;
12929 digest[3] -= SHA256M_D;
12930 digest[4] -= SHA256M_E;
12931 digest[5] -= SHA256M_F;
12932 digest[6] -= SHA256M_G;
12933 digest[7] -= SHA256M_H;
12934
12935 return (PARSER_OK);
12936 }
12937
12938 int sha512grub_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12939 {
12940 uint max_len = DISPLAY_LEN_MAX_7200 + (8 * 128);
12941
12942 if ((input_len < DISPLAY_LEN_MIN_7200) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
12943
12944 if (memcmp (SIGNATURE_SHA512GRUB, input_buf, 19)) return (PARSER_SIGNATURE_UNMATCHED);
12945
12946 u64 *digest = (u64 *) hash_buf->digest;
12947
12948 salt_t *salt = hash_buf->salt;
12949
12950 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
12951
12952 char *iter_pos = input_buf + 19;
12953
12954 char *salt_pos = strchr (iter_pos, '.');
12955
12956 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12957
12958 salt_pos++;
12959
12960 char *hash_pos = strchr (salt_pos, '.');
12961
12962 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12963
12964 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
12965
12966 hash_pos++;
12967
12968 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
12969 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
12970 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
12971 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
12972 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
12973 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
12974 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
12975 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
12976
12977 uint salt_len = hash_pos - salt_pos - 1;
12978
12979 salt_len /= 2;
12980
12981 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
12982
12983 uint i;
12984
12985 for (i = 0; i < salt_len; i++)
12986 {
12987 salt_buf_ptr[i] = hex_to_u8 ((const u8 *) &salt_pos[i * 2]);
12988 }
12989
12990 salt_buf_ptr[salt_len + 3] = 0x01;
12991 salt_buf_ptr[salt_len + 4] = 0x80;
12992
12993 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
12994
12995 salt->salt_len = salt_len;
12996
12997 salt->salt_iter = atoi (iter_pos) - 1;
12998
12999 return (PARSER_OK);
13000 }
13001
13002 int sha512b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13003 {
13004 if ((input_len < DISPLAY_LEN_MIN_1711) || (input_len > DISPLAY_LEN_MAX_1711)) return (PARSER_GLOBAL_LENGTH);
13005
13006 if (memcmp (SIGNATURE_SHA512B64S, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
13007
13008 u64 *digest = (u64 *) hash_buf->digest;
13009
13010 salt_t *salt = hash_buf->salt;
13011
13012 u8 tmp_buf[120] = { 0 };
13013
13014 int tmp_len = base64_decode (base64_to_int, (const u8 *) input_buf + 9, input_len - 9, tmp_buf);
13015
13016 memcpy (digest, tmp_buf, 64);
13017
13018 digest[0] = byte_swap_64 (digest[0]);
13019 digest[1] = byte_swap_64 (digest[1]);
13020 digest[2] = byte_swap_64 (digest[2]);
13021 digest[3] = byte_swap_64 (digest[3]);
13022 digest[4] = byte_swap_64 (digest[4]);
13023 digest[5] = byte_swap_64 (digest[5]);
13024 digest[6] = byte_swap_64 (digest[6]);
13025 digest[7] = byte_swap_64 (digest[7]);
13026
13027 digest[0] -= SHA512M_A;
13028 digest[1] -= SHA512M_B;
13029 digest[2] -= SHA512M_C;
13030 digest[3] -= SHA512M_D;
13031 digest[4] -= SHA512M_E;
13032 digest[5] -= SHA512M_F;
13033 digest[6] -= SHA512M_G;
13034 digest[7] -= SHA512M_H;
13035
13036 salt->salt_len = tmp_len - 64;
13037
13038 memcpy (salt->salt_buf, tmp_buf + 64, salt->salt_len);
13039
13040 if (data.opts_type & OPTS_TYPE_ST_ADD80)
13041 {
13042 char *ptr = (char *) salt->salt_buf;
13043
13044 ptr[salt->salt_len] = 0x80;
13045 }
13046
13047 return (PARSER_OK);
13048 }
13049
13050 int hmacmd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13051 {
13052 if (data.opts_type & OPTS_TYPE_ST_HEX)
13053 {
13054 if ((input_len < DISPLAY_LEN_MIN_50H) || (input_len > DISPLAY_LEN_MAX_50H)) return (PARSER_GLOBAL_LENGTH);
13055 }
13056 else
13057 {
13058 if ((input_len < DISPLAY_LEN_MIN_50) || (input_len > DISPLAY_LEN_MAX_50)) return (PARSER_GLOBAL_LENGTH);
13059 }
13060
13061 u32 *digest = (u32 *) hash_buf->digest;
13062
13063 salt_t *salt = hash_buf->salt;
13064
13065 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13066 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13067 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13068 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13069
13070 digest[0] = byte_swap_32 (digest[0]);
13071 digest[1] = byte_swap_32 (digest[1]);
13072 digest[2] = byte_swap_32 (digest[2]);
13073 digest[3] = byte_swap_32 (digest[3]);
13074
13075 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13076
13077 uint salt_len = input_len - 32 - 1;
13078
13079 char *salt_buf = input_buf + 32 + 1;
13080
13081 char *salt_buf_ptr = (char *) salt->salt_buf;
13082
13083 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13084
13085 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13086
13087 salt->salt_len = salt_len;
13088
13089 return (PARSER_OK);
13090 }
13091
13092 int hmacsha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13093 {
13094 if (data.opts_type & OPTS_TYPE_ST_HEX)
13095 {
13096 if ((input_len < DISPLAY_LEN_MIN_150H) || (input_len > DISPLAY_LEN_MAX_150H)) return (PARSER_GLOBAL_LENGTH);
13097 }
13098 else
13099 {
13100 if ((input_len < DISPLAY_LEN_MIN_150) || (input_len > DISPLAY_LEN_MAX_150)) return (PARSER_GLOBAL_LENGTH);
13101 }
13102
13103 u32 *digest = (u32 *) hash_buf->digest;
13104
13105 salt_t *salt = hash_buf->salt;
13106
13107 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13108 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13109 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13110 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13111 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
13112
13113 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13114
13115 uint salt_len = input_len - 40 - 1;
13116
13117 char *salt_buf = input_buf + 40 + 1;
13118
13119 char *salt_buf_ptr = (char *) salt->salt_buf;
13120
13121 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13122
13123 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13124
13125 salt->salt_len = salt_len;
13126
13127 return (PARSER_OK);
13128 }
13129
13130 int hmacsha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13131 {
13132 if (data.opts_type & OPTS_TYPE_ST_HEX)
13133 {
13134 if ((input_len < DISPLAY_LEN_MIN_1450H) || (input_len > DISPLAY_LEN_MAX_1450H)) return (PARSER_GLOBAL_LENGTH);
13135 }
13136 else
13137 {
13138 if ((input_len < DISPLAY_LEN_MIN_1450) || (input_len > DISPLAY_LEN_MAX_1450)) return (PARSER_GLOBAL_LENGTH);
13139 }
13140
13141 u32 *digest = (u32 *) hash_buf->digest;
13142
13143 salt_t *salt = hash_buf->salt;
13144
13145 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13146 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13147 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13148 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13149 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
13150 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
13151 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
13152 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
13153
13154 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13155
13156 uint salt_len = input_len - 64 - 1;
13157
13158 char *salt_buf = input_buf + 64 + 1;
13159
13160 char *salt_buf_ptr = (char *) salt->salt_buf;
13161
13162 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13163
13164 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13165
13166 salt->salt_len = salt_len;
13167
13168 return (PARSER_OK);
13169 }
13170
13171 int hmacsha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13172 {
13173 if (data.opts_type & OPTS_TYPE_ST_HEX)
13174 {
13175 if ((input_len < DISPLAY_LEN_MIN_1750H) || (input_len > DISPLAY_LEN_MAX_1750H)) return (PARSER_GLOBAL_LENGTH);
13176 }
13177 else
13178 {
13179 if ((input_len < DISPLAY_LEN_MIN_1750) || (input_len > DISPLAY_LEN_MAX_1750)) return (PARSER_GLOBAL_LENGTH);
13180 }
13181
13182 u64 *digest = (u64 *) hash_buf->digest;
13183
13184 salt_t *salt = hash_buf->salt;
13185
13186 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
13187 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
13188 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
13189 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
13190 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
13191 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
13192 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
13193 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
13194
13195 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13196
13197 uint salt_len = input_len - 128 - 1;
13198
13199 char *salt_buf = input_buf + 128 + 1;
13200
13201 char *salt_buf_ptr = (char *) salt->salt_buf;
13202
13203 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13204
13205 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13206
13207 salt->salt_len = salt_len;
13208
13209 return (PARSER_OK);
13210 }
13211
13212 int krb5pa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13213 {
13214 if ((input_len < DISPLAY_LEN_MIN_7500) || (input_len > DISPLAY_LEN_MAX_7500)) return (PARSER_GLOBAL_LENGTH);
13215
13216 if (memcmp (SIGNATURE_KRB5PA, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
13217
13218 u32 *digest = (u32 *) hash_buf->digest;
13219
13220 salt_t *salt = hash_buf->salt;
13221
13222 krb5pa_t *krb5pa = (krb5pa_t *) hash_buf->esalt;
13223
13224 /**
13225 * parse line
13226 */
13227
13228 char *user_pos = input_buf + 10 + 1;
13229
13230 char *realm_pos = strchr (user_pos, '$');
13231
13232 if (realm_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13233
13234 uint user_len = realm_pos - user_pos;
13235
13236 if (user_len >= 64) return (PARSER_SALT_LENGTH);
13237
13238 realm_pos++;
13239
13240 char *salt_pos = strchr (realm_pos, '$');
13241
13242 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13243
13244 uint realm_len = salt_pos - realm_pos;
13245
13246 if (realm_len >= 64) return (PARSER_SALT_LENGTH);
13247
13248 salt_pos++;
13249
13250 char *data_pos = strchr (salt_pos, '$');
13251
13252 if (data_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13253
13254 uint salt_len = data_pos - salt_pos;
13255
13256 if (salt_len >= 128) return (PARSER_SALT_LENGTH);
13257
13258 data_pos++;
13259
13260 uint data_len = input_len - 10 - 1 - user_len - 1 - realm_len - 1 - salt_len - 1;
13261
13262 if (data_len != ((36 + 16) * 2)) return (PARSER_SALT_LENGTH);
13263
13264 /**
13265 * copy data
13266 */
13267
13268 memcpy (krb5pa->user, user_pos, user_len);
13269 memcpy (krb5pa->realm, realm_pos, realm_len);
13270 memcpy (krb5pa->salt, salt_pos, salt_len);
13271
13272 char *timestamp_ptr = (char *) krb5pa->timestamp;
13273
13274 for (uint i = 0; i < (36 * 2); i += 2)
13275 {
13276 const char p0 = data_pos[i + 0];
13277 const char p1 = data_pos[i + 1];
13278
13279 *timestamp_ptr++ = hex_convert (p1) << 0
13280 | hex_convert (p0) << 4;
13281 }
13282
13283 char *checksum_ptr = (char *) krb5pa->checksum;
13284
13285 for (uint i = (36 * 2); i < ((36 + 16) * 2); i += 2)
13286 {
13287 const char p0 = data_pos[i + 0];
13288 const char p1 = data_pos[i + 1];
13289
13290 *checksum_ptr++ = hex_convert (p1) << 0
13291 | hex_convert (p0) << 4;
13292 }
13293
13294 /**
13295 * copy some data to generic buffers to make sorting happy
13296 */
13297
13298 salt->salt_buf[0] = krb5pa->timestamp[0];
13299 salt->salt_buf[1] = krb5pa->timestamp[1];
13300 salt->salt_buf[2] = krb5pa->timestamp[2];
13301 salt->salt_buf[3] = krb5pa->timestamp[3];
13302 salt->salt_buf[4] = krb5pa->timestamp[4];
13303 salt->salt_buf[5] = krb5pa->timestamp[5];
13304 salt->salt_buf[6] = krb5pa->timestamp[6];
13305 salt->salt_buf[7] = krb5pa->timestamp[7];
13306 salt->salt_buf[8] = krb5pa->timestamp[8];
13307
13308 salt->salt_len = 36;
13309
13310 digest[0] = krb5pa->checksum[0];
13311 digest[1] = krb5pa->checksum[1];
13312 digest[2] = krb5pa->checksum[2];
13313 digest[3] = krb5pa->checksum[3];
13314
13315 return (PARSER_OK);
13316 }
13317
13318 int sapb_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13319 {
13320 if ((input_len < DISPLAY_LEN_MIN_7700) || (input_len > DISPLAY_LEN_MAX_7700)) return (PARSER_GLOBAL_LENGTH);
13321
13322 u32 *digest = (u32 *) hash_buf->digest;
13323
13324 salt_t *salt = hash_buf->salt;
13325
13326 /**
13327 * parse line
13328 */
13329
13330 char *salt_pos = input_buf;
13331
13332 char *hash_pos = strchr (salt_pos, '$');
13333
13334 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13335
13336 uint salt_len = hash_pos - salt_pos;
13337
13338 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
13339
13340 hash_pos++;
13341
13342 uint hash_len = input_len - 1 - salt_len;
13343
13344 if (hash_len != 16) return (PARSER_HASH_LENGTH);
13345
13346 /**
13347 * valid some data
13348 */
13349
13350 uint user_len = 0;
13351
13352 for (uint i = 0; i < salt_len; i++)
13353 {
13354 if (salt_pos[i] == ' ') continue;
13355
13356 user_len++;
13357 }
13358
13359 // SAP user names cannot be longer than 12 characters
13360 if (user_len > 12) return (PARSER_SALT_LENGTH);
13361
13362 // SAP user name cannot start with ! or ?
13363 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
13364
13365 /**
13366 * copy data
13367 */
13368
13369 char *salt_buf_ptr = (char *) salt->salt_buf;
13370
13371 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13372
13373 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13374
13375 salt->salt_len = salt_len;
13376
13377 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[0]);
13378 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[8]);
13379 digest[2] = 0;
13380 digest[3] = 0;
13381
13382 digest[0] = byte_swap_32 (digest[0]);
13383 digest[1] = byte_swap_32 (digest[1]);
13384
13385 return (PARSER_OK);
13386 }
13387
13388 int sapg_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13389 {
13390 if ((input_len < DISPLAY_LEN_MIN_7800) || (input_len > DISPLAY_LEN_MAX_7800)) return (PARSER_GLOBAL_LENGTH);
13391
13392 u32 *digest = (u32 *) hash_buf->digest;
13393
13394 salt_t *salt = hash_buf->salt;
13395
13396 /**
13397 * parse line
13398 */
13399
13400 char *salt_pos = input_buf;
13401
13402 char *hash_pos = strchr (salt_pos, '$');
13403
13404 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13405
13406 uint salt_len = hash_pos - salt_pos;
13407
13408 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
13409
13410 hash_pos++;
13411
13412 uint hash_len = input_len - 1 - salt_len;
13413
13414 if (hash_len != 40) return (PARSER_HASH_LENGTH);
13415
13416 /**
13417 * valid some data
13418 */
13419
13420 uint user_len = 0;
13421
13422 for (uint i = 0; i < salt_len; i++)
13423 {
13424 if (salt_pos[i] == ' ') continue;
13425
13426 user_len++;
13427 }
13428
13429 // SAP user names cannot be longer than 12 characters
13430 // this is kinda buggy. if the username is in utf the length can be up to length 12*3
13431 // so far nobody complained so we stay with this because it helps in optimization
13432 // final string can have a max size of 32 (password) + (10 * 5) = lengthMagicArray + 12 (max salt) + 1 (the 0x80)
13433
13434 if (user_len > 12) return (PARSER_SALT_LENGTH);
13435
13436 // SAP user name cannot start with ! or ?
13437 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
13438
13439 /**
13440 * copy data
13441 */
13442
13443 char *salt_buf_ptr = (char *) salt->salt_buf;
13444
13445 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13446
13447 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13448
13449 salt->salt_len = salt_len;
13450
13451 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
13452 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
13453 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
13454 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
13455 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
13456
13457 return (PARSER_OK);
13458 }
13459
13460 int drupal7_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13461 {
13462 if ((input_len < DISPLAY_LEN_MIN_7900) || (input_len > DISPLAY_LEN_MAX_7900)) return (PARSER_GLOBAL_LENGTH);
13463
13464 if (memcmp (SIGNATURE_DRUPAL7, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
13465
13466 u64 *digest = (u64 *) hash_buf->digest;
13467
13468 salt_t *salt = hash_buf->salt;
13469
13470 char *iter_pos = input_buf + 3;
13471
13472 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
13473
13474 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
13475
13476 memcpy ((char *) salt->salt_sign, input_buf, 4);
13477
13478 salt->salt_iter = salt_iter;
13479
13480 char *salt_pos = iter_pos + 1;
13481
13482 uint salt_len = 8;
13483
13484 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13485
13486 salt->salt_len = salt_len;
13487
13488 char *hash_pos = salt_pos + salt_len;
13489
13490 drupal7_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13491
13492 // ugly hack start
13493
13494 char *tmp = (char *) salt->salt_buf_pc;
13495
13496 tmp[0] = hash_pos[42];
13497
13498 // ugly hack end
13499
13500 digest[ 0] = byte_swap_64 (digest[ 0]);
13501 digest[ 1] = byte_swap_64 (digest[ 1]);
13502 digest[ 2] = byte_swap_64 (digest[ 2]);
13503 digest[ 3] = byte_swap_64 (digest[ 3]);
13504 digest[ 4] = 0;
13505 digest[ 5] = 0;
13506 digest[ 6] = 0;
13507 digest[ 7] = 0;
13508
13509 return (PARSER_OK);
13510 }
13511
13512 int sybasease_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13513 {
13514 if ((input_len < DISPLAY_LEN_MIN_8000) || (input_len > DISPLAY_LEN_MAX_8000)) return (PARSER_GLOBAL_LENGTH);
13515
13516 if (memcmp (SIGNATURE_SYBASEASE, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
13517
13518 u32 *digest = (u32 *) hash_buf->digest;
13519
13520 salt_t *salt = hash_buf->salt;
13521
13522 char *salt_buf = input_buf + 6;
13523
13524 uint salt_len = 16;
13525
13526 char *salt_buf_ptr = (char *) salt->salt_buf;
13527
13528 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13529
13530 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13531
13532 salt->salt_len = salt_len;
13533
13534 char *hash_pos = input_buf + 6 + 16;
13535
13536 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
13537 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
13538 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
13539 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
13540 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
13541 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
13542 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
13543 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
13544
13545 return (PARSER_OK);
13546 }
13547
13548 int mysql323_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13549 {
13550 if ((input_len < DISPLAY_LEN_MIN_200) || (input_len > DISPLAY_LEN_MAX_200)) return (PARSER_GLOBAL_LENGTH);
13551
13552 u32 *digest = (u32 *) hash_buf->digest;
13553
13554 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13555 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13556 digest[2] = 0;
13557 digest[3] = 0;
13558
13559 return (PARSER_OK);
13560 }
13561
13562 int rakp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13563 {
13564 if ((input_len < DISPLAY_LEN_MIN_7300) || (input_len > DISPLAY_LEN_MAX_7300)) return (PARSER_GLOBAL_LENGTH);
13565
13566 u32 *digest = (u32 *) hash_buf->digest;
13567
13568 salt_t *salt = hash_buf->salt;
13569
13570 rakp_t *rakp = (rakp_t *) hash_buf->esalt;
13571
13572 char *saltbuf_pos = input_buf;
13573
13574 char *hashbuf_pos = strchr (saltbuf_pos, ':');
13575
13576 if (hashbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13577
13578 uint saltbuf_len = hashbuf_pos - saltbuf_pos;
13579
13580 if (saltbuf_len < 64) return (PARSER_SALT_LENGTH);
13581 if (saltbuf_len > 512) return (PARSER_SALT_LENGTH);
13582
13583 if (saltbuf_len & 1) return (PARSER_SALT_LENGTH); // muss gerade sein wegen hex
13584
13585 hashbuf_pos++;
13586
13587 uint hashbuf_len = input_len - saltbuf_len - 1;
13588
13589 if (hashbuf_len != 40) return (PARSER_HASH_LENGTH);
13590
13591 char *salt_ptr = (char *) saltbuf_pos;
13592 char *rakp_ptr = (char *) rakp->salt_buf;
13593
13594 uint i;
13595 uint j;
13596
13597 for (i = 0, j = 0; i < saltbuf_len; i += 2, j += 1)
13598 {
13599 rakp_ptr[j] = hex_to_u8 ((const u8 *) &salt_ptr[i]);
13600 }
13601
13602 rakp_ptr[j] = 0x80;
13603
13604 rakp->salt_len = j;
13605
13606 for (i = 0; i < 64; i++)
13607 {
13608 rakp->salt_buf[i] = byte_swap_32 (rakp->salt_buf[i]);
13609 }
13610
13611 salt->salt_buf[0] = rakp->salt_buf[0];
13612 salt->salt_buf[1] = rakp->salt_buf[1];
13613 salt->salt_buf[2] = rakp->salt_buf[2];
13614 salt->salt_buf[3] = rakp->salt_buf[3];
13615 salt->salt_buf[4] = rakp->salt_buf[4];
13616 salt->salt_buf[5] = rakp->salt_buf[5];
13617 salt->salt_buf[6] = rakp->salt_buf[6];
13618 salt->salt_buf[7] = rakp->salt_buf[7];
13619
13620 salt->salt_len = 32; // muss min. 32 haben
13621
13622 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
13623 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
13624 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
13625 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
13626 digest[4] = hex_to_u32 ((const u8 *) &hashbuf_pos[32]);
13627
13628 return (PARSER_OK);
13629 }
13630
13631 int netscaler_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13632 {
13633 if ((input_len < DISPLAY_LEN_MIN_8100) || (input_len > DISPLAY_LEN_MAX_8100)) return (PARSER_GLOBAL_LENGTH);
13634
13635 u32 *digest = (u32 *) hash_buf->digest;
13636
13637 salt_t *salt = hash_buf->salt;
13638
13639 if (memcmp (SIGNATURE_NETSCALER, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
13640
13641 char *salt_pos = input_buf + 1;
13642
13643 memcpy (salt->salt_buf, salt_pos, 8);
13644
13645 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
13646 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
13647
13648 salt->salt_len = 8;
13649
13650 char *hash_pos = salt_pos + 8;
13651
13652 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
13653 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
13654 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
13655 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
13656 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
13657
13658 digest[0] -= SHA1M_A;
13659 digest[1] -= SHA1M_B;
13660 digest[2] -= SHA1M_C;
13661 digest[3] -= SHA1M_D;
13662 digest[4] -= SHA1M_E;
13663
13664 return (PARSER_OK);
13665 }
13666
13667 int chap_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13668 {
13669 if ((input_len < DISPLAY_LEN_MIN_4800) || (input_len > DISPLAY_LEN_MAX_4800)) return (PARSER_GLOBAL_LENGTH);
13670
13671 u32 *digest = (u32 *) hash_buf->digest;
13672
13673 salt_t *salt = hash_buf->salt;
13674
13675 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13676 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13677 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13678 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13679
13680 digest[0] = byte_swap_32 (digest[0]);
13681 digest[1] = byte_swap_32 (digest[1]);
13682 digest[2] = byte_swap_32 (digest[2]);
13683 digest[3] = byte_swap_32 (digest[3]);
13684
13685 digest[0] -= MD5M_A;
13686 digest[1] -= MD5M_B;
13687 digest[2] -= MD5M_C;
13688 digest[3] -= MD5M_D;
13689
13690 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13691
13692 char *salt_buf_ptr = input_buf + 32 + 1;
13693
13694 u32 *salt_buf = salt->salt_buf;
13695
13696 salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf_ptr[ 0]);
13697 salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf_ptr[ 8]);
13698 salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf_ptr[16]);
13699 salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf_ptr[24]);
13700
13701 salt_buf[0] = byte_swap_32 (salt_buf[0]);
13702 salt_buf[1] = byte_swap_32 (salt_buf[1]);
13703 salt_buf[2] = byte_swap_32 (salt_buf[2]);
13704 salt_buf[3] = byte_swap_32 (salt_buf[3]);
13705
13706 salt->salt_len = 16 + 1;
13707
13708 if (input_buf[65] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13709
13710 char *idbyte_buf_ptr = input_buf + 32 + 1 + 32 + 1;
13711
13712 salt_buf[4] = hex_to_u8 ((const u8 *) &idbyte_buf_ptr[0]) & 0xff;
13713
13714 return (PARSER_OK);
13715 }
13716
13717 int cloudkey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13718 {
13719 if ((input_len < DISPLAY_LEN_MIN_8200) || (input_len > DISPLAY_LEN_MAX_8200)) return (PARSER_GLOBAL_LENGTH);
13720
13721 u32 *digest = (u32 *) hash_buf->digest;
13722
13723 salt_t *salt = hash_buf->salt;
13724
13725 cloudkey_t *cloudkey = (cloudkey_t *) hash_buf->esalt;
13726
13727 /**
13728 * parse line
13729 */
13730
13731 char *hashbuf_pos = input_buf;
13732
13733 char *saltbuf_pos = strchr (hashbuf_pos, ':');
13734
13735 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13736
13737 const uint hashbuf_len = saltbuf_pos - hashbuf_pos;
13738
13739 if (hashbuf_len != 64) return (PARSER_HASH_LENGTH);
13740
13741 saltbuf_pos++;
13742
13743 char *iteration_pos = strchr (saltbuf_pos, ':');
13744
13745 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13746
13747 const uint saltbuf_len = iteration_pos - saltbuf_pos;
13748
13749 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
13750
13751 iteration_pos++;
13752
13753 char *databuf_pos = strchr (iteration_pos, ':');
13754
13755 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13756
13757 const uint iteration_len = databuf_pos - iteration_pos;
13758
13759 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
13760 if (iteration_len > 8) return (PARSER_SALT_ITERATION);
13761
13762 const uint databuf_len = input_len - hashbuf_len - 1 - saltbuf_len - 1 - iteration_len - 1;
13763
13764 if (databuf_len < 1) return (PARSER_SALT_LENGTH);
13765 if (databuf_len > 2048) return (PARSER_SALT_LENGTH);
13766
13767 databuf_pos++;
13768
13769 // digest
13770
13771 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
13772 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
13773 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
13774 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
13775 digest[4] = hex_to_u32 ((const u8 *) &hashbuf_pos[32]);
13776 digest[5] = hex_to_u32 ((const u8 *) &hashbuf_pos[40]);
13777 digest[6] = hex_to_u32 ((const u8 *) &hashbuf_pos[48]);
13778 digest[7] = hex_to_u32 ((const u8 *) &hashbuf_pos[56]);
13779
13780 // salt
13781
13782 char *saltbuf_ptr = (char *) salt->salt_buf;
13783
13784 for (uint i = 0; i < saltbuf_len; i += 2)
13785 {
13786 const char p0 = saltbuf_pos[i + 0];
13787 const char p1 = saltbuf_pos[i + 1];
13788
13789 *saltbuf_ptr++ = hex_convert (p1) << 0
13790 | hex_convert (p0) << 4;
13791 }
13792
13793 salt->salt_buf[4] = 0x01000000;
13794 salt->salt_buf[5] = 0x80;
13795
13796 salt->salt_len = saltbuf_len / 2;
13797
13798 // iteration
13799
13800 salt->salt_iter = atoi (iteration_pos) - 1;
13801
13802 // data
13803
13804 char *databuf_ptr = (char *) cloudkey->data_buf;
13805
13806 for (uint i = 0; i < databuf_len; i += 2)
13807 {
13808 const char p0 = databuf_pos[i + 0];
13809 const char p1 = databuf_pos[i + 1];
13810
13811 *databuf_ptr++ = hex_convert (p1) << 0
13812 | hex_convert (p0) << 4;
13813 }
13814
13815 *databuf_ptr++ = 0x80;
13816
13817 for (uint i = 0; i < 512; i++)
13818 {
13819 cloudkey->data_buf[i] = byte_swap_32 (cloudkey->data_buf[i]);
13820 }
13821
13822 cloudkey->data_len = databuf_len / 2;
13823
13824 return (PARSER_OK);
13825 }
13826
13827 int nsec3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13828 {
13829 if ((input_len < DISPLAY_LEN_MIN_8300) || (input_len > DISPLAY_LEN_MAX_8300)) return (PARSER_GLOBAL_LENGTH);
13830
13831 u32 *digest = (u32 *) hash_buf->digest;
13832
13833 salt_t *salt = hash_buf->salt;
13834
13835 /**
13836 * parse line
13837 */
13838
13839 char *hashbuf_pos = input_buf;
13840
13841 char *domainbuf_pos = strchr (hashbuf_pos, ':');
13842
13843 if (domainbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13844
13845 const uint hashbuf_len = domainbuf_pos - hashbuf_pos;
13846
13847 if (hashbuf_len != 32) return (PARSER_HASH_LENGTH);
13848
13849 domainbuf_pos++;
13850
13851 if (domainbuf_pos[0] != '.') return (PARSER_SALT_VALUE);
13852
13853 char *saltbuf_pos = strchr (domainbuf_pos, ':');
13854
13855 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13856
13857 const uint domainbuf_len = saltbuf_pos - domainbuf_pos;
13858
13859 if (domainbuf_len >= 32) return (PARSER_SALT_LENGTH);
13860
13861 saltbuf_pos++;
13862
13863 char *iteration_pos = strchr (saltbuf_pos, ':');
13864
13865 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13866
13867 const uint saltbuf_len = iteration_pos - saltbuf_pos;
13868
13869 if (saltbuf_len >= 28) return (PARSER_SALT_LENGTH); // 28 = 32 - 4; 4 = length
13870
13871 if ((domainbuf_len + saltbuf_len) >= 48) return (PARSER_SALT_LENGTH);
13872
13873 iteration_pos++;
13874
13875 const uint iteration_len = input_len - hashbuf_len - 1 - domainbuf_len - 1 - saltbuf_len - 1;
13876
13877 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
13878 if (iteration_len > 5) return (PARSER_SALT_ITERATION);
13879
13880 // ok, the plan for this algorithm is the following:
13881 // we have 2 salts here, the domain-name and a random salt
13882 // while both are used in the initial transformation,
13883 // only the random salt is used in the following iterations
13884 // so we create two buffer, one that includes domain-name (stored into salt_buf_pc[])
13885 // and one that includes only the real salt (stored into salt_buf[]).
13886 // the domain-name length is put into array position 7 of salt_buf_pc[] since there is not salt_pc_len
13887
13888 u8 tmp_buf[100] = { 0 };
13889
13890 base32_decode (itoa32_to_int, (const u8 *) hashbuf_pos, 32, tmp_buf);
13891
13892 memcpy (digest, tmp_buf, 20);
13893
13894 digest[0] = byte_swap_32 (digest[0]);
13895 digest[1] = byte_swap_32 (digest[1]);
13896 digest[2] = byte_swap_32 (digest[2]);
13897 digest[3] = byte_swap_32 (digest[3]);
13898 digest[4] = byte_swap_32 (digest[4]);
13899
13900 // domain
13901
13902 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
13903
13904 memcpy (salt_buf_pc_ptr, domainbuf_pos, domainbuf_len);
13905
13906 char *len_ptr = NULL;
13907
13908 for (uint i = 0; i < domainbuf_len; i++)
13909 {
13910 if (salt_buf_pc_ptr[i] == '.')
13911 {
13912 len_ptr = &salt_buf_pc_ptr[i];
13913
13914 *len_ptr = 0;
13915 }
13916 else
13917 {
13918 *len_ptr += 1;
13919 }
13920 }
13921
13922 salt->salt_buf_pc[7] = domainbuf_len;
13923
13924 // "real" salt
13925
13926 char *salt_buf_ptr = (char *) salt->salt_buf;
13927
13928 const uint salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, saltbuf_len);
13929
13930 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13931
13932 salt->salt_len = salt_len;
13933
13934 // iteration
13935
13936 salt->salt_iter = atoi (iteration_pos);
13937
13938 return (PARSER_OK);
13939 }
13940
13941 int wbb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13942 {
13943 if ((input_len < DISPLAY_LEN_MIN_8400) || (input_len > DISPLAY_LEN_MAX_8400)) return (PARSER_GLOBAL_LENGTH);
13944
13945 u32 *digest = (u32 *) hash_buf->digest;
13946
13947 salt_t *salt = hash_buf->salt;
13948
13949 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13950 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13951 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13952 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13953 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
13954
13955 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13956
13957 uint salt_len = input_len - 40 - 1;
13958
13959 char *salt_buf = input_buf + 40 + 1;
13960
13961 char *salt_buf_ptr = (char *) salt->salt_buf;
13962
13963 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13964
13965 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13966
13967 salt->salt_len = salt_len;
13968
13969 return (PARSER_OK);
13970 }
13971
13972 int racf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13973 {
13974 const u8 ascii_to_ebcdic[] =
13975 {
13976 0x00, 0x01, 0x02, 0x03, 0x37, 0x2d, 0x2e, 0x2f, 0x16, 0x05, 0x25, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
13977 0x10, 0x11, 0x12, 0x13, 0x3c, 0x3d, 0x32, 0x26, 0x18, 0x19, 0x3f, 0x27, 0x1c, 0x1d, 0x1e, 0x1f,
13978 0x40, 0x4f, 0x7f, 0x7b, 0x5b, 0x6c, 0x50, 0x7d, 0x4d, 0x5d, 0x5c, 0x4e, 0x6b, 0x60, 0x4b, 0x61,
13979 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0x7a, 0x5e, 0x4c, 0x7e, 0x6e, 0x6f,
13980 0x7c, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6,
13981 0xd7, 0xd8, 0xd9, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0x4a, 0xe0, 0x5a, 0x5f, 0x6d,
13982 0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
13983 0x97, 0x98, 0x99, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xc0, 0x6a, 0xd0, 0xa1, 0x07,
13984 0x20, 0x21, 0x22, 0x23, 0x24, 0x15, 0x06, 0x17, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x09, 0x0a, 0x1b,
13985 0x30, 0x31, 0x1a, 0x33, 0x34, 0x35, 0x36, 0x08, 0x38, 0x39, 0x3a, 0x3b, 0x04, 0x14, 0x3e, 0xe1,
13986 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
13987 0x58, 0x59, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75,
13988 0x76, 0x77, 0x78, 0x80, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e,
13989 0x9f, 0xa0, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
13990 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xda, 0xdb,
13991 0xdc, 0xdd, 0xde, 0xdf, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
13992 };
13993
13994 if ((input_len < DISPLAY_LEN_MIN_8500) || (input_len > DISPLAY_LEN_MAX_8500)) return (PARSER_GLOBAL_LENGTH);
13995
13996 if (memcmp (SIGNATURE_RACF, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
13997
13998 u32 *digest = (u32 *) hash_buf->digest;
13999
14000 salt_t *salt = hash_buf->salt;
14001
14002 char *salt_pos = input_buf + 6 + 1;
14003
14004 char *digest_pos = strchr (salt_pos, '*');
14005
14006 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14007
14008 uint salt_len = digest_pos - salt_pos;
14009
14010 if (salt_len > 8) return (PARSER_SALT_LENGTH);
14011
14012 uint hash_len = input_len - 1 - salt_len - 1 - 6;
14013
14014 if (hash_len != 16) return (PARSER_HASH_LENGTH);
14015
14016 digest_pos++;
14017
14018 char *salt_buf_ptr = (char *) salt->salt_buf;
14019 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
14020
14021 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
14022
14023 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14024
14025 salt->salt_len = salt_len;
14026
14027 for (uint i = 0; i < salt_len; i++)
14028 {
14029 salt_buf_pc_ptr[i] = ascii_to_ebcdic[(int) salt_buf_ptr[i]];
14030 }
14031 for (uint i = salt_len; i < 8; i++)
14032 {
14033 salt_buf_pc_ptr[i] = 0x40;
14034 }
14035
14036 uint tt;
14037
14038 IP (salt->salt_buf_pc[0], salt->salt_buf_pc[1], tt);
14039
14040 salt->salt_buf_pc[0] = rotl32 (salt->salt_buf_pc[0], 3u);
14041 salt->salt_buf_pc[1] = rotl32 (salt->salt_buf_pc[1], 3u);
14042
14043 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
14044 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
14045
14046 digest[0] = byte_swap_32 (digest[0]);
14047 digest[1] = byte_swap_32 (digest[1]);
14048
14049 IP (digest[0], digest[1], tt);
14050
14051 digest[0] = rotr32 (digest[0], 29);
14052 digest[1] = rotr32 (digest[1], 29);
14053 digest[2] = 0;
14054 digest[3] = 0;
14055
14056 return (PARSER_OK);
14057 }
14058
14059 int lotus5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14060 {
14061 if ((input_len < DISPLAY_LEN_MIN_8600) || (input_len > DISPLAY_LEN_MAX_8600)) return (PARSER_GLOBAL_LENGTH);
14062
14063 u32 *digest = (u32 *) hash_buf->digest;
14064
14065 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14066 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14067 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14068 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14069
14070 digest[0] = byte_swap_32 (digest[0]);
14071 digest[1] = byte_swap_32 (digest[1]);
14072 digest[2] = byte_swap_32 (digest[2]);
14073 digest[3] = byte_swap_32 (digest[3]);
14074
14075 return (PARSER_OK);
14076 }
14077
14078 int lotus6_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14079 {
14080 if ((input_len < DISPLAY_LEN_MIN_8700) || (input_len > DISPLAY_LEN_MAX_8700)) return (PARSER_GLOBAL_LENGTH);
14081
14082 if ((input_buf[0] != '(') || (input_buf[1] != 'G') || (input_buf[21] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
14083
14084 u32 *digest = (u32 *) hash_buf->digest;
14085
14086 salt_t *salt = hash_buf->salt;
14087
14088 u8 tmp_buf[120] = { 0 };
14089
14090 base64_decode (lotus64_to_int, (const u8 *) input_buf + 2, input_len - 3, tmp_buf);
14091
14092 tmp_buf[3] += -4; // dont ask!
14093
14094 memcpy (salt->salt_buf, tmp_buf, 5);
14095
14096 salt->salt_len = 5;
14097
14098 memcpy (digest, tmp_buf + 5, 9);
14099
14100 // yes, only 9 byte are needed to crack, but 10 to display
14101
14102 salt->salt_buf_pc[7] = input_buf[20];
14103
14104 return (PARSER_OK);
14105 }
14106
14107 int lotus8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14108 {
14109 if ((input_len < DISPLAY_LEN_MIN_9100) || (input_len > DISPLAY_LEN_MAX_9100)) return (PARSER_GLOBAL_LENGTH);
14110
14111 if ((input_buf[0] != '(') || (input_buf[1] != 'H') || (input_buf[DISPLAY_LEN_MAX_9100 - 1] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
14112
14113 u32 *digest = (u32 *) hash_buf->digest;
14114
14115 salt_t *salt = hash_buf->salt;
14116
14117 u8 tmp_buf[120] = { 0 };
14118
14119 base64_decode (lotus64_to_int, (const u8 *) input_buf + 2, input_len - 3, tmp_buf);
14120
14121 tmp_buf[3] += -4; // dont ask!
14122
14123 // salt
14124
14125 memcpy (salt->salt_buf, tmp_buf, 16);
14126
14127 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)
14128
14129 // iteration
14130
14131 char tmp_iter_buf[11] = { 0 };
14132
14133 memcpy (tmp_iter_buf, tmp_buf + 16, 10);
14134
14135 tmp_iter_buf[10] = 0;
14136
14137 salt->salt_iter = atoi (tmp_iter_buf);
14138
14139 if (salt->salt_iter < 1) // well, the limit hopefully is much higher
14140 {
14141 return (PARSER_SALT_ITERATION);
14142 }
14143
14144 salt->salt_iter--; // first round in init
14145
14146 // 2 additional bytes for display only
14147
14148 salt->salt_buf_pc[0] = tmp_buf[26];
14149 salt->salt_buf_pc[1] = tmp_buf[27];
14150
14151 // digest
14152
14153 memcpy (digest, tmp_buf + 28, 8);
14154
14155 digest[0] = byte_swap_32 (digest[0]);
14156 digest[1] = byte_swap_32 (digest[1]);
14157 digest[2] = 0;
14158 digest[3] = 0;
14159
14160 return (PARSER_OK);
14161 }
14162
14163 int hmailserver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14164 {
14165 if ((input_len < DISPLAY_LEN_MIN_1421) || (input_len > DISPLAY_LEN_MAX_1421)) return (PARSER_GLOBAL_LENGTH);
14166
14167 u32 *digest = (u32 *) hash_buf->digest;
14168
14169 salt_t *salt = hash_buf->salt;
14170
14171 char *salt_buf_pos = input_buf;
14172
14173 char *hash_buf_pos = salt_buf_pos + 6;
14174
14175 digest[0] = hex_to_u32 ((const u8 *) &hash_buf_pos[ 0]);
14176 digest[1] = hex_to_u32 ((const u8 *) &hash_buf_pos[ 8]);
14177 digest[2] = hex_to_u32 ((const u8 *) &hash_buf_pos[16]);
14178 digest[3] = hex_to_u32 ((const u8 *) &hash_buf_pos[24]);
14179 digest[4] = hex_to_u32 ((const u8 *) &hash_buf_pos[32]);
14180 digest[5] = hex_to_u32 ((const u8 *) &hash_buf_pos[40]);
14181 digest[6] = hex_to_u32 ((const u8 *) &hash_buf_pos[48]);
14182 digest[7] = hex_to_u32 ((const u8 *) &hash_buf_pos[56]);
14183
14184 digest[0] -= SHA256M_A;
14185 digest[1] -= SHA256M_B;
14186 digest[2] -= SHA256M_C;
14187 digest[3] -= SHA256M_D;
14188 digest[4] -= SHA256M_E;
14189 digest[5] -= SHA256M_F;
14190 digest[6] -= SHA256M_G;
14191 digest[7] -= SHA256M_H;
14192
14193 char *salt_buf_ptr = (char *) salt->salt_buf;
14194
14195 const uint salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf_pos, 6);
14196
14197 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14198
14199 salt->salt_len = salt_len;
14200
14201 return (PARSER_OK);
14202 }
14203
14204 int phps_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14205 {
14206 if ((input_len < DISPLAY_LEN_MIN_2612) || (input_len > DISPLAY_LEN_MAX_2612)) return (PARSER_GLOBAL_LENGTH);
14207
14208 u32 *digest = (u32 *) hash_buf->digest;
14209
14210 if (memcmp (SIGNATURE_PHPS, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14211
14212 salt_t *salt = hash_buf->salt;
14213
14214 char *salt_buf = input_buf + 6;
14215
14216 char *digest_buf = strchr (salt_buf, '$');
14217
14218 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14219
14220 uint salt_len = digest_buf - salt_buf;
14221
14222 digest_buf++; // skip the '$' symbol
14223
14224 char *salt_buf_ptr = (char *) salt->salt_buf;
14225
14226 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14227
14228 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14229
14230 salt->salt_len = salt_len;
14231
14232 digest[0] = hex_to_u32 ((const u8 *) &digest_buf[ 0]);
14233 digest[1] = hex_to_u32 ((const u8 *) &digest_buf[ 8]);
14234 digest[2] = hex_to_u32 ((const u8 *) &digest_buf[16]);
14235 digest[3] = hex_to_u32 ((const u8 *) &digest_buf[24]);
14236
14237 digest[0] = byte_swap_32 (digest[0]);
14238 digest[1] = byte_swap_32 (digest[1]);
14239 digest[2] = byte_swap_32 (digest[2]);
14240 digest[3] = byte_swap_32 (digest[3]);
14241
14242 digest[0] -= MD5M_A;
14243 digest[1] -= MD5M_B;
14244 digest[2] -= MD5M_C;
14245 digest[3] -= MD5M_D;
14246
14247 return (PARSER_OK);
14248 }
14249
14250 int mediawiki_b_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14251 {
14252 if ((input_len < DISPLAY_LEN_MIN_3711) || (input_len > DISPLAY_LEN_MAX_3711)) return (PARSER_GLOBAL_LENGTH);
14253
14254 if (memcmp (SIGNATURE_MEDIAWIKI_B, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14255
14256 u32 *digest = (u32 *) hash_buf->digest;
14257
14258 salt_t *salt = hash_buf->salt;
14259
14260 char *salt_buf = input_buf + 3;
14261
14262 char *digest_buf = strchr (salt_buf, '$');
14263
14264 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14265
14266 uint salt_len = digest_buf - salt_buf;
14267
14268 digest_buf++; // skip the '$' symbol
14269
14270 char *salt_buf_ptr = (char *) salt->salt_buf;
14271
14272 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14273
14274 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14275
14276 salt_buf_ptr[salt_len] = 0x2d;
14277
14278 salt->salt_len = salt_len + 1;
14279
14280 digest[0] = hex_to_u32 ((const u8 *) &digest_buf[ 0]);
14281 digest[1] = hex_to_u32 ((const u8 *) &digest_buf[ 8]);
14282 digest[2] = hex_to_u32 ((const u8 *) &digest_buf[16]);
14283 digest[3] = hex_to_u32 ((const u8 *) &digest_buf[24]);
14284
14285 digest[0] = byte_swap_32 (digest[0]);
14286 digest[1] = byte_swap_32 (digest[1]);
14287 digest[2] = byte_swap_32 (digest[2]);
14288 digest[3] = byte_swap_32 (digest[3]);
14289
14290 digest[0] -= MD5M_A;
14291 digest[1] -= MD5M_B;
14292 digest[2] -= MD5M_C;
14293 digest[3] -= MD5M_D;
14294
14295 return (PARSER_OK);
14296 }
14297
14298 int peoplesoft_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14299 {
14300 if ((input_len < DISPLAY_LEN_MIN_133) || (input_len > DISPLAY_LEN_MAX_133)) return (PARSER_GLOBAL_LENGTH);
14301
14302 u32 *digest = (u32 *) hash_buf->digest;
14303
14304 u8 tmp_buf[100] = { 0 };
14305
14306 base64_decode (base64_to_int, (const u8 *) input_buf, input_len, tmp_buf);
14307
14308 memcpy (digest, tmp_buf, 20);
14309
14310 digest[0] = byte_swap_32 (digest[0]);
14311 digest[1] = byte_swap_32 (digest[1]);
14312 digest[2] = byte_swap_32 (digest[2]);
14313 digest[3] = byte_swap_32 (digest[3]);
14314 digest[4] = byte_swap_32 (digest[4]);
14315
14316 digest[0] -= SHA1M_A;
14317 digest[1] -= SHA1M_B;
14318 digest[2] -= SHA1M_C;
14319 digest[3] -= SHA1M_D;
14320 digest[4] -= SHA1M_E;
14321
14322 return (PARSER_OK);
14323 }
14324
14325 int skype_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14326 {
14327 if ((input_len < DISPLAY_LEN_MIN_23) || (input_len > DISPLAY_LEN_MAX_23)) return (PARSER_GLOBAL_LENGTH);
14328
14329 u32 *digest = (u32 *) hash_buf->digest;
14330
14331 salt_t *salt = hash_buf->salt;
14332
14333 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14334 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14335 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14336 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14337
14338 digest[0] = byte_swap_32 (digest[0]);
14339 digest[1] = byte_swap_32 (digest[1]);
14340 digest[2] = byte_swap_32 (digest[2]);
14341 digest[3] = byte_swap_32 (digest[3]);
14342
14343 digest[0] -= MD5M_A;
14344 digest[1] -= MD5M_B;
14345 digest[2] -= MD5M_C;
14346 digest[3] -= MD5M_D;
14347
14348 if (input_buf[32] != ':') return (PARSER_SEPARATOR_UNMATCHED);
14349
14350 uint salt_len = input_len - 32 - 1;
14351
14352 char *salt_buf = input_buf + 32 + 1;
14353
14354 char *salt_buf_ptr = (char *) salt->salt_buf;
14355
14356 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14357
14358 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14359
14360 /*
14361 * add static "salt" part
14362 */
14363
14364 memcpy (salt_buf_ptr + salt_len, "\nskyper\n", 8);
14365
14366 salt_len += 8;
14367
14368 salt->salt_len = salt_len;
14369
14370 return (PARSER_OK);
14371 }
14372
14373 int androidfde_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14374 {
14375 if ((input_len < DISPLAY_LEN_MIN_8800) || (input_len > DISPLAY_LEN_MAX_8800)) return (PARSER_GLOBAL_LENGTH);
14376
14377 if (memcmp (SIGNATURE_ANDROIDFDE, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
14378
14379 u32 *digest = (u32 *) hash_buf->digest;
14380
14381 salt_t *salt = hash_buf->salt;
14382
14383 androidfde_t *androidfde = (androidfde_t *) hash_buf->esalt;
14384
14385 /**
14386 * parse line
14387 */
14388
14389 char *saltlen_pos = input_buf + 1 + 3 + 1;
14390
14391 char *saltbuf_pos = strchr (saltlen_pos, '$');
14392
14393 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14394
14395 uint saltlen_len = saltbuf_pos - saltlen_pos;
14396
14397 if (saltlen_len != 2) return (PARSER_SALT_LENGTH);
14398
14399 saltbuf_pos++;
14400
14401 char *keylen_pos = strchr (saltbuf_pos, '$');
14402
14403 if (keylen_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14404
14405 uint saltbuf_len = keylen_pos - saltbuf_pos;
14406
14407 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
14408
14409 keylen_pos++;
14410
14411 char *keybuf_pos = strchr (keylen_pos, '$');
14412
14413 if (keybuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14414
14415 uint keylen_len = keybuf_pos - keylen_pos;
14416
14417 if (keylen_len != 2) return (PARSER_SALT_LENGTH);
14418
14419 keybuf_pos++;
14420
14421 char *databuf_pos = strchr (keybuf_pos, '$');
14422
14423 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14424
14425 uint keybuf_len = databuf_pos - keybuf_pos;
14426
14427 if (keybuf_len != 32) return (PARSER_SALT_LENGTH);
14428
14429 databuf_pos++;
14430
14431 uint data_len = input_len - 1 - 3 - 1 - saltlen_len - 1 - saltbuf_len - 1 - keylen_len - 1 - keybuf_len - 1;
14432
14433 if (data_len != 3072) return (PARSER_SALT_LENGTH);
14434
14435 /**
14436 * copy data
14437 */
14438
14439 digest[0] = hex_to_u32 ((const u8 *) &keybuf_pos[ 0]);
14440 digest[1] = hex_to_u32 ((const u8 *) &keybuf_pos[ 8]);
14441 digest[2] = hex_to_u32 ((const u8 *) &keybuf_pos[16]);
14442 digest[3] = hex_to_u32 ((const u8 *) &keybuf_pos[24]);
14443
14444 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &saltbuf_pos[ 0]);
14445 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &saltbuf_pos[ 8]);
14446 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &saltbuf_pos[16]);
14447 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &saltbuf_pos[24]);
14448
14449 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
14450 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
14451 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
14452 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
14453
14454 salt->salt_len = 16;
14455 salt->salt_iter = ROUNDS_ANDROIDFDE - 1;
14456
14457 for (uint i = 0, j = 0; i < 3072; i += 8, j += 1)
14458 {
14459 androidfde->data[j] = hex_to_u32 ((const u8 *) &databuf_pos[i]);
14460 }
14461
14462 return (PARSER_OK);
14463 }
14464
14465 int scrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14466 {
14467 if ((input_len < DISPLAY_LEN_MIN_8900) || (input_len > DISPLAY_LEN_MAX_8900)) return (PARSER_GLOBAL_LENGTH);
14468
14469 if (memcmp (SIGNATURE_SCRYPT, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14470
14471 u32 *digest = (u32 *) hash_buf->digest;
14472
14473 salt_t *salt = hash_buf->salt;
14474
14475 /**
14476 * parse line
14477 */
14478
14479 // first is the N salt parameter
14480
14481 char *N_pos = input_buf + 6;
14482
14483 if (N_pos[0] != ':') return (PARSER_SEPARATOR_UNMATCHED);
14484
14485 N_pos++;
14486
14487 salt->scrypt_N = atoi (N_pos);
14488
14489 // r
14490
14491 char *r_pos = strchr (N_pos, ':');
14492
14493 if (r_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14494
14495 r_pos++;
14496
14497 salt->scrypt_r = atoi (r_pos);
14498
14499 // p
14500
14501 char *p_pos = strchr (r_pos, ':');
14502
14503 if (p_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14504
14505 p_pos++;
14506
14507 salt->scrypt_p = atoi (p_pos);
14508
14509 // salt
14510
14511 char *saltbuf_pos = strchr (p_pos, ':');
14512
14513 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14514
14515 saltbuf_pos++;
14516
14517 char *hash_pos = strchr (saltbuf_pos, ':');
14518
14519 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14520
14521 hash_pos++;
14522
14523 // base64 decode
14524
14525 u8 tmp_buf[33] = { 0 };
14526
14527 int tmp_len = base64_decode (base64_to_int, (const u8 *) saltbuf_pos, hash_pos - saltbuf_pos, tmp_buf);
14528
14529 char *salt_buf_ptr = (char *) salt->salt_buf;
14530
14531 memcpy (salt_buf_ptr, tmp_buf, tmp_len);
14532
14533 salt->salt_len = tmp_len;
14534 salt->salt_iter = 1;
14535
14536 // digest - base64 decode
14537
14538 memset (tmp_buf, 0, sizeof (tmp_buf));
14539
14540 tmp_len = input_len - (hash_pos - input_buf);
14541
14542 if (tmp_len != 44) return (PARSER_GLOBAL_LENGTH);
14543
14544 base64_decode (base64_to_int, (const u8 *) hash_pos, tmp_len, tmp_buf);
14545
14546 memcpy (digest, tmp_buf, 32);
14547
14548 return (PARSER_OK);
14549 }
14550
14551 int juniper_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14552 {
14553 if ((input_len < DISPLAY_LEN_MIN_501) || (input_len > DISPLAY_LEN_MAX_501)) return (PARSER_GLOBAL_LENGTH);
14554
14555 u32 *digest = (u32 *) hash_buf->digest;
14556
14557 salt_t *salt = hash_buf->salt;
14558
14559 /**
14560 * parse line
14561 */
14562
14563 char decrypted[76] = { 0 }; // iv + hash
14564
14565 juniper_decrypt_hash (input_buf, decrypted);
14566
14567 char *md5crypt_hash = decrypted + 12;
14568
14569 if (memcmp (md5crypt_hash, "$1$danastre$", 12)) return (PARSER_SALT_VALUE);
14570
14571 salt->salt_iter = ROUNDS_MD5CRYPT;
14572
14573 char *salt_pos = md5crypt_hash + 3;
14574
14575 char *hash_pos = strchr (salt_pos, '$'); // or simply salt_pos + 8
14576
14577 salt->salt_len = hash_pos - salt_pos; // should be 8
14578
14579 memcpy ((char *) salt->salt_buf, salt_pos, salt->salt_len);
14580
14581 hash_pos++;
14582
14583 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
14584
14585 return (PARSER_OK);
14586 }
14587
14588 int cisco8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14589 {
14590 if ((input_len < DISPLAY_LEN_MIN_9200) || (input_len > DISPLAY_LEN_MAX_9200)) return (PARSER_GLOBAL_LENGTH);
14591
14592 if (memcmp (SIGNATURE_CISCO8, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14593
14594 u32 *digest = (u32 *) hash_buf->digest;
14595
14596 salt_t *salt = hash_buf->salt;
14597
14598 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
14599
14600 /**
14601 * parse line
14602 */
14603
14604 // first is *raw* salt
14605
14606 char *salt_pos = input_buf + 3;
14607
14608 char *hash_pos = strchr (salt_pos, '$');
14609
14610 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14611
14612 uint salt_len = hash_pos - salt_pos;
14613
14614 if (salt_len != 14) return (PARSER_SALT_LENGTH);
14615
14616 hash_pos++;
14617
14618 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
14619
14620 memcpy (salt_buf_ptr, salt_pos, 14);
14621
14622 salt_buf_ptr[17] = 0x01;
14623 salt_buf_ptr[18] = 0x80;
14624
14625 // add some stuff to normal salt to make sorted happy
14626
14627 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
14628 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
14629 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
14630 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
14631
14632 salt->salt_len = salt_len;
14633 salt->salt_iter = ROUNDS_CISCO8 - 1;
14634
14635 // base64 decode hash
14636
14637 u8 tmp_buf[100] = { 0 };
14638
14639 uint hash_len = input_len - 3 - salt_len - 1;
14640
14641 int tmp_len = base64_decode (itoa64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
14642
14643 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
14644
14645 memcpy (digest, tmp_buf, 32);
14646
14647 digest[0] = byte_swap_32 (digest[0]);
14648 digest[1] = byte_swap_32 (digest[1]);
14649 digest[2] = byte_swap_32 (digest[2]);
14650 digest[3] = byte_swap_32 (digest[3]);
14651 digest[4] = byte_swap_32 (digest[4]);
14652 digest[5] = byte_swap_32 (digest[5]);
14653 digest[6] = byte_swap_32 (digest[6]);
14654 digest[7] = byte_swap_32 (digest[7]);
14655
14656 return (PARSER_OK);
14657 }
14658
14659 int cisco9_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14660 {
14661 if ((input_len < DISPLAY_LEN_MIN_9300) || (input_len > DISPLAY_LEN_MAX_9300)) return (PARSER_GLOBAL_LENGTH);
14662
14663 if (memcmp (SIGNATURE_CISCO9, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14664
14665 u32 *digest = (u32 *) hash_buf->digest;
14666
14667 salt_t *salt = hash_buf->salt;
14668
14669 /**
14670 * parse line
14671 */
14672
14673 // first is *raw* salt
14674
14675 char *salt_pos = input_buf + 3;
14676
14677 char *hash_pos = strchr (salt_pos, '$');
14678
14679 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14680
14681 uint salt_len = hash_pos - salt_pos;
14682
14683 if (salt_len != 14) return (PARSER_SALT_LENGTH);
14684
14685 salt->salt_len = salt_len;
14686 hash_pos++;
14687
14688 char *salt_buf_ptr = (char *) salt->salt_buf;
14689
14690 memcpy (salt_buf_ptr, salt_pos, salt_len);
14691 salt_buf_ptr[salt_len] = 0;
14692
14693 // base64 decode hash
14694
14695 u8 tmp_buf[100] = { 0 };
14696
14697 uint hash_len = input_len - 3 - salt_len - 1;
14698
14699 int tmp_len = base64_decode (itoa64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
14700
14701 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
14702
14703 memcpy (digest, tmp_buf, 32);
14704
14705 // fixed:
14706 salt->scrypt_N = 16384;
14707 salt->scrypt_r = 1;
14708 salt->scrypt_p = 1;
14709 salt->salt_iter = 1;
14710
14711 return (PARSER_OK);
14712 }
14713
14714 int office2007_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14715 {
14716 if ((input_len < DISPLAY_LEN_MIN_9400) || (input_len > DISPLAY_LEN_MAX_9400)) return (PARSER_GLOBAL_LENGTH);
14717
14718 if (memcmp (SIGNATURE_OFFICE2007, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
14719
14720 u32 *digest = (u32 *) hash_buf->digest;
14721
14722 salt_t *salt = hash_buf->salt;
14723
14724 office2007_t *office2007 = (office2007_t *) hash_buf->esalt;
14725
14726 /**
14727 * parse line
14728 */
14729
14730 char *version_pos = input_buf + 8 + 1;
14731
14732 char *verifierHashSize_pos = strchr (version_pos, '*');
14733
14734 if (verifierHashSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14735
14736 u32 version_len = verifierHashSize_pos - version_pos;
14737
14738 if (version_len != 4) return (PARSER_SALT_LENGTH);
14739
14740 verifierHashSize_pos++;
14741
14742 char *keySize_pos = strchr (verifierHashSize_pos, '*');
14743
14744 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14745
14746 u32 verifierHashSize_len = keySize_pos - verifierHashSize_pos;
14747
14748 if (verifierHashSize_len != 2) return (PARSER_SALT_LENGTH);
14749
14750 keySize_pos++;
14751
14752 char *saltSize_pos = strchr (keySize_pos, '*');
14753
14754 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14755
14756 u32 keySize_len = saltSize_pos - keySize_pos;
14757
14758 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
14759
14760 saltSize_pos++;
14761
14762 char *osalt_pos = strchr (saltSize_pos, '*');
14763
14764 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14765
14766 u32 saltSize_len = osalt_pos - saltSize_pos;
14767
14768 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
14769
14770 osalt_pos++;
14771
14772 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
14773
14774 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14775
14776 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
14777
14778 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
14779
14780 encryptedVerifier_pos++;
14781
14782 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
14783
14784 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14785
14786 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
14787
14788 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
14789
14790 encryptedVerifierHash_pos++;
14791
14792 u32 encryptedVerifierHash_len = input_len - 8 - 1 - version_len - 1 - verifierHashSize_len - 1 - keySize_len - 1 - saltSize_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
14793
14794 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
14795
14796 const uint version = atoi (version_pos);
14797
14798 if (version != 2007) return (PARSER_SALT_VALUE);
14799
14800 const uint verifierHashSize = atoi (verifierHashSize_pos);
14801
14802 if (verifierHashSize != 20) return (PARSER_SALT_VALUE);
14803
14804 const uint keySize = atoi (keySize_pos);
14805
14806 if ((keySize != 128) && (keySize != 256)) return (PARSER_SALT_VALUE);
14807
14808 office2007->keySize = keySize;
14809
14810 const uint saltSize = atoi (saltSize_pos);
14811
14812 if (saltSize != 16) return (PARSER_SALT_VALUE);
14813
14814 /**
14815 * salt
14816 */
14817
14818 salt->salt_len = 16;
14819 salt->salt_iter = ROUNDS_OFFICE2007;
14820
14821 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
14822 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
14823 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
14824 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
14825
14826 /**
14827 * esalt
14828 */
14829
14830 office2007->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
14831 office2007->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
14832 office2007->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
14833 office2007->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
14834
14835 office2007->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
14836 office2007->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
14837 office2007->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
14838 office2007->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
14839 office2007->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
14840
14841 /**
14842 * digest
14843 */
14844
14845 digest[0] = office2007->encryptedVerifierHash[0];
14846 digest[1] = office2007->encryptedVerifierHash[1];
14847 digest[2] = office2007->encryptedVerifierHash[2];
14848 digest[3] = office2007->encryptedVerifierHash[3];
14849
14850 return (PARSER_OK);
14851 }
14852
14853 int office2010_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14854 {
14855 if ((input_len < DISPLAY_LEN_MIN_9500) || (input_len > DISPLAY_LEN_MAX_9500)) return (PARSER_GLOBAL_LENGTH);
14856
14857 if (memcmp (SIGNATURE_OFFICE2010, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
14858
14859 u32 *digest = (u32 *) hash_buf->digest;
14860
14861 salt_t *salt = hash_buf->salt;
14862
14863 office2010_t *office2010 = (office2010_t *) hash_buf->esalt;
14864
14865 /**
14866 * parse line
14867 */
14868
14869 char *version_pos = input_buf + 8 + 1;
14870
14871 char *spinCount_pos = strchr (version_pos, '*');
14872
14873 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14874
14875 u32 version_len = spinCount_pos - version_pos;
14876
14877 if (version_len != 4) return (PARSER_SALT_LENGTH);
14878
14879 spinCount_pos++;
14880
14881 char *keySize_pos = strchr (spinCount_pos, '*');
14882
14883 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14884
14885 u32 spinCount_len = keySize_pos - spinCount_pos;
14886
14887 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
14888
14889 keySize_pos++;
14890
14891 char *saltSize_pos = strchr (keySize_pos, '*');
14892
14893 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14894
14895 u32 keySize_len = saltSize_pos - keySize_pos;
14896
14897 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
14898
14899 saltSize_pos++;
14900
14901 char *osalt_pos = strchr (saltSize_pos, '*');
14902
14903 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14904
14905 u32 saltSize_len = osalt_pos - saltSize_pos;
14906
14907 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
14908
14909 osalt_pos++;
14910
14911 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
14912
14913 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14914
14915 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
14916
14917 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
14918
14919 encryptedVerifier_pos++;
14920
14921 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
14922
14923 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14924
14925 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
14926
14927 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
14928
14929 encryptedVerifierHash_pos++;
14930
14931 u32 encryptedVerifierHash_len = input_len - 8 - 1 - version_len - 1 - spinCount_len - 1 - keySize_len - 1 - saltSize_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
14932
14933 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
14934
14935 const uint version = atoi (version_pos);
14936
14937 if (version != 2010) return (PARSER_SALT_VALUE);
14938
14939 const uint spinCount = atoi (spinCount_pos);
14940
14941 if (spinCount != 100000) return (PARSER_SALT_VALUE);
14942
14943 const uint keySize = atoi (keySize_pos);
14944
14945 if (keySize != 128) return (PARSER_SALT_VALUE);
14946
14947 const uint saltSize = atoi (saltSize_pos);
14948
14949 if (saltSize != 16) return (PARSER_SALT_VALUE);
14950
14951 /**
14952 * salt
14953 */
14954
14955 salt->salt_len = 16;
14956 salt->salt_iter = spinCount;
14957
14958 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
14959 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
14960 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
14961 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
14962
14963 /**
14964 * esalt
14965 */
14966
14967 office2010->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
14968 office2010->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
14969 office2010->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
14970 office2010->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
14971
14972 office2010->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
14973 office2010->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
14974 office2010->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
14975 office2010->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
14976 office2010->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
14977 office2010->encryptedVerifierHash[5] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[40]);
14978 office2010->encryptedVerifierHash[6] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[48]);
14979 office2010->encryptedVerifierHash[7] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[56]);
14980
14981 /**
14982 * digest
14983 */
14984
14985 digest[0] = office2010->encryptedVerifierHash[0];
14986 digest[1] = office2010->encryptedVerifierHash[1];
14987 digest[2] = office2010->encryptedVerifierHash[2];
14988 digest[3] = office2010->encryptedVerifierHash[3];
14989
14990 return (PARSER_OK);
14991 }
14992
14993 int office2013_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14994 {
14995 if ((input_len < DISPLAY_LEN_MIN_9600) || (input_len > DISPLAY_LEN_MAX_9600)) return (PARSER_GLOBAL_LENGTH);
14996
14997 if (memcmp (SIGNATURE_OFFICE2013, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
14998
14999 u32 *digest = (u32 *) hash_buf->digest;
15000
15001 salt_t *salt = hash_buf->salt;
15002
15003 office2013_t *office2013 = (office2013_t *) hash_buf->esalt;
15004
15005 /**
15006 * parse line
15007 */
15008
15009 char *version_pos = input_buf + 8 + 1;
15010
15011 char *spinCount_pos = strchr (version_pos, '*');
15012
15013 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15014
15015 u32 version_len = spinCount_pos - version_pos;
15016
15017 if (version_len != 4) return (PARSER_SALT_LENGTH);
15018
15019 spinCount_pos++;
15020
15021 char *keySize_pos = strchr (spinCount_pos, '*');
15022
15023 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15024
15025 u32 spinCount_len = keySize_pos - spinCount_pos;
15026
15027 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
15028
15029 keySize_pos++;
15030
15031 char *saltSize_pos = strchr (keySize_pos, '*');
15032
15033 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15034
15035 u32 keySize_len = saltSize_pos - keySize_pos;
15036
15037 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
15038
15039 saltSize_pos++;
15040
15041 char *osalt_pos = strchr (saltSize_pos, '*');
15042
15043 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15044
15045 u32 saltSize_len = osalt_pos - saltSize_pos;
15046
15047 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
15048
15049 osalt_pos++;
15050
15051 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15052
15053 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15054
15055 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15056
15057 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15058
15059 encryptedVerifier_pos++;
15060
15061 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15062
15063 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15064
15065 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15066
15067 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15068
15069 encryptedVerifierHash_pos++;
15070
15071 u32 encryptedVerifierHash_len = input_len - 8 - 1 - version_len - 1 - spinCount_len - 1 - keySize_len - 1 - saltSize_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
15072
15073 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
15074
15075 const uint version = atoi (version_pos);
15076
15077 if (version != 2013) return (PARSER_SALT_VALUE);
15078
15079 const uint spinCount = atoi (spinCount_pos);
15080
15081 if (spinCount != 100000) return (PARSER_SALT_VALUE);
15082
15083 const uint keySize = atoi (keySize_pos);
15084
15085 if (keySize != 256) return (PARSER_SALT_VALUE);
15086
15087 const uint saltSize = atoi (saltSize_pos);
15088
15089 if (saltSize != 16) return (PARSER_SALT_VALUE);
15090
15091 /**
15092 * salt
15093 */
15094
15095 salt->salt_len = 16;
15096 salt->salt_iter = spinCount;
15097
15098 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15099 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15100 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15101 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15102
15103 /**
15104 * esalt
15105 */
15106
15107 office2013->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15108 office2013->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15109 office2013->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15110 office2013->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15111
15112 office2013->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15113 office2013->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15114 office2013->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15115 office2013->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15116 office2013->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15117 office2013->encryptedVerifierHash[5] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[40]);
15118 office2013->encryptedVerifierHash[6] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[48]);
15119 office2013->encryptedVerifierHash[7] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[56]);
15120
15121 /**
15122 * digest
15123 */
15124
15125 digest[0] = office2013->encryptedVerifierHash[0];
15126 digest[1] = office2013->encryptedVerifierHash[1];
15127 digest[2] = office2013->encryptedVerifierHash[2];
15128 digest[3] = office2013->encryptedVerifierHash[3];
15129
15130 return (PARSER_OK);
15131 }
15132
15133 int oldoffice01_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15134 {
15135 if ((input_len < DISPLAY_LEN_MIN_9700) || (input_len > DISPLAY_LEN_MAX_9700)) return (PARSER_GLOBAL_LENGTH);
15136
15137 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15138
15139 u32 *digest = (u32 *) hash_buf->digest;
15140
15141 salt_t *salt = hash_buf->salt;
15142
15143 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
15144
15145 /**
15146 * parse line
15147 */
15148
15149 char *version_pos = input_buf + 11;
15150
15151 char *osalt_pos = strchr (version_pos, '*');
15152
15153 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15154
15155 u32 version_len = osalt_pos - version_pos;
15156
15157 if (version_len != 1) return (PARSER_SALT_LENGTH);
15158
15159 osalt_pos++;
15160
15161 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15162
15163 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15164
15165 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15166
15167 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15168
15169 encryptedVerifier_pos++;
15170
15171 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15172
15173 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15174
15175 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15176
15177 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15178
15179 encryptedVerifierHash_pos++;
15180
15181 u32 encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
15182
15183 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
15184
15185 const uint version = *version_pos - 0x30;
15186
15187 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
15188
15189 /**
15190 * esalt
15191 */
15192
15193 oldoffice01->version = version;
15194
15195 oldoffice01->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15196 oldoffice01->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15197 oldoffice01->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15198 oldoffice01->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15199
15200 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
15201 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
15202 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
15203 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
15204
15205 oldoffice01->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15206 oldoffice01->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15207 oldoffice01->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15208 oldoffice01->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15209
15210 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
15211 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
15212 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
15213 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
15214
15215 /**
15216 * salt
15217 */
15218
15219 salt->salt_len = 16;
15220
15221 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15222 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15223 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15224 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15225
15226 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15227 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15228 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15229 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15230
15231 // this is a workaround as office produces multiple documents with the same salt
15232
15233 salt->salt_len += 32;
15234
15235 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
15236 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
15237 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
15238 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
15239 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
15240 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
15241 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
15242 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
15243
15244 /**
15245 * digest
15246 */
15247
15248 digest[0] = oldoffice01->encryptedVerifierHash[0];
15249 digest[1] = oldoffice01->encryptedVerifierHash[1];
15250 digest[2] = oldoffice01->encryptedVerifierHash[2];
15251 digest[3] = oldoffice01->encryptedVerifierHash[3];
15252
15253 return (PARSER_OK);
15254 }
15255
15256 int oldoffice01cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15257 {
15258 return oldoffice01_parse_hash (input_buf, input_len, hash_buf);
15259 }
15260
15261 int oldoffice01cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15262 {
15263 if ((input_len < DISPLAY_LEN_MIN_9720) || (input_len > DISPLAY_LEN_MAX_9720)) return (PARSER_GLOBAL_LENGTH);
15264
15265 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15266
15267 u32 *digest = (u32 *) hash_buf->digest;
15268
15269 salt_t *salt = hash_buf->salt;
15270
15271 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
15272
15273 /**
15274 * parse line
15275 */
15276
15277 char *version_pos = input_buf + 11;
15278
15279 char *osalt_pos = strchr (version_pos, '*');
15280
15281 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15282
15283 u32 version_len = osalt_pos - version_pos;
15284
15285 if (version_len != 1) return (PARSER_SALT_LENGTH);
15286
15287 osalt_pos++;
15288
15289 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15290
15291 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15292
15293 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15294
15295 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15296
15297 encryptedVerifier_pos++;
15298
15299 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15300
15301 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15302
15303 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15304
15305 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15306
15307 encryptedVerifierHash_pos++;
15308
15309 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
15310
15311 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15312
15313 u32 encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
15314
15315 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
15316
15317 rc4key_pos++;
15318
15319 u32 rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
15320
15321 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
15322
15323 const uint version = *version_pos - 0x30;
15324
15325 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
15326
15327 /**
15328 * esalt
15329 */
15330
15331 oldoffice01->version = version;
15332
15333 oldoffice01->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15334 oldoffice01->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15335 oldoffice01->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15336 oldoffice01->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15337
15338 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
15339 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
15340 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
15341 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
15342
15343 oldoffice01->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15344 oldoffice01->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15345 oldoffice01->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15346 oldoffice01->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15347
15348 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
15349 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
15350 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
15351 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
15352
15353 oldoffice01->rc4key[1] = 0;
15354 oldoffice01->rc4key[0] = 0;
15355
15356 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
15357 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
15358 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
15359 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
15360 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
15361 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
15362 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
15363 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
15364 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
15365 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
15366
15367 oldoffice01->rc4key[0] = byte_swap_32 (oldoffice01->rc4key[0]);
15368 oldoffice01->rc4key[1] = byte_swap_32 (oldoffice01->rc4key[1]);
15369
15370 /**
15371 * salt
15372 */
15373
15374 salt->salt_len = 16;
15375
15376 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15377 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15378 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15379 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15380
15381 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15382 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15383 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15384 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15385
15386 // this is a workaround as office produces multiple documents with the same salt
15387
15388 salt->salt_len += 32;
15389
15390 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
15391 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
15392 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
15393 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
15394 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
15395 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
15396 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
15397 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
15398
15399 /**
15400 * digest
15401 */
15402
15403 digest[0] = oldoffice01->rc4key[0];
15404 digest[1] = oldoffice01->rc4key[1];
15405 digest[2] = 0;
15406 digest[3] = 0;
15407
15408 return (PARSER_OK);
15409 }
15410
15411 int oldoffice34_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15412 {
15413 if ((input_len < DISPLAY_LEN_MIN_9800) || (input_len > DISPLAY_LEN_MAX_9800)) return (PARSER_GLOBAL_LENGTH);
15414
15415 if ((memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE4, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15416
15417 u32 *digest = (u32 *) hash_buf->digest;
15418
15419 salt_t *salt = hash_buf->salt;
15420
15421 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
15422
15423 /**
15424 * parse line
15425 */
15426
15427 char *version_pos = input_buf + 11;
15428
15429 char *osalt_pos = strchr (version_pos, '*');
15430
15431 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15432
15433 u32 version_len = osalt_pos - version_pos;
15434
15435 if (version_len != 1) return (PARSER_SALT_LENGTH);
15436
15437 osalt_pos++;
15438
15439 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15440
15441 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15442
15443 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15444
15445 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15446
15447 encryptedVerifier_pos++;
15448
15449 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15450
15451 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15452
15453 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15454
15455 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15456
15457 encryptedVerifierHash_pos++;
15458
15459 u32 encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
15460
15461 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
15462
15463 const uint version = *version_pos - 0x30;
15464
15465 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
15466
15467 /**
15468 * esalt
15469 */
15470
15471 oldoffice34->version = version;
15472
15473 oldoffice34->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15474 oldoffice34->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15475 oldoffice34->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15476 oldoffice34->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15477
15478 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
15479 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
15480 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
15481 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
15482
15483 oldoffice34->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15484 oldoffice34->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15485 oldoffice34->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15486 oldoffice34->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15487 oldoffice34->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15488
15489 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
15490 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
15491 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
15492 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
15493 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
15494
15495 /**
15496 * salt
15497 */
15498
15499 salt->salt_len = 16;
15500
15501 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15502 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15503 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15504 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15505
15506 // this is a workaround as office produces multiple documents with the same salt
15507
15508 salt->salt_len += 32;
15509
15510 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
15511 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
15512 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
15513 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
15514 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
15515 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
15516 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
15517 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
15518
15519 /**
15520 * digest
15521 */
15522
15523 digest[0] = oldoffice34->encryptedVerifierHash[0];
15524 digest[1] = oldoffice34->encryptedVerifierHash[1];
15525 digest[2] = oldoffice34->encryptedVerifierHash[2];
15526 digest[3] = oldoffice34->encryptedVerifierHash[3];
15527
15528 return (PARSER_OK);
15529 }
15530
15531 int oldoffice34cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15532 {
15533 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
15534
15535 return oldoffice34_parse_hash (input_buf, input_len, hash_buf);
15536 }
15537
15538 int oldoffice34cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15539 {
15540 if ((input_len < DISPLAY_LEN_MIN_9820) || (input_len > DISPLAY_LEN_MAX_9820)) return (PARSER_GLOBAL_LENGTH);
15541
15542 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
15543
15544 u32 *digest = (u32 *) hash_buf->digest;
15545
15546 salt_t *salt = hash_buf->salt;
15547
15548 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
15549
15550 /**
15551 * parse line
15552 */
15553
15554 char *version_pos = input_buf + 11;
15555
15556 char *osalt_pos = strchr (version_pos, '*');
15557
15558 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15559
15560 u32 version_len = osalt_pos - version_pos;
15561
15562 if (version_len != 1) return (PARSER_SALT_LENGTH);
15563
15564 osalt_pos++;
15565
15566 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15567
15568 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15569
15570 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15571
15572 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15573
15574 encryptedVerifier_pos++;
15575
15576 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15577
15578 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15579
15580 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15581
15582 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15583
15584 encryptedVerifierHash_pos++;
15585
15586 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
15587
15588 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15589
15590 u32 encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
15591
15592 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
15593
15594 rc4key_pos++;
15595
15596 u32 rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
15597
15598 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
15599
15600 const uint version = *version_pos - 0x30;
15601
15602 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
15603
15604 /**
15605 * esalt
15606 */
15607
15608 oldoffice34->version = version;
15609
15610 oldoffice34->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15611 oldoffice34->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15612 oldoffice34->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15613 oldoffice34->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15614
15615 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
15616 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
15617 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
15618 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
15619
15620 oldoffice34->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15621 oldoffice34->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15622 oldoffice34->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15623 oldoffice34->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15624 oldoffice34->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15625
15626 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
15627 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
15628 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
15629 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
15630 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
15631
15632 oldoffice34->rc4key[1] = 0;
15633 oldoffice34->rc4key[0] = 0;
15634
15635 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
15636 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
15637 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
15638 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
15639 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
15640 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
15641 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
15642 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
15643 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
15644 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
15645
15646 oldoffice34->rc4key[0] = byte_swap_32 (oldoffice34->rc4key[0]);
15647 oldoffice34->rc4key[1] = byte_swap_32 (oldoffice34->rc4key[1]);
15648
15649 /**
15650 * salt
15651 */
15652
15653 salt->salt_len = 16;
15654
15655 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15656 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15657 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15658 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15659
15660 // this is a workaround as office produces multiple documents with the same salt
15661
15662 salt->salt_len += 32;
15663
15664 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
15665 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
15666 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
15667 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
15668 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
15669 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
15670 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
15671 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
15672
15673 /**
15674 * digest
15675 */
15676
15677 digest[0] = oldoffice34->rc4key[0];
15678 digest[1] = oldoffice34->rc4key[1];
15679 digest[2] = 0;
15680 digest[3] = 0;
15681
15682 return (PARSER_OK);
15683 }
15684
15685 int radmin2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15686 {
15687 if ((input_len < DISPLAY_LEN_MIN_9900) || (input_len > DISPLAY_LEN_MAX_9900)) return (PARSER_GLOBAL_LENGTH);
15688
15689 u32 *digest = (u32 *) hash_buf->digest;
15690
15691 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
15692 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
15693 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
15694 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
15695
15696 digest[0] = byte_swap_32 (digest[0]);
15697 digest[1] = byte_swap_32 (digest[1]);
15698 digest[2] = byte_swap_32 (digest[2]);
15699 digest[3] = byte_swap_32 (digest[3]);
15700
15701 return (PARSER_OK);
15702 }
15703
15704 int djangosha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15705 {
15706 if ((input_len < DISPLAY_LEN_MIN_124) || (input_len > DISPLAY_LEN_MAX_124)) return (PARSER_GLOBAL_LENGTH);
15707
15708 if ((memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5)) && (memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
15709
15710 u32 *digest = (u32 *) hash_buf->digest;
15711
15712 salt_t *salt = hash_buf->salt;
15713
15714 char *signature_pos = input_buf;
15715
15716 char *salt_pos = strchr (signature_pos, '$');
15717
15718 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15719
15720 u32 signature_len = salt_pos - signature_pos;
15721
15722 if (signature_len != 4) return (PARSER_SIGNATURE_UNMATCHED);
15723
15724 salt_pos++;
15725
15726 char *hash_pos = strchr (salt_pos, '$');
15727
15728 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15729
15730 u32 salt_len = hash_pos - salt_pos;
15731
15732 if (salt_len > 32) return (PARSER_SALT_LENGTH);
15733
15734 hash_pos++;
15735
15736 u32 hash_len = input_len - signature_len - 1 - salt_len - 1;
15737
15738 if (hash_len != 40) return (PARSER_SALT_LENGTH);
15739
15740 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
15741 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
15742 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
15743 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
15744 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
15745
15746 digest[0] -= SHA1M_A;
15747 digest[1] -= SHA1M_B;
15748 digest[2] -= SHA1M_C;
15749 digest[3] -= SHA1M_D;
15750 digest[4] -= SHA1M_E;
15751
15752 char *salt_buf_ptr = (char *) salt->salt_buf;
15753
15754 memcpy (salt_buf_ptr, salt_pos, salt_len);
15755
15756 salt->salt_len = salt_len;
15757
15758 return (PARSER_OK);
15759 }
15760
15761 int djangopbkdf2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15762 {
15763 if ((input_len < DISPLAY_LEN_MIN_10000) || (input_len > DISPLAY_LEN_MAX_10000)) return (PARSER_GLOBAL_LENGTH);
15764
15765 if (memcmp (SIGNATURE_DJANGOPBKDF2, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
15766
15767 u32 *digest = (u32 *) hash_buf->digest;
15768
15769 salt_t *salt = hash_buf->salt;
15770
15771 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
15772
15773 /**
15774 * parse line
15775 */
15776
15777 char *iter_pos = input_buf + 14;
15778
15779 const int iter = atoi (iter_pos);
15780
15781 if (iter < 1) return (PARSER_SALT_ITERATION);
15782
15783 salt->salt_iter = iter - 1;
15784
15785 char *salt_pos = strchr (iter_pos, '$');
15786
15787 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15788
15789 salt_pos++;
15790
15791 char *hash_pos = strchr (salt_pos, '$');
15792
15793 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15794
15795 const uint salt_len = hash_pos - salt_pos;
15796
15797 hash_pos++;
15798
15799 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
15800
15801 memcpy (salt_buf_ptr, salt_pos, salt_len);
15802
15803 salt->salt_len = salt_len;
15804
15805 salt_buf_ptr[salt_len + 3] = 0x01;
15806 salt_buf_ptr[salt_len + 4] = 0x80;
15807
15808 // add some stuff to normal salt to make sorted happy
15809
15810 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
15811 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
15812 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
15813 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
15814 salt->salt_buf[4] = salt->salt_iter;
15815
15816 // base64 decode hash
15817
15818 u8 tmp_buf[100] = { 0 };
15819
15820 uint hash_len = input_len - (hash_pos - input_buf);
15821
15822 if (hash_len != 44) return (PARSER_HASH_LENGTH);
15823
15824 base64_decode (base64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
15825
15826 memcpy (digest, tmp_buf, 32);
15827
15828 digest[0] = byte_swap_32 (digest[0]);
15829 digest[1] = byte_swap_32 (digest[1]);
15830 digest[2] = byte_swap_32 (digest[2]);
15831 digest[3] = byte_swap_32 (digest[3]);
15832 digest[4] = byte_swap_32 (digest[4]);
15833 digest[5] = byte_swap_32 (digest[5]);
15834 digest[6] = byte_swap_32 (digest[6]);
15835 digest[7] = byte_swap_32 (digest[7]);
15836
15837 return (PARSER_OK);
15838 }
15839
15840 int siphash_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15841 {
15842 if ((input_len < DISPLAY_LEN_MIN_10100) || (input_len > DISPLAY_LEN_MAX_10100)) return (PARSER_GLOBAL_LENGTH);
15843
15844 u32 *digest = (u32 *) hash_buf->digest;
15845
15846 salt_t *salt = hash_buf->salt;
15847
15848 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
15849 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
15850 digest[2] = 0;
15851 digest[3] = 0;
15852
15853 digest[0] = byte_swap_32 (digest[0]);
15854 digest[1] = byte_swap_32 (digest[1]);
15855
15856 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15857 if (input_buf[18] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15858 if (input_buf[20] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15859
15860 char iter_c = input_buf[17];
15861 char iter_d = input_buf[19];
15862
15863 // atm only defaults, let's see if there's more request
15864 if (iter_c != '2') return (PARSER_SALT_ITERATION);
15865 if (iter_d != '4') return (PARSER_SALT_ITERATION);
15866
15867 char *salt_buf = input_buf + 16 + 1 + 1 + 1 + 1 + 1;
15868
15869 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
15870 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
15871 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
15872 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf[24]);
15873
15874 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15875 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15876 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15877 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15878
15879 salt->salt_len = 16;
15880
15881 return (PARSER_OK);
15882 }
15883
15884 int crammd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15885 {
15886 if ((input_len < DISPLAY_LEN_MIN_10200) || (input_len > DISPLAY_LEN_MAX_10200)) return (PARSER_GLOBAL_LENGTH);
15887
15888 if (memcmp (SIGNATURE_CRAM_MD5, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
15889
15890 u32 *digest = (u32 *) hash_buf->digest;
15891
15892 cram_md5_t *cram_md5 = (cram_md5_t *) hash_buf->esalt;
15893
15894 salt_t *salt = hash_buf->salt;
15895
15896 char *salt_pos = input_buf + 10;
15897
15898 char *hash_pos = strchr (salt_pos, '$');
15899
15900 uint salt_len = hash_pos - salt_pos;
15901
15902 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15903
15904 hash_pos++;
15905
15906 uint hash_len = input_len - 10 - salt_len - 1;
15907
15908 // base64 decode salt
15909
15910 u8 tmp_buf[100] = { 0 };
15911
15912 salt_len = base64_decode (base64_to_int, (const u8 *) salt_pos, salt_len, tmp_buf);
15913
15914 if (salt_len > 55) return (PARSER_SALT_LENGTH);
15915
15916 tmp_buf[salt_len] = 0x80;
15917
15918 memcpy (&salt->salt_buf, tmp_buf, salt_len + 1);
15919
15920 salt->salt_len = salt_len;
15921
15922 // base64 decode salt
15923
15924 memset (tmp_buf, 0, sizeof (tmp_buf));
15925
15926 hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
15927
15928 uint user_len = hash_len - 32;
15929
15930 const u8 *tmp_hash = tmp_buf + user_len;
15931
15932 user_len--; // skip the trailing space
15933
15934 digest[0] = hex_to_u32 (&tmp_hash[ 0]);
15935 digest[1] = hex_to_u32 (&tmp_hash[ 8]);
15936 digest[2] = hex_to_u32 (&tmp_hash[16]);
15937 digest[3] = hex_to_u32 (&tmp_hash[24]);
15938
15939 digest[0] = byte_swap_32 (digest[0]);
15940 digest[1] = byte_swap_32 (digest[1]);
15941 digest[2] = byte_swap_32 (digest[2]);
15942 digest[3] = byte_swap_32 (digest[3]);
15943
15944 // store username for host only (output hash if cracked)
15945
15946 memset (cram_md5->user, 0, sizeof (cram_md5->user));
15947 memcpy (cram_md5->user, tmp_buf, user_len);
15948
15949 return (PARSER_OK);
15950 }
15951
15952 int saph_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15953 {
15954 if ((input_len < DISPLAY_LEN_MIN_10300) || (input_len > DISPLAY_LEN_MAX_10300)) return (PARSER_GLOBAL_LENGTH);
15955
15956 if (memcmp (SIGNATURE_SAPH_SHA1, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
15957
15958 u32 *digest = (u32 *) hash_buf->digest;
15959
15960 salt_t *salt = hash_buf->salt;
15961
15962 char *iter_pos = input_buf + 10;
15963
15964 u32 iter = atoi (iter_pos);
15965
15966 if (iter < 1)
15967 {
15968 return (PARSER_SALT_ITERATION);
15969 }
15970
15971 iter--; // first iteration is special
15972
15973 salt->salt_iter = iter;
15974
15975 char *base64_pos = strchr (iter_pos, '}');
15976
15977 if (base64_pos == NULL)
15978 {
15979 return (PARSER_SIGNATURE_UNMATCHED);
15980 }
15981
15982 base64_pos++;
15983
15984 // base64 decode salt
15985
15986 u32 base64_len = input_len - (base64_pos - input_buf);
15987
15988 u8 tmp_buf[100] = { 0 };
15989
15990 u32 decoded_len = base64_decode (base64_to_int, (const u8 *) base64_pos, base64_len, tmp_buf);
15991
15992 if (decoded_len < 24)
15993 {
15994 return (PARSER_SALT_LENGTH);
15995 }
15996
15997 // copy the salt
15998
15999 uint salt_len = decoded_len - 20;
16000
16001 if (salt_len < 4) return (PARSER_SALT_LENGTH);
16002 if (salt_len > 16) return (PARSER_SALT_LENGTH);
16003
16004 memcpy (&salt->salt_buf, tmp_buf + 20, salt_len);
16005
16006 salt->salt_len = salt_len;
16007
16008 // set digest
16009
16010 u32 *digest_ptr = (u32*) tmp_buf;
16011
16012 digest[0] = byte_swap_32 (digest_ptr[0]);
16013 digest[1] = byte_swap_32 (digest_ptr[1]);
16014 digest[2] = byte_swap_32 (digest_ptr[2]);
16015 digest[3] = byte_swap_32 (digest_ptr[3]);
16016 digest[4] = byte_swap_32 (digest_ptr[4]);
16017
16018 return (PARSER_OK);
16019 }
16020
16021 int redmine_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16022 {
16023 if ((input_len < DISPLAY_LEN_MIN_7600) || (input_len > DISPLAY_LEN_MAX_7600)) return (PARSER_GLOBAL_LENGTH);
16024
16025 u32 *digest = (u32 *) hash_buf->digest;
16026
16027 salt_t *salt = hash_buf->salt;
16028
16029 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
16030 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
16031 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
16032 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
16033 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
16034
16035 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16036
16037 uint salt_len = input_len - 40 - 1;
16038
16039 char *salt_buf = input_buf + 40 + 1;
16040
16041 char *salt_buf_ptr = (char *) salt->salt_buf;
16042
16043 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
16044
16045 if (salt_len != 32) return (PARSER_SALT_LENGTH);
16046
16047 salt->salt_len = salt_len;
16048
16049 return (PARSER_OK);
16050 }
16051
16052 int pdf11_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16053 {
16054 if ((input_len < DISPLAY_LEN_MIN_10400) || (input_len > DISPLAY_LEN_MAX_10400)) return (PARSER_GLOBAL_LENGTH);
16055
16056 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16057
16058 u32 *digest = (u32 *) hash_buf->digest;
16059
16060 salt_t *salt = hash_buf->salt;
16061
16062 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16063
16064 /**
16065 * parse line
16066 */
16067
16068 char *V_pos = input_buf + 5;
16069
16070 char *R_pos = strchr (V_pos, '*');
16071
16072 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16073
16074 u32 V_len = R_pos - V_pos;
16075
16076 R_pos++;
16077
16078 char *bits_pos = strchr (R_pos, '*');
16079
16080 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16081
16082 u32 R_len = bits_pos - R_pos;
16083
16084 bits_pos++;
16085
16086 char *P_pos = strchr (bits_pos, '*');
16087
16088 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16089
16090 u32 bits_len = P_pos - bits_pos;
16091
16092 P_pos++;
16093
16094 char *enc_md_pos = strchr (P_pos, '*');
16095
16096 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16097
16098 u32 P_len = enc_md_pos - P_pos;
16099
16100 enc_md_pos++;
16101
16102 char *id_len_pos = strchr (enc_md_pos, '*');
16103
16104 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16105
16106 u32 enc_md_len = id_len_pos - enc_md_pos;
16107
16108 id_len_pos++;
16109
16110 char *id_buf_pos = strchr (id_len_pos, '*');
16111
16112 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16113
16114 u32 id_len_len = id_buf_pos - id_len_pos;
16115
16116 id_buf_pos++;
16117
16118 char *u_len_pos = strchr (id_buf_pos, '*');
16119
16120 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16121
16122 u32 id_buf_len = u_len_pos - id_buf_pos;
16123
16124 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
16125
16126 u_len_pos++;
16127
16128 char *u_buf_pos = strchr (u_len_pos, '*');
16129
16130 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16131
16132 u32 u_len_len = u_buf_pos - u_len_pos;
16133
16134 u_buf_pos++;
16135
16136 char *o_len_pos = strchr (u_buf_pos, '*');
16137
16138 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16139
16140 u32 u_buf_len = o_len_pos - u_buf_pos;
16141
16142 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16143
16144 o_len_pos++;
16145
16146 char *o_buf_pos = strchr (o_len_pos, '*');
16147
16148 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16149
16150 u32 o_len_len = o_buf_pos - o_len_pos;
16151
16152 o_buf_pos++;
16153
16154 u32 o_buf_len = input_len - 5 - V_len - 1 - R_len - 1 - bits_len - 1 - P_len - 1 - enc_md_len - 1 - id_len_len - 1 - id_buf_len - 1 - u_len_len - 1 - u_buf_len - 1 - o_len_len - 1;
16155
16156 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16157
16158 // validate data
16159
16160 const int V = atoi (V_pos);
16161 const int R = atoi (R_pos);
16162 const int P = atoi (P_pos);
16163
16164 if (V != 1) return (PARSER_SALT_VALUE);
16165 if (R != 2) return (PARSER_SALT_VALUE);
16166
16167 const int enc_md = atoi (enc_md_pos);
16168
16169 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
16170
16171 const int id_len = atoi (id_len_pos);
16172 const int u_len = atoi (u_len_pos);
16173 const int o_len = atoi (o_len_pos);
16174
16175 if (id_len != 16) return (PARSER_SALT_VALUE);
16176 if (u_len != 32) return (PARSER_SALT_VALUE);
16177 if (o_len != 32) return (PARSER_SALT_VALUE);
16178
16179 const int bits = atoi (bits_pos);
16180
16181 if (bits != 40) return (PARSER_SALT_VALUE);
16182
16183 // copy data to esalt
16184
16185 pdf->V = V;
16186 pdf->R = R;
16187 pdf->P = P;
16188
16189 pdf->enc_md = enc_md;
16190
16191 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
16192 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
16193 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
16194 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
16195 pdf->id_len = id_len;
16196
16197 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
16198 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
16199 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
16200 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
16201 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
16202 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
16203 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
16204 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
16205 pdf->u_len = u_len;
16206
16207 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
16208 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
16209 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
16210 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
16211 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
16212 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
16213 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
16214 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
16215 pdf->o_len = o_len;
16216
16217 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16218 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16219 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16220 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16221
16222 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16223 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16224 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16225 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16226 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16227 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16228 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16229 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16230
16231 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16232 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16233 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16234 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16235 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16236 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16237 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16238 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16239
16240 // we use ID for salt, maybe needs to change, we will see...
16241
16242 salt->salt_buf[0] = pdf->id_buf[0];
16243 salt->salt_buf[1] = pdf->id_buf[1];
16244 salt->salt_buf[2] = pdf->id_buf[2];
16245 salt->salt_buf[3] = pdf->id_buf[3];
16246 salt->salt_len = pdf->id_len;
16247
16248 digest[0] = pdf->u_buf[0];
16249 digest[1] = pdf->u_buf[1];
16250 digest[2] = pdf->u_buf[2];
16251 digest[3] = pdf->u_buf[3];
16252
16253 return (PARSER_OK);
16254 }
16255
16256 int pdf11cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16257 {
16258 return pdf11_parse_hash (input_buf, input_len, hash_buf);
16259 }
16260
16261 int pdf11cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16262 {
16263 if ((input_len < DISPLAY_LEN_MIN_10420) || (input_len > DISPLAY_LEN_MAX_10420)) return (PARSER_GLOBAL_LENGTH);
16264
16265 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16266
16267 u32 *digest = (u32 *) hash_buf->digest;
16268
16269 salt_t *salt = hash_buf->salt;
16270
16271 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16272
16273 /**
16274 * parse line
16275 */
16276
16277 char *V_pos = input_buf + 5;
16278
16279 char *R_pos = strchr (V_pos, '*');
16280
16281 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16282
16283 u32 V_len = R_pos - V_pos;
16284
16285 R_pos++;
16286
16287 char *bits_pos = strchr (R_pos, '*');
16288
16289 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16290
16291 u32 R_len = bits_pos - R_pos;
16292
16293 bits_pos++;
16294
16295 char *P_pos = strchr (bits_pos, '*');
16296
16297 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16298
16299 u32 bits_len = P_pos - bits_pos;
16300
16301 P_pos++;
16302
16303 char *enc_md_pos = strchr (P_pos, '*');
16304
16305 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16306
16307 u32 P_len = enc_md_pos - P_pos;
16308
16309 enc_md_pos++;
16310
16311 char *id_len_pos = strchr (enc_md_pos, '*');
16312
16313 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16314
16315 u32 enc_md_len = id_len_pos - enc_md_pos;
16316
16317 id_len_pos++;
16318
16319 char *id_buf_pos = strchr (id_len_pos, '*');
16320
16321 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16322
16323 u32 id_len_len = id_buf_pos - id_len_pos;
16324
16325 id_buf_pos++;
16326
16327 char *u_len_pos = strchr (id_buf_pos, '*');
16328
16329 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16330
16331 u32 id_buf_len = u_len_pos - id_buf_pos;
16332
16333 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
16334
16335 u_len_pos++;
16336
16337 char *u_buf_pos = strchr (u_len_pos, '*');
16338
16339 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16340
16341 u32 u_len_len = u_buf_pos - u_len_pos;
16342
16343 u_buf_pos++;
16344
16345 char *o_len_pos = strchr (u_buf_pos, '*');
16346
16347 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16348
16349 u32 u_buf_len = o_len_pos - u_buf_pos;
16350
16351 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16352
16353 o_len_pos++;
16354
16355 char *o_buf_pos = strchr (o_len_pos, '*');
16356
16357 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16358
16359 u32 o_len_len = o_buf_pos - o_len_pos;
16360
16361 o_buf_pos++;
16362
16363 char *rc4key_pos = strchr (o_buf_pos, ':');
16364
16365 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16366
16367 u32 o_buf_len = rc4key_pos - o_buf_pos;
16368
16369 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16370
16371 rc4key_pos++;
16372
16373 u32 rc4key_len = input_len - 5 - V_len - 1 - R_len - 1 - bits_len - 1 - P_len - 1 - enc_md_len - 1 - id_len_len - 1 - id_buf_len - 1 - u_len_len - 1 - u_buf_len - 1 - o_len_len - 1 - o_buf_len - 1;
16374
16375 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
16376
16377 // validate data
16378
16379 const int V = atoi (V_pos);
16380 const int R = atoi (R_pos);
16381 const int P = atoi (P_pos);
16382
16383 if (V != 1) return (PARSER_SALT_VALUE);
16384 if (R != 2) return (PARSER_SALT_VALUE);
16385
16386 const int enc_md = atoi (enc_md_pos);
16387
16388 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
16389
16390 const int id_len = atoi (id_len_pos);
16391 const int u_len = atoi (u_len_pos);
16392 const int o_len = atoi (o_len_pos);
16393
16394 if (id_len != 16) return (PARSER_SALT_VALUE);
16395 if (u_len != 32) return (PARSER_SALT_VALUE);
16396 if (o_len != 32) return (PARSER_SALT_VALUE);
16397
16398 const int bits = atoi (bits_pos);
16399
16400 if (bits != 40) return (PARSER_SALT_VALUE);
16401
16402 // copy data to esalt
16403
16404 pdf->V = V;
16405 pdf->R = R;
16406 pdf->P = P;
16407
16408 pdf->enc_md = enc_md;
16409
16410 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
16411 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
16412 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
16413 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
16414 pdf->id_len = id_len;
16415
16416 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
16417 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
16418 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
16419 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
16420 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
16421 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
16422 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
16423 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
16424 pdf->u_len = u_len;
16425
16426 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
16427 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
16428 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
16429 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
16430 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
16431 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
16432 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
16433 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
16434 pdf->o_len = o_len;
16435
16436 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16437 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16438 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16439 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16440
16441 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16442 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16443 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16444 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16445 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16446 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16447 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16448 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16449
16450 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16451 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16452 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16453 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16454 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16455 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16456 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16457 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16458
16459 pdf->rc4key[1] = 0;
16460 pdf->rc4key[0] = 0;
16461
16462 pdf->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
16463 pdf->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
16464 pdf->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
16465 pdf->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
16466 pdf->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
16467 pdf->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
16468 pdf->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
16469 pdf->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
16470 pdf->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
16471 pdf->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
16472
16473 pdf->rc4key[0] = byte_swap_32 (pdf->rc4key[0]);
16474 pdf->rc4key[1] = byte_swap_32 (pdf->rc4key[1]);
16475
16476 // we use ID for salt, maybe needs to change, we will see...
16477
16478 salt->salt_buf[0] = pdf->id_buf[0];
16479 salt->salt_buf[1] = pdf->id_buf[1];
16480 salt->salt_buf[2] = pdf->id_buf[2];
16481 salt->salt_buf[3] = pdf->id_buf[3];
16482 salt->salt_buf[4] = pdf->u_buf[0];
16483 salt->salt_buf[5] = pdf->u_buf[1];
16484 salt->salt_buf[6] = pdf->o_buf[0];
16485 salt->salt_buf[7] = pdf->o_buf[1];
16486 salt->salt_len = pdf->id_len + 16;
16487
16488 digest[0] = pdf->rc4key[0];
16489 digest[1] = pdf->rc4key[1];
16490 digest[2] = 0;
16491 digest[3] = 0;
16492
16493 return (PARSER_OK);
16494 }
16495
16496 int pdf14_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16497 {
16498 if ((input_len < DISPLAY_LEN_MIN_10500) || (input_len > DISPLAY_LEN_MAX_10500)) return (PARSER_GLOBAL_LENGTH);
16499
16500 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16501
16502 u32 *digest = (u32 *) hash_buf->digest;
16503
16504 salt_t *salt = hash_buf->salt;
16505
16506 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16507
16508 /**
16509 * parse line
16510 */
16511
16512 char *V_pos = input_buf + 5;
16513
16514 char *R_pos = strchr (V_pos, '*');
16515
16516 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16517
16518 u32 V_len = R_pos - V_pos;
16519
16520 R_pos++;
16521
16522 char *bits_pos = strchr (R_pos, '*');
16523
16524 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16525
16526 u32 R_len = bits_pos - R_pos;
16527
16528 bits_pos++;
16529
16530 char *P_pos = strchr (bits_pos, '*');
16531
16532 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16533
16534 u32 bits_len = P_pos - bits_pos;
16535
16536 P_pos++;
16537
16538 char *enc_md_pos = strchr (P_pos, '*');
16539
16540 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16541
16542 u32 P_len = enc_md_pos - P_pos;
16543
16544 enc_md_pos++;
16545
16546 char *id_len_pos = strchr (enc_md_pos, '*');
16547
16548 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16549
16550 u32 enc_md_len = id_len_pos - enc_md_pos;
16551
16552 id_len_pos++;
16553
16554 char *id_buf_pos = strchr (id_len_pos, '*');
16555
16556 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16557
16558 u32 id_len_len = id_buf_pos - id_len_pos;
16559
16560 id_buf_pos++;
16561
16562 char *u_len_pos = strchr (id_buf_pos, '*');
16563
16564 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16565
16566 u32 id_buf_len = u_len_pos - id_buf_pos;
16567
16568 if ((id_buf_len != 32) && (id_buf_len != 64)) return (PARSER_SALT_LENGTH);
16569
16570 u_len_pos++;
16571
16572 char *u_buf_pos = strchr (u_len_pos, '*');
16573
16574 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16575
16576 u32 u_len_len = u_buf_pos - u_len_pos;
16577
16578 u_buf_pos++;
16579
16580 char *o_len_pos = strchr (u_buf_pos, '*');
16581
16582 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16583
16584 u32 u_buf_len = o_len_pos - u_buf_pos;
16585
16586 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16587
16588 o_len_pos++;
16589
16590 char *o_buf_pos = strchr (o_len_pos, '*');
16591
16592 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16593
16594 u32 o_len_len = o_buf_pos - o_len_pos;
16595
16596 o_buf_pos++;
16597
16598 u32 o_buf_len = input_len - 5 - V_len - 1 - R_len - 1 - bits_len - 1 - P_len - 1 - enc_md_len - 1 - id_len_len - 1 - id_buf_len - 1 - u_len_len - 1 - u_buf_len - 1 - o_len_len - 1;
16599
16600 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16601
16602 // validate data
16603
16604 const int V = atoi (V_pos);
16605 const int R = atoi (R_pos);
16606 const int P = atoi (P_pos);
16607
16608 int vr_ok = 0;
16609
16610 if ((V == 2) && (R == 3)) vr_ok = 1;
16611 if ((V == 4) && (R == 4)) vr_ok = 1;
16612
16613 if (vr_ok == 0) return (PARSER_SALT_VALUE);
16614
16615 const int id_len = atoi (id_len_pos);
16616 const int u_len = atoi (u_len_pos);
16617 const int o_len = atoi (o_len_pos);
16618
16619 if ((id_len != 16) && (id_len != 32)) return (PARSER_SALT_VALUE);
16620
16621 if (u_len != 32) return (PARSER_SALT_VALUE);
16622 if (o_len != 32) return (PARSER_SALT_VALUE);
16623
16624 const int bits = atoi (bits_pos);
16625
16626 if (bits != 128) return (PARSER_SALT_VALUE);
16627
16628 int enc_md = 1;
16629
16630 if (R >= 4)
16631 {
16632 enc_md = atoi (enc_md_pos);
16633 }
16634
16635 // copy data to esalt
16636
16637 pdf->V = V;
16638 pdf->R = R;
16639 pdf->P = P;
16640
16641 pdf->enc_md = enc_md;
16642
16643 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
16644 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
16645 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
16646 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
16647
16648 if (id_len == 32)
16649 {
16650 pdf->id_buf[4] = hex_to_u32 ((const u8 *) &id_buf_pos[32]);
16651 pdf->id_buf[5] = hex_to_u32 ((const u8 *) &id_buf_pos[40]);
16652 pdf->id_buf[6] = hex_to_u32 ((const u8 *) &id_buf_pos[48]);
16653 pdf->id_buf[7] = hex_to_u32 ((const u8 *) &id_buf_pos[56]);
16654 }
16655
16656 pdf->id_len = id_len;
16657
16658 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
16659 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
16660 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
16661 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
16662 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
16663 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
16664 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
16665 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
16666 pdf->u_len = u_len;
16667
16668 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
16669 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
16670 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
16671 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
16672 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
16673 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
16674 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
16675 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
16676 pdf->o_len = o_len;
16677
16678 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16679 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16680 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16681 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16682
16683 if (id_len == 32)
16684 {
16685 pdf->id_buf[4] = byte_swap_32 (pdf->id_buf[4]);
16686 pdf->id_buf[5] = byte_swap_32 (pdf->id_buf[5]);
16687 pdf->id_buf[6] = byte_swap_32 (pdf->id_buf[6]);
16688 pdf->id_buf[7] = byte_swap_32 (pdf->id_buf[7]);
16689 }
16690
16691 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16692 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16693 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16694 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16695 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16696 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16697 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16698 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16699
16700 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16701 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16702 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16703 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16704 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16705 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16706 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16707 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16708
16709 // precompute rc4 data for later use
16710
16711 uint padding[8] =
16712 {
16713 0x5e4ebf28,
16714 0x418a754e,
16715 0x564e0064,
16716 0x0801faff,
16717 0xb6002e2e,
16718 0x803e68d0,
16719 0xfea90c2f,
16720 0x7a695364
16721 };
16722
16723 // md5
16724
16725 uint salt_pc_block[32] = { 0 };
16726
16727 char *salt_pc_ptr = (char *) salt_pc_block;
16728
16729 memcpy (salt_pc_ptr, padding, 32);
16730 memcpy (salt_pc_ptr + 32, pdf->id_buf, pdf->id_len);
16731
16732 uint salt_pc_digest[4] = { 0 };
16733
16734 md5_complete_no_limit (salt_pc_digest, salt_pc_block, 32 + pdf->id_len);
16735
16736 pdf->rc4data[0] = salt_pc_digest[0];
16737 pdf->rc4data[1] = salt_pc_digest[1];
16738
16739 // we use ID for salt, maybe needs to change, we will see...
16740
16741 salt->salt_buf[0] = pdf->id_buf[0];
16742 salt->salt_buf[1] = pdf->id_buf[1];
16743 salt->salt_buf[2] = pdf->id_buf[2];
16744 salt->salt_buf[3] = pdf->id_buf[3];
16745 salt->salt_buf[4] = pdf->u_buf[0];
16746 salt->salt_buf[5] = pdf->u_buf[1];
16747 salt->salt_buf[6] = pdf->o_buf[0];
16748 salt->salt_buf[7] = pdf->o_buf[1];
16749 salt->salt_len = pdf->id_len + 16;
16750
16751 salt->salt_iter = ROUNDS_PDF14;
16752
16753 digest[0] = pdf->u_buf[0];
16754 digest[1] = pdf->u_buf[1];
16755 digest[2] = 0;
16756 digest[3] = 0;
16757
16758 return (PARSER_OK);
16759 }
16760
16761 int pdf17l3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16762 {
16763 int ret = pdf17l8_parse_hash (input_buf, input_len, hash_buf);
16764
16765 if (ret != PARSER_OK)
16766 {
16767 return ret;
16768 }
16769
16770 u32 *digest = (u32 *) hash_buf->digest;
16771
16772 salt_t *salt = hash_buf->salt;
16773
16774 digest[0] -= SHA256M_A;
16775 digest[1] -= SHA256M_B;
16776 digest[2] -= SHA256M_C;
16777 digest[3] -= SHA256M_D;
16778 digest[4] -= SHA256M_E;
16779 digest[5] -= SHA256M_F;
16780 digest[6] -= SHA256M_G;
16781 digest[7] -= SHA256M_H;
16782
16783 salt->salt_buf[2] = 0x80;
16784
16785 return (PARSER_OK);
16786 }
16787
16788 int pdf17l8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16789 {
16790 if ((input_len < DISPLAY_LEN_MIN_10600) || (input_len > DISPLAY_LEN_MAX_10600)) return (PARSER_GLOBAL_LENGTH);
16791
16792 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16793
16794 u32 *digest = (u32 *) hash_buf->digest;
16795
16796 salt_t *salt = hash_buf->salt;
16797
16798 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16799
16800 /**
16801 * parse line
16802 */
16803
16804 char *V_pos = input_buf + 5;
16805
16806 char *R_pos = strchr (V_pos, '*');
16807
16808 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16809
16810 u32 V_len = R_pos - V_pos;
16811
16812 R_pos++;
16813
16814 char *bits_pos = strchr (R_pos, '*');
16815
16816 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16817
16818 u32 R_len = bits_pos - R_pos;
16819
16820 bits_pos++;
16821
16822 char *P_pos = strchr (bits_pos, '*');
16823
16824 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16825
16826 u32 bits_len = P_pos - bits_pos;
16827
16828 P_pos++;
16829
16830 char *enc_md_pos = strchr (P_pos, '*');
16831
16832 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16833
16834 u32 P_len = enc_md_pos - P_pos;
16835
16836 enc_md_pos++;
16837
16838 char *id_len_pos = strchr (enc_md_pos, '*');
16839
16840 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16841
16842 u32 enc_md_len = id_len_pos - enc_md_pos;
16843
16844 id_len_pos++;
16845
16846 char *id_buf_pos = strchr (id_len_pos, '*');
16847
16848 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16849
16850 u32 id_len_len = id_buf_pos - id_len_pos;
16851
16852 id_buf_pos++;
16853
16854 char *u_len_pos = strchr (id_buf_pos, '*');
16855
16856 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16857
16858 u32 id_buf_len = u_len_pos - id_buf_pos;
16859
16860 u_len_pos++;
16861
16862 char *u_buf_pos = strchr (u_len_pos, '*');
16863
16864 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16865
16866 u32 u_len_len = u_buf_pos - u_len_pos;
16867
16868 u_buf_pos++;
16869
16870 char *o_len_pos = strchr (u_buf_pos, '*');
16871
16872 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16873
16874 u32 u_buf_len = o_len_pos - u_buf_pos;
16875
16876 o_len_pos++;
16877
16878 char *o_buf_pos = strchr (o_len_pos, '*');
16879
16880 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16881
16882 u32 o_len_len = o_buf_pos - o_len_pos;
16883
16884 o_buf_pos++;
16885
16886 char *last = strchr (o_buf_pos, '*');
16887
16888 if (last == NULL) last = input_buf + input_len;
16889
16890 u32 o_buf_len = last - o_buf_pos;
16891
16892 // validate data
16893
16894 const int V = atoi (V_pos);
16895 const int R = atoi (R_pos);
16896
16897 int vr_ok = 0;
16898
16899 if ((V == 5) && (R == 5)) vr_ok = 1;
16900 if ((V == 5) && (R == 6)) vr_ok = 1;
16901
16902 if (vr_ok == 0) return (PARSER_SALT_VALUE);
16903
16904 const int bits = atoi (bits_pos);
16905
16906 if (bits != 256) return (PARSER_SALT_VALUE);
16907
16908 int enc_md = atoi (enc_md_pos);
16909
16910 if (enc_md != 1) return (PARSER_SALT_VALUE);
16911
16912 const uint id_len = atoi (id_len_pos);
16913 const uint u_len = atoi (u_len_pos);
16914 const uint o_len = atoi (o_len_pos);
16915
16916 if (V_len > 6) return (PARSER_SALT_LENGTH);
16917 if (R_len > 6) return (PARSER_SALT_LENGTH);
16918 if (P_len > 6) return (PARSER_SALT_LENGTH);
16919 if (id_len_len > 6) return (PARSER_SALT_LENGTH);
16920 if (u_len_len > 6) return (PARSER_SALT_LENGTH);
16921 if (o_len_len > 6) return (PARSER_SALT_LENGTH);
16922 if (bits_len > 6) return (PARSER_SALT_LENGTH);
16923 if (enc_md_len > 6) return (PARSER_SALT_LENGTH);
16924
16925 if ((id_len * 2) != id_buf_len) return (PARSER_SALT_VALUE);
16926 if ((u_len * 2) != u_buf_len) return (PARSER_SALT_VALUE);
16927 if ((o_len * 2) != o_buf_len) return (PARSER_SALT_VALUE);
16928
16929 // copy data to esalt
16930
16931 if (u_len < 40) return (PARSER_SALT_VALUE);
16932
16933 for (int i = 0, j = 0; i < 8 + 2; i += 1, j += 8)
16934 {
16935 pdf->u_buf[i] = hex_to_u32 ((const u8 *) &u_buf_pos[j]);
16936 }
16937
16938 salt->salt_buf[0] = pdf->u_buf[8];
16939 salt->salt_buf[1] = pdf->u_buf[9];
16940
16941 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
16942 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
16943
16944 salt->salt_len = 8;
16945 salt->salt_iter = ROUNDS_PDF17L8;
16946
16947 digest[0] = pdf->u_buf[0];
16948 digest[1] = pdf->u_buf[1];
16949 digest[2] = pdf->u_buf[2];
16950 digest[3] = pdf->u_buf[3];
16951 digest[4] = pdf->u_buf[4];
16952 digest[5] = pdf->u_buf[5];
16953 digest[6] = pdf->u_buf[6];
16954 digest[7] = pdf->u_buf[7];
16955
16956 return (PARSER_OK);
16957 }
16958
16959 int pbkdf2_sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16960 {
16961 if ((input_len < DISPLAY_LEN_MIN_10900) || (input_len > DISPLAY_LEN_MAX_10900)) return (PARSER_GLOBAL_LENGTH);
16962
16963 if (memcmp (SIGNATURE_PBKDF2_SHA256, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
16964
16965 u32 *digest = (u32 *) hash_buf->digest;
16966
16967 salt_t *salt = hash_buf->salt;
16968
16969 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
16970
16971 /**
16972 * parse line
16973 */
16974
16975 // iterations
16976
16977 char *iter_pos = input_buf + 7;
16978
16979 u32 iter = atoi (iter_pos);
16980
16981 if (iter < 1) return (PARSER_SALT_ITERATION);
16982 if (iter > 999999) return (PARSER_SALT_ITERATION);
16983
16984 // first is *raw* salt
16985
16986 char *salt_pos = strchr (iter_pos, ':');
16987
16988 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16989
16990 salt_pos++;
16991
16992 char *hash_pos = strchr (salt_pos, ':');
16993
16994 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16995
16996 u32 salt_len = hash_pos - salt_pos;
16997
16998 if (salt_len > 64) return (PARSER_SALT_LENGTH);
16999
17000 hash_pos++;
17001
17002 u32 hash_b64_len = input_len - (hash_pos - input_buf);
17003
17004 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
17005
17006 // decode salt
17007
17008 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
17009
17010 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
17011
17012 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17013
17014 salt_buf_ptr[salt_len + 3] = 0x01;
17015 salt_buf_ptr[salt_len + 4] = 0x80;
17016
17017 salt->salt_len = salt_len;
17018 salt->salt_iter = iter - 1;
17019
17020 // decode hash
17021
17022 u8 tmp_buf[100] = { 0 };
17023
17024 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
17025
17026 if (hash_len < 16) return (PARSER_HASH_LENGTH);
17027
17028 memcpy (digest, tmp_buf, 16);
17029
17030 digest[0] = byte_swap_32 (digest[0]);
17031 digest[1] = byte_swap_32 (digest[1]);
17032 digest[2] = byte_swap_32 (digest[2]);
17033 digest[3] = byte_swap_32 (digest[3]);
17034
17035 // add some stuff to normal salt to make sorted happy
17036
17037 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
17038 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
17039 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
17040 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
17041 salt->salt_buf[4] = salt->salt_iter;
17042
17043 return (PARSER_OK);
17044 }
17045
17046 int prestashop_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17047 {
17048 if ((input_len < DISPLAY_LEN_MIN_11000) || (input_len > DISPLAY_LEN_MAX_11000)) return (PARSER_GLOBAL_LENGTH);
17049
17050 u32 *digest = (u32 *) hash_buf->digest;
17051
17052 salt_t *salt = hash_buf->salt;
17053
17054 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
17055 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
17056 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
17057 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
17058
17059 digest[0] = byte_swap_32 (digest[0]);
17060 digest[1] = byte_swap_32 (digest[1]);
17061 digest[2] = byte_swap_32 (digest[2]);
17062 digest[3] = byte_swap_32 (digest[3]);
17063
17064 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
17065
17066 uint salt_len = input_len - 32 - 1;
17067
17068 char *salt_buf = input_buf + 32 + 1;
17069
17070 char *salt_buf_ptr = (char *) salt->salt_buf;
17071
17072 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
17073
17074 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17075
17076 salt->salt_len = salt_len;
17077
17078 return (PARSER_OK);
17079 }
17080
17081 int postgresql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17082 {
17083 if ((input_len < DISPLAY_LEN_MIN_11100) || (input_len > DISPLAY_LEN_MAX_11100)) return (PARSER_GLOBAL_LENGTH);
17084
17085 if (memcmp (SIGNATURE_POSTGRESQL_AUTH, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
17086
17087 u32 *digest = (u32 *) hash_buf->digest;
17088
17089 salt_t *salt = hash_buf->salt;
17090
17091 char *user_pos = input_buf + 10;
17092
17093 char *salt_pos = strchr (user_pos, '*');
17094
17095 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17096
17097 salt_pos++;
17098
17099 char *hash_pos = strchr (salt_pos, '*');
17100
17101 hash_pos++;
17102
17103 uint hash_len = input_len - (hash_pos - input_buf);
17104
17105 if (hash_len != 32) return (PARSER_HASH_LENGTH);
17106
17107 uint user_len = salt_pos - user_pos - 1;
17108
17109 uint salt_len = hash_pos - salt_pos - 1;
17110
17111 if (salt_len != 8) return (PARSER_SALT_LENGTH);
17112
17113 /*
17114 * store digest
17115 */
17116
17117 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
17118 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
17119 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
17120 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
17121
17122 digest[0] = byte_swap_32 (digest[0]);
17123 digest[1] = byte_swap_32 (digest[1]);
17124 digest[2] = byte_swap_32 (digest[2]);
17125 digest[3] = byte_swap_32 (digest[3]);
17126
17127 digest[0] -= MD5M_A;
17128 digest[1] -= MD5M_B;
17129 digest[2] -= MD5M_C;
17130 digest[3] -= MD5M_D;
17131
17132 /*
17133 * store salt
17134 */
17135
17136 char *salt_buf_ptr = (char *) salt->salt_buf;
17137
17138 // first 4 bytes are the "challenge"
17139
17140 salt_buf_ptr[0] = hex_to_u8 ((const u8 *) &salt_pos[0]);
17141 salt_buf_ptr[1] = hex_to_u8 ((const u8 *) &salt_pos[2]);
17142 salt_buf_ptr[2] = hex_to_u8 ((const u8 *) &salt_pos[4]);
17143 salt_buf_ptr[3] = hex_to_u8 ((const u8 *) &salt_pos[6]);
17144
17145 // append the user name
17146
17147 user_len = parse_and_store_salt (salt_buf_ptr + 4, user_pos, user_len);
17148
17149 salt->salt_len = 4 + user_len;
17150
17151 return (PARSER_OK);
17152 }
17153
17154 int mysql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17155 {
17156 if ((input_len < DISPLAY_LEN_MIN_11200) || (input_len > DISPLAY_LEN_MAX_11200)) return (PARSER_GLOBAL_LENGTH);
17157
17158 if (memcmp (SIGNATURE_MYSQL_AUTH, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
17159
17160 u32 *digest = (u32 *) hash_buf->digest;
17161
17162 salt_t *salt = hash_buf->salt;
17163
17164 char *salt_pos = input_buf + 9;
17165
17166 char *hash_pos = strchr (salt_pos, '*');
17167
17168 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17169
17170 hash_pos++;
17171
17172 uint hash_len = input_len - (hash_pos - input_buf);
17173
17174 if (hash_len != 40) return (PARSER_HASH_LENGTH);
17175
17176 uint salt_len = hash_pos - salt_pos - 1;
17177
17178 if (salt_len != 40) return (PARSER_SALT_LENGTH);
17179
17180 /*
17181 * store digest
17182 */
17183
17184 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
17185 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
17186 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
17187 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
17188 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
17189
17190 /*
17191 * store salt
17192 */
17193
17194 char *salt_buf_ptr = (char *) salt->salt_buf;
17195
17196 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
17197
17198 salt->salt_len = salt_len;
17199
17200 return (PARSER_OK);
17201 }
17202
17203 int bitcoin_wallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17204 {
17205 if ((input_len < DISPLAY_LEN_MIN_11300) || (input_len > DISPLAY_LEN_MAX_11300)) return (PARSER_GLOBAL_LENGTH);
17206
17207 if (memcmp (SIGNATURE_BITCOIN_WALLET, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
17208
17209 u32 *digest = (u32 *) hash_buf->digest;
17210
17211 salt_t *salt = hash_buf->salt;
17212
17213 bitcoin_wallet_t *bitcoin_wallet = (bitcoin_wallet_t *) hash_buf->esalt;
17214
17215 /**
17216 * parse line
17217 */
17218
17219 char *cry_master_len_pos = input_buf + 9;
17220
17221 char *cry_master_buf_pos = strchr (cry_master_len_pos, '$');
17222
17223 if (cry_master_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17224
17225 u32 cry_master_len_len = cry_master_buf_pos - cry_master_len_pos;
17226
17227 cry_master_buf_pos++;
17228
17229 char *cry_salt_len_pos = strchr (cry_master_buf_pos, '$');
17230
17231 if (cry_salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17232
17233 u32 cry_master_buf_len = cry_salt_len_pos - cry_master_buf_pos;
17234
17235 cry_salt_len_pos++;
17236
17237 char *cry_salt_buf_pos = strchr (cry_salt_len_pos, '$');
17238
17239 if (cry_salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17240
17241 u32 cry_salt_len_len = cry_salt_buf_pos - cry_salt_len_pos;
17242
17243 cry_salt_buf_pos++;
17244
17245 char *cry_rounds_pos = strchr (cry_salt_buf_pos, '$');
17246
17247 if (cry_rounds_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17248
17249 u32 cry_salt_buf_len = cry_rounds_pos - cry_salt_buf_pos;
17250
17251 cry_rounds_pos++;
17252
17253 char *ckey_len_pos = strchr (cry_rounds_pos, '$');
17254
17255 if (ckey_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17256
17257 u32 cry_rounds_len = ckey_len_pos - cry_rounds_pos;
17258
17259 ckey_len_pos++;
17260
17261 char *ckey_buf_pos = strchr (ckey_len_pos, '$');
17262
17263 if (ckey_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17264
17265 u32 ckey_len_len = ckey_buf_pos - ckey_len_pos;
17266
17267 ckey_buf_pos++;
17268
17269 char *public_key_len_pos = strchr (ckey_buf_pos, '$');
17270
17271 if (public_key_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17272
17273 u32 ckey_buf_len = public_key_len_pos - ckey_buf_pos;
17274
17275 public_key_len_pos++;
17276
17277 char *public_key_buf_pos = strchr (public_key_len_pos, '$');
17278
17279 if (public_key_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17280
17281 u32 public_key_len_len = public_key_buf_pos - public_key_len_pos;
17282
17283 public_key_buf_pos++;
17284
17285 u32 public_key_buf_len = input_len - 1 - 7 - 1 - cry_master_len_len - 1 - cry_master_buf_len - 1 - cry_salt_len_len - 1 - cry_salt_buf_len - 1 - cry_rounds_len - 1 - ckey_len_len - 1 - ckey_buf_len - 1 - public_key_len_len - 1;
17286
17287 const uint cry_master_len = atoi (cry_master_len_pos);
17288 const uint cry_salt_len = atoi (cry_salt_len_pos);
17289 const uint ckey_len = atoi (ckey_len_pos);
17290 const uint public_key_len = atoi (public_key_len_pos);
17291
17292 if (cry_master_buf_len != cry_master_len) return (PARSER_SALT_VALUE);
17293 if (cry_salt_buf_len != cry_salt_len) return (PARSER_SALT_VALUE);
17294 if (ckey_buf_len != ckey_len) return (PARSER_SALT_VALUE);
17295 if (public_key_buf_len != public_key_len) return (PARSER_SALT_VALUE);
17296
17297 for (uint i = 0, j = 0; j < cry_master_len; i += 1, j += 8)
17298 {
17299 bitcoin_wallet->cry_master_buf[i] = hex_to_u32 ((const u8 *) &cry_master_buf_pos[j]);
17300
17301 bitcoin_wallet->cry_master_buf[i] = byte_swap_32 (bitcoin_wallet->cry_master_buf[i]);
17302 }
17303
17304 for (uint i = 0, j = 0; j < ckey_len; i += 1, j += 8)
17305 {
17306 bitcoin_wallet->ckey_buf[i] = hex_to_u32 ((const u8 *) &ckey_buf_pos[j]);
17307
17308 bitcoin_wallet->ckey_buf[i] = byte_swap_32 (bitcoin_wallet->ckey_buf[i]);
17309 }
17310
17311 for (uint i = 0, j = 0; j < public_key_len; i += 1, j += 8)
17312 {
17313 bitcoin_wallet->public_key_buf[i] = hex_to_u32 ((const u8 *) &public_key_buf_pos[j]);
17314
17315 bitcoin_wallet->public_key_buf[i] = byte_swap_32 (bitcoin_wallet->public_key_buf[i]);
17316 }
17317
17318 bitcoin_wallet->cry_master_len = cry_master_len / 2;
17319 bitcoin_wallet->ckey_len = ckey_len / 2;
17320 bitcoin_wallet->public_key_len = public_key_len / 2;
17321
17322 /*
17323 * store digest (should be unique enought, hopefully)
17324 */
17325
17326 digest[0] = bitcoin_wallet->cry_master_buf[0];
17327 digest[1] = bitcoin_wallet->cry_master_buf[1];
17328 digest[2] = bitcoin_wallet->cry_master_buf[2];
17329 digest[3] = bitcoin_wallet->cry_master_buf[3];
17330
17331 /*
17332 * store salt
17333 */
17334
17335 if (cry_rounds_len >= 7) return (PARSER_SALT_VALUE);
17336
17337 const uint cry_rounds = atoi (cry_rounds_pos);
17338
17339 salt->salt_iter = cry_rounds - 1;
17340
17341 char *salt_buf_ptr = (char *) salt->salt_buf;
17342
17343 const uint salt_len = parse_and_store_salt (salt_buf_ptr, cry_salt_buf_pos, cry_salt_buf_len);
17344
17345 salt->salt_len = salt_len;
17346
17347 return (PARSER_OK);
17348 }
17349
17350 int sip_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17351 {
17352 if ((input_len < DISPLAY_LEN_MIN_11400) || (input_len > DISPLAY_LEN_MAX_11400)) return (PARSER_GLOBAL_LENGTH);
17353
17354 if (memcmp (SIGNATURE_SIP_AUTH, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
17355
17356 u32 *digest = (u32 *) hash_buf->digest;
17357
17358 salt_t *salt = hash_buf->salt;
17359
17360 sip_t *sip = (sip_t *) hash_buf->esalt;
17361
17362 // work with a temporary copy of input_buf (s.t. we can manipulate it directly)
17363
17364 char *temp_input_buf = (char *) mymalloc (input_len + 1);
17365
17366 memcpy (temp_input_buf, input_buf, input_len);
17367
17368 // URI_server:
17369
17370 char *URI_server_pos = temp_input_buf + 6;
17371
17372 char *URI_client_pos = strchr (URI_server_pos, '*');
17373
17374 if (URI_client_pos == NULL)
17375 {
17376 myfree (temp_input_buf);
17377
17378 return (PARSER_SEPARATOR_UNMATCHED);
17379 }
17380
17381 URI_client_pos[0] = 0;
17382 URI_client_pos++;
17383
17384 uint URI_server_len = strlen (URI_server_pos);
17385
17386 if (URI_server_len > 512)
17387 {
17388 myfree (temp_input_buf);
17389
17390 return (PARSER_SALT_LENGTH);
17391 }
17392
17393 // URI_client:
17394
17395 char *user_pos = strchr (URI_client_pos, '*');
17396
17397 if (user_pos == NULL)
17398 {
17399 myfree (temp_input_buf);
17400
17401 return (PARSER_SEPARATOR_UNMATCHED);
17402 }
17403
17404 user_pos[0] = 0;
17405 user_pos++;
17406
17407 uint URI_client_len = strlen (URI_client_pos);
17408
17409 if (URI_client_len > 512)
17410 {
17411 myfree (temp_input_buf);
17412
17413 return (PARSER_SALT_LENGTH);
17414 }
17415
17416 // user:
17417
17418 char *realm_pos = strchr (user_pos, '*');
17419
17420 if (realm_pos == NULL)
17421 {
17422 myfree (temp_input_buf);
17423
17424 return (PARSER_SEPARATOR_UNMATCHED);
17425 }
17426
17427 realm_pos[0] = 0;
17428 realm_pos++;
17429
17430 uint user_len = strlen (user_pos);
17431
17432 if (user_len > 116)
17433 {
17434 myfree (temp_input_buf);
17435
17436 return (PARSER_SALT_LENGTH);
17437 }
17438
17439 // realm:
17440
17441 char *method_pos = strchr (realm_pos, '*');
17442
17443 if (method_pos == NULL)
17444 {
17445 myfree (temp_input_buf);
17446
17447 return (PARSER_SEPARATOR_UNMATCHED);
17448 }
17449
17450 method_pos[0] = 0;
17451 method_pos++;
17452
17453 uint realm_len = strlen (realm_pos);
17454
17455 if (realm_len > 116)
17456 {
17457 myfree (temp_input_buf);
17458
17459 return (PARSER_SALT_LENGTH);
17460 }
17461
17462 // method:
17463
17464 char *URI_prefix_pos = strchr (method_pos, '*');
17465
17466 if (URI_prefix_pos == NULL)
17467 {
17468 myfree (temp_input_buf);
17469
17470 return (PARSER_SEPARATOR_UNMATCHED);
17471 }
17472
17473 URI_prefix_pos[0] = 0;
17474 URI_prefix_pos++;
17475
17476 uint method_len = strlen (method_pos);
17477
17478 if (method_len > 246)
17479 {
17480 myfree (temp_input_buf);
17481
17482 return (PARSER_SALT_LENGTH);
17483 }
17484
17485 // URI_prefix:
17486
17487 char *URI_resource_pos = strchr (URI_prefix_pos, '*');
17488
17489 if (URI_resource_pos == NULL)
17490 {
17491 myfree (temp_input_buf);
17492
17493 return (PARSER_SEPARATOR_UNMATCHED);
17494 }
17495
17496 URI_resource_pos[0] = 0;
17497 URI_resource_pos++;
17498
17499 uint URI_prefix_len = strlen (URI_prefix_pos);
17500
17501 if (URI_prefix_len > 245)
17502 {
17503 myfree (temp_input_buf);
17504
17505 return (PARSER_SALT_LENGTH);
17506 }
17507
17508 // URI_resource:
17509
17510 char *URI_suffix_pos = strchr (URI_resource_pos, '*');
17511
17512 if (URI_suffix_pos == NULL)
17513 {
17514 myfree (temp_input_buf);
17515
17516 return (PARSER_SEPARATOR_UNMATCHED);
17517 }
17518
17519 URI_suffix_pos[0] = 0;
17520 URI_suffix_pos++;
17521
17522 uint URI_resource_len = strlen (URI_resource_pos);
17523
17524 if (URI_resource_len < 1 || URI_resource_len > 246)
17525 {
17526 myfree (temp_input_buf);
17527
17528 return (PARSER_SALT_LENGTH);
17529 }
17530
17531 // URI_suffix:
17532
17533 char *nonce_pos = strchr (URI_suffix_pos, '*');
17534
17535 if (nonce_pos == NULL)
17536 {
17537 myfree (temp_input_buf);
17538
17539 return (PARSER_SEPARATOR_UNMATCHED);
17540 }
17541
17542 nonce_pos[0] = 0;
17543 nonce_pos++;
17544
17545 uint URI_suffix_len = strlen (URI_suffix_pos);
17546
17547 if (URI_suffix_len > 245)
17548 {
17549 myfree (temp_input_buf);
17550
17551 return (PARSER_SALT_LENGTH);
17552 }
17553
17554 // nonce:
17555
17556 char *nonce_client_pos = strchr (nonce_pos, '*');
17557
17558 if (nonce_client_pos == NULL)
17559 {
17560 myfree (temp_input_buf);
17561
17562 return (PARSER_SEPARATOR_UNMATCHED);
17563 }
17564
17565 nonce_client_pos[0] = 0;
17566 nonce_client_pos++;
17567
17568 uint nonce_len = strlen (nonce_pos);
17569
17570 if (nonce_len < 1 || nonce_len > 50)
17571 {
17572 myfree (temp_input_buf);
17573
17574 return (PARSER_SALT_LENGTH);
17575 }
17576
17577 // nonce_client:
17578
17579 char *nonce_count_pos = strchr (nonce_client_pos, '*');
17580
17581 if (nonce_count_pos == NULL)
17582 {
17583 myfree (temp_input_buf);
17584
17585 return (PARSER_SEPARATOR_UNMATCHED);
17586 }
17587
17588 nonce_count_pos[0] = 0;
17589 nonce_count_pos++;
17590
17591 uint nonce_client_len = strlen (nonce_client_pos);
17592
17593 if (nonce_client_len > 50)
17594 {
17595 myfree (temp_input_buf);
17596
17597 return (PARSER_SALT_LENGTH);
17598 }
17599
17600 // nonce_count:
17601
17602 char *qop_pos = strchr (nonce_count_pos, '*');
17603
17604 if (qop_pos == NULL)
17605 {
17606 myfree (temp_input_buf);
17607
17608 return (PARSER_SEPARATOR_UNMATCHED);
17609 }
17610
17611 qop_pos[0] = 0;
17612 qop_pos++;
17613
17614 uint nonce_count_len = strlen (nonce_count_pos);
17615
17616 if (nonce_count_len > 50)
17617 {
17618 myfree (temp_input_buf);
17619
17620 return (PARSER_SALT_LENGTH);
17621 }
17622
17623 // qop:
17624
17625 char *directive_pos = strchr (qop_pos, '*');
17626
17627 if (directive_pos == NULL)
17628 {
17629 myfree (temp_input_buf);
17630
17631 return (PARSER_SEPARATOR_UNMATCHED);
17632 }
17633
17634 directive_pos[0] = 0;
17635 directive_pos++;
17636
17637 uint qop_len = strlen (qop_pos);
17638
17639 if (qop_len > 50)
17640 {
17641 myfree (temp_input_buf);
17642
17643 return (PARSER_SALT_LENGTH);
17644 }
17645
17646 // directive
17647
17648 char *digest_pos = strchr (directive_pos, '*');
17649
17650 if (digest_pos == NULL)
17651 {
17652 myfree (temp_input_buf);
17653
17654 return (PARSER_SEPARATOR_UNMATCHED);
17655 }
17656
17657 digest_pos[0] = 0;
17658 digest_pos++;
17659
17660 uint directive_len = strlen (directive_pos);
17661
17662 if (directive_len != 3)
17663 {
17664 myfree (temp_input_buf);
17665
17666 return (PARSER_SALT_LENGTH);
17667 }
17668
17669 if (memcmp (directive_pos, "MD5", 3))
17670 {
17671 log_info ("ERROR: only the MD5 directive is currently supported\n");
17672
17673 myfree (temp_input_buf);
17674
17675 return (PARSER_SIP_AUTH_DIRECTIVE);
17676 }
17677
17678 /*
17679 * first (pre-)compute: HA2 = md5 ($method . ":" . $uri)
17680 */
17681
17682 uint md5_len = 0;
17683
17684 uint md5_max_len = 4 * 64;
17685
17686 uint md5_remaining_len = md5_max_len;
17687
17688 uint tmp_md5_buf[64] = { 0 };
17689
17690 char *tmp_md5_ptr = (char *) tmp_md5_buf;
17691
17692 snprintf (tmp_md5_ptr, md5_remaining_len, "%s:", method_pos);
17693
17694 md5_len += method_len + 1;
17695 tmp_md5_ptr += method_len + 1;
17696
17697 if (URI_prefix_len > 0)
17698 {
17699 md5_remaining_len = md5_max_len - md5_len;
17700
17701 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s:", URI_prefix_pos);
17702
17703 md5_len += URI_prefix_len + 1;
17704 tmp_md5_ptr += URI_prefix_len + 1;
17705 }
17706
17707 md5_remaining_len = md5_max_len - md5_len;
17708
17709 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s", URI_resource_pos);
17710
17711 md5_len += URI_resource_len;
17712 tmp_md5_ptr += URI_resource_len;
17713
17714 if (URI_suffix_len > 0)
17715 {
17716 md5_remaining_len = md5_max_len - md5_len;
17717
17718 snprintf (tmp_md5_ptr, md5_remaining_len + 1, ":%s", URI_suffix_pos);
17719
17720 md5_len += 1 + URI_suffix_len;
17721 }
17722
17723 uint tmp_digest[4] = { 0 };
17724
17725 md5_complete_no_limit (tmp_digest, tmp_md5_buf, md5_len);
17726
17727 tmp_digest[0] = byte_swap_32 (tmp_digest[0]);
17728 tmp_digest[1] = byte_swap_32 (tmp_digest[1]);
17729 tmp_digest[2] = byte_swap_32 (tmp_digest[2]);
17730 tmp_digest[3] = byte_swap_32 (tmp_digest[3]);
17731
17732 /*
17733 * esalt
17734 */
17735
17736 char *esalt_buf_ptr = (char *) sip->esalt_buf;
17737
17738 uint esalt_len = 0;
17739
17740 uint max_esalt_len = sizeof (sip->esalt_buf); // 151 = (64 + 64 + 55) - 32, where 32 is the hexadecimal MD5 HA1 hash
17741
17742 // there are 2 possibilities for the esalt:
17743
17744 if ((strcmp (qop_pos, "auth") == 0) || (strcmp (qop_pos, "auth-int") == 0))
17745 {
17746 esalt_len = 1 + nonce_len + 1 + nonce_count_len + 1 + nonce_client_len + 1 + qop_len + 1 + 32;
17747
17748 if (esalt_len > max_esalt_len)
17749 {
17750 myfree (temp_input_buf);
17751
17752 return (PARSER_SALT_LENGTH);
17753 }
17754
17755 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%s:%s:%s:%08x%08x%08x%08x",
17756 nonce_pos,
17757 nonce_count_pos,
17758 nonce_client_pos,
17759 qop_pos,
17760 tmp_digest[0],
17761 tmp_digest[1],
17762 tmp_digest[2],
17763 tmp_digest[3]);
17764 }
17765 else
17766 {
17767 esalt_len = 1 + nonce_len + 1 + 32;
17768
17769 if (esalt_len > max_esalt_len)
17770 {
17771 myfree (temp_input_buf);
17772
17773 return (PARSER_SALT_LENGTH);
17774 }
17775
17776 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%08x%08x%08x%08x",
17777 nonce_pos,
17778 tmp_digest[0],
17779 tmp_digest[1],
17780 tmp_digest[2],
17781 tmp_digest[3]);
17782 }
17783
17784 // add 0x80 to esalt
17785
17786 esalt_buf_ptr[esalt_len] = 0x80;
17787
17788 sip->esalt_len = esalt_len;
17789
17790 /*
17791 * actual salt
17792 */
17793
17794 char *sip_salt_ptr = (char *) sip->salt_buf;
17795
17796 uint salt_len = user_len + 1 + realm_len + 1;
17797
17798 uint max_salt_len = 119;
17799
17800 if (salt_len > max_salt_len)
17801 {
17802 myfree (temp_input_buf);
17803
17804 return (PARSER_SALT_LENGTH);
17805 }
17806
17807 snprintf (sip_salt_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
17808
17809 sip->salt_len = salt_len;
17810
17811 /*
17812 * fake salt (for sorting)
17813 */
17814
17815 char *salt_buf_ptr = (char *) salt->salt_buf;
17816
17817 max_salt_len = 55;
17818
17819 uint fake_salt_len = salt_len;
17820
17821 if (fake_salt_len > max_salt_len)
17822 {
17823 fake_salt_len = max_salt_len;
17824 }
17825
17826 snprintf (salt_buf_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
17827
17828 salt->salt_len = fake_salt_len;
17829
17830 /*
17831 * digest
17832 */
17833
17834 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
17835 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
17836 digest[2] = hex_to_u32 ((const u8 *) &digest_pos[16]);
17837 digest[3] = hex_to_u32 ((const u8 *) &digest_pos[24]);
17838
17839 digest[0] = byte_swap_32 (digest[0]);
17840 digest[1] = byte_swap_32 (digest[1]);
17841 digest[2] = byte_swap_32 (digest[2]);
17842 digest[3] = byte_swap_32 (digest[3]);
17843
17844 myfree (temp_input_buf);
17845
17846 return (PARSER_OK);
17847 }
17848
17849 int crc32_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17850 {
17851 if ((input_len < DISPLAY_LEN_MIN_11500) || (input_len > DISPLAY_LEN_MAX_11500)) return (PARSER_GLOBAL_LENGTH);
17852
17853 if (input_buf[8] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
17854
17855 u32 *digest = (u32 *) hash_buf->digest;
17856
17857 salt_t *salt = hash_buf->salt;
17858
17859 // digest
17860
17861 char *digest_pos = input_buf;
17862
17863 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[0]);
17864 digest[1] = 0;
17865 digest[2] = 0;
17866 digest[3] = 0;
17867
17868 // salt
17869
17870 char *salt_buf = input_buf + 8 + 1;
17871
17872 uint salt_len = 8;
17873
17874 char *salt_buf_ptr = (char *) salt->salt_buf;
17875
17876 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
17877
17878 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17879
17880 salt->salt_len = salt_len;
17881
17882 return (PARSER_OK);
17883 }
17884
17885 int seven_zip_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17886 {
17887 if ((input_len < DISPLAY_LEN_MIN_11600) || (input_len > DISPLAY_LEN_MAX_11600)) return (PARSER_GLOBAL_LENGTH);
17888
17889 if (memcmp (SIGNATURE_SEVEN_ZIP, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
17890
17891 u32 *digest = (u32 *) hash_buf->digest;
17892
17893 salt_t *salt = hash_buf->salt;
17894
17895 seven_zip_t *seven_zip = (seven_zip_t *) hash_buf->esalt;
17896
17897 /**
17898 * parse line
17899 */
17900
17901 char *p_buf_pos = input_buf + 4;
17902
17903 char *NumCyclesPower_pos = strchr (p_buf_pos, '$');
17904
17905 if (NumCyclesPower_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17906
17907 u32 p_buf_len = NumCyclesPower_pos - p_buf_pos;
17908
17909 NumCyclesPower_pos++;
17910
17911 char *salt_len_pos = strchr (NumCyclesPower_pos, '$');
17912
17913 if (salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17914
17915 u32 NumCyclesPower_len = salt_len_pos - NumCyclesPower_pos;
17916
17917 salt_len_pos++;
17918
17919 char *salt_buf_pos = strchr (salt_len_pos, '$');
17920
17921 if (salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17922
17923 u32 salt_len_len = salt_buf_pos - salt_len_pos;
17924
17925 salt_buf_pos++;
17926
17927 char *iv_len_pos = strchr (salt_buf_pos, '$');
17928
17929 if (iv_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17930
17931 u32 salt_buf_len = iv_len_pos - salt_buf_pos;
17932
17933 iv_len_pos++;
17934
17935 char *iv_buf_pos = strchr (iv_len_pos, '$');
17936
17937 if (iv_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17938
17939 u32 iv_len_len = iv_buf_pos - iv_len_pos;
17940
17941 iv_buf_pos++;
17942
17943 char *crc_buf_pos = strchr (iv_buf_pos, '$');
17944
17945 if (crc_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17946
17947 u32 iv_buf_len = crc_buf_pos - iv_buf_pos;
17948
17949 crc_buf_pos++;
17950
17951 char *data_len_pos = strchr (crc_buf_pos, '$');
17952
17953 if (data_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17954
17955 u32 crc_buf_len = data_len_pos - crc_buf_pos;
17956
17957 data_len_pos++;
17958
17959 char *unpack_size_pos = strchr (data_len_pos, '$');
17960
17961 if (unpack_size_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17962
17963 u32 data_len_len = unpack_size_pos - data_len_pos;
17964
17965 unpack_size_pos++;
17966
17967 char *data_buf_pos = strchr (unpack_size_pos, '$');
17968
17969 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17970
17971 u32 unpack_size_len = data_buf_pos - unpack_size_pos;
17972
17973 data_buf_pos++;
17974
17975 u32 data_buf_len = input_len - 1 - 2 - 1 - p_buf_len - 1 - NumCyclesPower_len - 1 - salt_len_len - 1 - salt_buf_len - 1 - iv_len_len - 1 - iv_buf_len - 1 - crc_buf_len - 1 - data_len_len - 1 - unpack_size_len - 1;
17976
17977 const uint iter = atoi (NumCyclesPower_pos);
17978 const uint crc = atoi (crc_buf_pos);
17979 const uint p_buf = atoi (p_buf_pos);
17980 const uint salt_len = atoi (salt_len_pos);
17981 const uint iv_len = atoi (iv_len_pos);
17982 const uint unpack_size = atoi (unpack_size_pos);
17983 const uint data_len = atoi (data_len_pos);
17984
17985 /**
17986 * verify some data
17987 */
17988
17989 if (p_buf != 0) return (PARSER_SALT_VALUE);
17990 if (salt_len != 0) return (PARSER_SALT_VALUE);
17991
17992 if ((data_len * 2) != data_buf_len) return (PARSER_SALT_VALUE);
17993
17994 if (data_len > 384) return (PARSER_SALT_VALUE);
17995
17996 if (unpack_size > data_len) return (PARSER_SALT_VALUE);
17997
17998 /**
17999 * store data
18000 */
18001
18002 seven_zip->iv_buf[0] = hex_to_u32 ((const u8 *) &iv_buf_pos[ 0]);
18003 seven_zip->iv_buf[1] = hex_to_u32 ((const u8 *) &iv_buf_pos[ 8]);
18004 seven_zip->iv_buf[2] = hex_to_u32 ((const u8 *) &iv_buf_pos[16]);
18005 seven_zip->iv_buf[3] = hex_to_u32 ((const u8 *) &iv_buf_pos[24]);
18006
18007 seven_zip->iv_len = iv_len;
18008
18009 memcpy (seven_zip->salt_buf, salt_buf_pos, salt_buf_len); // we just need that for later ascii_digest()
18010
18011 seven_zip->salt_len = 0;
18012
18013 seven_zip->crc = crc;
18014
18015 for (uint i = 0, j = 0; j < data_buf_len; i += 1, j += 8)
18016 {
18017 seven_zip->data_buf[i] = hex_to_u32 ((const u8 *) &data_buf_pos[j]);
18018
18019 seven_zip->data_buf[i] = byte_swap_32 (seven_zip->data_buf[i]);
18020 }
18021
18022 seven_zip->data_len = data_len;
18023
18024 seven_zip->unpack_size = unpack_size;
18025
18026 // real salt
18027
18028 salt->salt_buf[0] = seven_zip->data_buf[0];
18029 salt->salt_buf[1] = seven_zip->data_buf[1];
18030 salt->salt_buf[2] = seven_zip->data_buf[2];
18031 salt->salt_buf[3] = seven_zip->data_buf[3];
18032
18033 salt->salt_len = 16;
18034
18035 salt->salt_sign[0] = iter;
18036
18037 salt->salt_iter = 1 << iter;
18038
18039 /**
18040 * digest
18041 */
18042
18043 digest[0] = crc;
18044 digest[1] = 0;
18045 digest[2] = 0;
18046 digest[3] = 0;
18047
18048 return (PARSER_OK);
18049 }
18050
18051 int gost2012sbog_256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18052 {
18053 if ((input_len < DISPLAY_LEN_MIN_11700) || (input_len > DISPLAY_LEN_MAX_11700)) return (PARSER_GLOBAL_LENGTH);
18054
18055 u32 *digest = (u32 *) hash_buf->digest;
18056
18057 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
18058 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
18059 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
18060 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
18061 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
18062 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
18063 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
18064 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
18065
18066 digest[0] = byte_swap_32 (digest[0]);
18067 digest[1] = byte_swap_32 (digest[1]);
18068 digest[2] = byte_swap_32 (digest[2]);
18069 digest[3] = byte_swap_32 (digest[3]);
18070 digest[4] = byte_swap_32 (digest[4]);
18071 digest[5] = byte_swap_32 (digest[5]);
18072 digest[6] = byte_swap_32 (digest[6]);
18073 digest[7] = byte_swap_32 (digest[7]);
18074
18075 return (PARSER_OK);
18076 }
18077
18078 int gost2012sbog_512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18079 {
18080 if ((input_len < DISPLAY_LEN_MIN_11800) || (input_len > DISPLAY_LEN_MAX_11800)) return (PARSER_GLOBAL_LENGTH);
18081
18082 u32 *digest = (u32 *) hash_buf->digest;
18083
18084 digest[ 0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
18085 digest[ 1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
18086 digest[ 2] = hex_to_u32 ((const u8 *) &input_buf[ 16]);
18087 digest[ 3] = hex_to_u32 ((const u8 *) &input_buf[ 24]);
18088 digest[ 4] = hex_to_u32 ((const u8 *) &input_buf[ 32]);
18089 digest[ 5] = hex_to_u32 ((const u8 *) &input_buf[ 40]);
18090 digest[ 6] = hex_to_u32 ((const u8 *) &input_buf[ 48]);
18091 digest[ 7] = hex_to_u32 ((const u8 *) &input_buf[ 56]);
18092 digest[ 8] = hex_to_u32 ((const u8 *) &input_buf[ 64]);
18093 digest[ 9] = hex_to_u32 ((const u8 *) &input_buf[ 72]);
18094 digest[10] = hex_to_u32 ((const u8 *) &input_buf[ 80]);
18095 digest[11] = hex_to_u32 ((const u8 *) &input_buf[ 88]);
18096 digest[12] = hex_to_u32 ((const u8 *) &input_buf[ 96]);
18097 digest[13] = hex_to_u32 ((const u8 *) &input_buf[104]);
18098 digest[14] = hex_to_u32 ((const u8 *) &input_buf[112]);
18099 digest[15] = hex_to_u32 ((const u8 *) &input_buf[120]);
18100
18101 digest[ 0] = byte_swap_32 (digest[ 0]);
18102 digest[ 1] = byte_swap_32 (digest[ 1]);
18103 digest[ 2] = byte_swap_32 (digest[ 2]);
18104 digest[ 3] = byte_swap_32 (digest[ 3]);
18105 digest[ 4] = byte_swap_32 (digest[ 4]);
18106 digest[ 5] = byte_swap_32 (digest[ 5]);
18107 digest[ 6] = byte_swap_32 (digest[ 6]);
18108 digest[ 7] = byte_swap_32 (digest[ 7]);
18109 digest[ 8] = byte_swap_32 (digest[ 8]);
18110 digest[ 9] = byte_swap_32 (digest[ 9]);
18111 digest[10] = byte_swap_32 (digest[10]);
18112 digest[11] = byte_swap_32 (digest[11]);
18113 digest[12] = byte_swap_32 (digest[12]);
18114 digest[13] = byte_swap_32 (digest[13]);
18115 digest[14] = byte_swap_32 (digest[14]);
18116 digest[15] = byte_swap_32 (digest[15]);
18117
18118 return (PARSER_OK);
18119 }
18120
18121 int pbkdf2_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18122 {
18123 if ((input_len < DISPLAY_LEN_MIN_11900) || (input_len > DISPLAY_LEN_MAX_11900)) return (PARSER_GLOBAL_LENGTH);
18124
18125 if (memcmp (SIGNATURE_PBKDF2_MD5, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
18126
18127 u32 *digest = (u32 *) hash_buf->digest;
18128
18129 salt_t *salt = hash_buf->salt;
18130
18131 pbkdf2_md5_t *pbkdf2_md5 = (pbkdf2_md5_t *) hash_buf->esalt;
18132
18133 /**
18134 * parse line
18135 */
18136
18137 // iterations
18138
18139 char *iter_pos = input_buf + 4;
18140
18141 u32 iter = atoi (iter_pos);
18142
18143 if (iter < 1) return (PARSER_SALT_ITERATION);
18144 if (iter > 999999) return (PARSER_SALT_ITERATION);
18145
18146 // first is *raw* salt
18147
18148 char *salt_pos = strchr (iter_pos, ':');
18149
18150 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18151
18152 salt_pos++;
18153
18154 char *hash_pos = strchr (salt_pos, ':');
18155
18156 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18157
18158 u32 salt_len = hash_pos - salt_pos;
18159
18160 if (salt_len > 64) return (PARSER_SALT_LENGTH);
18161
18162 hash_pos++;
18163
18164 u32 hash_b64_len = input_len - (hash_pos - input_buf);
18165
18166 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
18167
18168 // decode salt
18169
18170 char *salt_buf_ptr = (char *) pbkdf2_md5->salt_buf;
18171
18172 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18173
18174 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18175
18176 salt_buf_ptr[salt_len + 3] = 0x01;
18177 salt_buf_ptr[salt_len + 4] = 0x80;
18178
18179 salt->salt_len = salt_len;
18180 salt->salt_iter = iter - 1;
18181
18182 // decode hash
18183
18184 u8 tmp_buf[100] = { 0 };
18185
18186 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
18187
18188 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18189
18190 memcpy (digest, tmp_buf, 16);
18191
18192 // add some stuff to normal salt to make sorted happy
18193
18194 salt->salt_buf[0] = pbkdf2_md5->salt_buf[0];
18195 salt->salt_buf[1] = pbkdf2_md5->salt_buf[1];
18196 salt->salt_buf[2] = pbkdf2_md5->salt_buf[2];
18197 salt->salt_buf[3] = pbkdf2_md5->salt_buf[3];
18198 salt->salt_buf[4] = salt->salt_iter;
18199
18200 return (PARSER_OK);
18201 }
18202
18203 int pbkdf2_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18204 {
18205 if ((input_len < DISPLAY_LEN_MIN_12000) || (input_len > DISPLAY_LEN_MAX_12000)) return (PARSER_GLOBAL_LENGTH);
18206
18207 if (memcmp (SIGNATURE_PBKDF2_SHA1, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
18208
18209 u32 *digest = (u32 *) hash_buf->digest;
18210
18211 salt_t *salt = hash_buf->salt;
18212
18213 pbkdf2_sha1_t *pbkdf2_sha1 = (pbkdf2_sha1_t *) hash_buf->esalt;
18214
18215 /**
18216 * parse line
18217 */
18218
18219 // iterations
18220
18221 char *iter_pos = input_buf + 5;
18222
18223 u32 iter = atoi (iter_pos);
18224
18225 if (iter < 1) return (PARSER_SALT_ITERATION);
18226 if (iter > 999999) return (PARSER_SALT_ITERATION);
18227
18228 // first is *raw* salt
18229
18230 char *salt_pos = strchr (iter_pos, ':');
18231
18232 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18233
18234 salt_pos++;
18235
18236 char *hash_pos = strchr (salt_pos, ':');
18237
18238 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18239
18240 u32 salt_len = hash_pos - salt_pos;
18241
18242 if (salt_len > 64) return (PARSER_SALT_LENGTH);
18243
18244 hash_pos++;
18245
18246 u32 hash_b64_len = input_len - (hash_pos - input_buf);
18247
18248 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
18249
18250 // decode salt
18251
18252 char *salt_buf_ptr = (char *) pbkdf2_sha1->salt_buf;
18253
18254 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18255
18256 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18257
18258 salt_buf_ptr[salt_len + 3] = 0x01;
18259 salt_buf_ptr[salt_len + 4] = 0x80;
18260
18261 salt->salt_len = salt_len;
18262 salt->salt_iter = iter - 1;
18263
18264 // decode hash
18265
18266 u8 tmp_buf[100] = { 0 };
18267
18268 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
18269
18270 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18271
18272 memcpy (digest, tmp_buf, 16);
18273
18274 digest[0] = byte_swap_32 (digest[0]);
18275 digest[1] = byte_swap_32 (digest[1]);
18276 digest[2] = byte_swap_32 (digest[2]);
18277 digest[3] = byte_swap_32 (digest[3]);
18278
18279 // add some stuff to normal salt to make sorted happy
18280
18281 salt->salt_buf[0] = pbkdf2_sha1->salt_buf[0];
18282 salt->salt_buf[1] = pbkdf2_sha1->salt_buf[1];
18283 salt->salt_buf[2] = pbkdf2_sha1->salt_buf[2];
18284 salt->salt_buf[3] = pbkdf2_sha1->salt_buf[3];
18285 salt->salt_buf[4] = salt->salt_iter;
18286
18287 return (PARSER_OK);
18288 }
18289
18290 int pbkdf2_sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18291 {
18292 if ((input_len < DISPLAY_LEN_MIN_12100) || (input_len > DISPLAY_LEN_MAX_12100)) return (PARSER_GLOBAL_LENGTH);
18293
18294 if (memcmp (SIGNATURE_PBKDF2_SHA512, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
18295
18296 u64 *digest = (u64 *) hash_buf->digest;
18297
18298 salt_t *salt = hash_buf->salt;
18299
18300 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
18301
18302 /**
18303 * parse line
18304 */
18305
18306 // iterations
18307
18308 char *iter_pos = input_buf + 7;
18309
18310 u32 iter = atoi (iter_pos);
18311
18312 if (iter < 1) return (PARSER_SALT_ITERATION);
18313 if (iter > 999999) return (PARSER_SALT_ITERATION);
18314
18315 // first is *raw* salt
18316
18317 char *salt_pos = strchr (iter_pos, ':');
18318
18319 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18320
18321 salt_pos++;
18322
18323 char *hash_pos = strchr (salt_pos, ':');
18324
18325 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18326
18327 u32 salt_len = hash_pos - salt_pos;
18328
18329 if (salt_len > 64) return (PARSER_SALT_LENGTH);
18330
18331 hash_pos++;
18332
18333 u32 hash_b64_len = input_len - (hash_pos - input_buf);
18334
18335 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
18336
18337 // decode salt
18338
18339 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
18340
18341 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18342
18343 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18344
18345 salt_buf_ptr[salt_len + 3] = 0x01;
18346 salt_buf_ptr[salt_len + 4] = 0x80;
18347
18348 salt->salt_len = salt_len;
18349 salt->salt_iter = iter - 1;
18350
18351 // decode hash
18352
18353 u8 tmp_buf[100] = { 0 };
18354
18355 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
18356
18357 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18358
18359 memcpy (digest, tmp_buf, 64);
18360
18361 digest[0] = byte_swap_64 (digest[0]);
18362 digest[1] = byte_swap_64 (digest[1]);
18363 digest[2] = byte_swap_64 (digest[2]);
18364 digest[3] = byte_swap_64 (digest[3]);
18365 digest[4] = byte_swap_64 (digest[4]);
18366 digest[5] = byte_swap_64 (digest[5]);
18367 digest[6] = byte_swap_64 (digest[6]);
18368 digest[7] = byte_swap_64 (digest[7]);
18369
18370 // add some stuff to normal salt to make sorted happy
18371
18372 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
18373 salt->salt_buf[1] = pbkdf2_sha512->salt_buf[1];
18374 salt->salt_buf[2] = pbkdf2_sha512->salt_buf[2];
18375 salt->salt_buf[3] = pbkdf2_sha512->salt_buf[3];
18376 salt->salt_buf[4] = salt->salt_iter;
18377
18378 return (PARSER_OK);
18379 }
18380
18381 int ecryptfs_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18382 {
18383 if ((input_len < DISPLAY_LEN_MIN_12200) || (input_len > DISPLAY_LEN_MAX_12200)) return (PARSER_GLOBAL_LENGTH);
18384
18385 if (memcmp (SIGNATURE_ECRYPTFS, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
18386
18387 uint *digest = (uint *) hash_buf->digest;
18388
18389 salt_t *salt = hash_buf->salt;
18390
18391 /**
18392 * parse line
18393 */
18394
18395 char *salt_pos = input_buf + 10 + 2 + 2; // skip over "0$" and "1$"
18396
18397 char *hash_pos = strchr (salt_pos, '$');
18398
18399 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18400
18401 u32 salt_len = hash_pos - salt_pos;
18402
18403 if (salt_len != 16) return (PARSER_SALT_LENGTH);
18404
18405 hash_pos++;
18406
18407 u32 hash_len = input_len - 10 - 2 - 2 - salt_len - 1;
18408
18409 if (hash_len != 16) return (PARSER_HASH_LENGTH);
18410
18411 // decode hash
18412
18413 digest[ 0] = hex_to_u32 ((const u8 *) &hash_pos[0]);
18414 digest[ 1] = hex_to_u32 ((const u8 *) &hash_pos[8]);
18415 digest[ 2] = 0;
18416 digest[ 3] = 0;
18417 digest[ 4] = 0;
18418 digest[ 5] = 0;
18419 digest[ 6] = 0;
18420 digest[ 7] = 0;
18421 digest[ 8] = 0;
18422 digest[ 9] = 0;
18423 digest[10] = 0;
18424 digest[11] = 0;
18425 digest[12] = 0;
18426 digest[13] = 0;
18427 digest[14] = 0;
18428 digest[15] = 0;
18429
18430 // decode salt
18431
18432 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[0]);
18433 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[8]);
18434
18435 salt->salt_iter = ROUNDS_ECRYPTFS;
18436 salt->salt_len = 8;
18437
18438 return (PARSER_OK);
18439 }
18440
18441 int bsdicrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18442 {
18443 if ((input_len < DISPLAY_LEN_MIN_12400) || (input_len > DISPLAY_LEN_MAX_12400)) return (PARSER_GLOBAL_LENGTH);
18444
18445 if (memcmp (SIGNATURE_BSDICRYPT, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
18446
18447 unsigned char c19 = itoa64_to_int (input_buf[19]);
18448
18449 if (c19 & 3) return (PARSER_HASH_VALUE);
18450
18451 salt_t *salt = hash_buf->salt;
18452
18453 u32 *digest = (u32 *) hash_buf->digest;
18454
18455 // iteration count
18456
18457 salt->salt_iter = itoa64_to_int (input_buf[1])
18458 | itoa64_to_int (input_buf[2]) << 6
18459 | itoa64_to_int (input_buf[3]) << 12
18460 | itoa64_to_int (input_buf[4]) << 18;
18461
18462 // set salt
18463
18464 salt->salt_buf[0] = itoa64_to_int (input_buf[5])
18465 | itoa64_to_int (input_buf[6]) << 6
18466 | itoa64_to_int (input_buf[7]) << 12
18467 | itoa64_to_int (input_buf[8]) << 18;
18468
18469 salt->salt_len = 4;
18470
18471 u8 tmp_buf[100] = { 0 };
18472
18473 base64_decode (itoa64_to_int, (const u8 *) input_buf + 9, 11, tmp_buf);
18474
18475 memcpy (digest, tmp_buf, 8);
18476
18477 uint tt;
18478
18479 IP (digest[0], digest[1], tt);
18480
18481 digest[0] = rotr32 (digest[0], 31);
18482 digest[1] = rotr32 (digest[1], 31);
18483 digest[2] = 0;
18484 digest[3] = 0;
18485
18486 return (PARSER_OK);
18487 }
18488
18489 int rar3hp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18490 {
18491 if ((input_len < DISPLAY_LEN_MIN_12500) || (input_len > DISPLAY_LEN_MAX_12500)) return (PARSER_GLOBAL_LENGTH);
18492
18493 if (memcmp (SIGNATURE_RAR3, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
18494
18495 u32 *digest = (u32 *) hash_buf->digest;
18496
18497 salt_t *salt = hash_buf->salt;
18498
18499 /**
18500 * parse line
18501 */
18502
18503 char *type_pos = input_buf + 6 + 1;
18504
18505 char *salt_pos = strchr (type_pos, '*');
18506
18507 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18508
18509 u32 type_len = salt_pos - type_pos;
18510
18511 if (type_len != 1) return (PARSER_SALT_LENGTH);
18512
18513 salt_pos++;
18514
18515 char *crypted_pos = strchr (salt_pos, '*');
18516
18517 if (crypted_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18518
18519 u32 salt_len = crypted_pos - salt_pos;
18520
18521 if (salt_len != 16) return (PARSER_SALT_LENGTH);
18522
18523 crypted_pos++;
18524
18525 u32 crypted_len = input_len - 6 - 1 - type_len - 1 - salt_len - 1;
18526
18527 if (crypted_len != 32) return (PARSER_SALT_LENGTH);
18528
18529 /**
18530 * copy data
18531 */
18532
18533 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[0]);
18534 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[8]);
18535
18536 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
18537 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
18538
18539 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &crypted_pos[ 0]);
18540 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &crypted_pos[ 8]);
18541 salt->salt_buf[4] = hex_to_u32 ((const u8 *) &crypted_pos[16]);
18542 salt->salt_buf[5] = hex_to_u32 ((const u8 *) &crypted_pos[24]);
18543
18544 salt->salt_len = 24;
18545 salt->salt_iter = ROUNDS_RAR3;
18546
18547 // there's no hash for rar3. the data which is in crypted_pos is some encrypted data and
18548 // if it matches the value \xc4\x3d\x7b\x00\x40\x07\x00 after decrypt we know that we successfully cracked it.
18549
18550 digest[0] = 0xc43d7b00;
18551 digest[1] = 0x40070000;
18552 digest[2] = 0;
18553 digest[3] = 0;
18554
18555 return (PARSER_OK);
18556 }
18557
18558 int rar5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18559 {
18560 if ((input_len < DISPLAY_LEN_MIN_13000) || (input_len > DISPLAY_LEN_MAX_13000)) return (PARSER_GLOBAL_LENGTH);
18561
18562 if (memcmp (SIGNATURE_RAR5, input_buf, 1 + 4 + 1)) return (PARSER_SIGNATURE_UNMATCHED);
18563
18564 u32 *digest = (u32 *) hash_buf->digest;
18565
18566 salt_t *salt = hash_buf->salt;
18567
18568 rar5_t *rar5 = (rar5_t *) hash_buf->esalt;
18569
18570 /**
18571 * parse line
18572 */
18573
18574 char *param0_pos = input_buf + 1 + 4 + 1;
18575
18576 char *param1_pos = strchr (param0_pos, '$');
18577
18578 if (param1_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18579
18580 u32 param0_len = param1_pos - param0_pos;
18581
18582 param1_pos++;
18583
18584 char *param2_pos = strchr (param1_pos, '$');
18585
18586 if (param2_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18587
18588 u32 param1_len = param2_pos - param1_pos;
18589
18590 param2_pos++;
18591
18592 char *param3_pos = strchr (param2_pos, '$');
18593
18594 if (param3_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18595
18596 u32 param2_len = param3_pos - param2_pos;
18597
18598 param3_pos++;
18599
18600 char *param4_pos = strchr (param3_pos, '$');
18601
18602 if (param4_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18603
18604 u32 param3_len = param4_pos - param3_pos;
18605
18606 param4_pos++;
18607
18608 char *param5_pos = strchr (param4_pos, '$');
18609
18610 if (param5_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18611
18612 u32 param4_len = param5_pos - param4_pos;
18613
18614 param5_pos++;
18615
18616 u32 param5_len = input_len - 1 - 4 - 1 - param0_len - 1 - param1_len - 1 - param2_len - 1 - param3_len - 1 - param4_len - 1;
18617
18618 char *salt_buf = param1_pos;
18619 char *iv = param3_pos;
18620 char *pswcheck = param5_pos;
18621
18622 const uint salt_len = atoi (param0_pos);
18623 const uint iterations = atoi (param2_pos);
18624 const uint pswcheck_len = atoi (param4_pos);
18625
18626 /**
18627 * verify some data
18628 */
18629
18630 if (param1_len != 32) return (PARSER_SALT_VALUE);
18631 if (param3_len != 32) return (PARSER_SALT_VALUE);
18632 if (param5_len != 16) return (PARSER_SALT_VALUE);
18633
18634 if (salt_len != 16) return (PARSER_SALT_VALUE);
18635 if (iterations == 0) return (PARSER_SALT_VALUE);
18636 if (pswcheck_len != 8) return (PARSER_SALT_VALUE);
18637
18638 /**
18639 * store data
18640 */
18641
18642 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
18643 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
18644 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
18645 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf[24]);
18646
18647 rar5->iv[0] = hex_to_u32 ((const u8 *) &iv[ 0]);
18648 rar5->iv[1] = hex_to_u32 ((const u8 *) &iv[ 8]);
18649 rar5->iv[2] = hex_to_u32 ((const u8 *) &iv[16]);
18650 rar5->iv[3] = hex_to_u32 ((const u8 *) &iv[24]);
18651
18652 salt->salt_len = 16;
18653
18654 salt->salt_sign[0] = iterations;
18655
18656 salt->salt_iter = ((1 << iterations) + 32) - 1;
18657
18658 /**
18659 * digest buf
18660 */
18661
18662 digest[0] = hex_to_u32 ((const u8 *) &pswcheck[ 0]);
18663 digest[1] = hex_to_u32 ((const u8 *) &pswcheck[ 8]);
18664 digest[2] = 0;
18665 digest[3] = 0;
18666
18667 return (PARSER_OK);
18668 }
18669
18670 int cf10_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18671 {
18672 if ((input_len < DISPLAY_LEN_MIN_12600) || (input_len > DISPLAY_LEN_MAX_12600)) return (PARSER_GLOBAL_LENGTH);
18673
18674 u32 *digest = (u32 *) hash_buf->digest;
18675
18676 salt_t *salt = hash_buf->salt;
18677
18678 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
18679 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
18680 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
18681 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
18682 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
18683 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
18684 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
18685 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
18686
18687 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
18688
18689 uint salt_len = input_len - 64 - 1;
18690
18691 char *salt_buf = input_buf + 64 + 1;
18692
18693 char *salt_buf_ptr = (char *) salt->salt_buf;
18694
18695 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
18696
18697 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18698
18699 salt->salt_len = salt_len;
18700
18701 /**
18702 * we can precompute the first sha256 transform
18703 */
18704
18705 uint w[16] = { 0 };
18706
18707 w[ 0] = byte_swap_32 (salt->salt_buf[ 0]);
18708 w[ 1] = byte_swap_32 (salt->salt_buf[ 1]);
18709 w[ 2] = byte_swap_32 (salt->salt_buf[ 2]);
18710 w[ 3] = byte_swap_32 (salt->salt_buf[ 3]);
18711 w[ 4] = byte_swap_32 (salt->salt_buf[ 4]);
18712 w[ 5] = byte_swap_32 (salt->salt_buf[ 5]);
18713 w[ 6] = byte_swap_32 (salt->salt_buf[ 6]);
18714 w[ 7] = byte_swap_32 (salt->salt_buf[ 7]);
18715 w[ 8] = byte_swap_32 (salt->salt_buf[ 8]);
18716 w[ 9] = byte_swap_32 (salt->salt_buf[ 9]);
18717 w[10] = byte_swap_32 (salt->salt_buf[10]);
18718 w[11] = byte_swap_32 (salt->salt_buf[11]);
18719 w[12] = byte_swap_32 (salt->salt_buf[12]);
18720 w[13] = byte_swap_32 (salt->salt_buf[13]);
18721 w[14] = byte_swap_32 (salt->salt_buf[14]);
18722 w[15] = byte_swap_32 (salt->salt_buf[15]);
18723
18724 uint pc256[8] = { SHA256M_A, SHA256M_B, SHA256M_C, SHA256M_D, SHA256M_E, SHA256M_F, SHA256M_G, SHA256M_H };
18725
18726 sha256_64 (w, pc256);
18727
18728 salt->salt_buf_pc[0] = pc256[0];
18729 salt->salt_buf_pc[1] = pc256[1];
18730 salt->salt_buf_pc[2] = pc256[2];
18731 salt->salt_buf_pc[3] = pc256[3];
18732 salt->salt_buf_pc[4] = pc256[4];
18733 salt->salt_buf_pc[5] = pc256[5];
18734 salt->salt_buf_pc[6] = pc256[6];
18735 salt->salt_buf_pc[7] = pc256[7];
18736
18737 digest[0] -= pc256[0];
18738 digest[1] -= pc256[1];
18739 digest[2] -= pc256[2];
18740 digest[3] -= pc256[3];
18741 digest[4] -= pc256[4];
18742 digest[5] -= pc256[5];
18743 digest[6] -= pc256[6];
18744 digest[7] -= pc256[7];
18745
18746 return (PARSER_OK);
18747 }
18748
18749 int mywallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18750 {
18751 if ((input_len < DISPLAY_LEN_MIN_12700) || (input_len > DISPLAY_LEN_MAX_12700)) return (PARSER_GLOBAL_LENGTH);
18752
18753 if (memcmp (SIGNATURE_MYWALLET, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
18754
18755 u32 *digest = (u32 *) hash_buf->digest;
18756
18757 salt_t *salt = hash_buf->salt;
18758
18759 /**
18760 * parse line
18761 */
18762
18763 char *data_len_pos = input_buf + 1 + 10 + 1;
18764
18765 char *data_buf_pos = strchr (data_len_pos, '$');
18766
18767 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18768
18769 u32 data_len_len = data_buf_pos - data_len_pos;
18770
18771 if (data_len_len < 1) return (PARSER_SALT_LENGTH);
18772 if (data_len_len > 5) return (PARSER_SALT_LENGTH);
18773
18774 data_buf_pos++;
18775
18776 u32 data_buf_len = input_len - 1 - 10 - 1 - data_len_len - 1;
18777
18778 if (data_buf_len < 64) return (PARSER_HASH_LENGTH);
18779
18780 if (data_buf_len % 16) return (PARSER_HASH_LENGTH);
18781
18782 u32 data_len = atoi (data_len_pos);
18783
18784 if ((data_len * 2) != data_buf_len) return (PARSER_HASH_LENGTH);
18785
18786 /**
18787 * salt
18788 */
18789
18790 char *salt_pos = data_buf_pos;
18791
18792 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
18793 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
18794 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
18795 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
18796
18797 // this is actually the CT, which is also the hash later (if matched)
18798
18799 salt->salt_buf[4] = hex_to_u32 ((const u8 *) &salt_pos[32]);
18800 salt->salt_buf[5] = hex_to_u32 ((const u8 *) &salt_pos[40]);
18801 salt->salt_buf[6] = hex_to_u32 ((const u8 *) &salt_pos[48]);
18802 salt->salt_buf[7] = hex_to_u32 ((const u8 *) &salt_pos[56]);
18803
18804 salt->salt_len = 32; // note we need to fix this to 16 in kernel
18805
18806 salt->salt_iter = 10 - 1;
18807
18808 /**
18809 * digest buf
18810 */
18811
18812 digest[0] = salt->salt_buf[4];
18813 digest[1] = salt->salt_buf[5];
18814 digest[2] = salt->salt_buf[6];
18815 digest[3] = salt->salt_buf[7];
18816
18817 return (PARSER_OK);
18818 }
18819
18820 int ms_drsr_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18821 {
18822 if ((input_len < DISPLAY_LEN_MIN_12800) || (input_len > DISPLAY_LEN_MAX_12800)) return (PARSER_GLOBAL_LENGTH);
18823
18824 if (memcmp (SIGNATURE_MS_DRSR, input_buf, 11)) return (PARSER_SIGNATURE_UNMATCHED);
18825
18826 u32 *digest = (u32 *) hash_buf->digest;
18827
18828 salt_t *salt = hash_buf->salt;
18829
18830 /**
18831 * parse line
18832 */
18833
18834 char *salt_pos = input_buf + 11 + 1;
18835
18836 char *iter_pos = strchr (salt_pos, ',');
18837
18838 if (iter_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18839
18840 u32 salt_len = iter_pos - salt_pos;
18841
18842 if (salt_len != 20) return (PARSER_SALT_LENGTH);
18843
18844 iter_pos++;
18845
18846 char *hash_pos = strchr (iter_pos, ',');
18847
18848 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18849
18850 u32 iter_len = hash_pos - iter_pos;
18851
18852 if (iter_len > 5) return (PARSER_SALT_LENGTH);
18853
18854 hash_pos++;
18855
18856 u32 hash_len = input_len - 11 - 1 - salt_len - 1 - iter_len - 1;
18857
18858 if (hash_len != 64) return (PARSER_HASH_LENGTH);
18859
18860 /**
18861 * salt
18862 */
18863
18864 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
18865 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
18866 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]) & 0xffff0000;
18867 salt->salt_buf[3] = 0x00018000;
18868
18869 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
18870 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
18871 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
18872 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
18873
18874 salt->salt_len = salt_len / 2;
18875
18876 salt->salt_iter = atoi (iter_pos) - 1;
18877
18878 /**
18879 * digest buf
18880 */
18881
18882 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
18883 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
18884 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
18885 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
18886 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
18887 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
18888 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
18889 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
18890
18891 return (PARSER_OK);
18892 }
18893
18894 int androidfde_samsung_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18895 {
18896 if ((input_len < DISPLAY_LEN_MIN_12900) || (input_len > DISPLAY_LEN_MAX_12900)) return (PARSER_GLOBAL_LENGTH);
18897
18898 u32 *digest = (u32 *) hash_buf->digest;
18899
18900 salt_t *salt = hash_buf->salt;
18901
18902 /**
18903 * parse line
18904 */
18905
18906 char *hash_pos = input_buf + 64;
18907 char *salt1_pos = input_buf + 128;
18908 char *salt2_pos = input_buf;
18909
18910 /**
18911 * salt
18912 */
18913
18914 salt->salt_buf[ 0] = hex_to_u32 ((const u8 *) &salt1_pos[ 0]);
18915 salt->salt_buf[ 1] = hex_to_u32 ((const u8 *) &salt1_pos[ 8]);
18916 salt->salt_buf[ 2] = hex_to_u32 ((const u8 *) &salt1_pos[16]);
18917 salt->salt_buf[ 3] = hex_to_u32 ((const u8 *) &salt1_pos[24]);
18918
18919 salt->salt_buf[ 4] = hex_to_u32 ((const u8 *) &salt2_pos[ 0]);
18920 salt->salt_buf[ 5] = hex_to_u32 ((const u8 *) &salt2_pos[ 8]);
18921 salt->salt_buf[ 6] = hex_to_u32 ((const u8 *) &salt2_pos[16]);
18922 salt->salt_buf[ 7] = hex_to_u32 ((const u8 *) &salt2_pos[24]);
18923
18924 salt->salt_buf[ 8] = hex_to_u32 ((const u8 *) &salt2_pos[32]);
18925 salt->salt_buf[ 9] = hex_to_u32 ((const u8 *) &salt2_pos[40]);
18926 salt->salt_buf[10] = hex_to_u32 ((const u8 *) &salt2_pos[48]);
18927 salt->salt_buf[11] = hex_to_u32 ((const u8 *) &salt2_pos[56]);
18928
18929 salt->salt_len = 48;
18930
18931 salt->salt_iter = ROUNDS_ANDROIDFDE_SAMSUNG - 1;
18932
18933 /**
18934 * digest buf
18935 */
18936
18937 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
18938 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
18939 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
18940 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
18941 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
18942 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
18943 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
18944 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
18945
18946 return (PARSER_OK);
18947 }
18948
18949 /**
18950 * parallel running threads
18951 */
18952
18953 #ifdef WIN
18954
18955 BOOL WINAPI sigHandler_default (DWORD sig)
18956 {
18957 switch (sig)
18958 {
18959 case CTRL_CLOSE_EVENT:
18960
18961 /*
18962 * special case see: https://stackoverflow.com/questions/3640633/c-setconsolectrlhandler-routine-issue/5610042#5610042
18963 * if the user interacts w/ the user-interface (GUI/cmd), we need to do the finalization job within this signal handler
18964 * function otherwise it is too late (e.g. after returning from this function)
18965 */
18966
18967 myabort ();
18968
18969 SetConsoleCtrlHandler (NULL, TRUE);
18970
18971 hc_sleep (10);
18972
18973 return TRUE;
18974
18975 case CTRL_C_EVENT:
18976 case CTRL_LOGOFF_EVENT:
18977 case CTRL_SHUTDOWN_EVENT:
18978
18979 myabort ();
18980
18981 SetConsoleCtrlHandler (NULL, TRUE);
18982
18983 return TRUE;
18984 }
18985
18986 return FALSE;
18987 }
18988
18989 BOOL WINAPI sigHandler_benchmark (DWORD sig)
18990 {
18991 switch (sig)
18992 {
18993 case CTRL_CLOSE_EVENT:
18994
18995 myabort ();
18996
18997 SetConsoleCtrlHandler (NULL, TRUE);
18998
18999 hc_sleep (10);
19000
19001 return TRUE;
19002
19003 case CTRL_C_EVENT:
19004 case CTRL_LOGOFF_EVENT:
19005 case CTRL_SHUTDOWN_EVENT:
19006
19007 myquit ();
19008
19009 SetConsoleCtrlHandler (NULL, TRUE);
19010
19011 return TRUE;
19012 }
19013
19014 return FALSE;
19015 }
19016
19017 void hc_signal (BOOL WINAPI (callback) (DWORD))
19018 {
19019 if (callback == NULL)
19020 {
19021 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, FALSE);
19022 }
19023 else
19024 {
19025 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, TRUE);
19026 }
19027 }
19028
19029 #else
19030
19031 void sigHandler_default (int sig)
19032 {
19033 myabort ();
19034
19035 signal (sig, NULL);
19036 }
19037
19038 void sigHandler_benchmark (int sig)
19039 {
19040 myquit ();
19041
19042 signal (sig, NULL);
19043 }
19044
19045 void hc_signal (void (callback) (int))
19046 {
19047 if (callback == NULL) callback = SIG_DFL;
19048
19049 signal (SIGINT, callback);
19050 signal (SIGTERM, callback);
19051 signal (SIGABRT, callback);
19052 }
19053
19054 #endif
19055
19056 void status_display ();
19057
19058 void *thread_keypress (void *p)
19059 {
19060 int benchmark = *((int *) p);
19061
19062 uint quiet = data.quiet;
19063
19064 tty_break();
19065
19066 while ((data.devices_status != STATUS_EXHAUSTED) && (data.devices_status != STATUS_CRACKED) && (data.devices_status != STATUS_ABORTED) && (data.devices_status != STATUS_QUIT))
19067 {
19068 int ch = tty_getchar();
19069
19070 if (ch == -1) break;
19071
19072 if (ch == 0) continue;
19073
19074 #ifdef _POSIX
19075 if (ch != '\n')
19076 #endif
19077
19078 hc_thread_mutex_lock (mux_display);
19079
19080 log_info ("");
19081
19082 switch (ch)
19083 {
19084 case 's':
19085 case '\n':
19086
19087 log_info ("");
19088
19089 status_display ();
19090
19091 log_info ("");
19092
19093 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19094 if (quiet == 0) fflush (stdout);
19095
19096 break;
19097
19098 case 'b':
19099
19100 log_info ("");
19101
19102 bypass ();
19103
19104 log_info ("");
19105
19106 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19107 if (quiet == 0) fflush (stdout);
19108
19109 break;
19110
19111 case 'p':
19112
19113 log_info ("");
19114
19115 SuspendThreads ();
19116
19117 log_info ("");
19118
19119 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19120 if (quiet == 0) fflush (stdout);
19121
19122 break;
19123
19124 case 'r':
19125
19126 log_info ("");
19127
19128 ResumeThreads ();
19129
19130 log_info ("");
19131
19132 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19133 if (quiet == 0) fflush (stdout);
19134
19135 break;
19136
19137 case 'c':
19138
19139 log_info ("");
19140
19141 if (benchmark == 1) break;
19142
19143 stop_at_checkpoint ();
19144
19145 log_info ("");
19146
19147 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19148 if (quiet == 0) fflush (stdout);
19149
19150 break;
19151
19152 case 'q':
19153
19154 log_info ("");
19155
19156 if (benchmark == 1)
19157 {
19158 myquit ();
19159 }
19160 else
19161 {
19162 myabort ();
19163 }
19164
19165 break;
19166 }
19167
19168 hc_thread_mutex_unlock (mux_display);
19169 }
19170
19171 tty_fix();
19172
19173 return (p);
19174 }
19175
19176 /**
19177 * rules common
19178 */
19179
19180 bool class_num (const u8 c)
19181 {
19182 return ((c >= '0') && (c <= '9'));
19183 }
19184
19185 bool class_lower (const u8 c)
19186 {
19187 return ((c >= 'a') && (c <= 'z'));
19188 }
19189
19190 bool class_upper (const u8 c)
19191 {
19192 return ((c >= 'A') && (c <= 'Z'));
19193 }
19194
19195 bool class_alpha (const u8 c)
19196 {
19197 return (class_lower (c) || class_upper (c));
19198 }
19199
19200 int conv_ctoi (const u8 c)
19201 {
19202 if (class_num (c))
19203 {
19204 return c - '0';
19205 }
19206 else if (class_upper (c))
19207 {
19208 return c - 'A' + 10;
19209 }
19210
19211 return -1;
19212 }
19213
19214 int conv_itoc (const u8 c)
19215 {
19216 if (c < 10)
19217 {
19218 return c + '0';
19219 }
19220 else if (c < 37)
19221 {
19222 return c + 'A' - 10;
19223 }
19224
19225 return -1;
19226 }
19227
19228 /**
19229 * device rules
19230 */
19231
19232 #define INCR_POS if (++rule_pos == rule_len) return (-1)
19233 #define SET_NAME(rule,val) (rule)->cmds[rule_cnt] = ((val) & 0xff) << 0
19234 #define SET_P0(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 8
19235 #define SET_P1(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 16
19236 #define MAX_KERNEL_RULES 255
19237 #define GET_NAME(rule) rule_cmd = (((rule)->cmds[rule_cnt] >> 0) & 0xff)
19238 #define GET_P0(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 8) & 0xff)
19239 #define GET_P1(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 16) & 0xff)
19240
19241 #define SET_P0_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 8
19242 #define SET_P1_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 16
19243 #define GET_P0_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 8) & 0xff)
19244 #define GET_P1_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 16) & 0xff)
19245
19246 int cpu_rule_to_kernel_rule (char rule_buf[BUFSIZ], uint rule_len, kernel_rule_t *rule)
19247 {
19248 uint rule_pos;
19249 uint rule_cnt;
19250
19251 for (rule_pos = 0, rule_cnt = 0; rule_pos < rule_len && rule_cnt < MAX_KERNEL_RULES; rule_pos++, rule_cnt++)
19252 {
19253 switch (rule_buf[rule_pos])
19254 {
19255 case ' ':
19256 rule_cnt--;
19257 break;
19258
19259 case RULE_OP_MANGLE_NOOP:
19260 SET_NAME (rule, rule_buf[rule_pos]);
19261 break;
19262
19263 case RULE_OP_MANGLE_LREST:
19264 SET_NAME (rule, rule_buf[rule_pos]);
19265 break;
19266
19267 case RULE_OP_MANGLE_UREST:
19268 SET_NAME (rule, rule_buf[rule_pos]);
19269 break;
19270
19271 case RULE_OP_MANGLE_LREST_UFIRST:
19272 SET_NAME (rule, rule_buf[rule_pos]);
19273 break;
19274
19275 case RULE_OP_MANGLE_UREST_LFIRST:
19276 SET_NAME (rule, rule_buf[rule_pos]);
19277 break;
19278
19279 case RULE_OP_MANGLE_TREST:
19280 SET_NAME (rule, rule_buf[rule_pos]);
19281 break;
19282
19283 case RULE_OP_MANGLE_TOGGLE_AT:
19284 SET_NAME (rule, rule_buf[rule_pos]);
19285 SET_P0_CONV (rule, rule_buf[rule_pos]);
19286 break;
19287
19288 case RULE_OP_MANGLE_REVERSE:
19289 SET_NAME (rule, rule_buf[rule_pos]);
19290 break;
19291
19292 case RULE_OP_MANGLE_DUPEWORD:
19293 SET_NAME (rule, rule_buf[rule_pos]);
19294 break;
19295
19296 case RULE_OP_MANGLE_DUPEWORD_TIMES:
19297 SET_NAME (rule, rule_buf[rule_pos]);
19298 SET_P0_CONV (rule, rule_buf[rule_pos]);
19299 break;
19300
19301 case RULE_OP_MANGLE_REFLECT:
19302 SET_NAME (rule, rule_buf[rule_pos]);
19303 break;
19304
19305 case RULE_OP_MANGLE_ROTATE_LEFT:
19306 SET_NAME (rule, rule_buf[rule_pos]);
19307 break;
19308
19309 case RULE_OP_MANGLE_ROTATE_RIGHT:
19310 SET_NAME (rule, rule_buf[rule_pos]);
19311 break;
19312
19313 case RULE_OP_MANGLE_APPEND:
19314 SET_NAME (rule, rule_buf[rule_pos]);
19315 SET_P0 (rule, rule_buf[rule_pos]);
19316 break;
19317
19318 case RULE_OP_MANGLE_PREPEND:
19319 SET_NAME (rule, rule_buf[rule_pos]);
19320 SET_P0 (rule, rule_buf[rule_pos]);
19321 break;
19322
19323 case RULE_OP_MANGLE_DELETE_FIRST:
19324 SET_NAME (rule, rule_buf[rule_pos]);
19325 break;
19326
19327 case RULE_OP_MANGLE_DELETE_LAST:
19328 SET_NAME (rule, rule_buf[rule_pos]);
19329 break;
19330
19331 case RULE_OP_MANGLE_DELETE_AT:
19332 SET_NAME (rule, rule_buf[rule_pos]);
19333 SET_P0_CONV (rule, rule_buf[rule_pos]);
19334 break;
19335
19336 case RULE_OP_MANGLE_EXTRACT:
19337 SET_NAME (rule, rule_buf[rule_pos]);
19338 SET_P0_CONV (rule, rule_buf[rule_pos]);
19339 SET_P1_CONV (rule, rule_buf[rule_pos]);
19340 break;
19341
19342 case RULE_OP_MANGLE_OMIT:
19343 SET_NAME (rule, rule_buf[rule_pos]);
19344 SET_P0_CONV (rule, rule_buf[rule_pos]);
19345 SET_P1_CONV (rule, rule_buf[rule_pos]);
19346 break;
19347
19348 case RULE_OP_MANGLE_INSERT:
19349 SET_NAME (rule, rule_buf[rule_pos]);
19350 SET_P0_CONV (rule, rule_buf[rule_pos]);
19351 SET_P1 (rule, rule_buf[rule_pos]);
19352 break;
19353
19354 case RULE_OP_MANGLE_OVERSTRIKE:
19355 SET_NAME (rule, rule_buf[rule_pos]);
19356 SET_P0_CONV (rule, rule_buf[rule_pos]);
19357 SET_P1 (rule, rule_buf[rule_pos]);
19358 break;
19359
19360 case RULE_OP_MANGLE_TRUNCATE_AT:
19361 SET_NAME (rule, rule_buf[rule_pos]);
19362 SET_P0_CONV (rule, rule_buf[rule_pos]);
19363 break;
19364
19365 case RULE_OP_MANGLE_REPLACE:
19366 SET_NAME (rule, rule_buf[rule_pos]);
19367 SET_P0 (rule, rule_buf[rule_pos]);
19368 SET_P1 (rule, rule_buf[rule_pos]);
19369 break;
19370
19371 case RULE_OP_MANGLE_PURGECHAR:
19372 return (-1);
19373 break;
19374
19375 case RULE_OP_MANGLE_TOGGLECASE_REC:
19376 return (-1);
19377 break;
19378
19379 case RULE_OP_MANGLE_DUPECHAR_FIRST:
19380 SET_NAME (rule, rule_buf[rule_pos]);
19381 SET_P0_CONV (rule, rule_buf[rule_pos]);
19382 break;
19383
19384 case RULE_OP_MANGLE_DUPECHAR_LAST:
19385 SET_NAME (rule, rule_buf[rule_pos]);
19386 SET_P0_CONV (rule, rule_buf[rule_pos]);
19387 break;
19388
19389 case RULE_OP_MANGLE_DUPECHAR_ALL:
19390 SET_NAME (rule, rule_buf[rule_pos]);
19391 break;
19392
19393 case RULE_OP_MANGLE_SWITCH_FIRST:
19394 SET_NAME (rule, rule_buf[rule_pos]);
19395 break;
19396
19397 case RULE_OP_MANGLE_SWITCH_LAST:
19398 SET_NAME (rule, rule_buf[rule_pos]);
19399 break;
19400
19401 case RULE_OP_MANGLE_SWITCH_AT:
19402 SET_NAME (rule, rule_buf[rule_pos]);
19403 SET_P0_CONV (rule, rule_buf[rule_pos]);
19404 SET_P1_CONV (rule, rule_buf[rule_pos]);
19405 break;
19406
19407 case RULE_OP_MANGLE_CHR_SHIFTL:
19408 SET_NAME (rule, rule_buf[rule_pos]);
19409 SET_P0_CONV (rule, rule_buf[rule_pos]);
19410 break;
19411
19412 case RULE_OP_MANGLE_CHR_SHIFTR:
19413 SET_NAME (rule, rule_buf[rule_pos]);
19414 SET_P0_CONV (rule, rule_buf[rule_pos]);
19415 break;
19416
19417 case RULE_OP_MANGLE_CHR_INCR:
19418 SET_NAME (rule, rule_buf[rule_pos]);
19419 SET_P0_CONV (rule, rule_buf[rule_pos]);
19420 break;
19421
19422 case RULE_OP_MANGLE_CHR_DECR:
19423 SET_NAME (rule, rule_buf[rule_pos]);
19424 SET_P0_CONV (rule, rule_buf[rule_pos]);
19425 break;
19426
19427 case RULE_OP_MANGLE_REPLACE_NP1:
19428 SET_NAME (rule, rule_buf[rule_pos]);
19429 SET_P0_CONV (rule, rule_buf[rule_pos]);
19430 break;
19431
19432 case RULE_OP_MANGLE_REPLACE_NM1:
19433 SET_NAME (rule, rule_buf[rule_pos]);
19434 SET_P0_CONV (rule, rule_buf[rule_pos]);
19435 break;
19436
19437 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
19438 SET_NAME (rule, rule_buf[rule_pos]);
19439 SET_P0_CONV (rule, rule_buf[rule_pos]);
19440 break;
19441
19442 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
19443 SET_NAME (rule, rule_buf[rule_pos]);
19444 SET_P0_CONV (rule, rule_buf[rule_pos]);
19445 break;
19446
19447 case RULE_OP_MANGLE_TITLE:
19448 SET_NAME (rule, rule_buf[rule_pos]);
19449 break;
19450
19451 default:
19452 return (-1);
19453 break;
19454 }
19455 }
19456
19457 if (rule_pos < rule_len) return (-1);
19458
19459 return (0);
19460 }
19461
19462 int kernel_rule_to_cpu_rule (char rule_buf[BUFSIZ], kernel_rule_t *rule)
19463 {
19464 uint rule_cnt;
19465 uint rule_pos;
19466 uint rule_len = BUFSIZ - 1; // maximum possible len
19467
19468 char rule_cmd;
19469
19470 for (rule_cnt = 0, rule_pos = 0; rule_pos < rule_len && rule_cnt < MAX_KERNEL_RULES; rule_pos++, rule_cnt++)
19471 {
19472 GET_NAME (rule);
19473
19474 if (rule_cnt > 0) rule_buf[rule_pos++] = ' ';
19475
19476 switch (rule_cmd)
19477 {
19478 case RULE_OP_MANGLE_NOOP:
19479 rule_buf[rule_pos] = rule_cmd;
19480 break;
19481
19482 case RULE_OP_MANGLE_LREST:
19483 rule_buf[rule_pos] = rule_cmd;
19484 break;
19485
19486 case RULE_OP_MANGLE_UREST:
19487 rule_buf[rule_pos] = rule_cmd;
19488 break;
19489
19490 case RULE_OP_MANGLE_LREST_UFIRST:
19491 rule_buf[rule_pos] = rule_cmd;
19492 break;
19493
19494 case RULE_OP_MANGLE_UREST_LFIRST:
19495 rule_buf[rule_pos] = rule_cmd;
19496 break;
19497
19498 case RULE_OP_MANGLE_TREST:
19499 rule_buf[rule_pos] = rule_cmd;
19500 break;
19501
19502 case RULE_OP_MANGLE_TOGGLE_AT:
19503 rule_buf[rule_pos] = rule_cmd;
19504 GET_P0_CONV (rule);
19505 break;
19506
19507 case RULE_OP_MANGLE_REVERSE:
19508 rule_buf[rule_pos] = rule_cmd;
19509 break;
19510
19511 case RULE_OP_MANGLE_DUPEWORD:
19512 rule_buf[rule_pos] = rule_cmd;
19513 break;
19514
19515 case RULE_OP_MANGLE_DUPEWORD_TIMES:
19516 rule_buf[rule_pos] = rule_cmd;
19517 GET_P0_CONV (rule);
19518 break;
19519
19520 case RULE_OP_MANGLE_REFLECT:
19521 rule_buf[rule_pos] = rule_cmd;
19522 break;
19523
19524 case RULE_OP_MANGLE_ROTATE_LEFT:
19525 rule_buf[rule_pos] = rule_cmd;
19526 break;
19527
19528 case RULE_OP_MANGLE_ROTATE_RIGHT:
19529 rule_buf[rule_pos] = rule_cmd;
19530 break;
19531
19532 case RULE_OP_MANGLE_APPEND:
19533 rule_buf[rule_pos] = rule_cmd;
19534 GET_P0 (rule);
19535 break;
19536
19537 case RULE_OP_MANGLE_PREPEND:
19538 rule_buf[rule_pos] = rule_cmd;
19539 GET_P0 (rule);
19540 break;
19541
19542 case RULE_OP_MANGLE_DELETE_FIRST:
19543 rule_buf[rule_pos] = rule_cmd;
19544 break;
19545
19546 case RULE_OP_MANGLE_DELETE_LAST:
19547 rule_buf[rule_pos] = rule_cmd;
19548 break;
19549
19550 case RULE_OP_MANGLE_DELETE_AT:
19551 rule_buf[rule_pos] = rule_cmd;
19552 GET_P0_CONV (rule);
19553 break;
19554
19555 case RULE_OP_MANGLE_EXTRACT:
19556 rule_buf[rule_pos] = rule_cmd;
19557 GET_P0_CONV (rule);
19558 GET_P1_CONV (rule);
19559 break;
19560
19561 case RULE_OP_MANGLE_OMIT:
19562 rule_buf[rule_pos] = rule_cmd;
19563 GET_P0_CONV (rule);
19564 GET_P1_CONV (rule);
19565 break;
19566
19567 case RULE_OP_MANGLE_INSERT:
19568 rule_buf[rule_pos] = rule_cmd;
19569 GET_P0_CONV (rule);
19570 GET_P1 (rule);
19571 break;
19572
19573 case RULE_OP_MANGLE_OVERSTRIKE:
19574 rule_buf[rule_pos] = rule_cmd;
19575 GET_P0_CONV (rule);
19576 GET_P1 (rule);
19577 break;
19578
19579 case RULE_OP_MANGLE_TRUNCATE_AT:
19580 rule_buf[rule_pos] = rule_cmd;
19581 GET_P0_CONV (rule);
19582 break;
19583
19584 case RULE_OP_MANGLE_REPLACE:
19585 rule_buf[rule_pos] = rule_cmd;
19586 GET_P0 (rule);
19587 GET_P1 (rule);
19588 break;
19589
19590 case RULE_OP_MANGLE_PURGECHAR:
19591 return (-1);
19592 break;
19593
19594 case RULE_OP_MANGLE_TOGGLECASE_REC:
19595 return (-1);
19596 break;
19597
19598 case RULE_OP_MANGLE_DUPECHAR_FIRST:
19599 rule_buf[rule_pos] = rule_cmd;
19600 GET_P0_CONV (rule);
19601 break;
19602
19603 case RULE_OP_MANGLE_DUPECHAR_LAST:
19604 rule_buf[rule_pos] = rule_cmd;
19605 GET_P0_CONV (rule);
19606 break;
19607
19608 case RULE_OP_MANGLE_DUPECHAR_ALL:
19609 rule_buf[rule_pos] = rule_cmd;
19610 break;
19611
19612 case RULE_OP_MANGLE_SWITCH_FIRST:
19613 rule_buf[rule_pos] = rule_cmd;
19614 break;
19615
19616 case RULE_OP_MANGLE_SWITCH_LAST:
19617 rule_buf[rule_pos] = rule_cmd;
19618 break;
19619
19620 case RULE_OP_MANGLE_SWITCH_AT:
19621 rule_buf[rule_pos] = rule_cmd;
19622 GET_P0_CONV (rule);
19623 GET_P1_CONV (rule);
19624 break;
19625
19626 case RULE_OP_MANGLE_CHR_SHIFTL:
19627 rule_buf[rule_pos] = rule_cmd;
19628 GET_P0_CONV (rule);
19629 break;
19630
19631 case RULE_OP_MANGLE_CHR_SHIFTR:
19632 rule_buf[rule_pos] = rule_cmd;
19633 GET_P0_CONV (rule);
19634 break;
19635
19636 case RULE_OP_MANGLE_CHR_INCR:
19637 rule_buf[rule_pos] = rule_cmd;
19638 GET_P0_CONV (rule);
19639 break;
19640
19641 case RULE_OP_MANGLE_CHR_DECR:
19642 rule_buf[rule_pos] = rule_cmd;
19643 GET_P0_CONV (rule);
19644 break;
19645
19646 case RULE_OP_MANGLE_REPLACE_NP1:
19647 rule_buf[rule_pos] = rule_cmd;
19648 GET_P0_CONV (rule);
19649 break;
19650
19651 case RULE_OP_MANGLE_REPLACE_NM1:
19652 rule_buf[rule_pos] = rule_cmd;
19653 GET_P0_CONV (rule);
19654 break;
19655
19656 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
19657 rule_buf[rule_pos] = rule_cmd;
19658 GET_P0_CONV (rule);
19659 break;
19660
19661 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
19662 rule_buf[rule_pos] = rule_cmd;
19663 GET_P0_CONV (rule);
19664 break;
19665
19666 case RULE_OP_MANGLE_TITLE:
19667 rule_buf[rule_pos] = rule_cmd;
19668 break;
19669
19670 case 0:
19671 return rule_pos - 1;
19672 break;
19673
19674 default:
19675 return (-1);
19676 break;
19677 }
19678 }
19679
19680 if (rule_cnt > 0)
19681 {
19682 return rule_pos;
19683 }
19684
19685 return (-1);
19686 }
19687
19688 /**
19689 * CPU rules : this is from hashcat sources, cpu based rules
19690 */
19691
19692 #define NEXT_RULEPOS(rp) if (++(rp) == rule_len) return (RULE_RC_SYNTAX_ERROR)
19693 #define NEXT_RPTOI(r,rp,up) if (((up) = conv_ctoi ((r)[(rp)])) == -1) return (RULE_RC_SYNTAX_ERROR)
19694
19695 #define MANGLE_TOGGLE_AT(a,p) if (class_alpha ((a)[(p)])) (a)[(p)] ^= 0x20
19696 #define MANGLE_LOWER_AT(a,p) if (class_upper ((a)[(p)])) (a)[(p)] ^= 0x20
19697 #define MANGLE_UPPER_AT(a,p) if (class_lower ((a)[(p)])) (a)[(p)] ^= 0x20
19698
19699 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); arr[(r)] = arr[(l)]; arr[(l)] = c; } */
19700 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); (a)[(r)] = (a)[(l)]; (a)[(l)] = c; } */
19701 #define MANGLE_SWITCH(a,l,r) { char c = (a)[(r)]; (a)[(r)] = (a)[(l)]; (a)[(l)] = c; }
19702
19703 int mangle_lrest (char arr[BLOCK_SIZE], int arr_len)
19704 {
19705 int pos;
19706
19707 for (pos = 0; pos < arr_len; pos++) MANGLE_LOWER_AT (arr, pos);
19708
19709 return (arr_len);
19710 }
19711
19712 int mangle_urest (char arr[BLOCK_SIZE], int arr_len)
19713 {
19714 int pos;
19715
19716 for (pos = 0; pos < arr_len; pos++) MANGLE_UPPER_AT (arr, pos);
19717
19718 return (arr_len);
19719 }
19720
19721 int mangle_trest (char arr[BLOCK_SIZE], int arr_len)
19722 {
19723 int pos;
19724
19725 for (pos = 0; pos < arr_len; pos++) MANGLE_TOGGLE_AT (arr, pos);
19726
19727 return (arr_len);
19728 }
19729
19730 int mangle_reverse (char arr[BLOCK_SIZE], int arr_len)
19731 {
19732 int l;
19733 int r;
19734
19735 for (l = 0; l < arr_len; l++)
19736 {
19737 r = arr_len - 1 - l;
19738
19739 if (l >= r) break;
19740
19741 MANGLE_SWITCH (arr, l, r);
19742 }
19743
19744 return (arr_len);
19745 }
19746
19747 int mangle_double (char arr[BLOCK_SIZE], int arr_len)
19748 {
19749 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
19750
19751 memcpy (&arr[arr_len], arr, (size_t) arr_len);
19752
19753 return (arr_len * 2);
19754 }
19755
19756 int mangle_double_times (char arr[BLOCK_SIZE], int arr_len, int times)
19757 {
19758 if (((arr_len * times) + arr_len) >= BLOCK_SIZE) return (arr_len);
19759
19760 int orig_len = arr_len;
19761
19762 int i;
19763
19764 for (i = 0; i < times; i++)
19765 {
19766 memcpy (&arr[arr_len], arr, orig_len);
19767
19768 arr_len += orig_len;
19769 }
19770
19771 return (arr_len);
19772 }
19773
19774 int mangle_reflect (char arr[BLOCK_SIZE], int arr_len)
19775 {
19776 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
19777
19778 mangle_double (arr, arr_len);
19779
19780 mangle_reverse (arr + arr_len, arr_len);
19781
19782 return (arr_len * 2);
19783 }
19784
19785 int mangle_rotate_left (char arr[BLOCK_SIZE], int arr_len)
19786 {
19787 int l;
19788 int r;
19789
19790 for (l = 0, r = arr_len - 1; r > 0; r--)
19791 {
19792 MANGLE_SWITCH (arr, l, r);
19793 }
19794
19795 return (arr_len);
19796 }
19797
19798 int mangle_rotate_right (char arr[BLOCK_SIZE], int arr_len)
19799 {
19800 int l;
19801 int r;
19802
19803 for (l = 0, r = arr_len - 1; l < r; l++)
19804 {
19805 MANGLE_SWITCH (arr, l, r);
19806 }
19807
19808 return (arr_len);
19809 }
19810
19811 int mangle_append (char arr[BLOCK_SIZE], int arr_len, char c)
19812 {
19813 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
19814
19815 arr[arr_len] = c;
19816
19817 return (arr_len + 1);
19818 }
19819
19820 int mangle_prepend (char arr[BLOCK_SIZE], int arr_len, char c)
19821 {
19822 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
19823
19824 int arr_pos;
19825
19826 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
19827 {
19828 arr[arr_pos + 1] = arr[arr_pos];
19829 }
19830
19831 arr[0] = c;
19832
19833 return (arr_len + 1);
19834 }
19835
19836 int mangle_delete_at (char arr[BLOCK_SIZE], int arr_len, int upos)
19837 {
19838 if (upos >= arr_len) return (arr_len);
19839
19840 int arr_pos;
19841
19842 for (arr_pos = upos; arr_pos < arr_len - 1; arr_pos++)
19843 {
19844 arr[arr_pos] = arr[arr_pos + 1];
19845 }
19846
19847 return (arr_len - 1);
19848 }
19849
19850 int mangle_extract (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
19851 {
19852 if (upos >= arr_len) return (arr_len);
19853
19854 if ((upos + ulen) > arr_len) return (arr_len);
19855
19856 int arr_pos;
19857
19858 for (arr_pos = 0; arr_pos < ulen; arr_pos++)
19859 {
19860 arr[arr_pos] = arr[upos + arr_pos];
19861 }
19862
19863 return (ulen);
19864 }
19865
19866 int mangle_omit (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
19867 {
19868 if (upos >= arr_len) return (arr_len);
19869
19870 if ((upos + ulen) >= arr_len) return (arr_len);
19871
19872 int arr_pos;
19873
19874 for (arr_pos = upos; arr_pos < arr_len - ulen; arr_pos++)
19875 {
19876 arr[arr_pos] = arr[arr_pos + ulen];
19877 }
19878
19879 return (arr_len - ulen);
19880 }
19881
19882 int mangle_insert (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
19883 {
19884 if (upos >= arr_len) return (arr_len);
19885
19886 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
19887
19888 int arr_pos;
19889
19890 for (arr_pos = arr_len - 1; arr_pos > upos - 1; arr_pos--)
19891 {
19892 arr[arr_pos + 1] = arr[arr_pos];
19893 }
19894
19895 arr[upos] = c;
19896
19897 return (arr_len + 1);
19898 }
19899
19900 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)
19901 {
19902 if ((arr_len + arr2_cpy) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
19903
19904 if (arr_pos > arr_len) return (RULE_RC_REJECT_ERROR);
19905
19906 if (arr2_pos > arr2_len) return (RULE_RC_REJECT_ERROR);
19907
19908 if ((arr2_pos + arr2_cpy) > arr2_len) return (RULE_RC_REJECT_ERROR);
19909
19910 if (arr2_cpy < 1) return (RULE_RC_SYNTAX_ERROR);
19911
19912 memcpy (arr2, arr2 + arr2_pos, arr2_len - arr2_pos);
19913
19914 memcpy (arr2 + arr2_cpy, arr + arr_pos, arr_len - arr_pos);
19915
19916 memcpy (arr + arr_pos, arr2, arr_len - arr_pos + arr2_cpy);
19917
19918 return (arr_len + arr2_cpy);
19919 }
19920
19921 int mangle_overstrike (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
19922 {
19923 if (upos >= arr_len) return (arr_len);
19924
19925 arr[upos] = c;
19926
19927 return (arr_len);
19928 }
19929
19930 int mangle_truncate_at (char arr[BLOCK_SIZE], int arr_len, int upos)
19931 {
19932 if (upos >= arr_len) return (arr_len);
19933
19934 memset (arr + upos, 0, arr_len - upos);
19935
19936 return (upos);
19937 }
19938
19939 int mangle_replace (char arr[BLOCK_SIZE], int arr_len, char oldc, char newc)
19940 {
19941 int arr_pos;
19942
19943 for (arr_pos = 0; arr_pos < arr_len; arr_pos++)
19944 {
19945 if (arr[arr_pos] != oldc) continue;
19946
19947 arr[arr_pos] = newc;
19948 }
19949
19950 return (arr_len);
19951 }
19952
19953 int mangle_purgechar (char arr[BLOCK_SIZE], int arr_len, char c)
19954 {
19955 int arr_pos;
19956
19957 int ret_len;
19958
19959 for (ret_len = 0, arr_pos = 0; arr_pos < arr_len; arr_pos++)
19960 {
19961 if (arr[arr_pos] == c) continue;
19962
19963 arr[ret_len] = arr[arr_pos];
19964
19965 ret_len++;
19966 }
19967
19968 return (ret_len);
19969 }
19970
19971 int mangle_dupeblock_prepend (char arr[BLOCK_SIZE], int arr_len, int ulen)
19972 {
19973 if (ulen > arr_len) return (arr_len);
19974
19975 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
19976
19977 char cs[100] = { 0 };
19978
19979 memcpy (cs, arr, ulen);
19980
19981 int i;
19982
19983 for (i = 0; i < ulen; i++)
19984 {
19985 char c = cs[i];
19986
19987 arr_len = mangle_insert (arr, arr_len, i, c);
19988 }
19989
19990 return (arr_len);
19991 }
19992
19993 int mangle_dupeblock_append (char arr[BLOCK_SIZE], int arr_len, int ulen)
19994 {
19995 if (ulen > arr_len) return (arr_len);
19996
19997 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
19998
19999 int upos = arr_len - ulen;
20000
20001 int i;
20002
20003 for (i = 0; i < ulen; i++)
20004 {
20005 char c = arr[upos + i];
20006
20007 arr_len = mangle_append (arr, arr_len, c);
20008 }
20009
20010 return (arr_len);
20011 }
20012
20013 int mangle_dupechar_at (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
20014 {
20015 if ( arr_len == 0) return (arr_len);
20016 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
20017
20018 char c = arr[upos];
20019
20020 int i;
20021
20022 for (i = 0; i < ulen; i++)
20023 {
20024 arr_len = mangle_insert (arr, arr_len, upos, c);
20025 }
20026
20027 return (arr_len);
20028 }
20029
20030 int mangle_dupechar (char arr[BLOCK_SIZE], int arr_len)
20031 {
20032 if ( arr_len == 0) return (arr_len);
20033 if ((arr_len + arr_len) >= BLOCK_SIZE) return (arr_len);
20034
20035 int arr_pos;
20036
20037 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
20038 {
20039 int new_pos = arr_pos * 2;
20040
20041 arr[new_pos] = arr[arr_pos];
20042
20043 arr[new_pos + 1] = arr[arr_pos];
20044 }
20045
20046 return (arr_len * 2);
20047 }
20048
20049 int mangle_switch_at_check (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
20050 {
20051 if (upos >= arr_len) return (arr_len);
20052 if (upos2 >= arr_len) return (arr_len);
20053
20054 MANGLE_SWITCH (arr, upos, upos2);
20055
20056 return (arr_len);
20057 }
20058
20059 int mangle_switch_at (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
20060 {
20061 MANGLE_SWITCH (arr, upos, upos2);
20062
20063 return (arr_len);
20064 }
20065
20066 int mangle_chr_shiftl (char arr[BLOCK_SIZE], int arr_len, int upos)
20067 {
20068 if (upos >= arr_len) return (arr_len);
20069
20070 arr[upos] <<= 1;
20071
20072 return (arr_len);
20073 }
20074
20075 int mangle_chr_shiftr (char arr[BLOCK_SIZE], int arr_len, int upos)
20076 {
20077 if (upos >= arr_len) return (arr_len);
20078
20079 arr[upos] >>= 1;
20080
20081 return (arr_len);
20082 }
20083
20084 int mangle_chr_incr (char arr[BLOCK_SIZE], int arr_len, int upos)
20085 {
20086 if (upos >= arr_len) return (arr_len);
20087
20088 arr[upos] += 1;
20089
20090 return (arr_len);
20091 }
20092
20093 int mangle_chr_decr (char arr[BLOCK_SIZE], int arr_len, int upos)
20094 {
20095 if (upos >= arr_len) return (arr_len);
20096
20097 arr[upos] -= 1;
20098
20099 return (arr_len);
20100 }
20101
20102 int mangle_title (char arr[BLOCK_SIZE], int arr_len)
20103 {
20104 int upper_next = 1;
20105
20106 int pos;
20107
20108 for (pos = 0; pos < arr_len; pos++)
20109 {
20110 if (arr[pos] == ' ')
20111 {
20112 upper_next = 1;
20113
20114 continue;
20115 }
20116
20117 if (upper_next)
20118 {
20119 upper_next = 0;
20120
20121 MANGLE_UPPER_AT (arr, pos);
20122 }
20123 else
20124 {
20125 MANGLE_LOWER_AT (arr, pos);
20126 }
20127 }
20128
20129 return (arr_len);
20130 }
20131
20132 int generate_random_rule (char rule_buf[RP_RULE_BUFSIZ], u32 rp_gen_func_min, u32 rp_gen_func_max)
20133 {
20134 u32 rp_gen_num = get_random_num (rp_gen_func_min, rp_gen_func_max);
20135
20136 u32 j;
20137
20138 u32 rule_pos = 0;
20139
20140 for (j = 0; j < rp_gen_num; j++)
20141 {
20142 u32 r = 0;
20143 u32 p1 = 0;
20144 u32 p2 = 0;
20145 u32 p3 = 0;
20146
20147 switch ((char) get_random_num (0, 9))
20148 {
20149 case 0:
20150 r = get_random_num (0, sizeof (grp_op_nop));
20151 rule_buf[rule_pos++] = grp_op_nop[r];
20152 break;
20153
20154 case 1:
20155 r = get_random_num (0, sizeof (grp_op_pos_p0));
20156 rule_buf[rule_pos++] = grp_op_pos_p0[r];
20157 p1 = get_random_num (0, sizeof (grp_pos));
20158 rule_buf[rule_pos++] = grp_pos[p1];
20159 break;
20160
20161 case 2:
20162 r = get_random_num (0, sizeof (grp_op_pos_p1));
20163 rule_buf[rule_pos++] = grp_op_pos_p1[r];
20164 p1 = get_random_num (1, 6);
20165 rule_buf[rule_pos++] = grp_pos[p1];
20166 break;
20167
20168 case 3:
20169 r = get_random_num (0, sizeof (grp_op_chr));
20170 rule_buf[rule_pos++] = grp_op_chr[r];
20171 p1 = get_random_num (0x20, 0x7e);
20172 rule_buf[rule_pos++] = (char) p1;
20173 break;
20174
20175 case 4:
20176 r = get_random_num (0, sizeof (grp_op_chr_chr));
20177 rule_buf[rule_pos++] = grp_op_chr_chr[r];
20178 p1 = get_random_num (0x20, 0x7e);
20179 rule_buf[rule_pos++] = (char) p1;
20180 p2 = get_random_num (0x20, 0x7e);
20181 while (p1 == p2)
20182 p2 = get_random_num (0x20, 0x7e);
20183 rule_buf[rule_pos++] = (char) p2;
20184 break;
20185
20186 case 5:
20187 r = get_random_num (0, sizeof (grp_op_pos_chr));
20188 rule_buf[rule_pos++] = grp_op_pos_chr[r];
20189 p1 = get_random_num (0, sizeof (grp_pos));
20190 rule_buf[rule_pos++] = grp_pos[p1];
20191 p2 = get_random_num (0x20, 0x7e);
20192 rule_buf[rule_pos++] = (char) p2;
20193 break;
20194
20195 case 6:
20196 r = get_random_num (0, sizeof (grp_op_pos_pos0));
20197 rule_buf[rule_pos++] = grp_op_pos_pos0[r];
20198 p1 = get_random_num (0, sizeof (grp_pos));
20199 rule_buf[rule_pos++] = grp_pos[p1];
20200 p2 = get_random_num (0, sizeof (grp_pos));
20201 while (p1 == p2)
20202 p2 = get_random_num (0, sizeof (grp_pos));
20203 rule_buf[rule_pos++] = grp_pos[p2];
20204 break;
20205
20206 case 7:
20207 r = get_random_num (0, sizeof (grp_op_pos_pos1));
20208 rule_buf[rule_pos++] = grp_op_pos_pos1[r];
20209 p1 = get_random_num (0, sizeof (grp_pos));
20210 rule_buf[rule_pos++] = grp_pos[p1];
20211 p2 = get_random_num (1, sizeof (grp_pos));
20212 while (p1 == p2)
20213 p2 = get_random_num (1, sizeof (grp_pos));
20214 rule_buf[rule_pos++] = grp_pos[p2];
20215 break;
20216
20217 case 8:
20218 r = get_random_num (0, sizeof (grp_op_pos1_pos2_pos3));
20219 rule_buf[rule_pos++] = grp_op_pos1_pos2_pos3[r];
20220 p1 = get_random_num (0, sizeof (grp_pos));
20221 rule_buf[rule_pos++] = grp_pos[p1];
20222 p2 = get_random_num (1, sizeof (grp_pos));
20223 rule_buf[rule_pos++] = grp_pos[p1];
20224 p3 = get_random_num (0, sizeof (grp_pos));
20225 rule_buf[rule_pos++] = grp_pos[p3];
20226 break;
20227 }
20228 }
20229
20230 return (rule_pos);
20231 }
20232
20233 int _old_apply_rule (char *rule, int rule_len, char in[BLOCK_SIZE], int in_len, char out[BLOCK_SIZE])
20234 {
20235 char mem[BLOCK_SIZE] = { 0 };
20236
20237 if (in == NULL) return (RULE_RC_REJECT_ERROR);
20238
20239 if (out == NULL) return (RULE_RC_REJECT_ERROR);
20240
20241 if (in_len < 1 || in_len > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
20242
20243 if (rule_len < 1) return (RULE_RC_REJECT_ERROR);
20244
20245 int out_len = in_len;
20246 int mem_len = in_len;
20247
20248 memcpy (out, in, out_len);
20249
20250 int rule_pos;
20251
20252 for (rule_pos = 0; rule_pos < rule_len; rule_pos++)
20253 {
20254 int upos, upos2;
20255 int ulen;
20256
20257 switch (rule[rule_pos])
20258 {
20259 case ' ':
20260 break;
20261
20262 case RULE_OP_MANGLE_NOOP:
20263 break;
20264
20265 case RULE_OP_MANGLE_LREST:
20266 out_len = mangle_lrest (out, out_len);
20267 break;
20268
20269 case RULE_OP_MANGLE_UREST:
20270 out_len = mangle_urest (out, out_len);
20271 break;
20272
20273 case RULE_OP_MANGLE_LREST_UFIRST:
20274 out_len = mangle_lrest (out, out_len);
20275 if (out_len) MANGLE_UPPER_AT (out, 0);
20276 break;
20277
20278 case RULE_OP_MANGLE_UREST_LFIRST:
20279 out_len = mangle_urest (out, out_len);
20280 if (out_len) MANGLE_LOWER_AT (out, 0);
20281 break;
20282
20283 case RULE_OP_MANGLE_TREST:
20284 out_len = mangle_trest (out, out_len);
20285 break;
20286
20287 case RULE_OP_MANGLE_TOGGLE_AT:
20288 NEXT_RULEPOS (rule_pos);
20289 NEXT_RPTOI (rule, rule_pos, upos);
20290 if (upos < out_len) MANGLE_TOGGLE_AT (out, upos);
20291 break;
20292
20293 case RULE_OP_MANGLE_REVERSE:
20294 out_len = mangle_reverse (out, out_len);
20295 break;
20296
20297 case RULE_OP_MANGLE_DUPEWORD:
20298 out_len = mangle_double (out, out_len);
20299 break;
20300
20301 case RULE_OP_MANGLE_DUPEWORD_TIMES:
20302 NEXT_RULEPOS (rule_pos);
20303 NEXT_RPTOI (rule, rule_pos, ulen);
20304 out_len = mangle_double_times (out, out_len, ulen);
20305 break;
20306
20307 case RULE_OP_MANGLE_REFLECT:
20308 out_len = mangle_reflect (out, out_len);
20309 break;
20310
20311 case RULE_OP_MANGLE_ROTATE_LEFT:
20312 mangle_rotate_left (out, out_len);
20313 break;
20314
20315 case RULE_OP_MANGLE_ROTATE_RIGHT:
20316 mangle_rotate_right (out, out_len);
20317 break;
20318
20319 case RULE_OP_MANGLE_APPEND:
20320 NEXT_RULEPOS (rule_pos);
20321 out_len = mangle_append (out, out_len, rule[rule_pos]);
20322 break;
20323
20324 case RULE_OP_MANGLE_PREPEND:
20325 NEXT_RULEPOS (rule_pos);
20326 out_len = mangle_prepend (out, out_len, rule[rule_pos]);
20327 break;
20328
20329 case RULE_OP_MANGLE_DELETE_FIRST:
20330 out_len = mangle_delete_at (out, out_len, 0);
20331 break;
20332
20333 case RULE_OP_MANGLE_DELETE_LAST:
20334 out_len = mangle_delete_at (out, out_len, (out_len) ? out_len - 1 : 0);
20335 break;
20336
20337 case RULE_OP_MANGLE_DELETE_AT:
20338 NEXT_RULEPOS (rule_pos);
20339 NEXT_RPTOI (rule, rule_pos, upos);
20340 out_len = mangle_delete_at (out, out_len, upos);
20341 break;
20342
20343 case RULE_OP_MANGLE_EXTRACT:
20344 NEXT_RULEPOS (rule_pos);
20345 NEXT_RPTOI (rule, rule_pos, upos);
20346 NEXT_RULEPOS (rule_pos);
20347 NEXT_RPTOI (rule, rule_pos, ulen);
20348 out_len = mangle_extract (out, out_len, upos, ulen);
20349 break;
20350
20351 case RULE_OP_MANGLE_OMIT:
20352 NEXT_RULEPOS (rule_pos);
20353 NEXT_RPTOI (rule, rule_pos, upos);
20354 NEXT_RULEPOS (rule_pos);
20355 NEXT_RPTOI (rule, rule_pos, ulen);
20356 out_len = mangle_omit (out, out_len, upos, ulen);
20357 break;
20358
20359 case RULE_OP_MANGLE_INSERT:
20360 NEXT_RULEPOS (rule_pos);
20361 NEXT_RPTOI (rule, rule_pos, upos);
20362 NEXT_RULEPOS (rule_pos);
20363 out_len = mangle_insert (out, out_len, upos, rule[rule_pos]);
20364 break;
20365
20366 case RULE_OP_MANGLE_OVERSTRIKE:
20367 NEXT_RULEPOS (rule_pos);
20368 NEXT_RPTOI (rule, rule_pos, upos);
20369 NEXT_RULEPOS (rule_pos);
20370 out_len = mangle_overstrike (out, out_len, upos, rule[rule_pos]);
20371 break;
20372
20373 case RULE_OP_MANGLE_TRUNCATE_AT:
20374 NEXT_RULEPOS (rule_pos);
20375 NEXT_RPTOI (rule, rule_pos, upos);
20376 out_len = mangle_truncate_at (out, out_len, upos);
20377 break;
20378
20379 case RULE_OP_MANGLE_REPLACE:
20380 NEXT_RULEPOS (rule_pos);
20381 NEXT_RULEPOS (rule_pos);
20382 out_len = mangle_replace (out, out_len, rule[rule_pos - 1], rule[rule_pos]);
20383 break;
20384
20385 case RULE_OP_MANGLE_PURGECHAR:
20386 NEXT_RULEPOS (rule_pos);
20387 out_len = mangle_purgechar (out, out_len, rule[rule_pos]);
20388 break;
20389
20390 case RULE_OP_MANGLE_TOGGLECASE_REC:
20391 /* todo */
20392 break;
20393
20394 case RULE_OP_MANGLE_DUPECHAR_FIRST:
20395 NEXT_RULEPOS (rule_pos);
20396 NEXT_RPTOI (rule, rule_pos, ulen);
20397 out_len = mangle_dupechar_at (out, out_len, 0, ulen);
20398 break;
20399
20400 case RULE_OP_MANGLE_DUPECHAR_LAST:
20401 NEXT_RULEPOS (rule_pos);
20402 NEXT_RPTOI (rule, rule_pos, ulen);
20403 out_len = mangle_dupechar_at (out, out_len, out_len - 1, ulen);
20404 break;
20405
20406 case RULE_OP_MANGLE_DUPECHAR_ALL:
20407 out_len = mangle_dupechar (out, out_len);
20408 break;
20409
20410 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
20411 NEXT_RULEPOS (rule_pos);
20412 NEXT_RPTOI (rule, rule_pos, ulen);
20413 out_len = mangle_dupeblock_prepend (out, out_len, ulen);
20414 break;
20415
20416 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
20417 NEXT_RULEPOS (rule_pos);
20418 NEXT_RPTOI (rule, rule_pos, ulen);
20419 out_len = mangle_dupeblock_append (out, out_len, ulen);
20420 break;
20421
20422 case RULE_OP_MANGLE_SWITCH_FIRST:
20423 if (out_len >= 2) mangle_switch_at (out, out_len, 0, 1);
20424 break;
20425
20426 case RULE_OP_MANGLE_SWITCH_LAST:
20427 if (out_len >= 2) mangle_switch_at (out, out_len, out_len - 1, out_len - 2);
20428 break;
20429
20430 case RULE_OP_MANGLE_SWITCH_AT:
20431 NEXT_RULEPOS (rule_pos);
20432 NEXT_RPTOI (rule, rule_pos, upos);
20433 NEXT_RULEPOS (rule_pos);
20434 NEXT_RPTOI (rule, rule_pos, upos2);
20435 out_len = mangle_switch_at_check (out, out_len, upos, upos2);
20436 break;
20437
20438 case RULE_OP_MANGLE_CHR_SHIFTL:
20439 NEXT_RULEPOS (rule_pos);
20440 NEXT_RPTOI (rule, rule_pos, upos);
20441 mangle_chr_shiftl (out, out_len, upos);
20442 break;
20443
20444 case RULE_OP_MANGLE_CHR_SHIFTR:
20445 NEXT_RULEPOS (rule_pos);
20446 NEXT_RPTOI (rule, rule_pos, upos);
20447 mangle_chr_shiftr (out, out_len, upos);
20448 break;
20449
20450 case RULE_OP_MANGLE_CHR_INCR:
20451 NEXT_RULEPOS (rule_pos);
20452 NEXT_RPTOI (rule, rule_pos, upos);
20453 mangle_chr_incr (out, out_len, upos);
20454 break;
20455
20456 case RULE_OP_MANGLE_CHR_DECR:
20457 NEXT_RULEPOS (rule_pos);
20458 NEXT_RPTOI (rule, rule_pos, upos);
20459 mangle_chr_decr (out, out_len, upos);
20460 break;
20461
20462 case RULE_OP_MANGLE_REPLACE_NP1:
20463 NEXT_RULEPOS (rule_pos);
20464 NEXT_RPTOI (rule, rule_pos, upos);
20465 if ((upos >= 0) && ((upos + 1) < out_len)) mangle_overstrike (out, out_len, upos, out[upos + 1]);
20466 break;
20467
20468 case RULE_OP_MANGLE_REPLACE_NM1:
20469 NEXT_RULEPOS (rule_pos);
20470 NEXT_RPTOI (rule, rule_pos, upos);
20471 if ((upos >= 1) && ((upos + 0) < out_len)) mangle_overstrike (out, out_len, upos, out[upos - 1]);
20472 break;
20473
20474 case RULE_OP_MANGLE_TITLE:
20475 out_len = mangle_title (out, out_len);
20476 break;
20477
20478 case RULE_OP_MANGLE_EXTRACT_MEMORY:
20479 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20480 NEXT_RULEPOS (rule_pos);
20481 NEXT_RPTOI (rule, rule_pos, upos);
20482 NEXT_RULEPOS (rule_pos);
20483 NEXT_RPTOI (rule, rule_pos, ulen);
20484 NEXT_RULEPOS (rule_pos);
20485 NEXT_RPTOI (rule, rule_pos, upos2);
20486 if ((out_len = mangle_insert_multi (out, out_len, upos2, mem, mem_len, upos, ulen)) < 1) return (out_len);
20487 break;
20488
20489 case RULE_OP_MANGLE_APPEND_MEMORY:
20490 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20491 if ((out_len + mem_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
20492 memcpy (out + out_len, mem, mem_len);
20493 out_len += mem_len;
20494 break;
20495
20496 case RULE_OP_MANGLE_PREPEND_MEMORY:
20497 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20498 if ((mem_len + out_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
20499 memcpy (mem + mem_len, out, out_len);
20500 out_len += mem_len;
20501 memcpy (out, mem, out_len);
20502 break;
20503
20504 case RULE_OP_MEMORIZE_WORD:
20505 memcpy (mem, out, out_len);
20506 mem_len = out_len;
20507 break;
20508
20509 case RULE_OP_REJECT_LESS:
20510 NEXT_RULEPOS (rule_pos);
20511 NEXT_RPTOI (rule, rule_pos, upos);
20512 if (out_len > upos) return (RULE_RC_REJECT_ERROR);
20513 break;
20514
20515 case RULE_OP_REJECT_GREATER:
20516 NEXT_RULEPOS (rule_pos);
20517 NEXT_RPTOI (rule, rule_pos, upos);
20518 if (out_len < upos) return (RULE_RC_REJECT_ERROR);
20519 break;
20520
20521 case RULE_OP_REJECT_CONTAIN:
20522 NEXT_RULEPOS (rule_pos);
20523 if (strchr (out, rule[rule_pos]) != NULL) return (RULE_RC_REJECT_ERROR);
20524 break;
20525
20526 case RULE_OP_REJECT_NOT_CONTAIN:
20527 NEXT_RULEPOS (rule_pos);
20528 if (strchr (out, rule[rule_pos]) == NULL) return (RULE_RC_REJECT_ERROR);
20529 break;
20530
20531 case RULE_OP_REJECT_EQUAL_FIRST:
20532 NEXT_RULEPOS (rule_pos);
20533 if (out[0] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20534 break;
20535
20536 case RULE_OP_REJECT_EQUAL_LAST:
20537 NEXT_RULEPOS (rule_pos);
20538 if (out[out_len - 1] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20539 break;
20540
20541 case RULE_OP_REJECT_EQUAL_AT:
20542 NEXT_RULEPOS (rule_pos);
20543 NEXT_RPTOI (rule, rule_pos, upos);
20544 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
20545 NEXT_RULEPOS (rule_pos);
20546 if (out[upos] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20547 break;
20548
20549 case RULE_OP_REJECT_CONTAINS:
20550 NEXT_RULEPOS (rule_pos);
20551 NEXT_RPTOI (rule, rule_pos, upos);
20552 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
20553 NEXT_RULEPOS (rule_pos);
20554 int c; int cnt; for (c = 0, cnt = 0; c < out_len; c++) if (out[c] == rule[rule_pos]) cnt++;
20555 if (cnt < upos) return (RULE_RC_REJECT_ERROR);
20556 break;
20557
20558 case RULE_OP_REJECT_MEMORY:
20559 if ((out_len == mem_len) && (memcmp (out, mem, out_len) == 0)) return (RULE_RC_REJECT_ERROR);
20560 break;
20561
20562 default:
20563 return (RULE_RC_SYNTAX_ERROR);
20564 break;
20565 }
20566 }
20567
20568 memset (out + out_len, 0, BLOCK_SIZE - out_len);
20569
20570 return (out_len);
20571 }