2 * Author......: Jens Steube <jens.steube@gmail.com>
9 #define MIN(a,b) (((a) < (b)) ? (a) : (b))
10 #define MAX(a,b) (((a) > (b)) ? (a) : (b))
16 #define GET_ACCEL(x) GPU_ACCEL_AMD_ ## x
17 #define GET_LOOPS(x) GPU_LOOPS_AMD_ ## x
23 uint32_t rotl32 (const uint32_t a
, const uint n
)
25 return ((a
<< n
) | (a
>> (32 - n
)));
28 uint32_t rotr32 (const uint32_t a
, const uint n
)
30 return ((a
>> n
) | (a
<< (32 - n
)));
33 uint64_t rotl64 (const uint64_t a
, const uint n
)
35 return ((a
<< n
) | (a
>> (64 - n
)));
38 uint64_t rotr64 (const uint64_t a
, const uint n
)
40 return ((a
>> n
) | (a
<< (64 - n
)));
44 * ciphers for use on cpu
51 * hashes for use on cpu
55 #include "cpu-sha256.c"
63 void log_final (FILE *fp
, const char *fmt
, va_list ap
)
69 for (int i
= 0; i
< last_len
; i
++)
79 int max_len
= (int) sizeof (s
);
81 int len
= vsnprintf (s
, max_len
, fmt
, ap
);
83 if (len
> max_len
) len
= max_len
;
85 fwrite (s
, len
, 1, fp
);
92 void log_out_nn (FILE *fp
, const char *fmt
, ...)
94 if (SUPPRESS_OUTPUT
) return;
100 log_final (fp
, fmt
, ap
);
105 void log_info_nn (const char *fmt
, ...)
107 if (SUPPRESS_OUTPUT
) return;
113 log_final (stdout
, fmt
, ap
);
118 void log_error_nn (const char *fmt
, ...)
120 if (SUPPRESS_OUTPUT
) return;
126 log_final (stderr
, fmt
, ap
);
131 void log_out (FILE *fp
, const char *fmt
, ...)
133 if (SUPPRESS_OUTPUT
) return;
139 log_final (fp
, fmt
, ap
);
148 void log_info (const char *fmt
, ...)
150 if (SUPPRESS_OUTPUT
) return;
156 log_final (stdout
, fmt
, ap
);
160 fputc ('\n', stdout
);
165 void log_error (const char *fmt
, ...)
167 if (SUPPRESS_OUTPUT
) return;
169 fputc ('\n', stderr
);
170 fputc ('\n', stderr
);
176 log_final (stderr
, fmt
, ap
);
180 fputc ('\n', stderr
);
181 fputc ('\n', stderr
);
190 uint
byte_swap_32 (const uint n
)
192 return (n
& 0xff000000) >> 24
193 | (n
& 0x00ff0000) >> 8
194 | (n
& 0x0000ff00) << 8
195 | (n
& 0x000000ff) << 24;
198 uint64_t byte_swap_64 (const uint64_t n
)
200 return (n
& 0xff00000000000000ULL
) >> 56
201 | (n
& 0x00ff000000000000ULL
) >> 40
202 | (n
& 0x0000ff0000000000ULL
) >> 24
203 | (n
& 0x000000ff00000000ULL
) >> 8
204 | (n
& 0x00000000ff000000ULL
) << 8
205 | (n
& 0x0000000000ff0000ULL
) << 24
206 | (n
& 0x000000000000ff00ULL
) << 40
207 | (n
& 0x00000000000000ffULL
) << 56;
210 char int_to_base32 (const char c
)
212 static const char tbl
[0x20] =
214 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50,
215 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
218 return tbl
[(const uint8_t) c
];
221 char base32_to_int (const char c
)
223 if ((c
>= 'A') && (c
<= 'Z')) return c
- 'A';
224 else if ((c
>= '2') && (c
<= '7')) return c
- '2' + 26;
229 char int_to_itoa32 (const char c
)
231 static const char tbl
[0x20] =
233 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66,
234 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76,
237 return tbl
[(const uint8_t) c
];
240 char itoa32_to_int (const char c
)
242 if ((c
>= '0') && (c
<= '9')) return c
- '0';
243 else if ((c
>= 'a') && (c
<= 'v')) return c
- 'a' + 10;
248 char int_to_itoa64 (const char c
)
250 static const char tbl
[0x40] =
252 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44,
253 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54,
254 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a,
255 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a,
258 return tbl
[(const uint8_t) c
];
261 char itoa64_to_int (const char c
)
263 static const char tbl
[0x100] =
265 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21,
266 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31,
267 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01,
268 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a,
269 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a,
270 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 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 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14,
278 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24,
279 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34,
280 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01, 0x02, 0x03, 0x04,
283 return tbl
[(const uint8_t) c
];
286 char int_to_base64 (const char c
)
288 static const char tbl
[0x40] =
290 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50,
291 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66,
292 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76,
293 0x77, 0x78, 0x79, 0x7a, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x2b, 0x2f,
296 return tbl
[(const uint8_t) c
];
299 char base64_to_int (const char c
)
301 static const char tbl
[0x100] =
303 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
304 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
305 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x3f,
306 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
307 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
308 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00,
309 0x00, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,
310 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 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 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
316 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
317 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
318 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
321 return tbl
[(const uint8_t) c
];
324 char int_to_bf64 (const char c
)
326 static const char tbl
[0x40] =
328 0x2e, 0x2f, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e,
329 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64,
330 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74,
331 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
334 return tbl
[(const uint8_t) c
];
337 char bf64_to_int (const char c
)
339 static const char tbl
[0x100] =
341 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
342 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
343 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
344 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
345 0x00, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
346 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00,
347 0x00, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a,
348 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 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 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
354 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
355 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
356 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
359 return tbl
[(const uint8_t) c
];
362 char int_to_lotus64 (const char c
)
364 if (c
< 10) return '0' + c
;
365 else if (c
< 36) return 'A' + c
- 10;
366 else if (c
< 62) return 'a' + c
- 36;
367 else if (c
== 62) return '+';
368 else if (c
== 63) return '/';
373 char lotus64_to_int (const char c
)
375 if ((c
>= '0') && (c
<= '9')) return c
- '0';
376 else if ((c
>= 'A') && (c
<= 'Z')) return c
- 'A' + 10;
377 else if ((c
>= 'a') && (c
<= 'z')) return c
- 'a' + 36;
378 else if (c
== '+') return 62;
379 else if (c
== '/') return 63;
385 int base32_decode (char (*f
) (const char), char *in_buf
, int in_len
, char *out_buf
)
387 char *in_ptr
= in_buf
;
389 char *out_ptr
= out_buf
;
391 for (int i
= 0; i
< in_len
; i
+= 8)
393 char out_val0
= f (in_ptr
[0] & 0x7f);
394 char out_val1
= f (in_ptr
[1] & 0x7f);
395 char out_val2
= f (in_ptr
[2] & 0x7f);
396 char out_val3
= f (in_ptr
[3] & 0x7f);
397 char out_val4
= f (in_ptr
[4] & 0x7f);
398 char out_val5
= f (in_ptr
[5] & 0x7f);
399 char out_val6
= f (in_ptr
[6] & 0x7f);
400 char out_val7
= f (in_ptr
[7] & 0x7f);
402 out_ptr
[0] = ((out_val0
<< 3) & 0xf8) | ((out_val1
>> 2) & 0x07);
403 out_ptr
[1] = ((out_val1
<< 6) & 0xc0) | ((out_val2
<< 1) & 0x3e) | ((out_val3
>> 4) & 0x01);
404 out_ptr
[2] = ((out_val3
<< 4) & 0xf0) | ((out_val4
>> 1) & 0x0f);
405 out_ptr
[3] = ((out_val4
<< 7) & 0x80) | ((out_val5
<< 2) & 0x7c) | ((out_val6
>> 3) & 0x03);
406 out_ptr
[4] = ((out_val6
<< 5) & 0xe0) | ((out_val7
>> 0) & 0x1f);
412 for (int i
= 0; i
< in_len
; i
++)
414 if (in_buf
[i
] != '=') continue;
419 int out_len
= (in_len
* 5) / 8;
424 int base32_encode (char (*f
) (const char), char *in_buf
, int in_len
, char *out_buf
)
426 char *in_ptr
= in_buf
;
428 char *out_ptr
= out_buf
;
430 for (int i
= 0; i
< in_len
; i
+= 5)
432 char out_val0
= f ( ((in_ptr
[0] >> 3) & 0x1f));
433 char out_val1
= f (((in_ptr
[0] << 2) & 0x1c) | ((in_ptr
[1] >> 6) & 0x03));
434 char out_val2
= f ( ((in_ptr
[1] >> 1) & 0x1f));
435 char out_val3
= f (((in_ptr
[1] << 4) & 0x10) | ((in_ptr
[2] >> 4) & 0x0f));
436 char out_val4
= f (((in_ptr
[2] << 1) & 0x1e) | ((in_ptr
[3] >> 7) & 0x01));
437 char out_val5
= f ( ((in_ptr
[3] >> 2) & 0x1f));
438 char out_val6
= f (((in_ptr
[3] << 3) & 0x18) | ((in_ptr
[4] >> 5) & 0x07));
439 char out_val7
= f ( ((in_ptr
[4] >> 0) & 0x1f));
441 out_ptr
[0] = out_val0
& 0x7f;
442 out_ptr
[1] = out_val1
& 0x7f;
443 out_ptr
[2] = out_val2
& 0x7f;
444 out_ptr
[3] = out_val3
& 0x7f;
445 out_ptr
[4] = out_val4
& 0x7f;
446 out_ptr
[5] = out_val5
& 0x7f;
447 out_ptr
[6] = out_val6
& 0x7f;
448 out_ptr
[7] = out_val7
& 0x7f;
454 int out_len
= (in_len
* 8) / 5;
456 for (int i
= 0; i
< (7 - (in_len
% 7)); i
++)
460 out_buf
[out_len
] = '=';
466 int base64_decode (char (*f
) (const char), char *in_buf
, int in_len
, char *out_buf
)
468 char *in_ptr
= in_buf
;
470 char *out_ptr
= out_buf
;
472 for (int i
= 0; i
< in_len
; i
+= 4)
474 char out_val0
= f (in_ptr
[0] & 0x7f);
475 char out_val1
= f (in_ptr
[1] & 0x7f);
476 char out_val2
= f (in_ptr
[2] & 0x7f);
477 char out_val3
= f (in_ptr
[3] & 0x7f);
479 out_ptr
[0] = ((out_val0
<< 2) & 0xfc) | ((out_val1
>> 4) & 0x03);
480 out_ptr
[1] = ((out_val1
<< 4) & 0xf0) | ((out_val2
>> 2) & 0x0f);
481 out_ptr
[2] = ((out_val2
<< 6) & 0xc0) | ((out_val3
>> 0) & 0x3f);
487 for (int i
= 0; i
< in_len
; i
++)
489 if (in_buf
[i
] != '=') continue;
494 int out_len
= (in_len
* 6) / 8;
499 int base64_encode (char (*f
) (const char), char *in_buf
, int in_len
, char *out_buf
)
501 char *in_ptr
= in_buf
;
503 char *out_ptr
= out_buf
;
505 for (int i
= 0; i
< in_len
; i
+= 3)
507 char out_val0
= f ( ((in_ptr
[0] >> 2) & 0x3f));
508 char out_val1
= f (((in_ptr
[0] << 4) & 0x30) | ((in_ptr
[1] >> 4) & 0x0f));
509 char out_val2
= f (((in_ptr
[1] << 2) & 0x3c) | ((in_ptr
[2] >> 6) & 0x03));
510 char out_val3
= f ( ((in_ptr
[2] >> 0) & 0x3f));
512 out_ptr
[0] = out_val0
& 0x7f;
513 out_ptr
[1] = out_val1
& 0x7f;
514 out_ptr
[2] = out_val2
& 0x7f;
515 out_ptr
[3] = out_val3
& 0x7f;
521 int out_len
= (in_len
* 8) / 6;
523 for (int i
= 0; i
< (3 - (in_len
% 3)); i
++)
527 out_buf
[out_len
] = '=';
533 static void AES128_decrypt_cbc (const uint key
[4], const uint iv
[4], const uint in
[16], uint out
[16])
537 AES_set_decrypt_key ((unsigned char *) key
, 128, &skey
);
546 for (int i
= 0; i
< 16; i
+= 4)
556 AES_decrypt (&skey
, (char *) _in
, (char *) _out
);
563 out
[i
+ 0] = _out
[0];
564 out
[i
+ 1] = _out
[1];
565 out
[i
+ 2] = _out
[2];
566 out
[i
+ 3] = _out
[3];
575 static void juniper_decrypt_hash (char *in
, char *out
)
579 char base64_buf
[100];
581 memset (base64_buf
, 0, sizeof (base64_buf
));
583 base64_decode (base64_to_int
, in
, DISPLAY_LEN_MIN_501
, base64_buf
);
587 uint juniper_iv
[4] = { 0 };
589 memcpy (juniper_iv
, base64_buf
, 12);
591 memcpy (out
, juniper_iv
, 12);
597 juniper_key
[0] = byte_swap_32 (0xa6707a7e);
598 juniper_key
[1] = byte_swap_32 (0x8df91059);
599 juniper_key
[2] = byte_swap_32 (0xdea70ae5);
600 juniper_key
[3] = byte_swap_32 (0x2f9c2442);
604 uint
*in_ptr
= (uint
*) (base64_buf
+ 12);
605 uint
*out_ptr
= (uint
*) (out
+ 12);
607 AES128_decrypt_cbc (juniper_key
, juniper_iv
, in_ptr
, out_ptr
);
610 uint
is_valid_hex_char (const char c
)
612 if ((c
>= '0') && (c
<= '9')) return 1;
613 if ((c
>= 'A') && (c
<= 'F')) return 1;
614 if ((c
>= 'a') && (c
<= 'f')) return 1;
619 char hex_convert (const char c
)
621 return (c
& 15) + (c
>> 6) * 9;
624 char hex_to_char (const char hex
[2])
628 v
|= (hex_convert (hex
[1]) << 0);
629 v
|= (hex_convert (hex
[0]) << 4);
634 uint
hex_to_uint (const char hex
[8])
638 v
|= hex_convert (hex
[7]) << 0;
639 v
|= hex_convert (hex
[6]) << 4;
640 v
|= hex_convert (hex
[5]) << 8;
641 v
|= hex_convert (hex
[4]) << 12;
642 v
|= hex_convert (hex
[3]) << 16;
643 v
|= hex_convert (hex
[2]) << 20;
644 v
|= hex_convert (hex
[1]) << 24;
645 v
|= hex_convert (hex
[0]) << 28;
650 uint64_t hex_to_uint64_t (const char hex
[16])
654 v
|= ((uint64_t) hex_convert (hex
[15]) << 0);
655 v
|= ((uint64_t) hex_convert (hex
[14]) << 4);
656 v
|= ((uint64_t) hex_convert (hex
[13]) << 8);
657 v
|= ((uint64_t) hex_convert (hex
[12]) << 12);
658 v
|= ((uint64_t) hex_convert (hex
[11]) << 16);
659 v
|= ((uint64_t) hex_convert (hex
[10]) << 20);
660 v
|= ((uint64_t) hex_convert (hex
[ 9]) << 24);
661 v
|= ((uint64_t) hex_convert (hex
[ 8]) << 28);
662 v
|= ((uint64_t) hex_convert (hex
[ 7]) << 32);
663 v
|= ((uint64_t) hex_convert (hex
[ 6]) << 36);
664 v
|= ((uint64_t) hex_convert (hex
[ 5]) << 40);
665 v
|= ((uint64_t) hex_convert (hex
[ 4]) << 44);
666 v
|= ((uint64_t) hex_convert (hex
[ 3]) << 48);
667 v
|= ((uint64_t) hex_convert (hex
[ 2]) << 52);
668 v
|= ((uint64_t) hex_convert (hex
[ 1]) << 56);
669 v
|= ((uint64_t) hex_convert (hex
[ 0]) << 60);
674 void bin_to_hex_lower (uint v
, char hex
[8])
676 hex
[0] = v
>> 28 & 15;
677 hex
[1] = v
>> 24 & 15;
678 hex
[2] = v
>> 20 & 15;
679 hex
[3] = v
>> 16 & 15;
680 hex
[4] = v
>> 12 & 15;
681 hex
[5] = v
>> 8 & 15;
682 hex
[6] = v
>> 4 & 15;
683 hex
[7] = v
>> 0 & 15;
687 hex
[0] += 6; add
= ((hex
[0] & 0x10) >> 4) * 39; hex
[0] += 42 + add
;
688 hex
[1] += 6; add
= ((hex
[1] & 0x10) >> 4) * 39; hex
[1] += 42 + add
;
689 hex
[2] += 6; add
= ((hex
[2] & 0x10) >> 4) * 39; hex
[2] += 42 + add
;
690 hex
[3] += 6; add
= ((hex
[3] & 0x10) >> 4) * 39; hex
[3] += 42 + add
;
691 hex
[4] += 6; add
= ((hex
[4] & 0x10) >> 4) * 39; hex
[4] += 42 + add
;
692 hex
[5] += 6; add
= ((hex
[5] & 0x10) >> 4) * 39; hex
[5] += 42 + add
;
693 hex
[6] += 6; add
= ((hex
[6] & 0x10) >> 4) * 39; hex
[6] += 42 + add
;
694 hex
[7] += 6; add
= ((hex
[7] & 0x10) >> 4) * 39; hex
[7] += 42 + add
;
697 void phpass_decode (unsigned char digest
[16], unsigned char buf
[22])
701 l
= itoa64_to_int (buf
[ 0]) << 0;
702 l
|= itoa64_to_int (buf
[ 1]) << 6;
703 l
|= itoa64_to_int (buf
[ 2]) << 12;
704 l
|= itoa64_to_int (buf
[ 3]) << 18;
706 digest
[ 0] = (l
>> 0) & 0xff;
707 digest
[ 1] = (l
>> 8) & 0xff;
708 digest
[ 2] = (l
>> 16) & 0xff;
710 l
= itoa64_to_int (buf
[ 4]) << 0;
711 l
|= itoa64_to_int (buf
[ 5]) << 6;
712 l
|= itoa64_to_int (buf
[ 6]) << 12;
713 l
|= itoa64_to_int (buf
[ 7]) << 18;
715 digest
[ 3] = (l
>> 0) & 0xff;
716 digest
[ 4] = (l
>> 8) & 0xff;
717 digest
[ 5] = (l
>> 16) & 0xff;
719 l
= itoa64_to_int (buf
[ 8]) << 0;
720 l
|= itoa64_to_int (buf
[ 9]) << 6;
721 l
|= itoa64_to_int (buf
[10]) << 12;
722 l
|= itoa64_to_int (buf
[11]) << 18;
724 digest
[ 6] = (l
>> 0) & 0xff;
725 digest
[ 7] = (l
>> 8) & 0xff;
726 digest
[ 8] = (l
>> 16) & 0xff;
728 l
= itoa64_to_int (buf
[12]) << 0;
729 l
|= itoa64_to_int (buf
[13]) << 6;
730 l
|= itoa64_to_int (buf
[14]) << 12;
731 l
|= itoa64_to_int (buf
[15]) << 18;
733 digest
[ 9] = (l
>> 0) & 0xff;
734 digest
[10] = (l
>> 8) & 0xff;
735 digest
[11] = (l
>> 16) & 0xff;
737 l
= itoa64_to_int (buf
[16]) << 0;
738 l
|= itoa64_to_int (buf
[17]) << 6;
739 l
|= itoa64_to_int (buf
[18]) << 12;
740 l
|= itoa64_to_int (buf
[19]) << 18;
742 digest
[12] = (l
>> 0) & 0xff;
743 digest
[13] = (l
>> 8) & 0xff;
744 digest
[14] = (l
>> 16) & 0xff;
746 l
= itoa64_to_int (buf
[20]) << 0;
747 l
|= itoa64_to_int (buf
[21]) << 6;
749 digest
[15] = (l
>> 0) & 0xff;
752 void phpass_encode (unsigned char digest
[16], unsigned char buf
[22])
756 l
= (digest
[ 0] << 0) | (digest
[ 1] << 8) | (digest
[ 2] << 16);
758 buf
[ 0] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
759 buf
[ 1] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
760 buf
[ 2] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
761 buf
[ 3] = int_to_itoa64 (l
& 0x3f);
763 l
= (digest
[ 3] << 0) | (digest
[ 4] << 8) | (digest
[ 5] << 16);
765 buf
[ 4] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
766 buf
[ 5] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
767 buf
[ 6] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
768 buf
[ 7] = int_to_itoa64 (l
& 0x3f);
770 l
= (digest
[ 6] << 0) | (digest
[ 7] << 8) | (digest
[ 8] << 16);
772 buf
[ 8] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
773 buf
[ 9] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
774 buf
[10] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
775 buf
[11] = int_to_itoa64 (l
& 0x3f);
777 l
= (digest
[ 9] << 0) | (digest
[10] << 8) | (digest
[11] << 16);
779 buf
[12] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
780 buf
[13] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
781 buf
[14] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
782 buf
[15] = int_to_itoa64 (l
& 0x3f);
784 l
= (digest
[12] << 0) | (digest
[13] << 8) | (digest
[14] << 16);
786 buf
[16] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
787 buf
[17] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
788 buf
[18] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
789 buf
[19] = int_to_itoa64 (l
& 0x3f);
791 l
= (digest
[15] << 0);
793 buf
[20] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
794 buf
[21] = int_to_itoa64 (l
& 0x3f);
797 void md5crypt_decode (unsigned char digest
[16], unsigned char buf
[22])
801 l
= itoa64_to_int (buf
[ 0]) << 0;
802 l
|= itoa64_to_int (buf
[ 1]) << 6;
803 l
|= itoa64_to_int (buf
[ 2]) << 12;
804 l
|= itoa64_to_int (buf
[ 3]) << 18;
806 digest
[ 0] = (l
>> 16) & 0xff;
807 digest
[ 6] = (l
>> 8) & 0xff;
808 digest
[12] = (l
>> 0) & 0xff;
810 l
= itoa64_to_int (buf
[ 4]) << 0;
811 l
|= itoa64_to_int (buf
[ 5]) << 6;
812 l
|= itoa64_to_int (buf
[ 6]) << 12;
813 l
|= itoa64_to_int (buf
[ 7]) << 18;
815 digest
[ 1] = (l
>> 16) & 0xff;
816 digest
[ 7] = (l
>> 8) & 0xff;
817 digest
[13] = (l
>> 0) & 0xff;
819 l
= itoa64_to_int (buf
[ 8]) << 0;
820 l
|= itoa64_to_int (buf
[ 9]) << 6;
821 l
|= itoa64_to_int (buf
[10]) << 12;
822 l
|= itoa64_to_int (buf
[11]) << 18;
824 digest
[ 2] = (l
>> 16) & 0xff;
825 digest
[ 8] = (l
>> 8) & 0xff;
826 digest
[14] = (l
>> 0) & 0xff;
828 l
= itoa64_to_int (buf
[12]) << 0;
829 l
|= itoa64_to_int (buf
[13]) << 6;
830 l
|= itoa64_to_int (buf
[14]) << 12;
831 l
|= itoa64_to_int (buf
[15]) << 18;
833 digest
[ 3] = (l
>> 16) & 0xff;
834 digest
[ 9] = (l
>> 8) & 0xff;
835 digest
[15] = (l
>> 0) & 0xff;
837 l
= itoa64_to_int (buf
[16]) << 0;
838 l
|= itoa64_to_int (buf
[17]) << 6;
839 l
|= itoa64_to_int (buf
[18]) << 12;
840 l
|= itoa64_to_int (buf
[19]) << 18;
842 digest
[ 4] = (l
>> 16) & 0xff;
843 digest
[10] = (l
>> 8) & 0xff;
844 digest
[ 5] = (l
>> 0) & 0xff;
846 l
= itoa64_to_int (buf
[20]) << 0;
847 l
|= itoa64_to_int (buf
[21]) << 6;
849 digest
[11] = (l
>> 0) & 0xff;
852 void md5crypt_encode (unsigned char digest
[16], unsigned char buf
[22])
856 l
= (digest
[ 0] << 16) | (digest
[ 6] << 8) | (digest
[12] << 0);
858 buf
[ 0] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
859 buf
[ 1] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
860 buf
[ 2] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
861 buf
[ 3] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
863 l
= (digest
[ 1] << 16) | (digest
[ 7] << 8) | (digest
[13] << 0);
865 buf
[ 4] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
866 buf
[ 5] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
867 buf
[ 6] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
868 buf
[ 7] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
870 l
= (digest
[ 2] << 16) | (digest
[ 8] << 8) | (digest
[14] << 0);
872 buf
[ 8] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
873 buf
[ 9] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
874 buf
[10] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
875 buf
[11] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
877 l
= (digest
[ 3] << 16) | (digest
[ 9] << 8) | (digest
[15] << 0);
879 buf
[12] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
880 buf
[13] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
881 buf
[14] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
882 buf
[15] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
884 l
= (digest
[ 4] << 16) | (digest
[10] << 8) | (digest
[ 5] << 0);
886 buf
[16] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
887 buf
[17] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
888 buf
[18] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
889 buf
[19] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
891 l
= (digest
[11] << 0);
893 buf
[20] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
894 buf
[21] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
897 void sha512crypt_decode (unsigned char digest
[64], unsigned char buf
[86])
901 l
= itoa64_to_int (buf
[ 0]) << 0;
902 l
|= itoa64_to_int (buf
[ 1]) << 6;
903 l
|= itoa64_to_int (buf
[ 2]) << 12;
904 l
|= itoa64_to_int (buf
[ 3]) << 18;
906 digest
[ 0] = (l
>> 16) & 0xff;
907 digest
[21] = (l
>> 8) & 0xff;
908 digest
[42] = (l
>> 0) & 0xff;
910 l
= itoa64_to_int (buf
[ 4]) << 0;
911 l
|= itoa64_to_int (buf
[ 5]) << 6;
912 l
|= itoa64_to_int (buf
[ 6]) << 12;
913 l
|= itoa64_to_int (buf
[ 7]) << 18;
915 digest
[22] = (l
>> 16) & 0xff;
916 digest
[43] = (l
>> 8) & 0xff;
917 digest
[ 1] = (l
>> 0) & 0xff;
919 l
= itoa64_to_int (buf
[ 8]) << 0;
920 l
|= itoa64_to_int (buf
[ 9]) << 6;
921 l
|= itoa64_to_int (buf
[10]) << 12;
922 l
|= itoa64_to_int (buf
[11]) << 18;
924 digest
[44] = (l
>> 16) & 0xff;
925 digest
[ 2] = (l
>> 8) & 0xff;
926 digest
[23] = (l
>> 0) & 0xff;
928 l
= itoa64_to_int (buf
[12]) << 0;
929 l
|= itoa64_to_int (buf
[13]) << 6;
930 l
|= itoa64_to_int (buf
[14]) << 12;
931 l
|= itoa64_to_int (buf
[15]) << 18;
933 digest
[ 3] = (l
>> 16) & 0xff;
934 digest
[24] = (l
>> 8) & 0xff;
935 digest
[45] = (l
>> 0) & 0xff;
937 l
= itoa64_to_int (buf
[16]) << 0;
938 l
|= itoa64_to_int (buf
[17]) << 6;
939 l
|= itoa64_to_int (buf
[18]) << 12;
940 l
|= itoa64_to_int (buf
[19]) << 18;
942 digest
[25] = (l
>> 16) & 0xff;
943 digest
[46] = (l
>> 8) & 0xff;
944 digest
[ 4] = (l
>> 0) & 0xff;
946 l
= itoa64_to_int (buf
[20]) << 0;
947 l
|= itoa64_to_int (buf
[21]) << 6;
948 l
|= itoa64_to_int (buf
[22]) << 12;
949 l
|= itoa64_to_int (buf
[23]) << 18;
951 digest
[47] = (l
>> 16) & 0xff;
952 digest
[ 5] = (l
>> 8) & 0xff;
953 digest
[26] = (l
>> 0) & 0xff;
955 l
= itoa64_to_int (buf
[24]) << 0;
956 l
|= itoa64_to_int (buf
[25]) << 6;
957 l
|= itoa64_to_int (buf
[26]) << 12;
958 l
|= itoa64_to_int (buf
[27]) << 18;
960 digest
[ 6] = (l
>> 16) & 0xff;
961 digest
[27] = (l
>> 8) & 0xff;
962 digest
[48] = (l
>> 0) & 0xff;
964 l
= itoa64_to_int (buf
[28]) << 0;
965 l
|= itoa64_to_int (buf
[29]) << 6;
966 l
|= itoa64_to_int (buf
[30]) << 12;
967 l
|= itoa64_to_int (buf
[31]) << 18;
969 digest
[28] = (l
>> 16) & 0xff;
970 digest
[49] = (l
>> 8) & 0xff;
971 digest
[ 7] = (l
>> 0) & 0xff;
973 l
= itoa64_to_int (buf
[32]) << 0;
974 l
|= itoa64_to_int (buf
[33]) << 6;
975 l
|= itoa64_to_int (buf
[34]) << 12;
976 l
|= itoa64_to_int (buf
[35]) << 18;
978 digest
[50] = (l
>> 16) & 0xff;
979 digest
[ 8] = (l
>> 8) & 0xff;
980 digest
[29] = (l
>> 0) & 0xff;
982 l
= itoa64_to_int (buf
[36]) << 0;
983 l
|= itoa64_to_int (buf
[37]) << 6;
984 l
|= itoa64_to_int (buf
[38]) << 12;
985 l
|= itoa64_to_int (buf
[39]) << 18;
987 digest
[ 9] = (l
>> 16) & 0xff;
988 digest
[30] = (l
>> 8) & 0xff;
989 digest
[51] = (l
>> 0) & 0xff;
991 l
= itoa64_to_int (buf
[40]) << 0;
992 l
|= itoa64_to_int (buf
[41]) << 6;
993 l
|= itoa64_to_int (buf
[42]) << 12;
994 l
|= itoa64_to_int (buf
[43]) << 18;
996 digest
[31] = (l
>> 16) & 0xff;
997 digest
[52] = (l
>> 8) & 0xff;
998 digest
[10] = (l
>> 0) & 0xff;
1000 l
= itoa64_to_int (buf
[44]) << 0;
1001 l
|= itoa64_to_int (buf
[45]) << 6;
1002 l
|= itoa64_to_int (buf
[46]) << 12;
1003 l
|= itoa64_to_int (buf
[47]) << 18;
1005 digest
[53] = (l
>> 16) & 0xff;
1006 digest
[11] = (l
>> 8) & 0xff;
1007 digest
[32] = (l
>> 0) & 0xff;
1009 l
= itoa64_to_int (buf
[48]) << 0;
1010 l
|= itoa64_to_int (buf
[49]) << 6;
1011 l
|= itoa64_to_int (buf
[50]) << 12;
1012 l
|= itoa64_to_int (buf
[51]) << 18;
1014 digest
[12] = (l
>> 16) & 0xff;
1015 digest
[33] = (l
>> 8) & 0xff;
1016 digest
[54] = (l
>> 0) & 0xff;
1018 l
= itoa64_to_int (buf
[52]) << 0;
1019 l
|= itoa64_to_int (buf
[53]) << 6;
1020 l
|= itoa64_to_int (buf
[54]) << 12;
1021 l
|= itoa64_to_int (buf
[55]) << 18;
1023 digest
[34] = (l
>> 16) & 0xff;
1024 digest
[55] = (l
>> 8) & 0xff;
1025 digest
[13] = (l
>> 0) & 0xff;
1027 l
= itoa64_to_int (buf
[56]) << 0;
1028 l
|= itoa64_to_int (buf
[57]) << 6;
1029 l
|= itoa64_to_int (buf
[58]) << 12;
1030 l
|= itoa64_to_int (buf
[59]) << 18;
1032 digest
[56] = (l
>> 16) & 0xff;
1033 digest
[14] = (l
>> 8) & 0xff;
1034 digest
[35] = (l
>> 0) & 0xff;
1036 l
= itoa64_to_int (buf
[60]) << 0;
1037 l
|= itoa64_to_int (buf
[61]) << 6;
1038 l
|= itoa64_to_int (buf
[62]) << 12;
1039 l
|= itoa64_to_int (buf
[63]) << 18;
1041 digest
[15] = (l
>> 16) & 0xff;
1042 digest
[36] = (l
>> 8) & 0xff;
1043 digest
[57] = (l
>> 0) & 0xff;
1045 l
= itoa64_to_int (buf
[64]) << 0;
1046 l
|= itoa64_to_int (buf
[65]) << 6;
1047 l
|= itoa64_to_int (buf
[66]) << 12;
1048 l
|= itoa64_to_int (buf
[67]) << 18;
1050 digest
[37] = (l
>> 16) & 0xff;
1051 digest
[58] = (l
>> 8) & 0xff;
1052 digest
[16] = (l
>> 0) & 0xff;
1054 l
= itoa64_to_int (buf
[68]) << 0;
1055 l
|= itoa64_to_int (buf
[69]) << 6;
1056 l
|= itoa64_to_int (buf
[70]) << 12;
1057 l
|= itoa64_to_int (buf
[71]) << 18;
1059 digest
[59] = (l
>> 16) & 0xff;
1060 digest
[17] = (l
>> 8) & 0xff;
1061 digest
[38] = (l
>> 0) & 0xff;
1063 l
= itoa64_to_int (buf
[72]) << 0;
1064 l
|= itoa64_to_int (buf
[73]) << 6;
1065 l
|= itoa64_to_int (buf
[74]) << 12;
1066 l
|= itoa64_to_int (buf
[75]) << 18;
1068 digest
[18] = (l
>> 16) & 0xff;
1069 digest
[39] = (l
>> 8) & 0xff;
1070 digest
[60] = (l
>> 0) & 0xff;
1072 l
= itoa64_to_int (buf
[76]) << 0;
1073 l
|= itoa64_to_int (buf
[77]) << 6;
1074 l
|= itoa64_to_int (buf
[78]) << 12;
1075 l
|= itoa64_to_int (buf
[79]) << 18;
1077 digest
[40] = (l
>> 16) & 0xff;
1078 digest
[61] = (l
>> 8) & 0xff;
1079 digest
[19] = (l
>> 0) & 0xff;
1081 l
= itoa64_to_int (buf
[80]) << 0;
1082 l
|= itoa64_to_int (buf
[81]) << 6;
1083 l
|= itoa64_to_int (buf
[82]) << 12;
1084 l
|= itoa64_to_int (buf
[83]) << 18;
1086 digest
[62] = (l
>> 16) & 0xff;
1087 digest
[20] = (l
>> 8) & 0xff;
1088 digest
[41] = (l
>> 0) & 0xff;
1090 l
= itoa64_to_int (buf
[84]) << 0;
1091 l
|= itoa64_to_int (buf
[85]) << 6;
1093 digest
[63] = (l
>> 0) & 0xff;
1096 void sha512crypt_encode (unsigned char digest
[64], unsigned char buf
[86])
1100 l
= (digest
[ 0] << 16) | (digest
[21] << 8) | (digest
[42] << 0);
1102 buf
[ 0] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1103 buf
[ 1] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1104 buf
[ 2] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1105 buf
[ 3] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1107 l
= (digest
[22] << 16) | (digest
[43] << 8) | (digest
[ 1] << 0);
1109 buf
[ 4] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1110 buf
[ 5] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1111 buf
[ 6] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1112 buf
[ 7] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1114 l
= (digest
[44] << 16) | (digest
[ 2] << 8) | (digest
[23] << 0);
1116 buf
[ 8] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1117 buf
[ 9] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1118 buf
[10] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1119 buf
[11] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1121 l
= (digest
[ 3] << 16) | (digest
[24] << 8) | (digest
[45] << 0);
1123 buf
[12] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1124 buf
[13] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1125 buf
[14] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1126 buf
[15] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1128 l
= (digest
[25] << 16) | (digest
[46] << 8) | (digest
[ 4] << 0);
1130 buf
[16] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1131 buf
[17] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1132 buf
[18] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1133 buf
[19] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1135 l
= (digest
[47] << 16) | (digest
[ 5] << 8) | (digest
[26] << 0);
1137 buf
[20] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1138 buf
[21] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1139 buf
[22] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1140 buf
[23] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1142 l
= (digest
[ 6] << 16) | (digest
[27] << 8) | (digest
[48] << 0);
1144 buf
[24] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1145 buf
[25] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1146 buf
[26] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1147 buf
[27] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1149 l
= (digest
[28] << 16) | (digest
[49] << 8) | (digest
[ 7] << 0);
1151 buf
[28] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1152 buf
[29] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1153 buf
[30] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1154 buf
[31] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1156 l
= (digest
[50] << 16) | (digest
[ 8] << 8) | (digest
[29] << 0);
1158 buf
[32] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1159 buf
[33] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1160 buf
[34] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1161 buf
[35] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1163 l
= (digest
[ 9] << 16) | (digest
[30] << 8) | (digest
[51] << 0);
1165 buf
[36] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1166 buf
[37] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1167 buf
[38] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1168 buf
[39] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1170 l
= (digest
[31] << 16) | (digest
[52] << 8) | (digest
[10] << 0);
1172 buf
[40] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1173 buf
[41] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1174 buf
[42] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1175 buf
[43] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1177 l
= (digest
[53] << 16) | (digest
[11] << 8) | (digest
[32] << 0);
1179 buf
[44] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1180 buf
[45] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1181 buf
[46] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1182 buf
[47] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1184 l
= (digest
[12] << 16) | (digest
[33] << 8) | (digest
[54] << 0);
1186 buf
[48] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1187 buf
[49] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1188 buf
[50] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1189 buf
[51] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1191 l
= (digest
[34] << 16) | (digest
[55] << 8) | (digest
[13] << 0);
1193 buf
[52] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1194 buf
[53] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1195 buf
[54] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1196 buf
[55] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1198 l
= (digest
[56] << 16) | (digest
[14] << 8) | (digest
[35] << 0);
1200 buf
[56] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1201 buf
[57] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1202 buf
[58] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1203 buf
[59] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1205 l
= (digest
[15] << 16) | (digest
[36] << 8) | (digest
[57] << 0);
1207 buf
[60] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1208 buf
[61] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1209 buf
[62] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1210 buf
[63] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1212 l
= (digest
[37] << 16) | (digest
[58] << 8) | (digest
[16] << 0);
1214 buf
[64] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1215 buf
[65] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1216 buf
[66] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1217 buf
[67] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1219 l
= (digest
[59] << 16) | (digest
[17] << 8) | (digest
[38] << 0);
1221 buf
[68] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1222 buf
[69] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1223 buf
[70] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1224 buf
[71] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1226 l
= (digest
[18] << 16) | (digest
[39] << 8) | (digest
[60] << 0);
1228 buf
[72] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1229 buf
[73] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1230 buf
[74] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1231 buf
[75] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1233 l
= (digest
[40] << 16) | (digest
[61] << 8) | (digest
[19] << 0);
1235 buf
[76] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1236 buf
[77] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1237 buf
[78] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1238 buf
[79] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1240 l
= (digest
[62] << 16) | (digest
[20] << 8) | (digest
[41] << 0);
1242 buf
[80] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1243 buf
[81] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1244 buf
[82] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1245 buf
[83] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1247 l
= 0 | 0 | (digest
[63] << 0);
1249 buf
[84] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1250 buf
[85] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1253 void sha1aix_decode (unsigned char digest
[20], unsigned char buf
[27])
1257 l
= itoa64_to_int (buf
[ 0]) << 0;
1258 l
|= itoa64_to_int (buf
[ 1]) << 6;
1259 l
|= itoa64_to_int (buf
[ 2]) << 12;
1260 l
|= itoa64_to_int (buf
[ 3]) << 18;
1262 digest
[ 2] = (l
>> 0) & 0xff;
1263 digest
[ 1] = (l
>> 8) & 0xff;
1264 digest
[ 0] = (l
>> 16) & 0xff;
1266 l
= itoa64_to_int (buf
[ 4]) << 0;
1267 l
|= itoa64_to_int (buf
[ 5]) << 6;
1268 l
|= itoa64_to_int (buf
[ 6]) << 12;
1269 l
|= itoa64_to_int (buf
[ 7]) << 18;
1271 digest
[ 5] = (l
>> 0) & 0xff;
1272 digest
[ 4] = (l
>> 8) & 0xff;
1273 digest
[ 3] = (l
>> 16) & 0xff;
1275 l
= itoa64_to_int (buf
[ 8]) << 0;
1276 l
|= itoa64_to_int (buf
[ 9]) << 6;
1277 l
|= itoa64_to_int (buf
[10]) << 12;
1278 l
|= itoa64_to_int (buf
[11]) << 18;
1280 digest
[ 8] = (l
>> 0) & 0xff;
1281 digest
[ 7] = (l
>> 8) & 0xff;
1282 digest
[ 6] = (l
>> 16) & 0xff;
1284 l
= itoa64_to_int (buf
[12]) << 0;
1285 l
|= itoa64_to_int (buf
[13]) << 6;
1286 l
|= itoa64_to_int (buf
[14]) << 12;
1287 l
|= itoa64_to_int (buf
[15]) << 18;
1289 digest
[11] = (l
>> 0) & 0xff;
1290 digest
[10] = (l
>> 8) & 0xff;
1291 digest
[ 9] = (l
>> 16) & 0xff;
1293 l
= itoa64_to_int (buf
[16]) << 0;
1294 l
|= itoa64_to_int (buf
[17]) << 6;
1295 l
|= itoa64_to_int (buf
[18]) << 12;
1296 l
|= itoa64_to_int (buf
[19]) << 18;
1298 digest
[14] = (l
>> 0) & 0xff;
1299 digest
[13] = (l
>> 8) & 0xff;
1300 digest
[12] = (l
>> 16) & 0xff;
1302 l
= itoa64_to_int (buf
[20]) << 0;
1303 l
|= itoa64_to_int (buf
[21]) << 6;
1304 l
|= itoa64_to_int (buf
[22]) << 12;
1305 l
|= itoa64_to_int (buf
[23]) << 18;
1307 digest
[17] = (l
>> 0) & 0xff;
1308 digest
[16] = (l
>> 8) & 0xff;
1309 digest
[15] = (l
>> 16) & 0xff;
1311 l
= itoa64_to_int (buf
[24]) << 0;
1312 l
|= itoa64_to_int (buf
[25]) << 6;
1313 l
|= itoa64_to_int (buf
[26]) << 12;
1315 digest
[19] = (l
>> 8) & 0xff;
1316 digest
[18] = (l
>> 16) & 0xff;
1319 void sha1aix_encode (unsigned char digest
[20], unsigned char buf
[27])
1323 l
= (digest
[ 2] << 0) | (digest
[ 1] << 8) | (digest
[ 0] << 16);
1325 buf
[ 0] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1326 buf
[ 1] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1327 buf
[ 2] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1328 buf
[ 3] = int_to_itoa64 (l
& 0x3f);
1330 l
= (digest
[ 5] << 0) | (digest
[ 4] << 8) | (digest
[ 3] << 16);
1332 buf
[ 4] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1333 buf
[ 5] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1334 buf
[ 6] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1335 buf
[ 7] = int_to_itoa64 (l
& 0x3f);
1337 l
= (digest
[ 8] << 0) | (digest
[ 7] << 8) | (digest
[ 6] << 16);
1339 buf
[ 8] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1340 buf
[ 9] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1341 buf
[10] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1342 buf
[11] = int_to_itoa64 (l
& 0x3f);
1344 l
= (digest
[11] << 0) | (digest
[10] << 8) | (digest
[ 9] << 16);
1346 buf
[12] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1347 buf
[13] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1348 buf
[14] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1349 buf
[15] = int_to_itoa64 (l
& 0x3f);
1351 l
= (digest
[14] << 0) | (digest
[13] << 8) | (digest
[12] << 16);
1353 buf
[16] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1354 buf
[17] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1355 buf
[18] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1356 buf
[19] = int_to_itoa64 (l
& 0x3f);
1358 l
= (digest
[17] << 0) | (digest
[16] << 8) | (digest
[15] << 16);
1360 buf
[20] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1361 buf
[21] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1362 buf
[22] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1363 buf
[23] = int_to_itoa64 (l
& 0x3f);
1365 l
= 0 | (digest
[19] << 8) | (digest
[18] << 16);
1367 buf
[24] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1368 buf
[25] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1369 buf
[26] = int_to_itoa64 (l
& 0x3f);
1372 void sha256aix_decode (unsigned char digest
[32], unsigned char buf
[43])
1376 l
= itoa64_to_int (buf
[ 0]) << 0;
1377 l
|= itoa64_to_int (buf
[ 1]) << 6;
1378 l
|= itoa64_to_int (buf
[ 2]) << 12;
1379 l
|= itoa64_to_int (buf
[ 3]) << 18;
1381 digest
[ 2] = (l
>> 0) & 0xff;
1382 digest
[ 1] = (l
>> 8) & 0xff;
1383 digest
[ 0] = (l
>> 16) & 0xff;
1385 l
= itoa64_to_int (buf
[ 4]) << 0;
1386 l
|= itoa64_to_int (buf
[ 5]) << 6;
1387 l
|= itoa64_to_int (buf
[ 6]) << 12;
1388 l
|= itoa64_to_int (buf
[ 7]) << 18;
1390 digest
[ 5] = (l
>> 0) & 0xff;
1391 digest
[ 4] = (l
>> 8) & 0xff;
1392 digest
[ 3] = (l
>> 16) & 0xff;
1394 l
= itoa64_to_int (buf
[ 8]) << 0;
1395 l
|= itoa64_to_int (buf
[ 9]) << 6;
1396 l
|= itoa64_to_int (buf
[10]) << 12;
1397 l
|= itoa64_to_int (buf
[11]) << 18;
1399 digest
[ 8] = (l
>> 0) & 0xff;
1400 digest
[ 7] = (l
>> 8) & 0xff;
1401 digest
[ 6] = (l
>> 16) & 0xff;
1403 l
= itoa64_to_int (buf
[12]) << 0;
1404 l
|= itoa64_to_int (buf
[13]) << 6;
1405 l
|= itoa64_to_int (buf
[14]) << 12;
1406 l
|= itoa64_to_int (buf
[15]) << 18;
1408 digest
[11] = (l
>> 0) & 0xff;
1409 digest
[10] = (l
>> 8) & 0xff;
1410 digest
[ 9] = (l
>> 16) & 0xff;
1412 l
= itoa64_to_int (buf
[16]) << 0;
1413 l
|= itoa64_to_int (buf
[17]) << 6;
1414 l
|= itoa64_to_int (buf
[18]) << 12;
1415 l
|= itoa64_to_int (buf
[19]) << 18;
1417 digest
[14] = (l
>> 0) & 0xff;
1418 digest
[13] = (l
>> 8) & 0xff;
1419 digest
[12] = (l
>> 16) & 0xff;
1421 l
= itoa64_to_int (buf
[20]) << 0;
1422 l
|= itoa64_to_int (buf
[21]) << 6;
1423 l
|= itoa64_to_int (buf
[22]) << 12;
1424 l
|= itoa64_to_int (buf
[23]) << 18;
1426 digest
[17] = (l
>> 0) & 0xff;
1427 digest
[16] = (l
>> 8) & 0xff;
1428 digest
[15] = (l
>> 16) & 0xff;
1430 l
= itoa64_to_int (buf
[24]) << 0;
1431 l
|= itoa64_to_int (buf
[25]) << 6;
1432 l
|= itoa64_to_int (buf
[26]) << 12;
1433 l
|= itoa64_to_int (buf
[27]) << 18;
1435 digest
[20] = (l
>> 0) & 0xff;
1436 digest
[19] = (l
>> 8) & 0xff;
1437 digest
[18] = (l
>> 16) & 0xff;
1439 l
= itoa64_to_int (buf
[28]) << 0;
1440 l
|= itoa64_to_int (buf
[29]) << 6;
1441 l
|= itoa64_to_int (buf
[30]) << 12;
1442 l
|= itoa64_to_int (buf
[31]) << 18;
1444 digest
[23] = (l
>> 0) & 0xff;
1445 digest
[22] = (l
>> 8) & 0xff;
1446 digest
[21] = (l
>> 16) & 0xff;
1448 l
= itoa64_to_int (buf
[32]) << 0;
1449 l
|= itoa64_to_int (buf
[33]) << 6;
1450 l
|= itoa64_to_int (buf
[34]) << 12;
1451 l
|= itoa64_to_int (buf
[35]) << 18;
1453 digest
[26] = (l
>> 0) & 0xff;
1454 digest
[25] = (l
>> 8) & 0xff;
1455 digest
[24] = (l
>> 16) & 0xff;
1457 l
= itoa64_to_int (buf
[36]) << 0;
1458 l
|= itoa64_to_int (buf
[37]) << 6;
1459 l
|= itoa64_to_int (buf
[38]) << 12;
1460 l
|= itoa64_to_int (buf
[39]) << 18;
1462 digest
[29] = (l
>> 0) & 0xff;
1463 digest
[28] = (l
>> 8) & 0xff;
1464 digest
[27] = (l
>> 16) & 0xff;
1466 l
= itoa64_to_int (buf
[40]) << 0;
1467 l
|= itoa64_to_int (buf
[41]) << 6;
1468 l
|= itoa64_to_int (buf
[42]) << 12;
1470 //digest[32] = (l >> 0) & 0xff;
1471 digest
[31] = (l
>> 8) & 0xff;
1472 digest
[30] = (l
>> 16) & 0xff;
1475 void sha256aix_encode (unsigned char digest
[32], unsigned char buf
[43])
1479 l
= (digest
[ 2] << 0) | (digest
[ 1] << 8) | (digest
[ 0] << 16);
1481 buf
[ 0] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1482 buf
[ 1] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1483 buf
[ 2] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1484 buf
[ 3] = int_to_itoa64 (l
& 0x3f);
1486 l
= (digest
[ 5] << 0) | (digest
[ 4] << 8) | (digest
[ 3] << 16);
1488 buf
[ 4] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1489 buf
[ 5] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1490 buf
[ 6] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1491 buf
[ 7] = int_to_itoa64 (l
& 0x3f);
1493 l
= (digest
[ 8] << 0) | (digest
[ 7] << 8) | (digest
[ 6] << 16);
1495 buf
[ 8] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1496 buf
[ 9] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1497 buf
[10] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1498 buf
[11] = int_to_itoa64 (l
& 0x3f);
1500 l
= (digest
[11] << 0) | (digest
[10] << 8) | (digest
[ 9] << 16);
1502 buf
[12] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1503 buf
[13] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1504 buf
[14] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1505 buf
[15] = int_to_itoa64 (l
& 0x3f);
1507 l
= (digest
[14] << 0) | (digest
[13] << 8) | (digest
[12] << 16);
1509 buf
[16] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1510 buf
[17] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1511 buf
[18] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1512 buf
[19] = int_to_itoa64 (l
& 0x3f);
1514 l
= (digest
[17] << 0) | (digest
[16] << 8) | (digest
[15] << 16);
1516 buf
[20] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1517 buf
[21] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1518 buf
[22] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1519 buf
[23] = int_to_itoa64 (l
& 0x3f);
1521 l
= (digest
[20] << 0) | (digest
[19] << 8) | (digest
[18] << 16);
1523 buf
[24] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1524 buf
[25] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1525 buf
[26] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1526 buf
[27] = int_to_itoa64 (l
& 0x3f);
1528 l
= (digest
[23] << 0) | (digest
[22] << 8) | (digest
[21] << 16);
1530 buf
[28] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1531 buf
[29] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1532 buf
[30] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1533 buf
[31] = int_to_itoa64 (l
& 0x3f);
1535 l
= (digest
[26] << 0) | (digest
[25] << 8) | (digest
[24] << 16);
1537 buf
[32] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1538 buf
[33] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1539 buf
[34] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1540 buf
[35] = int_to_itoa64 (l
& 0x3f);
1542 l
= (digest
[29] << 0) | (digest
[28] << 8) | (digest
[27] << 16);
1544 buf
[36] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1545 buf
[37] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1546 buf
[38] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1547 buf
[39] = int_to_itoa64 (l
& 0x3f);
1549 l
= 0 | (digest
[31] << 8) | (digest
[30] << 16);
1551 buf
[40] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1552 buf
[41] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1553 buf
[42] = int_to_itoa64 (l
& 0x3f);
1556 void sha512aix_decode (unsigned char digest
[64], unsigned char buf
[86])
1560 l
= itoa64_to_int (buf
[ 0]) << 0;
1561 l
|= itoa64_to_int (buf
[ 1]) << 6;
1562 l
|= itoa64_to_int (buf
[ 2]) << 12;
1563 l
|= itoa64_to_int (buf
[ 3]) << 18;
1565 digest
[ 2] = (l
>> 0) & 0xff;
1566 digest
[ 1] = (l
>> 8) & 0xff;
1567 digest
[ 0] = (l
>> 16) & 0xff;
1569 l
= itoa64_to_int (buf
[ 4]) << 0;
1570 l
|= itoa64_to_int (buf
[ 5]) << 6;
1571 l
|= itoa64_to_int (buf
[ 6]) << 12;
1572 l
|= itoa64_to_int (buf
[ 7]) << 18;
1574 digest
[ 5] = (l
>> 0) & 0xff;
1575 digest
[ 4] = (l
>> 8) & 0xff;
1576 digest
[ 3] = (l
>> 16) & 0xff;
1578 l
= itoa64_to_int (buf
[ 8]) << 0;
1579 l
|= itoa64_to_int (buf
[ 9]) << 6;
1580 l
|= itoa64_to_int (buf
[10]) << 12;
1581 l
|= itoa64_to_int (buf
[11]) << 18;
1583 digest
[ 8] = (l
>> 0) & 0xff;
1584 digest
[ 7] = (l
>> 8) & 0xff;
1585 digest
[ 6] = (l
>> 16) & 0xff;
1587 l
= itoa64_to_int (buf
[12]) << 0;
1588 l
|= itoa64_to_int (buf
[13]) << 6;
1589 l
|= itoa64_to_int (buf
[14]) << 12;
1590 l
|= itoa64_to_int (buf
[15]) << 18;
1592 digest
[11] = (l
>> 0) & 0xff;
1593 digest
[10] = (l
>> 8) & 0xff;
1594 digest
[ 9] = (l
>> 16) & 0xff;
1596 l
= itoa64_to_int (buf
[16]) << 0;
1597 l
|= itoa64_to_int (buf
[17]) << 6;
1598 l
|= itoa64_to_int (buf
[18]) << 12;
1599 l
|= itoa64_to_int (buf
[19]) << 18;
1601 digest
[14] = (l
>> 0) & 0xff;
1602 digest
[13] = (l
>> 8) & 0xff;
1603 digest
[12] = (l
>> 16) & 0xff;
1605 l
= itoa64_to_int (buf
[20]) << 0;
1606 l
|= itoa64_to_int (buf
[21]) << 6;
1607 l
|= itoa64_to_int (buf
[22]) << 12;
1608 l
|= itoa64_to_int (buf
[23]) << 18;
1610 digest
[17] = (l
>> 0) & 0xff;
1611 digest
[16] = (l
>> 8) & 0xff;
1612 digest
[15] = (l
>> 16) & 0xff;
1614 l
= itoa64_to_int (buf
[24]) << 0;
1615 l
|= itoa64_to_int (buf
[25]) << 6;
1616 l
|= itoa64_to_int (buf
[26]) << 12;
1617 l
|= itoa64_to_int (buf
[27]) << 18;
1619 digest
[20] = (l
>> 0) & 0xff;
1620 digest
[19] = (l
>> 8) & 0xff;
1621 digest
[18] = (l
>> 16) & 0xff;
1623 l
= itoa64_to_int (buf
[28]) << 0;
1624 l
|= itoa64_to_int (buf
[29]) << 6;
1625 l
|= itoa64_to_int (buf
[30]) << 12;
1626 l
|= itoa64_to_int (buf
[31]) << 18;
1628 digest
[23] = (l
>> 0) & 0xff;
1629 digest
[22] = (l
>> 8) & 0xff;
1630 digest
[21] = (l
>> 16) & 0xff;
1632 l
= itoa64_to_int (buf
[32]) << 0;
1633 l
|= itoa64_to_int (buf
[33]) << 6;
1634 l
|= itoa64_to_int (buf
[34]) << 12;
1635 l
|= itoa64_to_int (buf
[35]) << 18;
1637 digest
[26] = (l
>> 0) & 0xff;
1638 digest
[25] = (l
>> 8) & 0xff;
1639 digest
[24] = (l
>> 16) & 0xff;
1641 l
= itoa64_to_int (buf
[36]) << 0;
1642 l
|= itoa64_to_int (buf
[37]) << 6;
1643 l
|= itoa64_to_int (buf
[38]) << 12;
1644 l
|= itoa64_to_int (buf
[39]) << 18;
1646 digest
[29] = (l
>> 0) & 0xff;
1647 digest
[28] = (l
>> 8) & 0xff;
1648 digest
[27] = (l
>> 16) & 0xff;
1650 l
= itoa64_to_int (buf
[40]) << 0;
1651 l
|= itoa64_to_int (buf
[41]) << 6;
1652 l
|= itoa64_to_int (buf
[42]) << 12;
1653 l
|= itoa64_to_int (buf
[43]) << 18;
1655 digest
[32] = (l
>> 0) & 0xff;
1656 digest
[31] = (l
>> 8) & 0xff;
1657 digest
[30] = (l
>> 16) & 0xff;
1659 l
= itoa64_to_int (buf
[44]) << 0;
1660 l
|= itoa64_to_int (buf
[45]) << 6;
1661 l
|= itoa64_to_int (buf
[46]) << 12;
1662 l
|= itoa64_to_int (buf
[47]) << 18;
1664 digest
[35] = (l
>> 0) & 0xff;
1665 digest
[34] = (l
>> 8) & 0xff;
1666 digest
[33] = (l
>> 16) & 0xff;
1668 l
= itoa64_to_int (buf
[48]) << 0;
1669 l
|= itoa64_to_int (buf
[49]) << 6;
1670 l
|= itoa64_to_int (buf
[50]) << 12;
1671 l
|= itoa64_to_int (buf
[51]) << 18;
1673 digest
[38] = (l
>> 0) & 0xff;
1674 digest
[37] = (l
>> 8) & 0xff;
1675 digest
[36] = (l
>> 16) & 0xff;
1677 l
= itoa64_to_int (buf
[52]) << 0;
1678 l
|= itoa64_to_int (buf
[53]) << 6;
1679 l
|= itoa64_to_int (buf
[54]) << 12;
1680 l
|= itoa64_to_int (buf
[55]) << 18;
1682 digest
[41] = (l
>> 0) & 0xff;
1683 digest
[40] = (l
>> 8) & 0xff;
1684 digest
[39] = (l
>> 16) & 0xff;
1686 l
= itoa64_to_int (buf
[56]) << 0;
1687 l
|= itoa64_to_int (buf
[57]) << 6;
1688 l
|= itoa64_to_int (buf
[58]) << 12;
1689 l
|= itoa64_to_int (buf
[59]) << 18;
1691 digest
[44] = (l
>> 0) & 0xff;
1692 digest
[43] = (l
>> 8) & 0xff;
1693 digest
[42] = (l
>> 16) & 0xff;
1695 l
= itoa64_to_int (buf
[60]) << 0;
1696 l
|= itoa64_to_int (buf
[61]) << 6;
1697 l
|= itoa64_to_int (buf
[62]) << 12;
1698 l
|= itoa64_to_int (buf
[63]) << 18;
1700 digest
[47] = (l
>> 0) & 0xff;
1701 digest
[46] = (l
>> 8) & 0xff;
1702 digest
[45] = (l
>> 16) & 0xff;
1704 l
= itoa64_to_int (buf
[64]) << 0;
1705 l
|= itoa64_to_int (buf
[65]) << 6;
1706 l
|= itoa64_to_int (buf
[66]) << 12;
1707 l
|= itoa64_to_int (buf
[67]) << 18;
1709 digest
[50] = (l
>> 0) & 0xff;
1710 digest
[49] = (l
>> 8) & 0xff;
1711 digest
[48] = (l
>> 16) & 0xff;
1713 l
= itoa64_to_int (buf
[68]) << 0;
1714 l
|= itoa64_to_int (buf
[69]) << 6;
1715 l
|= itoa64_to_int (buf
[70]) << 12;
1716 l
|= itoa64_to_int (buf
[71]) << 18;
1718 digest
[53] = (l
>> 0) & 0xff;
1719 digest
[52] = (l
>> 8) & 0xff;
1720 digest
[51] = (l
>> 16) & 0xff;
1722 l
= itoa64_to_int (buf
[72]) << 0;
1723 l
|= itoa64_to_int (buf
[73]) << 6;
1724 l
|= itoa64_to_int (buf
[74]) << 12;
1725 l
|= itoa64_to_int (buf
[75]) << 18;
1727 digest
[56] = (l
>> 0) & 0xff;
1728 digest
[55] = (l
>> 8) & 0xff;
1729 digest
[54] = (l
>> 16) & 0xff;
1731 l
= itoa64_to_int (buf
[76]) << 0;
1732 l
|= itoa64_to_int (buf
[77]) << 6;
1733 l
|= itoa64_to_int (buf
[78]) << 12;
1734 l
|= itoa64_to_int (buf
[79]) << 18;
1736 digest
[59] = (l
>> 0) & 0xff;
1737 digest
[58] = (l
>> 8) & 0xff;
1738 digest
[57] = (l
>> 16) & 0xff;
1740 l
= itoa64_to_int (buf
[80]) << 0;
1741 l
|= itoa64_to_int (buf
[81]) << 6;
1742 l
|= itoa64_to_int (buf
[82]) << 12;
1743 l
|= itoa64_to_int (buf
[83]) << 18;
1745 digest
[62] = (l
>> 0) & 0xff;
1746 digest
[61] = (l
>> 8) & 0xff;
1747 digest
[60] = (l
>> 16) & 0xff;
1749 l
= itoa64_to_int (buf
[84]) << 0;
1750 l
|= itoa64_to_int (buf
[85]) << 6;
1752 digest
[63] = (l
>> 16) & 0xff;
1755 void sha512aix_encode (unsigned char digest
[64], unsigned char buf
[86])
1759 l
= (digest
[ 2] << 0) | (digest
[ 1] << 8) | (digest
[ 0] << 16);
1761 buf
[ 0] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1762 buf
[ 1] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1763 buf
[ 2] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1764 buf
[ 3] = int_to_itoa64 (l
& 0x3f);
1766 l
= (digest
[ 5] << 0) | (digest
[ 4] << 8) | (digest
[ 3] << 16);
1768 buf
[ 4] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1769 buf
[ 5] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1770 buf
[ 6] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1771 buf
[ 7] = int_to_itoa64 (l
& 0x3f);
1773 l
= (digest
[ 8] << 0) | (digest
[ 7] << 8) | (digest
[ 6] << 16);
1775 buf
[ 8] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1776 buf
[ 9] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1777 buf
[10] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1778 buf
[11] = int_to_itoa64 (l
& 0x3f);
1780 l
= (digest
[11] << 0) | (digest
[10] << 8) | (digest
[ 9] << 16);
1782 buf
[12] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1783 buf
[13] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1784 buf
[14] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1785 buf
[15] = int_to_itoa64 (l
& 0x3f);
1787 l
= (digest
[14] << 0) | (digest
[13] << 8) | (digest
[12] << 16);
1789 buf
[16] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1790 buf
[17] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1791 buf
[18] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1792 buf
[19] = int_to_itoa64 (l
& 0x3f);
1794 l
= (digest
[17] << 0) | (digest
[16] << 8) | (digest
[15] << 16);
1796 buf
[20] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1797 buf
[21] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1798 buf
[22] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1799 buf
[23] = int_to_itoa64 (l
& 0x3f);
1801 l
= (digest
[20] << 0) | (digest
[19] << 8) | (digest
[18] << 16);
1803 buf
[24] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1804 buf
[25] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1805 buf
[26] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1806 buf
[27] = int_to_itoa64 (l
& 0x3f);
1808 l
= (digest
[23] << 0) | (digest
[22] << 8) | (digest
[21] << 16);
1810 buf
[28] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1811 buf
[29] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1812 buf
[30] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1813 buf
[31] = int_to_itoa64 (l
& 0x3f);
1815 l
= (digest
[26] << 0) | (digest
[25] << 8) | (digest
[24] << 16);
1817 buf
[32] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1818 buf
[33] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1819 buf
[34] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1820 buf
[35] = int_to_itoa64 (l
& 0x3f);
1822 l
= (digest
[29] << 0) | (digest
[28] << 8) | (digest
[27] << 16);
1824 buf
[36] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1825 buf
[37] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1826 buf
[38] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1827 buf
[39] = int_to_itoa64 (l
& 0x3f);
1829 l
= (digest
[32] << 0) | (digest
[31] << 8) | (digest
[30] << 16);
1831 buf
[40] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1832 buf
[41] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1833 buf
[42] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1834 buf
[43] = int_to_itoa64 (l
& 0x3f);
1836 l
= (digest
[35] << 0) | (digest
[34] << 8) | (digest
[33] << 16);
1838 buf
[44] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1839 buf
[45] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1840 buf
[46] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1841 buf
[47] = int_to_itoa64 (l
& 0x3f);
1843 l
= (digest
[38] << 0) | (digest
[37] << 8) | (digest
[36] << 16);
1845 buf
[48] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1846 buf
[49] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1847 buf
[50] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1848 buf
[51] = int_to_itoa64 (l
& 0x3f);
1850 l
= (digest
[41] << 0) | (digest
[40] << 8) | (digest
[39] << 16);
1852 buf
[52] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1853 buf
[53] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1854 buf
[54] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1855 buf
[55] = int_to_itoa64 (l
& 0x3f);
1857 l
= (digest
[44] << 0) | (digest
[43] << 8) | (digest
[42] << 16);
1859 buf
[56] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1860 buf
[57] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1861 buf
[58] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1862 buf
[59] = int_to_itoa64 (l
& 0x3f);
1864 l
= (digest
[47] << 0) | (digest
[46] << 8) | (digest
[45] << 16);
1866 buf
[60] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1867 buf
[61] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1868 buf
[62] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1869 buf
[63] = int_to_itoa64 (l
& 0x3f);
1871 l
= (digest
[50] << 0) | (digest
[49] << 8) | (digest
[48] << 16);
1873 buf
[64] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1874 buf
[65] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1875 buf
[66] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1876 buf
[67] = int_to_itoa64 (l
& 0x3f);
1878 l
= (digest
[53] << 0) | (digest
[52] << 8) | (digest
[51] << 16);
1880 buf
[68] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1881 buf
[69] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1882 buf
[70] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1883 buf
[71] = int_to_itoa64 (l
& 0x3f);
1885 l
= (digest
[56] << 0) | (digest
[55] << 8) | (digest
[54] << 16);
1887 buf
[72] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1888 buf
[73] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1889 buf
[74] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1890 buf
[75] = int_to_itoa64 (l
& 0x3f);
1892 l
= (digest
[59] << 0) | (digest
[58] << 8) | (digest
[57] << 16);
1894 buf
[76] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1895 buf
[77] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1896 buf
[78] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1897 buf
[79] = int_to_itoa64 (l
& 0x3f);
1899 l
= (digest
[62] << 0) | (digest
[61] << 8) | (digest
[60] << 16);
1901 buf
[80] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1902 buf
[81] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1903 buf
[82] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1904 buf
[83] = int_to_itoa64 (l
& 0x3f);
1906 l
= 0 | 0 | (digest
[63] << 16);
1908 buf
[84] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1909 buf
[85] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
1912 void sha256crypt_decode (unsigned char digest
[32], unsigned char buf
[43])
1916 l
= itoa64_to_int (buf
[ 0]) << 0;
1917 l
|= itoa64_to_int (buf
[ 1]) << 6;
1918 l
|= itoa64_to_int (buf
[ 2]) << 12;
1919 l
|= itoa64_to_int (buf
[ 3]) << 18;
1921 digest
[ 0] = (l
>> 16) & 0xff;
1922 digest
[10] = (l
>> 8) & 0xff;
1923 digest
[20] = (l
>> 0) & 0xff;
1925 l
= itoa64_to_int (buf
[ 4]) << 0;
1926 l
|= itoa64_to_int (buf
[ 5]) << 6;
1927 l
|= itoa64_to_int (buf
[ 6]) << 12;
1928 l
|= itoa64_to_int (buf
[ 7]) << 18;
1930 digest
[21] = (l
>> 16) & 0xff;
1931 digest
[ 1] = (l
>> 8) & 0xff;
1932 digest
[11] = (l
>> 0) & 0xff;
1934 l
= itoa64_to_int (buf
[ 8]) << 0;
1935 l
|= itoa64_to_int (buf
[ 9]) << 6;
1936 l
|= itoa64_to_int (buf
[10]) << 12;
1937 l
|= itoa64_to_int (buf
[11]) << 18;
1939 digest
[12] = (l
>> 16) & 0xff;
1940 digest
[22] = (l
>> 8) & 0xff;
1941 digest
[ 2] = (l
>> 0) & 0xff;
1943 l
= itoa64_to_int (buf
[12]) << 0;
1944 l
|= itoa64_to_int (buf
[13]) << 6;
1945 l
|= itoa64_to_int (buf
[14]) << 12;
1946 l
|= itoa64_to_int (buf
[15]) << 18;
1948 digest
[ 3] = (l
>> 16) & 0xff;
1949 digest
[13] = (l
>> 8) & 0xff;
1950 digest
[23] = (l
>> 0) & 0xff;
1952 l
= itoa64_to_int (buf
[16]) << 0;
1953 l
|= itoa64_to_int (buf
[17]) << 6;
1954 l
|= itoa64_to_int (buf
[18]) << 12;
1955 l
|= itoa64_to_int (buf
[19]) << 18;
1957 digest
[24] = (l
>> 16) & 0xff;
1958 digest
[ 4] = (l
>> 8) & 0xff;
1959 digest
[14] = (l
>> 0) & 0xff;
1961 l
= itoa64_to_int (buf
[20]) << 0;
1962 l
|= itoa64_to_int (buf
[21]) << 6;
1963 l
|= itoa64_to_int (buf
[22]) << 12;
1964 l
|= itoa64_to_int (buf
[23]) << 18;
1966 digest
[15] = (l
>> 16) & 0xff;
1967 digest
[25] = (l
>> 8) & 0xff;
1968 digest
[ 5] = (l
>> 0) & 0xff;
1970 l
= itoa64_to_int (buf
[24]) << 0;
1971 l
|= itoa64_to_int (buf
[25]) << 6;
1972 l
|= itoa64_to_int (buf
[26]) << 12;
1973 l
|= itoa64_to_int (buf
[27]) << 18;
1975 digest
[ 6] = (l
>> 16) & 0xff;
1976 digest
[16] = (l
>> 8) & 0xff;
1977 digest
[26] = (l
>> 0) & 0xff;
1979 l
= itoa64_to_int (buf
[28]) << 0;
1980 l
|= itoa64_to_int (buf
[29]) << 6;
1981 l
|= itoa64_to_int (buf
[30]) << 12;
1982 l
|= itoa64_to_int (buf
[31]) << 18;
1984 digest
[27] = (l
>> 16) & 0xff;
1985 digest
[ 7] = (l
>> 8) & 0xff;
1986 digest
[17] = (l
>> 0) & 0xff;
1988 l
= itoa64_to_int (buf
[32]) << 0;
1989 l
|= itoa64_to_int (buf
[33]) << 6;
1990 l
|= itoa64_to_int (buf
[34]) << 12;
1991 l
|= itoa64_to_int (buf
[35]) << 18;
1993 digest
[18] = (l
>> 16) & 0xff;
1994 digest
[28] = (l
>> 8) & 0xff;
1995 digest
[ 8] = (l
>> 0) & 0xff;
1997 l
= itoa64_to_int (buf
[36]) << 0;
1998 l
|= itoa64_to_int (buf
[37]) << 6;
1999 l
|= itoa64_to_int (buf
[38]) << 12;
2000 l
|= itoa64_to_int (buf
[39]) << 18;
2002 digest
[ 9] = (l
>> 16) & 0xff;
2003 digest
[19] = (l
>> 8) & 0xff;
2004 digest
[29] = (l
>> 0) & 0xff;
2006 l
= itoa64_to_int (buf
[40]) << 0;
2007 l
|= itoa64_to_int (buf
[41]) << 6;
2008 l
|= itoa64_to_int (buf
[42]) << 12;
2010 digest
[31] = (l
>> 8) & 0xff;
2011 digest
[30] = (l
>> 0) & 0xff;
2014 void sha256crypt_encode (unsigned char digest
[32], unsigned char buf
[43])
2018 l
= (digest
[ 0] << 16) | (digest
[10] << 8) | (digest
[20] << 0);
2020 buf
[ 0] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2021 buf
[ 1] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2022 buf
[ 2] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2023 buf
[ 3] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2025 l
= (digest
[21] << 16) | (digest
[ 1] << 8) | (digest
[11] << 0);
2027 buf
[ 4] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2028 buf
[ 5] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2029 buf
[ 6] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2030 buf
[ 7] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2032 l
= (digest
[12] << 16) | (digest
[22] << 8) | (digest
[ 2] << 0);
2034 buf
[ 8] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2035 buf
[ 9] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2036 buf
[10] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2037 buf
[11] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2039 l
= (digest
[ 3] << 16) | (digest
[13] << 8) | (digest
[23] << 0);
2041 buf
[12] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2042 buf
[13] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2043 buf
[14] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2044 buf
[15] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2046 l
= (digest
[24] << 16) | (digest
[ 4] << 8) | (digest
[14] << 0);
2048 buf
[16] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2049 buf
[17] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2050 buf
[18] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2051 buf
[19] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2053 l
= (digest
[15] << 16) | (digest
[25] << 8) | (digest
[ 5] << 0);
2055 buf
[20] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2056 buf
[21] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2057 buf
[22] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2058 buf
[23] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2060 l
= (digest
[ 6] << 16) | (digest
[16] << 8) | (digest
[26] << 0);
2062 buf
[24] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2063 buf
[25] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2064 buf
[26] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2065 buf
[27] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2067 l
= (digest
[27] << 16) | (digest
[ 7] << 8) | (digest
[17] << 0);
2069 buf
[28] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2070 buf
[29] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2071 buf
[30] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2072 buf
[31] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2074 l
= (digest
[18] << 16) | (digest
[28] << 8) | (digest
[ 8] << 0);
2076 buf
[32] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2077 buf
[33] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2078 buf
[34] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2079 buf
[35] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2081 l
= (digest
[ 9] << 16) | (digest
[19] << 8) | (digest
[29] << 0);
2083 buf
[36] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2084 buf
[37] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2085 buf
[38] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2086 buf
[39] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2088 l
= 0 | (digest
[31] << 8) | (digest
[30] << 0);
2090 buf
[40] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2091 buf
[41] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2092 buf
[42] = int_to_itoa64 (l
& 0x3f);
2095 void drupal7_decode (unsigned char digest
[64], unsigned char buf
[44])
2099 l
= itoa64_to_int (buf
[ 0]) << 0;
2100 l
|= itoa64_to_int (buf
[ 1]) << 6;
2101 l
|= itoa64_to_int (buf
[ 2]) << 12;
2102 l
|= itoa64_to_int (buf
[ 3]) << 18;
2104 digest
[ 0] = (l
>> 0) & 0xff;
2105 digest
[ 1] = (l
>> 8) & 0xff;
2106 digest
[ 2] = (l
>> 16) & 0xff;
2108 l
= itoa64_to_int (buf
[ 4]) << 0;
2109 l
|= itoa64_to_int (buf
[ 5]) << 6;
2110 l
|= itoa64_to_int (buf
[ 6]) << 12;
2111 l
|= itoa64_to_int (buf
[ 7]) << 18;
2113 digest
[ 3] = (l
>> 0) & 0xff;
2114 digest
[ 4] = (l
>> 8) & 0xff;
2115 digest
[ 5] = (l
>> 16) & 0xff;
2117 l
= itoa64_to_int (buf
[ 8]) << 0;
2118 l
|= itoa64_to_int (buf
[ 9]) << 6;
2119 l
|= itoa64_to_int (buf
[10]) << 12;
2120 l
|= itoa64_to_int (buf
[11]) << 18;
2122 digest
[ 6] = (l
>> 0) & 0xff;
2123 digest
[ 7] = (l
>> 8) & 0xff;
2124 digest
[ 8] = (l
>> 16) & 0xff;
2126 l
= itoa64_to_int (buf
[12]) << 0;
2127 l
|= itoa64_to_int (buf
[13]) << 6;
2128 l
|= itoa64_to_int (buf
[14]) << 12;
2129 l
|= itoa64_to_int (buf
[15]) << 18;
2131 digest
[ 9] = (l
>> 0) & 0xff;
2132 digest
[10] = (l
>> 8) & 0xff;
2133 digest
[11] = (l
>> 16) & 0xff;
2135 l
= itoa64_to_int (buf
[16]) << 0;
2136 l
|= itoa64_to_int (buf
[17]) << 6;
2137 l
|= itoa64_to_int (buf
[18]) << 12;
2138 l
|= itoa64_to_int (buf
[19]) << 18;
2140 digest
[12] = (l
>> 0) & 0xff;
2141 digest
[13] = (l
>> 8) & 0xff;
2142 digest
[14] = (l
>> 16) & 0xff;
2144 l
= itoa64_to_int (buf
[20]) << 0;
2145 l
|= itoa64_to_int (buf
[21]) << 6;
2146 l
|= itoa64_to_int (buf
[22]) << 12;
2147 l
|= itoa64_to_int (buf
[23]) << 18;
2149 digest
[15] = (l
>> 0) & 0xff;
2150 digest
[16] = (l
>> 8) & 0xff;
2151 digest
[17] = (l
>> 16) & 0xff;
2153 l
= itoa64_to_int (buf
[24]) << 0;
2154 l
|= itoa64_to_int (buf
[25]) << 6;
2155 l
|= itoa64_to_int (buf
[26]) << 12;
2156 l
|= itoa64_to_int (buf
[27]) << 18;
2158 digest
[18] = (l
>> 0) & 0xff;
2159 digest
[19] = (l
>> 8) & 0xff;
2160 digest
[20] = (l
>> 16) & 0xff;
2162 l
= itoa64_to_int (buf
[28]) << 0;
2163 l
|= itoa64_to_int (buf
[29]) << 6;
2164 l
|= itoa64_to_int (buf
[30]) << 12;
2165 l
|= itoa64_to_int (buf
[31]) << 18;
2167 digest
[21] = (l
>> 0) & 0xff;
2168 digest
[22] = (l
>> 8) & 0xff;
2169 digest
[23] = (l
>> 16) & 0xff;
2171 l
= itoa64_to_int (buf
[32]) << 0;
2172 l
|= itoa64_to_int (buf
[33]) << 6;
2173 l
|= itoa64_to_int (buf
[34]) << 12;
2174 l
|= itoa64_to_int (buf
[35]) << 18;
2176 digest
[24] = (l
>> 0) & 0xff;
2177 digest
[25] = (l
>> 8) & 0xff;
2178 digest
[26] = (l
>> 16) & 0xff;
2180 l
= itoa64_to_int (buf
[36]) << 0;
2181 l
|= itoa64_to_int (buf
[37]) << 6;
2182 l
|= itoa64_to_int (buf
[38]) << 12;
2183 l
|= itoa64_to_int (buf
[39]) << 18;
2185 digest
[27] = (l
>> 0) & 0xff;
2186 digest
[28] = (l
>> 8) & 0xff;
2187 digest
[29] = (l
>> 16) & 0xff;
2189 l
= itoa64_to_int (buf
[40]) << 0;
2190 l
|= itoa64_to_int (buf
[41]) << 6;
2191 l
|= itoa64_to_int (buf
[42]) << 12;
2192 l
|= itoa64_to_int (buf
[43]) << 18;
2194 digest
[30] = (l
>> 0) & 0xff;
2195 digest
[31] = (l
>> 8) & 0xff;
2196 digest
[32] = (l
>> 16) & 0xff;
2231 void drupal7_encode (unsigned char digest
[64], unsigned char buf
[43])
2235 l
= (digest
[ 0] << 0) | (digest
[ 1] << 8) | (digest
[ 2] << 16);
2237 buf
[ 0] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2238 buf
[ 1] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2239 buf
[ 2] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2240 buf
[ 3] = int_to_itoa64 (l
& 0x3f);
2242 l
= (digest
[ 3] << 0) | (digest
[ 4] << 8) | (digest
[ 5] << 16);
2244 buf
[ 4] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2245 buf
[ 5] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2246 buf
[ 6] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2247 buf
[ 7] = int_to_itoa64 (l
& 0x3f);
2249 l
= (digest
[ 6] << 0) | (digest
[ 7] << 8) | (digest
[ 8] << 16);
2251 buf
[ 8] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2252 buf
[ 9] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2253 buf
[10] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2254 buf
[11] = int_to_itoa64 (l
& 0x3f);
2256 l
= (digest
[ 9] << 0) | (digest
[10] << 8) | (digest
[11] << 16);
2258 buf
[12] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2259 buf
[13] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2260 buf
[14] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2261 buf
[15] = int_to_itoa64 (l
& 0x3f);
2263 l
= (digest
[12] << 0) | (digest
[13] << 8) | (digest
[14] << 16);
2265 buf
[16] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2266 buf
[17] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2267 buf
[18] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2268 buf
[19] = int_to_itoa64 (l
& 0x3f);
2270 l
= (digest
[15] << 0) | (digest
[16] << 8) | (digest
[17] << 16);
2272 buf
[20] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2273 buf
[21] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2274 buf
[22] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2275 buf
[23] = int_to_itoa64 (l
& 0x3f);
2277 l
= (digest
[18] << 0) | (digest
[19] << 8) | (digest
[20] << 16);
2279 buf
[24] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2280 buf
[25] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2281 buf
[26] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2282 buf
[27] = int_to_itoa64 (l
& 0x3f);
2284 l
= (digest
[21] << 0) | (digest
[22] << 8) | (digest
[23] << 16);
2286 buf
[28] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2287 buf
[29] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2288 buf
[30] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2289 buf
[31] = int_to_itoa64 (l
& 0x3f);
2291 l
= (digest
[24] << 0) | (digest
[25] << 8) | (digest
[26] << 16);
2293 buf
[32] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2294 buf
[33] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2295 buf
[34] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2296 buf
[35] = int_to_itoa64 (l
& 0x3f);
2298 l
= (digest
[27] << 0) | (digest
[28] << 8) | (digest
[29] << 16);
2300 buf
[36] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2301 buf
[37] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2302 buf
[38] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2303 buf
[39] = int_to_itoa64 (l
& 0x3f);
2305 l
= (digest
[30] << 0) | (digest
[31] << 8) | (digest
[32] << 16);
2307 buf
[40] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2308 buf
[41] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2309 buf
[42] = int_to_itoa64 (l
& 0x3f); l
>>= 6;
2310 //buf[43] = int_to_itoa64 (l & 0x3f);
2318 static struct termio savemodes
;
2319 static int havemodes
= 0;
2323 struct termio modmodes
;
2325 if (ioctl (fileno (stdin
), TCGETA
, &savemodes
) < 0) return -1;
2329 modmodes
= savemodes
;
2330 modmodes
.c_lflag
&= ~ICANON
;
2331 modmodes
.c_cc
[VMIN
] = 1;
2332 modmodes
.c_cc
[VTIME
] = 0;
2334 return ioctl (fileno (stdin
), TCSETAW
, &modmodes
);
2343 FD_SET (fileno (stdin
), &rfds
);
2350 int retval
= select (1, &rfds
, NULL
, NULL
, &tv
);
2352 if (retval
== 0) return 0;
2353 if (retval
== -1) return -1;
2360 if (!havemodes
) return 0;
2362 return ioctl (fileno (stdin
), TCSETAW
, &savemodes
);
2367 static struct termios savemodes
;
2368 static int havemodes
= 0;
2372 struct termios modmodes
;
2374 if (ioctl (fileno (stdin
), TIOCGETA
, &savemodes
) < 0) return -1;
2378 modmodes
= savemodes
;
2379 modmodes
.c_lflag
&= ~ICANON
;
2380 modmodes
.c_cc
[VMIN
] = 1;
2381 modmodes
.c_cc
[VTIME
] = 0;
2383 return ioctl (fileno (stdin
), TIOCSETAW
, &modmodes
);
2392 FD_SET (fileno (stdin
), &rfds
);
2399 int retval
= select (1, &rfds
, NULL
, NULL
, &tv
);
2401 if (retval
== 0) return 0;
2402 if (retval
== -1) return -1;
2409 if (!havemodes
) return 0;
2411 return ioctl (fileno (stdin
), TIOCSETAW
, &savemodes
);
2416 static DWORD saveMode
= 0;
2420 HANDLE stdinHandle
= GetStdHandle (STD_INPUT_HANDLE
);
2422 GetConsoleMode (stdinHandle
, &saveMode
);
2423 SetConsoleMode (stdinHandle
, ENABLE_PROCESSED_INPUT
);
2430 HANDLE stdinHandle
= GetStdHandle (STD_INPUT_HANDLE
);
2432 DWORD rc
= WaitForSingleObject (stdinHandle
, 1000);
2434 if (rc
== WAIT_TIMEOUT
) return 0;
2435 if (rc
== WAIT_ABANDONED
) return -1;
2436 if (rc
== WAIT_FAILED
) return -1;
2438 // The whole ReadConsoleInput () part is a workaround.
2439 // For some unknown reason, maybe a mingw bug, a random signal
2440 // is sent to stdin which unblocks WaitForSingleObject () and sets rc 0.
2441 // Then it wants to read with getche () a keyboard input
2442 // which has never been made.
2444 INPUT_RECORD buf
[100];
2448 ReadConsoleInput (stdinHandle
, buf
, 100, &num
);
2450 FlushConsoleInputBuffer (stdinHandle
);
2452 for (uint i
= 0; i
< num
; i
++)
2454 if (buf
[i
].EventType
!= KEY_EVENT
) continue;
2456 KEY_EVENT_RECORD KeyEvent
= buf
[i
].Event
.KeyEvent
;
2458 if (KeyEvent
.bKeyDown
!= TRUE
) continue;
2460 return KeyEvent
.uChar
.AsciiChar
;
2468 HANDLE stdinHandle
= GetStdHandle (STD_INPUT_HANDLE
);
2470 SetConsoleMode (stdinHandle
, saveMode
);
2480 #define MSG_ENOMEM "Insufficient memory available"
2482 void *mycalloc (size_t nmemb
, size_t size
)
2484 void *p
= calloc (nmemb
, size
);
2488 log_error ("ERROR: %s", MSG_ENOMEM
);
2496 void *mymalloc (size_t size
)
2498 void *p
= malloc (size
);
2502 log_error ("ERROR: %s", MSG_ENOMEM
);
2507 memset (p
, 0, size
);
2512 void myfree (void *ptr
)
2514 if (ptr
== NULL
) return;
2519 void *myrealloc (void *ptr
, size_t oldsz
, size_t add
)
2521 void *p
= realloc (ptr
, oldsz
+ add
);
2525 log_error ("ERROR: %s", MSG_ENOMEM
);
2530 memset ((char *) p
+ oldsz
, 0, add
);
2535 char *mystrdup (const char *s
)
2537 const size_t len
= strlen (s
);
2539 char *b
= (char *) mymalloc (len
+ 1);
2546 FILE *logfile_open (char *logfile
)
2548 FILE *fp
= fopen (logfile
, "ab");
2558 void logfile_close (FILE *fp
)
2560 if (fp
== stdout
) return;
2565 void logfile_append (const char *fmt
, ...)
2567 if (data
.logfile_disable
== 1) return;
2569 FILE *fp
= logfile_open (data
.logfile
);
2575 vfprintf (fp
, fmt
, ap
);
2586 int logfile_generate_id ()
2588 const int n
= rand ();
2597 char *logfile_generate_topid ()
2599 const int id
= logfile_generate_id ();
2601 char *topid
= (char *) mymalloc (1 + 16 + 1);
2603 sprintf (topid
, "TOP%08x", id
);
2608 char *logfile_generate_subid ()
2610 const int id
= logfile_generate_id ();
2612 char *subid
= (char *) mymalloc (1 + 16 + 1);
2614 sprintf (subid
, "SUB%08x", id
);
2626 HANDLE h
= (HANDLE
) _get_osfhandle (fd
);
2628 FlushFileBuffers (h
);
2638 int hm_get_adapter_index (HM_ADAPTER nvGPUHandle[DEVICES_MAX])
2642 if (hc_NvAPI_EnumPhysicalGPUs (nvGPUHandle, &pGpuCount) != NVAPI_OK) return (0);
2646 log_info ("WARN: No NvAPI adapters found");
2656 int hm_get_adapter_index (HM_ADAPTER nvGPUHandle[DEVICES_MAX])
2660 for (uint i = 0; i < DEVICES_MAX; i++)
2662 // do not use wrapper function to omit warning message
2663 if (nvmlDeviceGetHandleByIndex (i, &nvGPUHandle[i]) != NVML_SUCCESS) break;
2665 //can be used to determine if the device by index matches the cuda device by index
2666 //char name[100]; memset (name, 0, sizeof (name));
2667 //hc_NVML_nvmlDeviceGetName (nvGPUHandle[i], name, sizeof (name) - 1);
2674 log_info ("WARN: No NVML adapters found");
2683 void hm_close (HM_LIB hm_dll)
2689 FreeLibrary (hm_dll);
2697 HM_LIB hm_dll = dlopen ("libatiadlxx.so", RTLD_LAZY | RTLD_GLOBAL);
2700 HM_LIB hm_dll = LoadLibrary ("atiadlxx.dll");
2703 hm_dll = LoadLibrary ("atiadlxy.dll");
2710 int get_adapters_num (HM_LIB hm_dll, int *iNumberAdapters)
2712 if (hc_ADL_Adapter_NumberOfAdapters_Get (hm_dll, iNumberAdapters) != ADL_OK) return -1;
2714 if (iNumberAdapters == 0)
2716 log_info ("WARN: No ADL adapters found.");
2724 int hm_show_performance_level (HM_LIB hm_dll, int iAdapterIndex)
2726 ADLODPerformanceLevels *lpOdPerformanceLevels = NULL;
2727 ADLODParameters lpOdParameters;
2729 lpOdParameters.iSize = sizeof (ADLODParameters);
2730 size_t plevels_size = 0;
2732 if (hc_ADL_Overdrive_ODParameters_Get (hm_dll, iAdapterIndex, &lpOdParameters) != ADL_OK) return -1;
2734 log_info ("[DEBUG] %s, adapter %d performance level (%d) : %s %s",
2735 __func__, iAdapterIndex,
2736 lpOdParameters.iNumberOfPerformanceLevels,
2737 (lpOdParameters.iActivityReportingSupported) ? "activity reporting" : "",
2738 (lpOdParameters.iDiscretePerformanceLevels) ? "discrete performance levels" : "performance ranges");
2740 plevels_size = sizeof (ADLODPerformanceLevels) + sizeof (ADLODPerformanceLevel) * (lpOdParameters.iNumberOfPerformanceLevels - 1);
2742 lpOdPerformanceLevels = (ADLODPerformanceLevels *) mymalloc (plevels_size);
2744 lpOdPerformanceLevels->iSize = sizeof (ADLODPerformanceLevels) + sizeof (ADLODPerformanceLevel) * (lpOdParameters.iNumberOfPerformanceLevels - 1);
2746 if (hc_ADL_Overdrive_ODPerformanceLevels_Get (hm_dll, iAdapterIndex, 0, lpOdPerformanceLevels) != ADL_OK) return -1;
2748 for (int j = 0; j < lpOdParameters.iNumberOfPerformanceLevels; j++)
2749 log_info ("[DEBUG] %s, adapter %d, level %d : engine %d, memory %d, voltage: %d",
2750 __func__, iAdapterIndex, j,
2751 lpOdPerformanceLevels->aLevels[j].iEngineClock / 100, lpOdPerformanceLevels->aLevels[j].iMemoryClock / 100, lpOdPerformanceLevels->aLevels[j].iVddc);
2753 myfree (lpOdPerformanceLevels);
2758 LPAdapterInfo hm_get_adapter_info (HM_LIB hm_dll, int iNumberAdapters)
2760 size_t AdapterInfoSize = iNumberAdapters * sizeof (AdapterInfo);
2762 LPAdapterInfo lpAdapterInfo = (LPAdapterInfo) mymalloc (AdapterInfoSize);
2764 if (hc_ADL_Adapter_AdapterInfo_Get (hm_dll, lpAdapterInfo, AdapterInfoSize) != ADL_OK) return NULL;
2766 return lpAdapterInfo;
2770 // does not help at all, since AMD does not assign different bus id, device id when we have multi GPU setups
2773 int hm_get_opencl_device_index (hm_attrs_t *hm_device, uint num_adl_adapters, int bus_num, int dev_num)
2777 for (uint i = 0; i < num_adl_adapters; i++)
2779 int opencl_bus_num = hm_device[i].busid;
2780 int opencl_dev_num = hm_device[i].devid;
2782 if ((opencl_bus_num == bus_num) && (opencl_dev_num == dev_num))
2790 if (idx >= DEVICES_MAX) return -1;
2795 void hm_get_opencl_busid_devid (hm_attrs_t *hm_device, uint opencl_num_devices, cl_device_id *devices)
2797 for (uint i = 0; i < opencl_num_devices; i++)
2799 cl_device_topology_amd device_topology;
2801 hc_clGetDeviceInfo (devices[i], CL_DEVICE_TOPOLOGY_AMD, sizeof (device_topology), &device_topology, NULL);
2803 hm_device[i].busid = device_topology.pcie.bus;
2804 hm_device[i].devid = device_topology.pcie.device;
2808 void hm_sort_adl_adapters_by_busid_devid (uint32_t *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2810 // basically bubble sort
2812 for (int i = 0; i < num_adl_adapters; i++)
2814 for (int j = 0; j < num_adl_adapters - 1; j++)
2816 // get info of adapter [x]
2818 uint32_t adapter_index_x = valid_adl_device_list[j];
2819 AdapterInfo info_x = lpAdapterInfo[adapter_index_x];
2821 uint32_t bus_num_x = info_x.iBusNumber;
2822 uint32_t dev_num_x = info_x.iDeviceNumber;
2824 // get info of adapter [y]
2826 uint32_t adapter_index_y = valid_adl_device_list[j + 1];
2827 AdapterInfo info_y = lpAdapterInfo[adapter_index_y];
2829 uint32_t bus_num_y = info_y.iBusNumber;
2830 uint32_t dev_num_y = info_y.iDeviceNumber;
2834 if (bus_num_y < bus_num_x)
2838 else if (bus_num_y == bus_num_x)
2840 if (dev_num_y < dev_num_x)
2848 uint32_t temp = valid_adl_device_list[j + 1];
2850 valid_adl_device_list[j + 1] = valid_adl_device_list[j];
2851 valid_adl_device_list[j + 0] = temp;
2857 uint32_t *hm_get_list_valid_adl_adapters (int iNumberAdapters, int *num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2859 *num_adl_adapters = 0;
2861 uint32_t *adl_adapters = NULL;
2863 int *bus_numbers = NULL;
2864 int *device_numbers = NULL;
2866 for (int i = 0; i < iNumberAdapters; i++)
2868 AdapterInfo info = lpAdapterInfo[i];
2870 if ((info.strUDID == NULL) || (strlen (info.strUDID) < 1)) continue;
2873 if (info.iVendorID != 1002) continue;
2875 if (info.iVendorID != 0x1002) continue;
2878 if (info.iBusNumber < 0) continue;
2879 if (info.iDeviceNumber < 0) continue;
2883 for (int pos = 0; pos < *num_adl_adapters; pos++)
2885 if ((bus_numbers[pos] == info.iBusNumber) && (device_numbers[pos] == info.iDeviceNumber))
2892 if (found) continue;
2894 // add it to the list
2896 adl_adapters = (uint32_t *) myrealloc (adl_adapters, (*num_adl_adapters) * sizeof (int), sizeof (int));
2898 adl_adapters[*num_adl_adapters] = i;
2900 // rest is just bookkeeping
2902 bus_numbers = (int*) myrealloc (bus_numbers, (*num_adl_adapters) * sizeof (int), sizeof (int));
2903 device_numbers = (int*) myrealloc (device_numbers, (*num_adl_adapters) * sizeof (int), sizeof (int));
2905 bus_numbers[*num_adl_adapters] = info.iBusNumber;
2906 device_numbers[*num_adl_adapters] = info.iDeviceNumber;
2908 (*num_adl_adapters)++;
2911 myfree (bus_numbers);
2912 myfree (device_numbers);
2914 // sort the list by increasing bus id, device id number
2916 hm_sort_adl_adapters_by_busid_devid (adl_adapters, *num_adl_adapters, lpAdapterInfo);
2918 return adl_adapters;
2921 int hm_check_fanspeed_control (HM_LIB hm_dll, hm_attrs_t *hm_device, uint32_t *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2923 // loop through all valid devices
2925 for (int i = 0; i < num_adl_adapters; i++)
2927 uint32_t adapter_index = valid_adl_device_list[i];
2931 AdapterInfo info = lpAdapterInfo[adapter_index];
2933 // unfortunately this doesn't work since bus id and dev id are not unique
2934 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
2935 // if (opencl_device_index == -1) continue;
2937 int opencl_device_index = i;
2939 // if (hm_show_performance_level (hm_dll, info.iAdapterIndex) != 0) return -1;
2941 // get fanspeed info
2943 if (hm_device[opencl_device_index].od_version == 5)
2945 ADLFanSpeedInfo FanSpeedInfo;
2947 memset (&FanSpeedInfo, 0, sizeof (ADLFanSpeedInfo));
2949 FanSpeedInfo.iSize = sizeof (ADLFanSpeedInfo);
2951 if (hc_ADL_Overdrive5_FanSpeedInfo_Get (hm_dll, info.iAdapterIndex, 0, &FanSpeedInfo) != ADL_OK) return -1;
2953 // check read and write capability in fanspeedinfo
2955 if ((FanSpeedInfo.iFlags & ADL_DL_FANCTRL_SUPPORTS_PERCENT_READ) &&
2956 (FanSpeedInfo.iFlags & ADL_DL_FANCTRL_SUPPORTS_PERCENT_WRITE))
2958 hm_device[opencl_device_index].fan_supported = 1;
2962 hm_device[opencl_device_index].fan_supported = 0;
2965 else // od_version == 6
2967 ADLOD6FanSpeedInfo faninfo;
2969 memset (&faninfo, 0, sizeof (faninfo));
2971 if (hc_ADL_Overdrive6_FanSpeed_Get (hm_dll, info.iAdapterIndex, &faninfo) != ADL_OK) return -1;
2973 // check read capability in fanspeedinfo
2975 if (faninfo.iSpeedType & ADL_OD6_FANSPEED_TYPE_PERCENT)
2977 hm_device[opencl_device_index].fan_supported = 1;
2981 hm_device[opencl_device_index].fan_supported = 0;
2989 int hm_get_overdrive_version (HM_LIB hm_dll, hm_attrs_t *hm_device, uint32_t *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2991 for (int i = 0; i < num_adl_adapters; i++)
2993 uint32_t adapter_index = valid_adl_device_list[i];
2997 AdapterInfo info = lpAdapterInfo[adapter_index];
2999 // get overdrive version
3001 int od_supported = 0;
3005 if (hc_ADL_Overdrive_Caps (hm_dll, info.iAdapterIndex, &od_supported, &od_enabled, &od_version) != ADL_OK) return -1;
3007 // store the overdrive version in hm_device
3009 // unfortunately this doesn't work since bus id and dev id are not unique
3010 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
3011 // if (opencl_device_index == -1) continue;
3013 int opencl_device_index = i;
3015 hm_device[opencl_device_index].od_version = od_version;
3021 int hm_get_adapter_index (hm_attrs_t *hm_device, uint32_t *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
3023 for (int i = 0; i < num_adl_adapters; i++)
3025 uint32_t adapter_index = valid_adl_device_list[i];
3029 AdapterInfo info = lpAdapterInfo[adapter_index];
3031 // store the iAdapterIndex in hm_device
3033 // unfortunately this doesn't work since bus id and dev id are not unique
3034 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
3035 // if (opencl_device_index == -1) continue;
3037 int opencl_device_index = i;
3039 hm_device[opencl_device_index].adapter_index = info.iAdapterIndex;
3042 return num_adl_adapters;
3045 int hm_get_temperature_with_device_id (const uint device_id)
3047 if (data.vendor_id == VENDOR_ID_AMD)
3051 if (data.hm_device[device_id].od_version == 5)
3053 ADLTemperature Temperature;
3055 Temperature.iSize = sizeof (ADLTemperature);
3057 if (hc_ADL_Overdrive5_Temperature_Get (data.hm_dll, data.hm_device[device_id].adapter_index, 0, &Temperature) != ADL_OK) return -1;
3059 return Temperature.iTemperature / 1000;
3061 else if (data.hm_device[device_id].od_version == 6)
3063 int Temperature = 0;
3065 if (hc_ADL_Overdrive6_Temperature_Get (data.hm_dll, data.hm_device[device_id].adapter_index, &Temperature) != ADL_OK) return -1;
3067 return Temperature / 1000;
3072 if (data.vendor_id == VENDOR_ID_NV)
3075 int temperature = 0;
3077 hc_NVML_nvmlDeviceGetTemperature (data.hm_device[device_id].adapter_index, NVML_TEMPERATURE_GPU, (unsigned int *) &temperature);
3083 NV_GPU_THERMAL_SETTINGS pThermalSettings;
3085 pThermalSettings.version = NV_GPU_THERMAL_SETTINGS_VER;
3086 pThermalSettings.count = NVAPI_MAX_THERMAL_SENSORS_PER_GPU;
3087 pThermalSettings.sensor[0].controller = NVAPI_THERMAL_CONTROLLER_UNKNOWN;
3088 pThermalSettings.sensor[0].target = NVAPI_THERMAL_TARGET_GPU;
3090 if (hc_NvAPI_GPU_GetThermalSettings (data.hm_device[device_id].adapter_index, 0, &pThermalSettings) != NVAPI_OK) return -1;
3092 return pThermalSettings.sensor[0].currentTemp;
3099 int hm_get_fanspeed_with_device_id (const uint device_id)
3101 if (data.hm_device[device_id].fan_supported == 1)
3103 if (data.vendor_id == VENDOR_ID_AMD)
3107 if (data.hm_device[device_id].od_version == 5)
3109 ADLFanSpeedValue lpFanSpeedValue;
3111 memset (&lpFanSpeedValue, 0, sizeof (lpFanSpeedValue));
3113 lpFanSpeedValue.iSize = sizeof (lpFanSpeedValue);
3114 lpFanSpeedValue.iSpeedType = ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
3115 lpFanSpeedValue.iFlags = ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED;
3117 if (hc_ADL_Overdrive5_FanSpeed_Get (data.hm_dll, data.hm_device[device_id].adapter_index, 0, &lpFanSpeedValue) != ADL_OK) return -1;
3119 return lpFanSpeedValue.iFanSpeed;
3121 else // od_version == 6
3123 ADLOD6FanSpeedInfo faninfo;
3125 memset (&faninfo, 0, sizeof (faninfo));
3127 if (hc_ADL_Overdrive6_FanSpeed_Get (data.hm_dll, data.hm_device[device_id].adapter_index, &faninfo) != ADL_OK) return -1;
3129 return faninfo.iFanSpeedPercent;
3134 if (data.vendor_id == VENDOR_ID_NV)
3139 hc_NVML_nvmlDeviceGetFanSpeed (data.hm_device[device_id].adapter_index, (unsigned int *) &speed);
3147 hc_NvAPI_GPU_GetTachReading (data.hm_device[device_id].adapter_index, &speed);
3157 int hm_get_utilization_with_device_id (const uint device_id)
3159 if (data.vendor_id == VENDOR_ID_AMD)
3163 ADLPMActivity PMActivity;
3165 PMActivity.iSize = sizeof (ADLPMActivity);
3167 if (hc_ADL_Overdrive_CurrentActivity_Get (data.hm_dll, data.hm_device[device_id].adapter_index, &PMActivity) != ADL_OK) return -1;
3169 return PMActivity.iActivityPercent;
3173 if (data.vendor_id == VENDOR_ID_AMD)
3176 nvmlUtilization_t utilization;
3178 hc_NVML_nvmlDeviceGetUtilizationRates (data.hm_device[device_id].adapter_index, &utilization);
3180 return utilization.gpu;
3184 NV_GPU_DYNAMIC_PSTATES_INFO_EX pDynamicPstatesInfoEx;
3186 pDynamicPstatesInfoEx.version = NV_GPU_DYNAMIC_PSTATES_INFO_EX_VER;
3188 if (hc_NvAPI_GPU_GetDynamicPstatesInfoEx (data.hm_device[device_id].adapter_index, &pDynamicPstatesInfoEx) != NVAPI_OK) return -1;
3190 return pDynamicPstatesInfoEx.utilization[0].percentage;
3197 int hm_set_fanspeed_with_device_id (const uint device_id, const int fanspeed)
3199 if (data.hm_device[device_id].fan_supported == 1)
3203 if (data.hm_device[device_id].od_version == 5)
3205 ADLFanSpeedValue lpFanSpeedValue;
3207 memset (&lpFanSpeedValue, 0, sizeof (lpFanSpeedValue));
3209 lpFanSpeedValue.iSize = sizeof (lpFanSpeedValue);
3210 lpFanSpeedValue.iSpeedType = ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
3211 lpFanSpeedValue.iFlags = ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED;
3212 lpFanSpeedValue.iFanSpeed = fanspeed;
3214 if (hc_ADL_Overdrive5_FanSpeed_Set (data.hm_dll, data.hm_device[device_id].adapter_index, 0, &lpFanSpeedValue) != ADL_OK) return -1;
3218 else // od_version == 6
3220 ADLOD6FanSpeedValue fan_speed_value;
3222 memset (&fan_speed_value, 0, sizeof (fan_speed_value));
3224 fan_speed_value.iSpeedType = ADL_OD6_FANSPEED_TYPE_PERCENT;
3225 fan_speed_value.iFanSpeed = fanspeed;
3227 if (hc_ADL_Overdrive6_FanSpeed_Set (data.hm_dll, data.hm_device[device_id].adapter_index, &fan_speed_value) != ADL_OK) return -1;
3242 void mp_css_to_uniq_tbl (uint css_cnt
, cs_t
*css
, uint uniq_tbls
[SP_PW_MAX
][CHARSIZ
])
3244 /* generates a lookup table where key is the char itself for fastest possible lookup performance */
3246 if (css_cnt
> SP_PW_MAX
)
3248 log_error ("ERROR: mask length is too long");
3253 for (uint css_pos
= 0; css_pos
< css_cnt
; css_pos
++)
3255 uint
*uniq_tbl
= uniq_tbls
[css_pos
];
3257 uint
*cs_buf
= css
[css_pos
].cs_buf
;
3258 uint cs_len
= css
[css_pos
].cs_len
;
3260 for (uint cs_pos
= 0; cs_pos
< cs_len
; cs_pos
++)
3262 uint c
= cs_buf
[cs_pos
] & 0xff;
3269 void mp_add_cs_buf (uint
*in_buf
, size_t in_len
, cs_t
*css
, int css_cnt
)
3271 cs_t
*cs
= &css
[css_cnt
];
3273 size_t css_uniq_sz
= CHARSIZ
* sizeof (uint
);
3275 uint
*css_uniq
= (uint
*) mymalloc (css_uniq_sz
);
3277 memset (css_uniq
, 0, css_uniq_sz
);
3281 for (i
= 0; i
< cs
->cs_len
; i
++)
3283 const uint u
= cs
->cs_buf
[i
];
3288 for (i
= 0; i
< in_len
; i
++)
3290 uint u
= in_buf
[i
] & 0xff;
3292 if (data
.opts_type
& OPTS_TYPE_PT_UPPER
) u
= toupper (u
);
3294 if (css_uniq
[u
] == 1) continue;
3298 cs
->cs_buf
[cs
->cs_len
] = u
;
3306 void mp_expand (char *in_buf
, size_t in_len
, cs_t
*mp_sys
, cs_t
*mp_usr
, int mp_usr_offset
, int interpret
)
3310 for (in_pos
= 0; in_pos
< in_len
; in_pos
++)
3312 uint p0
= in_buf
[in_pos
] & 0xff;
3314 if (interpret
== 1 && p0
== '?')
3318 if (in_pos
== in_len
) break;
3320 uint p1
= in_buf
[in_pos
] & 0xff;
3324 case 'l': mp_add_cs_buf (mp_sys
[0].cs_buf
, mp_sys
[0].cs_len
, mp_usr
, mp_usr_offset
);
3326 case 'u': mp_add_cs_buf (mp_sys
[1].cs_buf
, mp_sys
[1].cs_len
, mp_usr
, mp_usr_offset
);
3328 case 'd': mp_add_cs_buf (mp_sys
[2].cs_buf
, mp_sys
[2].cs_len
, mp_usr
, mp_usr_offset
);
3330 case 's': mp_add_cs_buf (mp_sys
[3].cs_buf
, mp_sys
[3].cs_len
, mp_usr
, mp_usr_offset
);
3332 case 'a': mp_add_cs_buf (mp_sys
[4].cs_buf
, mp_sys
[4].cs_len
, mp_usr
, mp_usr_offset
);
3334 case 'b': mp_add_cs_buf (mp_sys
[5].cs_buf
, mp_sys
[5].cs_len
, mp_usr
, mp_usr_offset
);
3336 case '1': if (mp_usr
[0].cs_len
== 0) { log_error ("ERROR: Custom-charset 1 is undefined\n"); exit (-1); }
3337 mp_add_cs_buf (mp_usr
[0].cs_buf
, mp_usr
[0].cs_len
, mp_usr
, mp_usr_offset
);
3339 case '2': if (mp_usr
[1].cs_len
== 0) { log_error ("ERROR: Custom-charset 2 is undefined\n"); exit (-1); }
3340 mp_add_cs_buf (mp_usr
[1].cs_buf
, mp_usr
[1].cs_len
, mp_usr
, mp_usr_offset
);
3342 case '3': if (mp_usr
[2].cs_len
== 0) { log_error ("ERROR: Custom-charset 3 is undefined\n"); exit (-1); }
3343 mp_add_cs_buf (mp_usr
[2].cs_buf
, mp_usr
[2].cs_len
, mp_usr
, mp_usr_offset
);
3345 case '4': if (mp_usr
[3].cs_len
== 0) { log_error ("ERROR: Custom-charset 4 is undefined\n"); exit (-1); }
3346 mp_add_cs_buf (mp_usr
[3].cs_buf
, mp_usr
[3].cs_len
, mp_usr
, mp_usr_offset
);
3348 case '?': mp_add_cs_buf (&p0
, 1, mp_usr
, mp_usr_offset
);
3350 default: log_error ("Syntax error: %s", in_buf
);
3356 if (data
.hex_charset
)
3360 if (in_pos
== in_len
)
3362 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", in_buf
);
3367 uint p1
= in_buf
[in_pos
] & 0xff;
3369 if ((is_valid_hex_char (p0
) == 0) || (is_valid_hex_char (p1
) == 0))
3371 log_error ("ERROR: invalid hex character detected in mask %s", in_buf
);
3378 chr
= hex_convert (p1
) << 0;
3379 chr
|= hex_convert (p0
) << 4;
3381 mp_add_cs_buf (&chr
, 1, mp_usr
, mp_usr_offset
);
3387 mp_add_cs_buf (&chr
, 1, mp_usr
, mp_usr_offset
);
3393 uint64_t mp_get_sum (uint css_cnt
, cs_t
*css
)
3397 for (uint css_pos
= 0; css_pos
< css_cnt
; css_pos
++)
3399 sum
*= css
[css_pos
].cs_len
;
3405 cs_t
*mp_gen_css (char *mask_buf
, size_t mask_len
, cs_t
*mp_sys
, cs_t
*mp_usr
, uint
*css_cnt
)
3407 cs_t
*css
= (cs_t
*) mycalloc (256, sizeof (cs_t
));
3412 for (mask_pos
= 0, css_pos
= 0; mask_pos
< mask_len
; mask_pos
++, css_pos
++)
3414 char p0
= mask_buf
[mask_pos
];
3420 if (mask_pos
== mask_len
) break;
3422 char p1
= mask_buf
[mask_pos
];
3428 case 'l': mp_add_cs_buf (mp_sys
[0].cs_buf
, mp_sys
[0].cs_len
, css
, css_pos
);
3430 case 'u': mp_add_cs_buf (mp_sys
[1].cs_buf
, mp_sys
[1].cs_len
, css
, css_pos
);
3432 case 'd': mp_add_cs_buf (mp_sys
[2].cs_buf
, mp_sys
[2].cs_len
, css
, css_pos
);
3434 case 's': mp_add_cs_buf (mp_sys
[3].cs_buf
, mp_sys
[3].cs_len
, css
, css_pos
);
3436 case 'a': mp_add_cs_buf (mp_sys
[4].cs_buf
, mp_sys
[4].cs_len
, css
, css_pos
);
3438 case 'b': mp_add_cs_buf (mp_sys
[5].cs_buf
, mp_sys
[5].cs_len
, css
, css_pos
);
3440 case '1': if (mp_usr
[0].cs_len
== 0) { log_error ("ERROR: Custom-charset 1 is undefined\n"); exit (-1); }
3441 mp_add_cs_buf (mp_usr
[0].cs_buf
, mp_usr
[0].cs_len
, css
, css_pos
);
3443 case '2': if (mp_usr
[1].cs_len
== 0) { log_error ("ERROR: Custom-charset 2 is undefined\n"); exit (-1); }
3444 mp_add_cs_buf (mp_usr
[1].cs_buf
, mp_usr
[1].cs_len
, css
, css_pos
);
3446 case '3': if (mp_usr
[2].cs_len
== 0) { log_error ("ERROR: Custom-charset 3 is undefined\n"); exit (-1); }
3447 mp_add_cs_buf (mp_usr
[2].cs_buf
, mp_usr
[2].cs_len
, css
, css_pos
);
3449 case '4': if (mp_usr
[3].cs_len
== 0) { log_error ("ERROR: Custom-charset 4 is undefined\n"); exit (-1); }
3450 mp_add_cs_buf (mp_usr
[3].cs_buf
, mp_usr
[3].cs_len
, css
, css_pos
);
3452 case '?': mp_add_cs_buf (&chr
, 1, css
, css_pos
);
3454 default: log_error ("ERROR: syntax error: %s", mask_buf
);
3460 if (data
.hex_charset
)
3464 // if there is no 2nd hex character, show an error:
3466 if (mask_pos
== mask_len
)
3468 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", mask_buf
);
3473 char p1
= mask_buf
[mask_pos
];
3475 // if they are not valid hex character, show an error:
3477 if ((is_valid_hex_char (p0
) == 0) || (is_valid_hex_char (p1
) == 0))
3479 log_error ("ERROR: invalid hex character detected in mask %s", mask_buf
);
3486 chr
|= hex_convert (p1
) << 0;
3487 chr
|= hex_convert (p0
) << 4;
3489 mp_add_cs_buf (&chr
, 1, css
, css_pos
);
3495 mp_add_cs_buf (&chr
, 1, css
, css_pos
);
3502 log_error ("ERROR: invalid mask length (0)");
3512 void mp_exec (uint64_t val
, char *buf
, cs_t
*css
, int css_cnt
)
3514 for (int i
= 0; i
< css_cnt
; i
++)
3516 uint len
= css
[i
].cs_len
;
3517 uint64_t next
= val
/ len
;
3518 uint pos
= val
% len
;
3519 buf
[i
] = (char) css
[i
].cs_buf
[pos
] & 0xff;
3524 void mp_cut_at (char *mask
, uint max
)
3528 uint mask_len
= strlen (mask
);
3530 for (i
= 0, j
= 0; i
< mask_len
&& j
< max
; i
++, j
++)
3532 if (mask
[i
] == '?') i
++;
3538 void mp_setup_sys (cs_t
*mp_sys
)
3542 uint donec
[CHARSIZ
];
3544 memset (donec
, 0, sizeof (donec
));
3546 for (pos
= 0, chr
= 'a'; chr
<= 'z'; chr
++) { donec
[chr
] = 1;
3547 mp_sys
[0].cs_buf
[pos
++] = chr
;
3548 mp_sys
[0].cs_len
= pos
; }
3550 for (pos
= 0, chr
= 'A'; chr
<= 'Z'; chr
++) { donec
[chr
] = 1;
3551 mp_sys
[1].cs_buf
[pos
++] = chr
;
3552 mp_sys
[1].cs_len
= pos
; }
3554 for (pos
= 0, chr
= '0'; chr
<= '9'; chr
++) { donec
[chr
] = 1;
3555 mp_sys
[2].cs_buf
[pos
++] = chr
;
3556 mp_sys
[2].cs_len
= pos
; }
3558 for (pos
= 0, chr
= 0x20; chr
<= 0x7e; chr
++) { if (donec
[chr
]) continue;
3559 mp_sys
[3].cs_buf
[pos
++] = chr
;
3560 mp_sys
[3].cs_len
= pos
; }
3562 for (pos
= 0, chr
= 0x20; chr
<= 0x7e; chr
++) { mp_sys
[4].cs_buf
[pos
++] = chr
;
3563 mp_sys
[4].cs_len
= pos
; }
3565 for (pos
= 0, chr
= 0x00; chr
<= 0xff; chr
++) { mp_sys
[5].cs_buf
[pos
++] = chr
;
3566 mp_sys
[5].cs_len
= pos
; }
3569 void mp_setup_usr (cs_t
*mp_sys
, cs_t
*mp_usr
, char *buf
, uint index
)
3571 FILE *fp
= fopen (buf
, "rb");
3573 if (fp
== NULL
|| feof (fp
)) // feof() in case if file is empty
3575 mp_expand (buf
, strlen (buf
), mp_sys
, mp_usr
, index
, 1);
3581 memset (mp_file
, 0, sizeof (mp_file
));
3583 size_t len
= fread (mp_file
, 1, sizeof (mp_file
) - 1, fp
);
3587 len
= in_superchop (mp_file
);
3591 log_info ("WARNING: charset file corrupted");
3593 mp_expand (buf
, strlen (buf
), mp_sys
, mp_usr
, index
, 1);
3597 mp_expand (mp_file
, len
, mp_sys
, mp_usr
, index
, 0);
3602 void mp_reset_usr (cs_t
*mp_usr
, uint index
)
3604 mp_usr
[index
].cs_len
= 0;
3606 memset (mp_usr
[index
].cs_buf
, 0, sizeof (mp_usr
[index
].cs_buf
));
3609 char *mp_get_truncated_mask (char *mask_buf
, size_t mask_len
, uint len
)
3611 char *new_mask_buf
= (char *) mymalloc (256);
3617 for (mask_pos
= 0, css_pos
= 0; mask_pos
< mask_len
; mask_pos
++, css_pos
++)
3619 if (css_pos
== len
) break;
3621 char p0
= mask_buf
[mask_pos
];
3623 new_mask_buf
[mask_pos
] = p0
;
3629 if (mask_pos
== mask_len
) break;
3631 new_mask_buf
[mask_pos
] = mask_buf
[mask_pos
];
3635 if (data
.hex_charset
)
3639 if (mask_pos
== mask_len
)
3641 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", mask_buf
);
3646 char p1
= mask_buf
[mask_pos
];
3648 // if they are not valid hex character, show an error:
3650 if ((is_valid_hex_char (p0
) == 0) || (is_valid_hex_char (p1
) == 0))
3652 log_error ("ERROR: invalid hex character detected in mask: %s", mask_buf
);
3657 new_mask_buf
[mask_pos
] = p1
;
3662 if (css_pos
== len
) return (new_mask_buf
);
3664 myfree (new_mask_buf
);
3673 uint64_t sp_get_sum (uint start
, uint stop
, cs_t
*root_css_buf
)
3679 for (i
= start
; i
< stop
; i
++)
3681 sum
*= root_css_buf
[i
].cs_len
;
3687 void sp_exec (uint64_t ctx
, char *pw_buf
, cs_t
*root_css_buf
, cs_t
*markov_css_buf
, uint start
, uint stop
)
3691 cs_t
*cs
= &root_css_buf
[start
];
3695 for (i
= start
; i
< stop
; i
++)
3697 const uint64_t m
= v
% cs
->cs_len
;
3698 const uint64_t d
= v
/ cs
->cs_len
;
3702 const uint k
= cs
->cs_buf
[m
];
3704 pw_buf
[i
- start
] = (char) k
;
3706 cs
= &markov_css_buf
[(i
* CHARSIZ
) + k
];
3710 int sp_comp_val (const void *p1
, const void *p2
)
3712 hcstat_table_t
*b1
= (hcstat_table_t
*) p1
;
3713 hcstat_table_t
*b2
= (hcstat_table_t
*) p2
;
3715 return b2
->val
- b1
->val
;
3718 void sp_setup_tbl (const char *install_dir
, char *hcstat
, uint disable
, uint classic
, hcstat_table_t
*root_table_buf
, hcstat_table_t
*markov_table_buf
)
3725 * Initialize hcstats
3728 uint64_t *root_stats_buf
= (uint64_t *) mycalloc (SP_ROOT_CNT
, sizeof (uint64_t));
3730 uint64_t *root_stats_ptr
= root_stats_buf
;
3732 uint64_t *root_stats_buf_by_pos
[SP_PW_MAX
];
3734 for (i
= 0; i
< SP_PW_MAX
; i
++)
3736 root_stats_buf_by_pos
[i
] = root_stats_ptr
;
3738 root_stats_ptr
+= CHARSIZ
;
3741 uint64_t *markov_stats_buf
= (uint64_t *) mycalloc (SP_MARKOV_CNT
, sizeof (uint64_t));
3743 uint64_t *markov_stats_ptr
= markov_stats_buf
;
3745 uint64_t *markov_stats_buf_by_key
[SP_PW_MAX
][CHARSIZ
];
3747 for (i
= 0; i
< SP_PW_MAX
; i
++)
3749 for (j
= 0; j
< CHARSIZ
; j
++)
3751 markov_stats_buf_by_key
[i
][j
] = markov_stats_ptr
;
3753 markov_stats_ptr
+= CHARSIZ
;
3763 char hcstat_tmp
[256];
3765 memset (hcstat_tmp
, 0, sizeof (hcstat_tmp
));
3767 snprintf (hcstat_tmp
, sizeof (hcstat_tmp
) - 1, "%s/%s", install_dir
, SP_HCSTAT
);
3769 hcstat
= hcstat_tmp
;
3772 FILE *fd
= fopen (hcstat
, "rb");
3776 log_error ("%s: %s", hcstat
, strerror (errno
));
3781 if (fread (root_stats_buf
, sizeof (uint64_t), SP_ROOT_CNT
, fd
) != SP_ROOT_CNT
)
3783 log_error ("%s: Could not load data", hcstat
);
3788 if (fread (markov_stats_buf
, sizeof (uint64_t), SP_MARKOV_CNT
, fd
) != SP_MARKOV_CNT
)
3790 log_error ("%s: Could not load data", hcstat
);
3798 * Markov modifier of hcstat_table on user request
3803 memset (root_stats_buf
, 0, SP_ROOT_CNT
* sizeof (uint64_t));
3804 memset (markov_stats_buf
, 0, SP_MARKOV_CNT
* sizeof (uint64_t));
3809 /* Add all stats to first position */
3811 for (i
= 1; i
< SP_PW_MAX
; i
++)
3813 uint64_t *out
= root_stats_buf_by_pos
[0];
3814 uint64_t *in
= root_stats_buf_by_pos
[i
];
3816 for (j
= 0; j
< CHARSIZ
; j
++)
3822 for (i
= 1; i
< SP_PW_MAX
; i
++)
3824 uint64_t *out
= markov_stats_buf_by_key
[0][0];
3825 uint64_t *in
= markov_stats_buf_by_key
[i
][0];
3827 for (j
= 0; j
< CHARSIZ
; j
++)
3829 for (k
= 0; k
< CHARSIZ
; k
++)
3836 /* copy them to all pw_positions */
3838 for (i
= 1; i
< SP_PW_MAX
; i
++)
3840 memcpy (root_stats_buf_by_pos
[i
], root_stats_buf_by_pos
[0], CHARSIZ
* sizeof (uint64_t));
3843 for (i
= 1; i
< SP_PW_MAX
; i
++)
3845 memcpy (markov_stats_buf_by_key
[i
][0], markov_stats_buf_by_key
[0][0], CHARSIZ
* CHARSIZ
* sizeof (uint64_t));
3853 hcstat_table_t
*root_table_ptr
= root_table_buf
;
3855 hcstat_table_t
*root_table_buf_by_pos
[SP_PW_MAX
];
3857 for (i
= 0; i
< SP_PW_MAX
; i
++)
3859 root_table_buf_by_pos
[i
] = root_table_ptr
;
3861 root_table_ptr
+= CHARSIZ
;
3864 hcstat_table_t
*markov_table_ptr
= markov_table_buf
;
3866 hcstat_table_t
*markov_table_buf_by_key
[SP_PW_MAX
][CHARSIZ
];
3868 for (i
= 0; i
< SP_PW_MAX
; i
++)
3870 for (j
= 0; j
< CHARSIZ
; j
++)
3872 markov_table_buf_by_key
[i
][j
] = markov_table_ptr
;
3874 markov_table_ptr
+= CHARSIZ
;
3879 * Convert hcstat to tables
3882 for (i
= 0; i
< SP_ROOT_CNT
; i
++)
3884 uint key
= i
% CHARSIZ
;
3886 root_table_buf
[i
].key
= key
;
3887 root_table_buf
[i
].val
= root_stats_buf
[i
];
3890 for (i
= 0; i
< SP_MARKOV_CNT
; i
++)
3892 uint key
= i
% CHARSIZ
;
3894 markov_table_buf
[i
].key
= key
;
3895 markov_table_buf
[i
].val
= markov_stats_buf
[i
];
3898 myfree (root_stats_buf
);
3899 myfree (markov_stats_buf
);
3905 for (i
= 0; i
< SP_PW_MAX
; i
++)
3907 qsort (root_table_buf_by_pos
[i
], CHARSIZ
, sizeof (hcstat_table_t
), sp_comp_val
);
3910 for (i
= 0; i
< SP_PW_MAX
; i
++)
3912 for (j
= 0; j
< CHARSIZ
; j
++)
3914 qsort (markov_table_buf_by_key
[i
][j
], CHARSIZ
, sizeof (hcstat_table_t
), sp_comp_val
);
3919 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
])
3922 * Convert tables to css
3925 for (uint i
= 0; i
< SP_ROOT_CNT
; i
++)
3927 uint pw_pos
= i
/ CHARSIZ
;
3929 cs_t
*cs
= &root_css_buf
[pw_pos
];
3931 if (cs
->cs_len
== threshold
) continue;
3933 uint key
= root_table_buf
[i
].key
;
3935 if (uniq_tbls
[pw_pos
][key
] == 0) continue;
3937 cs
->cs_buf
[cs
->cs_len
] = key
;
3943 * Convert table to css
3946 for (uint i
= 0; i
< SP_MARKOV_CNT
; i
++)
3948 uint c
= i
/ CHARSIZ
;
3950 cs_t
*cs
= &markov_css_buf
[c
];
3952 if (cs
->cs_len
== threshold
) continue;
3954 uint pw_pos
= c
/ CHARSIZ
;
3956 uint key
= markov_table_buf
[i
].key
;
3958 if ((pw_pos
+ 1) < SP_PW_MAX
) if (uniq_tbls
[pw_pos
+ 1][key
] == 0) continue;
3960 cs
->cs_buf
[cs
->cs_len
] = key
;
3966 for (uint i = 0; i < 8; i++)
3968 for (uint j = 0x20; j < 0x80; j++)
3970 cs_t *ptr = &markov_css_buf[(i * CHARSIZ) + j];
3972 printf ("pos:%u key:%u len:%u\n", i, j, ptr->cs_len);
3974 for (uint k = 0; k < 10; k++)
3976 printf (" %u\n", ptr->cs_buf[k]);
3983 void sp_stretch_root (hcstat_table_t
*in
, hcstat_table_t
*out
)
3985 for (uint i
= 0; i
< SP_PW_MAX
; i
+= 2)
3987 memcpy (out
, in
, CHARSIZ
* sizeof (hcstat_table_t
));
3997 for (uint j
= 1; j
< CHARSIZ
; j
++)
4007 void sp_stretch_markov (hcstat_table_t
*in
, hcstat_table_t
*out
)
4009 for (uint i
= 0; i
< SP_PW_MAX
; i
+= 2)
4011 memcpy (out
, in
, CHARSIZ
* CHARSIZ
* sizeof (hcstat_table_t
));
4013 out
+= CHARSIZ
* CHARSIZ
;
4014 in
+= CHARSIZ
* CHARSIZ
;
4016 for (uint j
= 0; j
< CHARSIZ
; j
++)
4023 for (uint k
= 1; k
< CHARSIZ
; k
++)
4035 * mixed shared functions
4038 void dump_hex (const char *s
, size_t size
)
4042 for (i
= 0; i
< size
; i
++)
4044 log_info_nn ("%02x ", (unsigned char) s
[i
]);
4050 void usage_mini_print (const char *progname
)
4052 for (uint i
= 0; USAGE_MINI
[i
] != NULL
; i
++) log_info (USAGE_MINI
[i
], progname
);
4055 void usage_big_print (const char *progname
)
4057 for (uint i
= 0; USAGE_BIG
[i
] != NULL
; i
++) log_info (USAGE_BIG
[i
], progname
);
4060 char *get_install_dir (const char *progname
)
4062 char *install_dir
= mystrdup (progname
);
4063 char *last_slash
= NULL
;
4065 if ((last_slash
= strrchr (install_dir
, '/')) != NULL
)
4069 else if ((last_slash
= strrchr (install_dir
, '\\')) != NULL
)
4075 install_dir
[0] = '.';
4079 return (install_dir
);
4082 char *get_profile_dir (const char *homedir
)
4084 #define DOT_HASHCAT ".hashcat"
4086 char *profile_dir
= (char *) mymalloc (strlen (homedir
) + 1 + strlen (DOT_HASHCAT
) + 1);
4088 sprintf (profile_dir
, "%s/%s", homedir
, DOT_HASHCAT
);
4093 char *get_session_dir (const char *profile_dir
, const char *session
)
4095 char *session_dir
= (char *) mymalloc (strlen (profile_dir
) + 1 + strlen (session
) + 1);
4097 sprintf (session_dir
, "%s/%s", profile_dir
, session
);
4102 void truecrypt_crc32 (char *file
, unsigned char keytab
[64])
4106 FILE *fd
= fopen (file
, "rb");
4110 log_error ("%s: %s", file
, strerror (errno
));
4115 #define MAX_KEY_SIZE (1024 * 1024)
4117 char *buf
= (char *) mymalloc (MAX_KEY_SIZE
);
4119 int nread
= fread (buf
, 1, MAX_KEY_SIZE
, fd
);
4123 for (int fpos
= 0; fpos
< nread
; fpos
++)
4125 crc
= crc32tab
[(crc
^ buf
[fpos
]) & 0xff] ^ (crc
>> 8);
4127 keytab
[kpos
++] += (crc
>> 24) & 0xff;
4128 keytab
[kpos
++] += (crc
>> 16) & 0xff;
4129 keytab
[kpos
++] += (crc
>> 8) & 0xff;
4130 keytab
[kpos
++] += (crc
>> 0) & 0xff;
4132 if (kpos
>= 64) kpos
= 0;
4140 void set_cpu_affinity (char *cpu_affinity
)
4143 DWORD_PTR aff_mask
= 0;
4154 char *devices
= strdup (cpu_affinity
);
4156 char *next
= strtok (devices
, ",");
4160 uint cpu_id
= atoi (next
);
4177 log_error ("ERROR: invalid cpu_id %u specified", cpu_id
);
4183 aff_mask
|= 1 << (cpu_id
- 1);
4187 CPU_SET ((cpu_id
- 1), &cpuset
);
4190 } while ((next
= strtok (NULL
, ",")) != NULL
);
4196 SetProcessAffinityMask (GetCurrentProcess (), aff_mask
);
4197 SetThreadAffinityMask (GetCurrentThread (), aff_mask
);
4201 pthread_t thread
= pthread_self ();
4202 pthread_setaffinity_np (thread
, sizeof (cpu_set_t
), &cpuset
);
4206 void *rulefind (const void *key
, void *base
, int nmemb
, size_t size
, int (*compar
) (const void *, const void *))
4208 char *element
, *end
;
4210 end
= (char *) base
+ nmemb
* size
;
4212 for (element
= (char *) base
; element
< end
; element
+= size
)
4213 if (!compar (element
, key
))
4219 int sort_by_salt (const void *v1
, const void *v2
)
4221 const salt_t
*s1
= (const salt_t
*) v1
;
4222 const salt_t
*s2
= (const salt_t
*) v2
;
4224 const int res1
= s1
->salt_len
- s2
->salt_len
;
4226 if (res1
!= 0) return (res1
);
4228 const int res2
= s1
->salt_iter
- s2
->salt_iter
;
4230 if (res2
!= 0) return (res2
);
4238 if (s1
->salt_buf
[n
] > s2
->salt_buf
[n
]) return ( 1);
4239 if (s1
->salt_buf
[n
] < s2
->salt_buf
[n
]) return (-1);
4246 if (s1
->salt_buf_pc
[n
] > s2
->salt_buf_pc
[n
]) return ( 1);
4247 if (s1
->salt_buf_pc
[n
] < s2
->salt_buf_pc
[n
]) return (-1);
4253 int sort_by_salt_buf (const void *v1
, const void *v2
)
4255 const pot_t
*p1
= (const pot_t
*) v1
;
4256 const pot_t
*p2
= (const pot_t
*) v2
;
4258 const hash_t
*h1
= &p1
->hash
;
4259 const hash_t
*h2
= &p2
->hash
;
4261 const salt_t
*s1
= h1
->salt
;
4262 const salt_t
*s2
= h2
->salt
;
4268 if (s1
->salt_buf
[n
] > s2
->salt_buf
[n
]) return ( 1);
4269 if (s1
->salt_buf
[n
] < s2
->salt_buf
[n
]) return (-1);
4275 int sort_by_hash_t_salt (const void *v1
, const void *v2
)
4277 const hash_t
*h1
= (const hash_t
*) v1
;
4278 const hash_t
*h2
= (const hash_t
*) v2
;
4280 const salt_t
*s1
= h1
->salt
;
4281 const salt_t
*s2
= h2
->salt
;
4283 // testphase: this should work
4288 if (s1
->salt_buf
[n
] > s2
->salt_buf
[n
]) return ( 1);
4289 if (s1
->salt_buf
[n
] < s2
->salt_buf
[n
]) return (-1);
4292 /* original code, seems buggy since salt_len can be very big (had a case with 131 len)
4293 also it thinks salt_buf[x] is a char but its a uint so salt_len should be / 4
4294 if (s1->salt_len > s2->salt_len) return ( 1);
4295 if (s1->salt_len < s2->salt_len) return (-1);
4297 uint n = s1->salt_len;
4301 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4302 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4309 int sort_by_hash_t_salt_hccap (const void *v1
, const void *v2
)
4311 const hash_t
*h1
= (const hash_t
*) v1
;
4312 const hash_t
*h2
= (const hash_t
*) v2
;
4314 const salt_t
*s1
= h1
->salt
;
4315 const salt_t
*s2
= h2
->salt
;
4317 // 12 - 2 (since last 2 uints contain the digest)
4322 if (s1
->salt_buf
[n
] > s2
->salt_buf
[n
]) return ( 1);
4323 if (s1
->salt_buf
[n
] < s2
->salt_buf
[n
]) return (-1);
4329 int sort_by_hash_no_salt (const void *v1
, const void *v2
)
4331 const hash_t
*h1
= (const hash_t
*) v1
;
4332 const hash_t
*h2
= (const hash_t
*) v2
;
4334 const void *d1
= h1
->digest
;
4335 const void *d2
= h2
->digest
;
4337 return data
.sort_by_digest (d1
, d2
);
4340 int sort_by_hash (const void *v1
, const void *v2
)
4342 const hash_t
*h1
= (const hash_t
*) v1
;
4343 const hash_t
*h2
= (const hash_t
*) v2
;
4347 const salt_t
*s1
= h1
->salt
;
4348 const salt_t
*s2
= h2
->salt
;
4350 int res
= sort_by_salt (s1
, s2
);
4352 if (res
!= 0) return (res
);
4355 const void *d1
= h1
->digest
;
4356 const void *d2
= h2
->digest
;
4358 return data
.sort_by_digest (d1
, d2
);
4361 int sort_by_pot (const void *v1
, const void *v2
)
4363 const pot_t
*p1
= (const pot_t
*) v1
;
4364 const pot_t
*p2
= (const pot_t
*) v2
;
4366 const hash_t
*h1
= &p1
->hash
;
4367 const hash_t
*h2
= &p2
->hash
;
4369 return sort_by_hash (h1
, h2
);
4372 int sort_by_mtime (const void *p1
, const void *p2
)
4374 const char **f1
= (const char **) p1
;
4375 const char **f2
= (const char **) p2
;
4377 struct stat s1
; stat (*f1
, &s1
);
4378 struct stat s2
; stat (*f2
, &s2
);
4380 return s2
.st_mtime
- s1
.st_mtime
;
4383 int sort_by_cpu_rule (const void *p1
, const void *p2
)
4385 const cpu_rule_t
*r1
= (const cpu_rule_t
*) p1
;
4386 const cpu_rule_t
*r2
= (const cpu_rule_t
*) p2
;
4388 return memcmp (r1
, r2
, sizeof (cpu_rule_t
));
4391 int sort_by_gpu_rule (const void *p1
, const void *p2
)
4393 const gpu_rule_t
*r1
= (const gpu_rule_t
*) p1
;
4394 const gpu_rule_t
*r2
= (const gpu_rule_t
*) p2
;
4396 return memcmp (r1
, r2
, sizeof (gpu_rule_t
));
4399 int sort_by_stringptr (const void *p1
, const void *p2
)
4401 const char **s1
= (const char **) p1
;
4402 const char **s2
= (const char **) p2
;
4404 return strcmp (*s1
, *s2
);
4407 int sort_by_dictstat (const void *s1
, const void *s2
)
4409 dictstat_t
*d1
= (dictstat_t
*) s1
;
4410 dictstat_t
*d2
= (dictstat_t
*) s2
;
4413 d2
->stat
.st_atim
= d1
->stat
.st_atim
;
4415 d2
->stat
.st_atime
= d1
->stat
.st_atime
;
4418 return memcmp (&d1
->stat
, &d2
->stat
, sizeof (struct stat
));
4421 int sort_by_bitmap (const void *p1
, const void *p2
)
4423 const bitmap_result_t
*b1
= (const bitmap_result_t
*) p1
;
4424 const bitmap_result_t
*b2
= (const bitmap_result_t
*) p2
;
4426 return b1
->collisions
- b2
->collisions
;
4429 int sort_by_digest_4_2 (const void *v1
, const void *v2
)
4431 const uint32_t *d1
= (const uint32_t *) v1
;
4432 const uint32_t *d2
= (const uint32_t *) v2
;
4438 if (d1
[n
] > d2
[n
]) return ( 1);
4439 if (d1
[n
] < d2
[n
]) return (-1);
4445 int sort_by_digest_4_4 (const void *v1
, const void *v2
)
4447 const uint32_t *d1
= (const uint32_t *) v1
;
4448 const uint32_t *d2
= (const uint32_t *) v2
;
4454 if (d1
[n
] > d2
[n
]) return ( 1);
4455 if (d1
[n
] < d2
[n
]) return (-1);
4461 int sort_by_digest_4_5 (const void *v1
, const void *v2
)
4463 const uint32_t *d1
= (const uint32_t *) v1
;
4464 const uint32_t *d2
= (const uint32_t *) v2
;
4470 if (d1
[n
] > d2
[n
]) return ( 1);
4471 if (d1
[n
] < d2
[n
]) return (-1);
4477 int sort_by_digest_4_6 (const void *v1
, const void *v2
)
4479 const uint32_t *d1
= (const uint32_t *) v1
;
4480 const uint32_t *d2
= (const uint32_t *) v2
;
4486 if (d1
[n
] > d2
[n
]) return ( 1);
4487 if (d1
[n
] < d2
[n
]) return (-1);
4493 int sort_by_digest_4_8 (const void *v1
, const void *v2
)
4495 const uint32_t *d1
= (const uint32_t *) v1
;
4496 const uint32_t *d2
= (const uint32_t *) v2
;
4502 if (d1
[n
] > d2
[n
]) return ( 1);
4503 if (d1
[n
] < d2
[n
]) return (-1);
4509 int sort_by_digest_4_16 (const void *v1
, const void *v2
)
4511 const uint32_t *d1
= (const uint32_t *) v1
;
4512 const uint32_t *d2
= (const uint32_t *) v2
;
4518 if (d1
[n
] > d2
[n
]) return ( 1);
4519 if (d1
[n
] < d2
[n
]) return (-1);
4525 int sort_by_digest_4_32 (const void *v1
, const void *v2
)
4527 const uint32_t *d1
= (const uint32_t *) v1
;
4528 const uint32_t *d2
= (const uint32_t *) v2
;
4534 if (d1
[n
] > d2
[n
]) return ( 1);
4535 if (d1
[n
] < d2
[n
]) return (-1);
4541 int sort_by_digest_4_64 (const void *v1
, const void *v2
)
4543 const uint32_t *d1
= (const uint32_t *) v1
;
4544 const uint32_t *d2
= (const uint32_t *) v2
;
4550 if (d1
[n
] > d2
[n
]) return ( 1);
4551 if (d1
[n
] < d2
[n
]) return (-1);
4557 int sort_by_digest_8_8 (const void *v1
, const void *v2
)
4559 const uint64_t *d1
= (const uint64_t *) v1
;
4560 const uint64_t *d2
= (const uint64_t *) v2
;
4566 if (d1
[n
] > d2
[n
]) return ( 1);
4567 if (d1
[n
] < d2
[n
]) return (-1);
4573 int sort_by_digest_8_16 (const void *v1
, const void *v2
)
4575 const uint64_t *d1
= (const uint64_t *) v1
;
4576 const uint64_t *d2
= (const uint64_t *) v2
;
4582 if (d1
[n
] > d2
[n
]) return ( 1);
4583 if (d1
[n
] < d2
[n
]) return (-1);
4589 int sort_by_digest_8_25 (const void *v1
, const void *v2
)
4591 const uint64_t *d1
= (const uint64_t *) v1
;
4592 const uint64_t *d2
= (const uint64_t *) v2
;
4598 if (d1
[n
] > d2
[n
]) return ( 1);
4599 if (d1
[n
] < d2
[n
]) return (-1);
4605 int sort_by_digest_p0p1 (const void *v1
, const void *v2
)
4607 const uint32_t *d1
= (const uint32_t *) v1
;
4608 const uint32_t *d2
= (const uint32_t *) v2
;
4610 const uint dgst_pos0
= data
.dgst_pos0
;
4611 const uint dgst_pos1
= data
.dgst_pos1
;
4612 const uint dgst_pos2
= data
.dgst_pos2
;
4613 const uint dgst_pos3
= data
.dgst_pos3
;
4615 if (d1
[dgst_pos3
] > d2
[dgst_pos3
]) return ( 1);
4616 if (d1
[dgst_pos3
] < d2
[dgst_pos3
]) return (-1);
4617 if (d1
[dgst_pos2
] > d2
[dgst_pos2
]) return ( 1);
4618 if (d1
[dgst_pos2
] < d2
[dgst_pos2
]) return (-1);
4619 if (d1
[dgst_pos1
] > d2
[dgst_pos1
]) return ( 1);
4620 if (d1
[dgst_pos1
] < d2
[dgst_pos1
]) return (-1);
4621 if (d1
[dgst_pos0
] > d2
[dgst_pos0
]) return ( 1);
4622 if (d1
[dgst_pos0
] < d2
[dgst_pos0
]) return (-1);
4627 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
)
4629 uint outfile_autohex
= data
.outfile_autohex
;
4631 unsigned char *rule_ptr
= (unsigned char *) rule_buf
;
4633 FILE *debug_fp
= NULL
;
4635 if (debug_file
!= NULL
)
4637 debug_fp
= fopen (debug_file
, "ab");
4644 if (debug_fp
== NULL
)
4646 log_info ("WARNING: Could not open debug-file for writing");
4650 if ((debug_mode
== 2) || (debug_mode
== 3) || (debug_mode
== 4))
4652 format_plain (debug_fp
, orig_plain_ptr
, orig_plain_len
, outfile_autohex
);
4654 if ((debug_mode
== 3) || (debug_mode
== 4)) fputc (':', debug_fp
);
4657 fwrite (rule_ptr
, rule_len
, 1, debug_fp
);
4659 if (debug_mode
== 4)
4661 fputc (':', debug_fp
);
4663 format_plain (debug_fp
, mod_plain_ptr
, mod_plain_len
, outfile_autohex
);
4666 fputc ('\n', debug_fp
);
4668 if (debug_file
!= NULL
) fclose (debug_fp
);
4672 void format_plain (FILE *fp
, unsigned char *plain_ptr
, uint plain_len
, uint outfile_autohex
)
4674 int needs_hexify
= 0;
4676 if (outfile_autohex
== 1)
4678 for (uint i
= 0; i
< plain_len
; i
++)
4680 if (plain_ptr
[i
] < 0x20)
4687 if (plain_ptr
[i
] > 0x7f)
4696 if (needs_hexify
== 1)
4698 fprintf (fp
, "$HEX[");
4700 for (uint i
= 0; i
< plain_len
; i
++)
4702 fprintf (fp
, "%02x", plain_ptr
[i
]);
4709 fwrite (plain_ptr
, plain_len
, 1, fp
);
4713 void format_output (FILE *out_fp
, char *out_buf
, unsigned char *plain_ptr
, const uint plain_len
, const uint64_t crackpos
, unsigned char *username
, const uint user_len
)
4715 uint outfile_format
= data
.outfile_format
;
4717 char separator
= data
.separator
;
4719 if (outfile_format
& OUTFILE_FMT_HASH
)
4721 fprintf (out_fp
, "%s", out_buf
);
4723 if (outfile_format
& (OUTFILE_FMT_PLAIN
| OUTFILE_FMT_HEXPLAIN
| OUTFILE_FMT_CRACKPOS
))
4725 fputc (separator
, out_fp
);
4728 else if (data
.username
)
4730 if (username
!= NULL
)
4732 for (uint i
= 0; i
< user_len
; i
++)
4734 fprintf (out_fp
, "%c", username
[i
]);
4737 if (outfile_format
& (OUTFILE_FMT_PLAIN
| OUTFILE_FMT_HEXPLAIN
| OUTFILE_FMT_CRACKPOS
))
4739 fputc (separator
, out_fp
);
4744 if (outfile_format
& OUTFILE_FMT_PLAIN
)
4746 format_plain (out_fp
, plain_ptr
, plain_len
, data
.outfile_autohex
);
4748 if (outfile_format
& (OUTFILE_FMT_HEXPLAIN
| OUTFILE_FMT_CRACKPOS
))
4750 fputc (separator
, out_fp
);
4754 if (outfile_format
& OUTFILE_FMT_HEXPLAIN
)
4756 for (uint i
= 0; i
< plain_len
; i
++)
4758 fprintf (out_fp
, "%02x", plain_ptr
[i
]);
4761 if (outfile_format
& (OUTFILE_FMT_CRACKPOS
))
4763 fputc (separator
, out_fp
);
4767 if (outfile_format
& OUTFILE_FMT_CRACKPOS
)
4770 __mingw_fprintf (out_fp
, "%llu", crackpos
);
4775 fprintf (out_fp
, "%lu", crackpos
);
4777 fprintf (out_fp
, "%llu", crackpos
);
4782 fputc ('\n', out_fp
);
4785 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
)
4789 pot_key
.hash
.salt
= hashes_buf
->salt
;
4790 pot_key
.hash
.digest
= hashes_buf
->digest
;
4792 pot_t
*pot_ptr
= (pot_t
*) bsearch (&pot_key
, pot
, pot_cnt
, sizeof (pot_t
), sort_by_pot
);
4798 input_buf
[input_len
] = 0;
4801 unsigned char *username
= NULL
;
4806 user_t
*user
= hashes_buf
->hash_info
->user
;
4810 username
= (unsigned char *) (user
->user_name
);
4812 user_len
= user
->user_len
;
4816 // do output the line
4817 format_output (out_fp
, input_buf
, (unsigned char *) pot_ptr
->plain_buf
, pot_ptr
->plain_len
, 0, username
, user_len
);
4821 #define LM_WEAK_HASH "\x4e\xcf\x0d\x0c\x0a\xe2\xfb\xc1"
4822 #define LM_MASKED_PLAIN "[notfound]"
4824 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
)
4830 pot_left_key
.hash
.salt
= hash_left
->salt
;
4831 pot_left_key
.hash
.digest
= hash_left
->digest
;
4833 pot_t
*pot_left_ptr
= (pot_t
*) bsearch (&pot_left_key
, pot
, pot_cnt
, sizeof (pot_t
), sort_by_pot
);
4837 uint weak_hash_found
= 0;
4839 pot_t pot_right_key
;
4841 pot_right_key
.hash
.salt
= hash_right
->salt
;
4842 pot_right_key
.hash
.digest
= hash_right
->digest
;
4844 pot_t
*pot_right_ptr
= (pot_t
*) bsearch (&pot_right_key
, pot
, pot_cnt
, sizeof (pot_t
), sort_by_pot
);
4846 if (pot_right_ptr
== NULL
)
4848 // special case, if "weak hash"
4850 if (memcmp (hash_right
->digest
, LM_WEAK_HASH
, 8) == 0)
4852 weak_hash_found
= 1;
4854 pot_right_ptr
= (pot_t
*) mycalloc (1, sizeof (pot_t
));
4856 // in theory this is not needed, but we are paranoia:
4858 memset (pot_right_ptr
->plain_buf
, 0, sizeof (pot_right_ptr
->plain_buf
));
4859 pot_right_ptr
->plain_len
= 0;
4863 if ((pot_left_ptr
== NULL
) && (pot_right_ptr
== NULL
))
4865 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
4870 // at least one half was found:
4874 input_buf
[input_len
] = 0;
4878 unsigned char *username
= NULL
;
4883 user_t
*user
= hash_left
->hash_info
->user
;
4887 username
= (unsigned char *) (user
->user_name
);
4889 user_len
= user
->user_len
;
4893 // mask the part which was not found
4895 uint left_part_masked
= 0;
4896 uint right_part_masked
= 0;
4898 uint mask_plain_len
= strlen (LM_MASKED_PLAIN
);
4900 if (pot_left_ptr
== NULL
)
4902 left_part_masked
= 1;
4904 pot_left_ptr
= (pot_t
*) mycalloc (1, sizeof (pot_t
));
4906 memset (pot_left_ptr
->plain_buf
, 0, sizeof (pot_left_ptr
->plain_buf
));
4908 memcpy (pot_left_ptr
->plain_buf
, LM_MASKED_PLAIN
, mask_plain_len
);
4909 pot_left_ptr
->plain_len
= mask_plain_len
;
4912 if (pot_right_ptr
== NULL
)
4914 right_part_masked
= 1;
4916 pot_right_ptr
= (pot_t
*) mycalloc (1, sizeof (pot_t
));
4918 memset (pot_right_ptr
->plain_buf
, 0, sizeof (pot_right_ptr
->plain_buf
));
4920 memcpy (pot_right_ptr
->plain_buf
, LM_MASKED_PLAIN
, mask_plain_len
);
4921 pot_right_ptr
->plain_len
= mask_plain_len
;
4924 // create the pot_ptr out of pot_left_ptr and pot_right_ptr
4928 pot_ptr
.plain_len
= pot_left_ptr
->plain_len
+ pot_right_ptr
->plain_len
;
4930 memcpy (pot_ptr
.plain_buf
, pot_left_ptr
->plain_buf
, pot_left_ptr
->plain_len
);
4932 memcpy (pot_ptr
.plain_buf
+ pot_left_ptr
->plain_len
, pot_right_ptr
->plain_buf
, pot_right_ptr
->plain_len
);
4934 // do output the line
4936 format_output (out_fp
, input_buf
, (unsigned char *) pot_ptr
.plain_buf
, pot_ptr
.plain_len
, 0, username
, user_len
);
4938 if (weak_hash_found
== 1) myfree (pot_right_ptr
);
4940 if (left_part_masked
== 1) myfree (pot_left_ptr
);
4941 if (right_part_masked
== 1) myfree (pot_right_ptr
);
4944 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
)
4948 memcpy (&pot_key
.hash
, hashes_buf
, sizeof (hash_t
));
4950 pot_t
*pot_ptr
= (pot_t
*) bsearch (&pot_key
, pot
, pot_cnt
, sizeof (pot_t
), sort_by_pot
);
4952 if (pot_ptr
== NULL
)
4956 input_buf
[input_len
] = 0;
4958 format_output (out_fp
, input_buf
, NULL
, 0, 0, NULL
, 0);
4962 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
)
4968 memcpy (&pot_left_key
.hash
, hash_left
, sizeof (hash_t
));
4970 pot_t
*pot_left_ptr
= (pot_t
*) bsearch (&pot_left_key
, pot
, pot_cnt
, sizeof (pot_t
), sort_by_pot
);
4974 pot_t pot_right_key
;
4976 memcpy (&pot_right_key
.hash
, hash_right
, sizeof (hash_t
));
4978 pot_t
*pot_right_ptr
= (pot_t
*) bsearch (&pot_right_key
, pot
, pot_cnt
, sizeof (pot_t
), sort_by_pot
);
4980 uint weak_hash_found
= 0;
4982 if (pot_right_ptr
== NULL
)
4984 // special case, if "weak hash"
4986 if (memcmp (hash_right
->digest
, LM_WEAK_HASH
, 8) == 0)
4988 weak_hash_found
= 1;
4990 // we just need that pot_right_ptr is not a NULL pointer
4992 pot_right_ptr
= (pot_t
*) mycalloc (1, sizeof (pot_t
));
4996 if ((pot_left_ptr
!= NULL
) && (pot_right_ptr
!= NULL
))
4998 if (weak_hash_found
== 1) myfree (pot_right_ptr
);
5003 // ... at least one part was not cracked
5007 input_buf
[input_len
] = 0;
5009 // only show the hash part which is still not cracked
5011 uint user_len
= input_len
- 32;
5013 char hash_output
[user_len
+ 33];
5015 memset (hash_output
, 0, sizeof (hash_output
));
5017 memcpy (hash_output
, input_buf
, input_len
);
5019 if (pot_left_ptr
!= NULL
)
5021 // only show right part (because left part was already found)
5023 memcpy (hash_output
+ user_len
, input_buf
+ user_len
+ 16, 16);
5025 hash_output
[user_len
+ 16] = 0;
5028 if (pot_right_ptr
!= NULL
)
5030 // only show left part (because right part was already found)
5032 memcpy (hash_output
+ user_len
, input_buf
+ user_len
, 16);
5034 hash_output
[user_len
+ 16] = 0;
5037 format_output (out_fp
, hash_output
, NULL
, 0, 0, NULL
, 0);
5039 if (weak_hash_found
== 1) myfree (pot_right_ptr
);
5042 uint
devices_to_devicemask (char *gpu_devices
)
5044 uint gpu_devicemask
= 0;
5048 char *devices
= strdup (gpu_devices
);
5050 char *next
= strtok (devices
, ",");
5054 uint gpu_id
= atoi (next
);
5056 if (gpu_id
< 1 || gpu_id
> 8)
5058 log_error ("ERROR: invalid gpu_id %u specified", gpu_id
);
5063 gpu_devicemask
|= 1 << (gpu_id
- 1);
5065 } while ((next
= strtok (NULL
, ",")) != NULL
);
5070 return gpu_devicemask
;
5073 uint
get_random_num (uint min
, uint max
)
5075 if (min
== max
) return (min
);
5077 return (uint
) ((rand () % (max
- min
)) + min
);
5080 uint32_t mydivc32 (const uint32_t dividend
, const uint32_t divisor
)
5082 uint32_t quotient
= dividend
/ divisor
;
5084 if (dividend
% divisor
) quotient
++;
5089 uint64_t mydivc64 (const uint64_t dividend
, const uint64_t divisor
)
5091 uint64_t quotient
= dividend
/ divisor
;
5093 if (dividend
% divisor
) quotient
++;
5098 void format_timer_display (struct tm
*tm
, char *buf
, size_t len
)
5100 const char *time_entities_s
[] = { "year", "day", "hour", "min", "sec" };
5101 const char *time_entities_m
[] = { "years", "days", "hours", "mins", "secs" };
5103 if (tm
->tm_year
- 70)
5105 char *time_entity1
= ((tm
->tm_year
- 70) == 1) ? (char *) time_entities_s
[0] : (char *) time_entities_m
[0];
5106 char *time_entity2
= ( tm
->tm_yday
== 1) ? (char *) time_entities_s
[1] : (char *) time_entities_m
[1];
5108 snprintf (buf
, len
- 1, "%d %s, %d %s", tm
->tm_year
- 70, time_entity1
, tm
->tm_yday
, time_entity2
);
5110 else if (tm
->tm_yday
)
5112 char *time_entity1
= (tm
->tm_yday
== 1) ? (char *) time_entities_s
[1] : (char *) time_entities_m
[1];
5113 char *time_entity2
= (tm
->tm_hour
== 1) ? (char *) time_entities_s
[2] : (char *) time_entities_m
[2];
5115 snprintf (buf
, len
- 1, "%d %s, %d %s", tm
->tm_yday
, time_entity1
, tm
->tm_hour
, time_entity2
);
5117 else if (tm
->tm_hour
)
5119 char *time_entity1
= (tm
->tm_hour
== 1) ? (char *) time_entities_s
[2] : (char *) time_entities_m
[2];
5120 char *time_entity2
= (tm
->tm_min
== 1) ? (char *) time_entities_s
[3] : (char *) time_entities_m
[3];
5122 snprintf (buf
, len
- 1, "%d %s, %d %s", tm
->tm_hour
, time_entity1
, tm
->tm_min
, time_entity2
);
5124 else if (tm
->tm_min
)
5126 char *time_entity1
= (tm
->tm_min
== 1) ? (char *) time_entities_s
[3] : (char *) time_entities_m
[3];
5127 char *time_entity2
= (tm
->tm_sec
== 1) ? (char *) time_entities_s
[4] : (char *) time_entities_m
[4];
5129 snprintf (buf
, len
- 1, "%d %s, %d %s", tm
->tm_min
, time_entity1
, tm
->tm_sec
, time_entity2
);
5133 char *time_entity1
= (tm
->tm_sec
== 1) ? (char *) time_entities_s
[4] : (char *) time_entities_m
[4];
5135 snprintf (buf
, len
- 1, "%d %s", tm
->tm_sec
, time_entity1
);
5139 void format_speed_display (float val
, char *buf
, size_t len
)
5150 char units
[7] = { ' ', 'k', 'M', 'G', 'T', 'P', 'E' };
5161 /* generate output */
5165 snprintf (buf
, len
- 1, "%.0f ", val
);
5169 snprintf (buf
, len
- 1, "%.1f %c", val
, units
[level
]);
5173 void lowercase (char *buf
, int len
)
5175 for (int i
= 0; i
< len
; i
++) buf
[i
] = tolower (buf
[i
]);
5178 void uppercase (char *buf
, int len
)
5180 for (int i
= 0; i
< len
; i
++) buf
[i
] = toupper (buf
[i
]);
5183 int fgetl (FILE *fp
, char *line_buf
)
5189 const int c
= fgetc (fp
);
5191 if (c
== EOF
) break;
5193 line_buf
[line_len
] = (char) c
;
5197 if (line_len
== BUFSIZ
) line_len
--;
5199 if (c
== '\n') break;
5202 if (line_len
== 0) return 0;
5204 if (line_buf
[line_len
- 1] == '\n')
5208 line_buf
[line_len
] = 0;
5211 if (line_len
== 0) return 0;
5213 if (line_buf
[line_len
- 1] == '\r')
5217 line_buf
[line_len
] = 0;
5223 int in_superchop (char *buf
)
5225 int len
= strlen (buf
);
5229 if (buf
[len
- 1] == '\n')
5236 if (buf
[len
- 1] == '\r')
5251 char **scan_directory (const char *path
)
5253 char *tmp_path
= mystrdup (path
);
5255 size_t tmp_path_len
= strlen (tmp_path
);
5257 while (tmp_path
[tmp_path_len
- 1] == '/' || tmp_path
[tmp_path_len
- 1] == '\\')
5259 tmp_path
[tmp_path_len
- 1] = 0;
5261 tmp_path_len
= strlen (tmp_path
);
5264 char **files
= NULL
;
5270 if ((d
= opendir (tmp_path
)) != NULL
)
5274 while ((de
= readdir (d
)) != NULL
)
5276 if ((strcmp (de
->d_name
, ".") == 0) || (strcmp (de
->d_name
, "..") == 0)) continue;
5278 int path_size
= strlen (tmp_path
) + 1 + strlen (de
->d_name
);
5280 char *path_file
= (char *) mymalloc (path_size
+ 1);
5282 snprintf (path_file
, path_size
+ 1, "%s/%s", tmp_path
, de
->d_name
);
5284 path_file
[path_size
] = 0;
5288 if ((d_test
= opendir (path_file
)) != NULL
)
5296 files
= (char **) myrealloc (files
, num_files
* sizeof (char *), sizeof (char *));
5300 files
[num_files
- 1] = path_file
;
5306 else if (errno
== ENOTDIR
)
5308 files
= (char **) myrealloc (files
, num_files
* sizeof (char *), sizeof (char *));
5312 files
[num_files
- 1] = mystrdup (path
);
5315 files
= (char **) myrealloc (files
, num_files
* sizeof (char *), sizeof (char *));
5319 files
[num_files
- 1] = NULL
;
5326 int count_dictionaries (char **dictionary_files
)
5328 if (dictionary_files
== NULL
) return 0;
5332 for (int d
= 0; dictionary_files
[d
] != NULL
; d
++)
5340 char *stroptitype (const uint opti_type
)
5344 case OPTI_TYPE_ZERO_BYTE
: return ((char *) OPTI_STR_ZERO_BYTE
); break;
5345 case OPTI_TYPE_PRECOMPUTE_INIT
: return ((char *) OPTI_STR_PRECOMPUTE_INIT
); break;
5346 case OPTI_TYPE_PRECOMPUTE_MERKLE
: return ((char *) OPTI_STR_PRECOMPUTE_MERKLE
); break;
5347 case OPTI_TYPE_PRECOMPUTE_PERMUT
: return ((char *) OPTI_STR_PRECOMPUTE_PERMUT
); break;
5348 case OPTI_TYPE_MEET_IN_MIDDLE
: return ((char *) OPTI_STR_MEET_IN_MIDDLE
); break;
5349 case OPTI_TYPE_EARLY_SKIP
: return ((char *) OPTI_STR_EARLY_SKIP
); break;
5350 case OPTI_TYPE_NOT_SALTED
: return ((char *) OPTI_STR_NOT_SALTED
); break;
5351 case OPTI_TYPE_NOT_ITERATED
: return ((char *) OPTI_STR_NOT_ITERATED
); break;
5352 case OPTI_TYPE_PREPENDED_SALT
: return ((char *) OPTI_STR_PREPENDED_SALT
); break;
5353 case OPTI_TYPE_APPENDED_SALT
: return ((char *) OPTI_STR_APPENDED_SALT
); break;
5354 case OPTI_TYPE_SINGLE_HASH
: return ((char *) OPTI_STR_SINGLE_HASH
); break;
5355 case OPTI_TYPE_SINGLE_SALT
: return ((char *) OPTI_STR_SINGLE_SALT
); break;
5356 case OPTI_TYPE_BRUTE_FORCE
: return ((char *) OPTI_STR_BRUTE_FORCE
); break;
5357 case OPTI_TYPE_RAW_HASH
: return ((char *) OPTI_STR_RAW_HASH
); break;
5363 char *strparser (const uint parser_status
)
5365 switch (parser_status
)
5367 case PARSER_OK
: return ((char *) PA_000
); break;
5368 case PARSER_COMMENT
: return ((char *) PA_001
); break;
5369 case PARSER_GLOBAL_ZERO
: return ((char *) PA_002
); break;
5370 case PARSER_GLOBAL_LENGTH
: return ((char *) PA_003
); break;
5371 case PARSER_HASH_LENGTH
: return ((char *) PA_004
); break;
5372 case PARSER_HASH_VALUE
: return ((char *) PA_005
); break;
5373 case PARSER_SALT_LENGTH
: return ((char *) PA_006
); break;
5374 case PARSER_SALT_VALUE
: return ((char *) PA_007
); break;
5375 case PARSER_SALT_ITERATION
: return ((char *) PA_008
); break;
5376 case PARSER_SEPARATOR_UNMATCHED
: return ((char *) PA_009
); break;
5377 case PARSER_SIGNATURE_UNMATCHED
: return ((char *) PA_010
); break;
5378 case PARSER_HCCAP_FILE_SIZE
: return ((char *) PA_011
); break;
5379 case PARSER_HCCAP_EAPOL_SIZE
: return ((char *) PA_012
); break;
5380 case PARSER_PSAFE2_FILE_SIZE
: return ((char *) PA_013
); break;
5381 case PARSER_PSAFE3_FILE_SIZE
: return ((char *) PA_014
); break;
5382 case PARSER_TC_FILE_SIZE
: return ((char *) PA_015
); break;
5383 case PARSER_SIP_AUTH_DIRECTIVE
: return ((char *) PA_016
); break;
5386 return ((char *) PA_255
);
5389 char *strhashtype (const uint hash_mode
)
5393 case 0: return ((char *) HT_00000
); break;
5394 case 10: return ((char *) HT_00010
); break;
5395 case 11: return ((char *) HT_00011
); break;
5396 case 12: return ((char *) HT_00012
); break;
5397 case 20: return ((char *) HT_00020
); break;
5398 case 21: return ((char *) HT_00021
); break;
5399 case 22: return ((char *) HT_00022
); break;
5400 case 23: return ((char *) HT_00023
); break;
5401 case 30: return ((char *) HT_00030
); break;
5402 case 40: return ((char *) HT_00040
); break;
5403 case 50: return ((char *) HT_00050
); break;
5404 case 60: return ((char *) HT_00060
); break;
5405 case 100: return ((char *) HT_00100
); break;
5406 case 101: return ((char *) HT_00101
); break;
5407 case 110: return ((char *) HT_00110
); break;
5408 case 111: return ((char *) HT_00111
); break;
5409 case 112: return ((char *) HT_00112
); break;
5410 case 120: return ((char *) HT_00120
); break;
5411 case 121: return ((char *) HT_00121
); break;
5412 case 122: return ((char *) HT_00122
); break;
5413 case 124: return ((char *) HT_00124
); break;
5414 case 130: return ((char *) HT_00130
); break;
5415 case 131: return ((char *) HT_00131
); break;
5416 case 132: return ((char *) HT_00132
); break;
5417 case 133: return ((char *) HT_00133
); break;
5418 case 140: return ((char *) HT_00140
); break;
5419 case 141: return ((char *) HT_00141
); break;
5420 case 150: return ((char *) HT_00150
); break;
5421 case 160: return ((char *) HT_00160
); break;
5422 case 190: return ((char *) HT_00190
); break;
5423 case 200: return ((char *) HT_00200
); break;
5424 case 300: return ((char *) HT_00300
); break;
5425 case 400: return ((char *) HT_00400
); break;
5426 case 500: return ((char *) HT_00500
); break;
5427 case 501: return ((char *) HT_00501
); break;
5428 case 900: return ((char *) HT_00900
); break;
5429 case 910: return ((char *) HT_00910
); break;
5430 case 1000: return ((char *) HT_01000
); break;
5431 case 1100: return ((char *) HT_01100
); break;
5432 case 1400: return ((char *) HT_01400
); break;
5433 case 1410: return ((char *) HT_01410
); break;
5434 case 1420: return ((char *) HT_01420
); break;
5435 case 1421: return ((char *) HT_01421
); break;
5436 case 1430: return ((char *) HT_01430
); break;
5437 case 1440: return ((char *) HT_01440
); break;
5438 case 1441: return ((char *) HT_01441
); break;
5439 case 1450: return ((char *) HT_01450
); break;
5440 case 1460: return ((char *) HT_01460
); break;
5441 case 1500: return ((char *) HT_01500
); break;
5442 case 1600: return ((char *) HT_01600
); break;
5443 case 1700: return ((char *) HT_01700
); break;
5444 case 1710: return ((char *) HT_01710
); break;
5445 case 1711: return ((char *) HT_01711
); break;
5446 case 1720: return ((char *) HT_01720
); break;
5447 case 1722: return ((char *) HT_01722
); break;
5448 case 1730: return ((char *) HT_01730
); break;
5449 case 1731: return ((char *) HT_01731
); break;
5450 case 1740: return ((char *) HT_01740
); break;
5451 case 1750: return ((char *) HT_01750
); break;
5452 case 1760: return ((char *) HT_01760
); break;
5453 case 1800: return ((char *) HT_01800
); break;
5454 case 2100: return ((char *) HT_02100
); break;
5455 case 2400: return ((char *) HT_02400
); break;
5456 case 2410: return ((char *) HT_02410
); break;
5457 case 2500: return ((char *) HT_02500
); break;
5458 case 2600: return ((char *) HT_02600
); break;
5459 case 2611: return ((char *) HT_02611
); break;
5460 case 2612: return ((char *) HT_02612
); break;
5461 case 2711: return ((char *) HT_02711
); break;
5462 case 2811: return ((char *) HT_02811
); break;
5463 case 3000: return ((char *) HT_03000
); break;
5464 case 3100: return ((char *) HT_03100
); break;
5465 case 3200: return ((char *) HT_03200
); break;
5466 case 3710: return ((char *) HT_03710
); break;
5467 case 3711: return ((char *) HT_03711
); break;
5468 case 3800: return ((char *) HT_03800
); break;
5469 case 4300: return ((char *) HT_04300
); break;
5470 case 4400: return ((char *) HT_04400
); break;
5471 case 4500: return ((char *) HT_04500
); break;
5472 case 4700: return ((char *) HT_04700
); break;
5473 case 4800: return ((char *) HT_04800
); break;
5474 case 4900: return ((char *) HT_04900
); break;
5475 case 5000: return ((char *) HT_05000
); break;
5476 case 5100: return ((char *) HT_05100
); break;
5477 case 5200: return ((char *) HT_05200
); break;
5478 case 5300: return ((char *) HT_05300
); break;
5479 case 5400: return ((char *) HT_05400
); break;
5480 case 5500: return ((char *) HT_05500
); break;
5481 case 5600: return ((char *) HT_05600
); break;
5482 case 5700: return ((char *) HT_05700
); break;
5483 case 5800: return ((char *) HT_05800
); break;
5484 case 6000: return ((char *) HT_06000
); break;
5485 case 6100: return ((char *) HT_06100
); break;
5486 case 6211: return ((char *) HT_06211
); break;
5487 case 6212: return ((char *) HT_06212
); break;
5488 case 6213: return ((char *) HT_06213
); break;
5489 case 6221: return ((char *) HT_06221
); break;
5490 case 6222: return ((char *) HT_06222
); break;
5491 case 6223: return ((char *) HT_06223
); break;
5492 case 6231: return ((char *) HT_06231
); break;
5493 case 6232: return ((char *) HT_06232
); break;
5494 case 6233: return ((char *) HT_06233
); break;
5495 case 6241: return ((char *) HT_06241
); break;
5496 case 6242: return ((char *) HT_06242
); break;
5497 case 6243: return ((char *) HT_06243
); break;
5498 case 6300: return ((char *) HT_06300
); break;
5499 case 6400: return ((char *) HT_06400
); break;
5500 case 6500: return ((char *) HT_06500
); break;
5501 case 6600: return ((char *) HT_06600
); break;
5502 case 6700: return ((char *) HT_06700
); break;
5503 case 6800: return ((char *) HT_06800
); break;
5504 case 6900: return ((char *) HT_06900
); break;
5505 case 7100: return ((char *) HT_07100
); break;
5506 case 7200: return ((char *) HT_07200
); break;
5507 case 7300: return ((char *) HT_07300
); break;
5508 case 7400: return ((char *) HT_07400
); break;
5509 case 7500: return ((char *) HT_07500
); break;
5510 case 7600: return ((char *) HT_07600
); break;
5511 case 7700: return ((char *) HT_07700
); break;
5512 case 7800: return ((char *) HT_07800
); break;
5513 case 7900: return ((char *) HT_07900
); break;
5514 case 8000: return ((char *) HT_08000
); break;
5515 case 8100: return ((char *) HT_08100
); break;
5516 case 8200: return ((char *) HT_08200
); break;
5517 case 8300: return ((char *) HT_08300
); break;
5518 case 8400: return ((char *) HT_08400
); break;
5519 case 8500: return ((char *) HT_08500
); break;
5520 case 8600: return ((char *) HT_08600
); break;
5521 case 8700: return ((char *) HT_08700
); break;
5522 case 8800: return ((char *) HT_08800
); break;
5523 case 8900: return ((char *) HT_08900
); break;
5524 case 9000: return ((char *) HT_09000
); break;
5525 case 9100: return ((char *) HT_09100
); break;
5526 case 9200: return ((char *) HT_09200
); break;
5527 case 9300: return ((char *) HT_09300
); break;
5528 case 9400: return ((char *) HT_09400
); break;
5529 case 9500: return ((char *) HT_09500
); break;
5530 case 9600: return ((char *) HT_09600
); break;
5531 case 9700: return ((char *) HT_09700
); break;
5532 case 9710: return ((char *) HT_09710
); break;
5533 case 9720: return ((char *) HT_09720
); break;
5534 case 9800: return ((char *) HT_09800
); break;
5535 case 9810: return ((char *) HT_09810
); break;
5536 case 9820: return ((char *) HT_09820
); break;
5537 case 9900: return ((char *) HT_09900
); break;
5538 case 10000: return ((char *) HT_10000
); break;
5539 case 10100: return ((char *) HT_10100
); break;
5540 case 10200: return ((char *) HT_10200
); break;
5541 case 10300: return ((char *) HT_10300
); break;
5542 case 10400: return ((char *) HT_10400
); break;
5543 case 10410: return ((char *) HT_10410
); break;
5544 case 10420: return ((char *) HT_10420
); break;
5545 case 10500: return ((char *) HT_10500
); break;
5546 case 10600: return ((char *) HT_10600
); break;
5547 case 10700: return ((char *) HT_10700
); break;
5548 case 10800: return ((char *) HT_10800
); break;
5549 case 10900: return ((char *) HT_10900
); break;
5550 case 11000: return ((char *) HT_11000
); break;
5551 case 11100: return ((char *) HT_11100
); break;
5552 case 11200: return ((char *) HT_11200
); break;
5553 case 11300: return ((char *) HT_11300
); break;
5554 case 11400: return ((char *) HT_11400
); break;
5555 case 11500: return ((char *) HT_11500
); break;
5556 case 11600: return ((char *) HT_11600
); break;
5557 case 11700: return ((char *) HT_11700
); break;
5558 case 11800: return ((char *) HT_11800
); break;
5559 case 11900: return ((char *) HT_11900
); break;
5560 case 12000: return ((char *) HT_12000
); break;
5561 case 12100: return ((char *) HT_12100
); break;
5562 case 12200: return ((char *) HT_12200
); break;
5563 case 12300: return ((char *) HT_12300
); break;
5564 case 12400: return ((char *) HT_12400
); break;
5565 case 12500: return ((char *) HT_12500
); break;
5566 case 12600: return ((char *) HT_12600
); break;
5567 case 12700: return ((char *) HT_12700
); break;
5568 case 12800: return ((char *) HT_12800
); break;
5571 return ((char *) "Unknown");
5574 char *strstatus (const uint devices_status
)
5576 switch (devices_status
)
5578 case STATUS_INIT
: return ((char *) ST_0000
); break;
5579 case STATUS_STARTING
: return ((char *) ST_0001
); break;
5580 case STATUS_RUNNING
: return ((char *) ST_0002
); break;
5581 case STATUS_PAUSED
: return ((char *) ST_0003
); break;
5582 case STATUS_EXHAUSTED
: return ((char *) ST_0004
); break;
5583 case STATUS_CRACKED
: return ((char *) ST_0005
); break;
5584 case STATUS_ABORTED
: return ((char *) ST_0006
); break;
5585 case STATUS_QUIT
: return ((char *) ST_0007
); break;
5586 case STATUS_BYPASS
: return ((char *) ST_0008
); break;
5587 case STATUS_STOP_AT_CHECKPOINT
: return ((char *) ST_0009
); break;
5590 return ((char *) "Unknown");
5593 void ascii_digest (char out_buf
[4096], uint salt_pos
, uint digest_pos
)
5595 uint hash_type
= data
.hash_type
;
5596 uint hash_mode
= data
.hash_mode
;
5597 uint salt_type
= data
.salt_type
;
5598 uint opts_type
= data
.opts_type
;
5599 uint opti_type
= data
.opti_type
;
5600 uint dgst_size
= data
.dgst_size
;
5602 char *hashfile
= data
.hashfile
;
5606 uint digest_buf
[64];
5608 uint64_t *digest_buf64
= (uint64_t *) digest_buf
;
5610 char *digests_buf_ptr
= (char *) data
.digests_buf
;
5612 memcpy (digest_buf
, digests_buf_ptr
+ (data
.salts_buf
[salt_pos
].digests_offset
* dgst_size
) + (digest_pos
* dgst_size
), dgst_size
);
5614 if (opti_type
& OPTI_TYPE_PRECOMPUTE_PERMUT
)
5620 case HASH_TYPE_DESCRYPT
:
5621 FP (digest_buf
[1], digest_buf
[0], tt
);
5624 case HASH_TYPE_DESRACF
:
5625 digest_buf
[0] = ROTATE_LEFT (digest_buf
[0], 29);
5626 digest_buf
[1] = ROTATE_LEFT (digest_buf
[1], 29);
5628 FP (digest_buf
[1], digest_buf
[0], tt
);
5632 FP (digest_buf
[1], digest_buf
[0], tt
);
5635 case HASH_TYPE_NETNTLM
:
5636 digest_buf
[0] = ROTATE_LEFT (digest_buf
[0], 29);
5637 digest_buf
[1] = ROTATE_LEFT (digest_buf
[1], 29);
5638 digest_buf
[2] = ROTATE_LEFT (digest_buf
[2], 29);
5639 digest_buf
[3] = ROTATE_LEFT (digest_buf
[3], 29);
5641 FP (digest_buf
[1], digest_buf
[0], tt
);
5642 FP (digest_buf
[3], digest_buf
[2], tt
);
5645 case HASH_TYPE_BSDICRYPT
:
5646 digest_buf
[0] = ROTATE_LEFT (digest_buf
[0], 31);
5647 digest_buf
[1] = ROTATE_LEFT (digest_buf
[1], 31);
5649 FP (digest_buf
[1], digest_buf
[0], tt
);
5654 if (opti_type
& OPTI_TYPE_PRECOMPUTE_MERKLE
)
5659 digest_buf
[0] += MD4M_A
;
5660 digest_buf
[1] += MD4M_B
;
5661 digest_buf
[2] += MD4M_C
;
5662 digest_buf
[3] += MD4M_D
;
5666 digest_buf
[0] += MD5M_A
;
5667 digest_buf
[1] += MD5M_B
;
5668 digest_buf
[2] += MD5M_C
;
5669 digest_buf
[3] += MD5M_D
;
5672 case HASH_TYPE_SHA1
:
5673 digest_buf
[0] += SHA1M_A
;
5674 digest_buf
[1] += SHA1M_B
;
5675 digest_buf
[2] += SHA1M_C
;
5676 digest_buf
[3] += SHA1M_D
;
5677 digest_buf
[4] += SHA1M_E
;
5680 case HASH_TYPE_SHA256
:
5681 digest_buf
[0] += SHA256M_A
;
5682 digest_buf
[1] += SHA256M_B
;
5683 digest_buf
[2] += SHA256M_C
;
5684 digest_buf
[3] += SHA256M_D
;
5685 digest_buf
[4] += SHA256M_E
;
5686 digest_buf
[5] += SHA256M_F
;
5687 digest_buf
[6] += SHA256M_G
;
5688 digest_buf
[7] += SHA256M_H
;
5691 case HASH_TYPE_SHA384
:
5692 digest_buf64
[0] += SHA384M_A
;
5693 digest_buf64
[1] += SHA384M_B
;
5694 digest_buf64
[2] += SHA384M_C
;
5695 digest_buf64
[3] += SHA384M_D
;
5696 digest_buf64
[4] += SHA384M_E
;
5697 digest_buf64
[5] += SHA384M_F
;
5698 digest_buf64
[6] += 0;
5699 digest_buf64
[7] += 0;
5702 case HASH_TYPE_SHA512
:
5703 digest_buf64
[0] += SHA512M_A
;
5704 digest_buf64
[1] += SHA512M_B
;
5705 digest_buf64
[2] += SHA512M_C
;
5706 digest_buf64
[3] += SHA512M_D
;
5707 digest_buf64
[4] += SHA512M_E
;
5708 digest_buf64
[5] += SHA512M_F
;
5709 digest_buf64
[6] += SHA512M_G
;
5710 digest_buf64
[7] += SHA512M_H
;
5715 if (opts_type
& OPTS_TYPE_PT_GENERATE_LE
)
5717 if (dgst_size
== DGST_SIZE_4_2
)
5719 for (int i
= 0; i
< 2; i
++) digest_buf
[i
] = byte_swap_32 (digest_buf
[i
]);
5721 else if (dgst_size
== DGST_SIZE_4_4
)
5723 for (int i
= 0; i
< 4; i
++) digest_buf
[i
] = byte_swap_32 (digest_buf
[i
]);
5725 else if (dgst_size
== DGST_SIZE_4_5
)
5727 for (int i
= 0; i
< 5; i
++) digest_buf
[i
] = byte_swap_32 (digest_buf
[i
]);
5729 else if (dgst_size
== DGST_SIZE_4_6
)
5731 for (int i
= 0; i
< 6; i
++) digest_buf
[i
] = byte_swap_32 (digest_buf
[i
]);
5733 else if (dgst_size
== DGST_SIZE_4_8
)
5735 for (int i
= 0; i
< 8; i
++) digest_buf
[i
] = byte_swap_32 (digest_buf
[i
]);
5737 else if ((dgst_size
== DGST_SIZE_4_16
) || (dgst_size
== DGST_SIZE_8_8
)) // same size, same result :)
5739 if (hash_type
== HASH_TYPE_WHIRLPOOL
)
5741 for (int i
= 0; i
< 16; i
++) digest_buf
[i
] = byte_swap_32 (digest_buf
[i
]);
5743 else if (hash_type
== HASH_TYPE_SHA384
)
5745 for (int i
= 0; i
< 8; i
++) digest_buf64
[i
] = byte_swap_64 (digest_buf64
[i
]);
5747 else if (hash_type
== HASH_TYPE_SHA512
)
5749 for (int i
= 0; i
< 8; i
++) digest_buf64
[i
] = byte_swap_64 (digest_buf64
[i
]);
5751 else if (hash_type
== HASH_TYPE_GOST
)
5753 for (int i
= 0; i
< 16; i
++) digest_buf
[i
] = byte_swap_32 (digest_buf
[i
]);
5756 else if (dgst_size
== DGST_SIZE_4_64
)
5758 for (int i
= 0; i
< 64; i
++) digest_buf
[i
] = byte_swap_32 (digest_buf
[i
]);
5760 else if (dgst_size
== DGST_SIZE_8_25
)
5762 for (int i
= 0; i
< 25; i
++) digest_buf64
[i
] = byte_swap_64 (digest_buf64
[i
]);
5766 uint isSalted
= ((data
.salt_type
== SALT_TYPE_INTERN
)
5767 | (data
.salt_type
== SALT_TYPE_EXTERN
)
5768 | (data
.salt_type
== SALT_TYPE_EMBEDDED
));
5774 memset (&salt
, 0, sizeof (salt_t
));
5776 memcpy (&salt
, &data
.salts_buf
[salt_pos
], sizeof (salt_t
));
5778 char *ptr
= (char *) salt
.salt_buf
;
5780 uint len
= salt
.salt_len
;
5782 if (opti_type
& OPTI_TYPE_PRECOMPUTE_PERMUT
)
5788 case HASH_TYPE_NETNTLM
:
5790 salt
.salt_buf
[0] = ROTATE_RIGHT (salt
.salt_buf
[0], 3);
5791 salt
.salt_buf
[1] = ROTATE_RIGHT (salt
.salt_buf
[1], 3);
5793 FP (salt
.salt_buf
[1], salt
.salt_buf
[0], tt
);
5799 if (opts_type
& OPTS_TYPE_ST_UNICODE
)
5801 for (uint i
= 0, j
= 0; i
< len
; i
+= 1, j
+= 2)
5809 if (opts_type
& OPTS_TYPE_ST_GENERATE_LE
)
5811 uint max
= salt
.salt_len
/ 4;
5815 for (uint i
= 0; i
< max
; i
++)
5817 salt
.salt_buf
[i
] = byte_swap_32 (salt
.salt_buf
[i
]);
5821 if (opts_type
& OPTS_TYPE_ST_HEX
)
5825 memset (tmp
, 0, sizeof (tmp
));
5827 for (uint i
= 0, j
= 0; i
< len
; i
+= 1, j
+= 2)
5829 sprintf (tmp
+ j
, "%02x", (unsigned char) ptr
[i
]);
5834 memcpy (ptr
, tmp
, len
);
5837 uint memset_size
= ((48 - (int) len
) > 0) ? (48 - len
) : 0;
5839 memset (ptr
+ len
, 0, memset_size
);
5841 salt
.salt_len
= len
;
5845 // some modes require special encoding
5848 uint out_buf_plain
[256];
5849 uint out_buf_salt
[256];
5853 memset (out_buf_plain
, 0, sizeof (out_buf_plain
));
5854 memset (out_buf_salt
, 0, sizeof (out_buf_salt
));
5856 memset (tmp_buf
, 0, sizeof (tmp_buf
));
5858 char *ptr_plain
= (char *) out_buf_plain
;
5859 char *ptr_salt
= (char *) out_buf_salt
;
5861 if (hash_mode
== 22)
5865 memset (username
, 0, sizeof (username
));
5867 memcpy (username
, salt
.salt_buf
, salt
.salt_len
- 22);
5869 char sig
[6] = { 'n', 'r', 'c', 's', 't', 'n' };
5871 uint16_t *ptr
= (uint16_t *) digest_buf
;
5873 tmp_buf
[ 0] = sig
[0];
5874 tmp_buf
[ 1] = int_to_base64 (((ptr
[1]) >> 12) & 0x3f);
5875 tmp_buf
[ 2] = int_to_base64 (((ptr
[1]) >> 6) & 0x3f);
5876 tmp_buf
[ 3] = int_to_base64 (((ptr
[1]) >> 0) & 0x3f);
5877 tmp_buf
[ 4] = int_to_base64 (((ptr
[0]) >> 12) & 0x3f);
5878 tmp_buf
[ 5] = int_to_base64 (((ptr
[0]) >> 6) & 0x3f);
5879 tmp_buf
[ 6] = sig
[1];
5880 tmp_buf
[ 7] = int_to_base64 (((ptr
[0]) >> 0) & 0x3f);
5881 tmp_buf
[ 8] = int_to_base64 (((ptr
[3]) >> 12) & 0x3f);
5882 tmp_buf
[ 9] = int_to_base64 (((ptr
[3]) >> 6) & 0x3f);
5883 tmp_buf
[10] = int_to_base64 (((ptr
[3]) >> 0) & 0x3f);
5884 tmp_buf
[11] = int_to_base64 (((ptr
[2]) >> 12) & 0x3f);
5885 tmp_buf
[12] = sig
[2];
5886 tmp_buf
[13] = int_to_base64 (((ptr
[2]) >> 6) & 0x3f);
5887 tmp_buf
[14] = int_to_base64 (((ptr
[2]) >> 0) & 0x3f);
5888 tmp_buf
[15] = int_to_base64 (((ptr
[5]) >> 12) & 0x3f);
5889 tmp_buf
[16] = int_to_base64 (((ptr
[5]) >> 6) & 0x3f);
5890 tmp_buf
[17] = sig
[3];
5891 tmp_buf
[18] = int_to_base64 (((ptr
[5]) >> 0) & 0x3f);
5892 tmp_buf
[19] = int_to_base64 (((ptr
[4]) >> 12) & 0x3f);
5893 tmp_buf
[20] = int_to_base64 (((ptr
[4]) >> 6) & 0x3f);
5894 tmp_buf
[21] = int_to_base64 (((ptr
[4]) >> 0) & 0x3f);
5895 tmp_buf
[22] = int_to_base64 (((ptr
[7]) >> 12) & 0x3f);
5896 tmp_buf
[23] = sig
[4];
5897 tmp_buf
[24] = int_to_base64 (((ptr
[7]) >> 6) & 0x3f);
5898 tmp_buf
[25] = int_to_base64 (((ptr
[7]) >> 0) & 0x3f);
5899 tmp_buf
[26] = int_to_base64 (((ptr
[6]) >> 12) & 0x3f);
5900 tmp_buf
[27] = int_to_base64 (((ptr
[6]) >> 6) & 0x3f);
5901 tmp_buf
[28] = int_to_base64 (((ptr
[6]) >> 0) & 0x3f);
5902 tmp_buf
[29] = sig
[5];
5904 snprintf (out_buf
, len
-1, "%s:%s",
5908 else if (hash_mode
== 23)
5910 // do not show the \nskyper\n part in output
5912 char *salt_buf_ptr
= (char *) salt
.salt_buf
;
5914 salt_buf_ptr
[salt
.salt_len
- 8] = 0;
5916 snprintf (out_buf
, len
-1, "%08x%08x%08x%08x:%s",
5923 else if (hash_mode
== 101)
5925 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
5927 digest_buf
[0] = byte_swap_32 (digest_buf
[0]);
5928 digest_buf
[1] = byte_swap_32 (digest_buf
[1]);
5929 digest_buf
[2] = byte_swap_32 (digest_buf
[2]);
5930 digest_buf
[3] = byte_swap_32 (digest_buf
[3]);
5931 digest_buf
[4] = byte_swap_32 (digest_buf
[4]);
5933 memcpy (tmp_buf
, digest_buf
, 20);
5935 base64_encode (int_to_base64
, tmp_buf
, 20, ptr_plain
);
5937 snprintf (out_buf
, len
-1, "{SHA}%s", ptr_plain
);
5939 else if (hash_mode
== 111)
5941 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
5943 digest_buf
[0] = byte_swap_32 (digest_buf
[0]);
5944 digest_buf
[1] = byte_swap_32 (digest_buf
[1]);
5945 digest_buf
[2] = byte_swap_32 (digest_buf
[2]);
5946 digest_buf
[3] = byte_swap_32 (digest_buf
[3]);
5947 digest_buf
[4] = byte_swap_32 (digest_buf
[4]);
5949 memcpy (tmp_buf
, digest_buf
, 20);
5950 memcpy (tmp_buf
+ 20, salt
.salt_buf
, salt
.salt_len
);
5952 base64_encode (int_to_base64
, tmp_buf
, 20 + salt
.salt_len
, ptr_plain
);
5954 snprintf (out_buf
, len
-1, "{SSHA}%s", ptr_plain
);
5956 else if (hash_mode
== 122)
5958 snprintf (out_buf
, len
-1, "%s%08x%08x%08x%08x%08x",
5959 (unsigned char *) salt
.salt_buf
,
5966 else if (hash_mode
== 124)
5968 snprintf (out_buf
, len
-1, "sha1$%s$%08x%08x%08x%08x%08x",
5969 (unsigned char *) salt
.salt_buf
,
5976 else if (hash_mode
== 131)
5978 snprintf (out_buf
, len
-1, "0x0100%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
5979 (unsigned char *) salt
.salt_buf
,
5987 else if (hash_mode
== 132)
5989 snprintf (out_buf
, len
-1, "0x0100%s%08x%08x%08x%08x%08x",
5990 (unsigned char *) salt
.salt_buf
,
5997 else if (hash_mode
== 133)
5999 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
6001 digest_buf
[0] = byte_swap_32 (digest_buf
[0]);
6002 digest_buf
[1] = byte_swap_32 (digest_buf
[1]);
6003 digest_buf
[2] = byte_swap_32 (digest_buf
[2]);
6004 digest_buf
[3] = byte_swap_32 (digest_buf
[3]);
6005 digest_buf
[4] = byte_swap_32 (digest_buf
[4]);
6007 memcpy (tmp_buf
, digest_buf
, 20);
6009 base64_encode (int_to_base64
, tmp_buf
, 20, ptr_plain
);
6011 snprintf (out_buf
, len
-1, "%s", ptr_plain
);
6013 else if (hash_mode
== 141)
6015 memcpy (tmp_buf
, salt
.salt_buf
, salt
.salt_len
);
6017 base64_encode (int_to_base64
, tmp_buf
, salt
.salt_len
, ptr_salt
);
6019 memset (tmp_buf
, 0, sizeof (tmp_buf
));
6021 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
6023 digest_buf
[0] = byte_swap_32 (digest_buf
[0]);
6024 digest_buf
[1] = byte_swap_32 (digest_buf
[1]);
6025 digest_buf
[2] = byte_swap_32 (digest_buf
[2]);
6026 digest_buf
[3] = byte_swap_32 (digest_buf
[3]);
6027 digest_buf
[4] = byte_swap_32 (digest_buf
[4]);
6029 memcpy (tmp_buf
, digest_buf
, 20);
6031 base64_encode (int_to_base64
, tmp_buf
, 20, ptr_plain
);
6035 snprintf (out_buf
, len
-1, "%s%s*%s", SIGNATURE_EPISERVER
, ptr_salt
, ptr_plain
);
6037 else if (hash_mode
== 400)
6039 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
6041 digest_buf
[0] = byte_swap_32 (digest_buf
[0]);
6042 digest_buf
[1] = byte_swap_32 (digest_buf
[1]);
6043 digest_buf
[2] = byte_swap_32 (digest_buf
[2]);
6044 digest_buf
[3] = byte_swap_32 (digest_buf
[3]);
6046 phpass_encode ((unsigned char *) digest_buf
, (unsigned char *) ptr_plain
);
6048 snprintf (out_buf
, len
-1, "%s%s%s", (char *) salt
.salt_sign
, (char *) salt
.salt_buf
, (char *) ptr_plain
);
6050 else if (hash_mode
== 500)
6052 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
6054 digest_buf
[0] = byte_swap_32 (digest_buf
[0]);
6055 digest_buf
[1] = byte_swap_32 (digest_buf
[1]);
6056 digest_buf
[2] = byte_swap_32 (digest_buf
[2]);
6057 digest_buf
[3] = byte_swap_32 (digest_buf
[3]);
6059 md5crypt_encode ((unsigned char *) digest_buf
, (unsigned char *) ptr_plain
);
6061 if (salt
.salt_iter
== ROUNDS_MD5CRYPT
)
6063 snprintf (out_buf
, len
-1, "$1$%s$%s", (char *) salt
.salt_buf
, (char *) ptr_plain
);
6067 snprintf (out_buf
, len
-1, "$1$rounds=%i$%s$%s", salt
.salt_iter
, (char *) salt
.salt_buf
, (char *) ptr_plain
);
6070 else if (hash_mode
== 501)
6072 uint digest_idx
= salt
.digests_offset
+ digest_pos
;
6074 hashinfo_t
**hashinfo_ptr
= data
.hash_info
;
6075 char *hash_buf
= hashinfo_ptr
[digest_idx
]->orighash
;
6077 snprintf (out_buf
, len
-1, "%s", hash_buf
);
6079 else if (hash_mode
== 1421)
6081 uint8_t *salt_ptr
= (uint8_t *) salt
.salt_buf
;
6083 snprintf (out_buf
, len
-1, "%c%c%c%c%c%c%08x%08x%08x%08x%08x%08x%08x%08x",
6099 else if (hash_mode
== 1441)
6101 memcpy (tmp_buf
, salt
.salt_buf
, salt
.salt_len
);
6103 base64_encode (int_to_base64
, tmp_buf
, salt
.salt_len
, ptr_salt
);
6105 memset (tmp_buf
, 0, sizeof (tmp_buf
));
6107 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
6109 digest_buf
[0] = byte_swap_32 (digest_buf
[0]);
6110 digest_buf
[1] = byte_swap_32 (digest_buf
[1]);
6111 digest_buf
[2] = byte_swap_32 (digest_buf
[2]);
6112 digest_buf
[3] = byte_swap_32 (digest_buf
[3]);
6113 digest_buf
[4] = byte_swap_32 (digest_buf
[4]);
6114 digest_buf
[5] = byte_swap_32 (digest_buf
[5]);
6115 digest_buf
[6] = byte_swap_32 (digest_buf
[6]);
6116 digest_buf
[7] = byte_swap_32 (digest_buf
[7]);
6118 memcpy (tmp_buf
, digest_buf
, 32);
6120 base64_encode (int_to_base64
, tmp_buf
, 32, ptr_plain
);
6124 snprintf (out_buf
, len
-1, "%s%s*%s", SIGNATURE_EPISERVER4
, ptr_salt
, ptr_plain
);
6126 else if (hash_mode
== 1500)
6128 out_buf
[0] = salt
.salt_sign
[0] & 0xff;
6129 out_buf
[1] = salt
.salt_sign
[1] & 0xff;
6130 //original method, but changed because of this ticket: https://hashcat.net/trac/ticket/269
6131 //out_buf[0] = int_to_itoa64 ((salt.salt_buf[0] >> 0) & 0x3f);
6132 //out_buf[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f);
6134 memset (tmp_buf
, 0, sizeof (tmp_buf
));
6136 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
6138 digest_buf
[0] = byte_swap_32 (digest_buf
[0]);
6139 digest_buf
[1] = byte_swap_32 (digest_buf
[1]);
6141 memcpy (tmp_buf
, digest_buf
, 8);
6143 base64_encode (int_to_itoa64
, tmp_buf
, 8, ptr_plain
);
6145 snprintf (out_buf
+ 2, len
-1-2, "%s", ptr_plain
);
6149 else if (hash_mode
== 1600)
6151 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
6153 digest_buf
[0] = byte_swap_32 (digest_buf
[0]);
6154 digest_buf
[1] = byte_swap_32 (digest_buf
[1]);
6155 digest_buf
[2] = byte_swap_32 (digest_buf
[2]);
6156 digest_buf
[3] = byte_swap_32 (digest_buf
[3]);
6158 md5crypt_encode ((unsigned char *) digest_buf
, (unsigned char *) ptr_plain
);
6160 if (salt
.salt_iter
== ROUNDS_MD5CRYPT
)
6162 snprintf (out_buf
, len
-1, "$apr1$%s$%s", (char *) salt
.salt_buf
, (char *) ptr_plain
);
6166 snprintf (out_buf
, len
-1, "$apr1$rounds=%i$%s$%s", salt
.salt_iter
, (char *) salt
.salt_buf
, (char *) ptr_plain
);
6169 else if (hash_mode
== 1711)
6171 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6173 digest_buf64
[0] = byte_swap_64 (digest_buf64
[0]);
6174 digest_buf64
[1] = byte_swap_64 (digest_buf64
[1]);
6175 digest_buf64
[2] = byte_swap_64 (digest_buf64
[2]);
6176 digest_buf64
[3] = byte_swap_64 (digest_buf64
[3]);
6177 digest_buf64
[4] = byte_swap_64 (digest_buf64
[4]);
6178 digest_buf64
[5] = byte_swap_64 (digest_buf64
[5]);
6179 digest_buf64
[6] = byte_swap_64 (digest_buf64
[6]);
6180 digest_buf64
[7] = byte_swap_64 (digest_buf64
[7]);
6182 memcpy (tmp_buf
, digest_buf
, 64);
6183 memcpy (tmp_buf
+ 64, salt
.salt_buf
, salt
.salt_len
);
6185 base64_encode (int_to_base64
, tmp_buf
, 64 + salt
.salt_len
, ptr_plain
);
6187 snprintf (out_buf
, len
-1, "%s%s", SIGNATURE_SHA512B64S
, ptr_plain
);
6189 else if (hash_mode
== 1722)
6191 uint
*ptr
= digest_buf
;
6193 snprintf (out_buf
, len
-1, "%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6194 (unsigned char *) salt
.salt_buf
,
6204 else if (hash_mode
== 1731)
6206 uint
*ptr
= digest_buf
;
6208 snprintf (out_buf
, len
-1, "0x0200%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6209 (unsigned char *) salt
.salt_buf
,
6219 else if (hash_mode
== 1800)
6223 digest_buf64
[0] = byte_swap_64 (digest_buf64
[0]);
6224 digest_buf64
[1] = byte_swap_64 (digest_buf64
[1]);
6225 digest_buf64
[2] = byte_swap_64 (digest_buf64
[2]);
6226 digest_buf64
[3] = byte_swap_64 (digest_buf64
[3]);
6227 digest_buf64
[4] = byte_swap_64 (digest_buf64
[4]);
6228 digest_buf64
[5] = byte_swap_64 (digest_buf64
[5]);
6229 digest_buf64
[6] = byte_swap_64 (digest_buf64
[6]);
6230 digest_buf64
[7] = byte_swap_64 (digest_buf64
[7]);
6232 sha512crypt_encode ((unsigned char *) digest_buf64
, (unsigned char *) ptr_plain
);
6234 if (salt
.salt_iter
== ROUNDS_SHA512CRYPT
)
6236 snprintf (out_buf
, len
-1, "$6$%s$%s", (char *) salt
.salt_buf
, (char *) ptr_plain
);
6240 snprintf (out_buf
, len
-1, "$6$rounds=%i$%s$%s", salt
.salt_iter
, (char *) salt
.salt_buf
, (char *) ptr_plain
);
6243 else if (hash_mode
== 2100)
6247 snprintf (out_buf
+ pos
, len
-1, "%s%i#",
6249 salt
.salt_iter
+ 1);
6251 uint signature_len
= strlen (out_buf
);
6253 pos
+= signature_len
;
6254 len
-= signature_len
;
6256 char *salt_ptr
= (char *) salt
.salt_buf
;
6258 for (uint i
= 0; i
< salt
.salt_len
; i
++, pos
++, len
--) snprintf (out_buf
+ pos
, len
-1, "%c", salt_ptr
[i
]);
6260 snprintf (out_buf
+ pos
, len
-1, "#%08x%08x%08x%08x",
6261 byte_swap_32 (digest_buf
[0]),
6262 byte_swap_32 (digest_buf
[1]),
6263 byte_swap_32 (digest_buf
[2]),
6264 byte_swap_32 (digest_buf
[3]));
6266 else if ((hash_mode
== 2400) || (hash_mode
== 2410))
6268 memcpy (tmp_buf
, digest_buf
, 16);
6270 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6272 digest_buf
[0] = byte_swap_32 (digest_buf
[0]);
6273 digest_buf
[1] = byte_swap_32 (digest_buf
[1]);
6274 digest_buf
[2] = byte_swap_32 (digest_buf
[2]);
6275 digest_buf
[3] = byte_swap_32 (digest_buf
[3]);
6277 out_buf
[ 0] = int_to_itoa64 ((digest_buf
[0] >> 0) & 0x3f);
6278 out_buf
[ 1] = int_to_itoa64 ((digest_buf
[0] >> 6) & 0x3f);
6279 out_buf
[ 2] = int_to_itoa64 ((digest_buf
[0] >> 12) & 0x3f);
6280 out_buf
[ 3] = int_to_itoa64 ((digest_buf
[0] >> 18) & 0x3f);
6282 out_buf
[ 4] = int_to_itoa64 ((digest_buf
[1] >> 0) & 0x3f);
6283 out_buf
[ 5] = int_to_itoa64 ((digest_buf
[1] >> 6) & 0x3f);
6284 out_buf
[ 6] = int_to_itoa64 ((digest_buf
[1] >> 12) & 0x3f);
6285 out_buf
[ 7] = int_to_itoa64 ((digest_buf
[1] >> 18) & 0x3f);
6287 out_buf
[ 8] = int_to_itoa64 ((digest_buf
[2] >> 0) & 0x3f);
6288 out_buf
[ 9] = int_to_itoa64 ((digest_buf
[2] >> 6) & 0x3f);
6289 out_buf
[10] = int_to_itoa64 ((digest_buf
[2] >> 12) & 0x3f);
6290 out_buf
[11] = int_to_itoa64 ((digest_buf
[2] >> 18) & 0x3f);
6292 out_buf
[12] = int_to_itoa64 ((digest_buf
[3] >> 0) & 0x3f);
6293 out_buf
[13] = int_to_itoa64 ((digest_buf
[3] >> 6) & 0x3f);
6294 out_buf
[14] = int_to_itoa64 ((digest_buf
[3] >> 12) & 0x3f);
6295 out_buf
[15] = int_to_itoa64 ((digest_buf
[3] >> 18) & 0x3f);
6299 else if (hash_mode
== 2500)
6301 wpa_t
*wpas
= (wpa_t
*) data
.esalts_buf
;
6303 wpa_t
*wpa
= &wpas
[salt_pos
];
6307 char *pke_ptr
= (char *) pke
;
6309 for (uint i
= 0; i
< 25; i
++)
6311 pke
[i
] = byte_swap_32 (wpa
->pke
[i
]);
6314 unsigned char mac1
[6];
6315 unsigned char mac2
[6];
6317 memcpy (mac1
, pke_ptr
+ 23, 6);
6318 memcpy (mac2
, pke_ptr
+ 29, 6);
6320 snprintf (out_buf
, len
-1, "%s:%02x%02x%02x%02x%02x%02x:%02x%02x%02x%02x%02x%02x",
6321 (char *) salt
.salt_buf
,
6335 else if (hash_mode
== 4400)
6337 snprintf (out_buf
, len
-1, "%08x%08x%08x%08x",
6338 byte_swap_32 (digest_buf
[0]),
6339 byte_swap_32 (digest_buf
[1]),
6340 byte_swap_32 (digest_buf
[2]),
6341 byte_swap_32 (digest_buf
[3]));
6343 else if (hash_mode
== 4700)
6345 snprintf (out_buf
, len
-1, "%08x%08x%08x%08x%08x",
6346 byte_swap_32 (digest_buf
[0]),
6347 byte_swap_32 (digest_buf
[1]),
6348 byte_swap_32 (digest_buf
[2]),
6349 byte_swap_32 (digest_buf
[3]),
6350 byte_swap_32 (digest_buf
[4]));
6352 else if (hash_mode
== 4800)
6354 uint8_t chap_id_byte
= (uint8_t) salt
.salt_buf
[4];
6356 snprintf (out_buf
, len
-1, "%08x%08x%08x%08x:%08x%08x%08x%08x:%02x",
6361 byte_swap_32 (salt
.salt_buf
[0]),
6362 byte_swap_32 (salt
.salt_buf
[1]),
6363 byte_swap_32 (salt
.salt_buf
[2]),
6364 byte_swap_32 (salt
.salt_buf
[3]),
6367 else if (hash_mode
== 4900)
6369 snprintf (out_buf
, len
-1, "%08x%08x%08x%08x%08x",
6370 byte_swap_32 (digest_buf
[0]),
6371 byte_swap_32 (digest_buf
[1]),
6372 byte_swap_32 (digest_buf
[2]),
6373 byte_swap_32 (digest_buf
[3]),
6374 byte_swap_32 (digest_buf
[4]));
6376 else if (hash_mode
== 5100)
6378 snprintf (out_buf
, len
-1, "%08x%08x",
6382 else if (hash_mode
== 5200)
6384 snprintf (out_buf
, len
-1, "%s", hashfile
);
6386 else if (hash_mode
== 5300)
6388 ikepsk_t
*ikepsks
= (ikepsk_t
*) data
.esalts_buf
;
6390 ikepsk_t
*ikepsk
= &ikepsks
[salt_pos
];
6392 int buf_len
= len
-1;
6396 uint ikepsk_msg_len
= ikepsk
->msg_len
/ 4;
6398 for (uint i
= 0; i
< ikepsk_msg_len
; i
++)
6400 if ((i
== 32) || (i
== 64) || (i
== 66) || (i
== 68) || (i
== 108))
6402 snprintf (out_buf
, buf_len
, ":");
6408 snprintf (out_buf
, buf_len
, "%08x", byte_swap_32 (ikepsk
->msg_buf
[i
]));
6416 uint ikepsk_nr_len
= ikepsk
->nr_len
/ 4;
6418 for (uint i
= 0; i
< ikepsk_nr_len
; i
++)
6420 if ((i
== 0) || (i
== 5))
6422 snprintf (out_buf
, buf_len
, ":");
6428 snprintf (out_buf
, buf_len
, "%08x", byte_swap_32 (ikepsk
->nr_buf
[i
]));
6436 for (uint i
= 0; i
< 4; i
++)
6440 snprintf (out_buf
, buf_len
, ":");
6446 snprintf (out_buf
, buf_len
, "%08x", digest_buf
[i
]);
6452 else if (hash_mode
== 5400)
6454 ikepsk_t
*ikepsks
= (ikepsk_t
*) data
.esalts_buf
;
6456 ikepsk_t
*ikepsk
= &ikepsks
[salt_pos
];
6458 int buf_len
= len
-1;
6462 uint ikepsk_msg_len
= ikepsk
->msg_len
/ 4;
6464 for (uint i
= 0; i
< ikepsk_msg_len
; i
++)
6466 if ((i
== 32) || (i
== 64) || (i
== 66) || (i
== 68) || (i
== 108))
6468 snprintf (out_buf
, buf_len
, ":");
6474 snprintf (out_buf
, buf_len
, "%08x", byte_swap_32 (ikepsk
->msg_buf
[i
]));
6482 uint ikepsk_nr_len
= ikepsk
->nr_len
/ 4;
6484 for (uint i
= 0; i
< ikepsk_nr_len
; i
++)
6486 if ((i
== 0) || (i
== 5))
6488 snprintf (out_buf
, buf_len
, ":");
6494 snprintf (out_buf
, buf_len
, "%08x", byte_swap_32 (ikepsk
->nr_buf
[i
]));
6502 for (uint i
= 0; i
< 5; i
++)
6506 snprintf (out_buf
, buf_len
, ":");
6512 snprintf (out_buf
, buf_len
, "%08x", digest_buf
[i
]);
6518 else if (hash_mode
== 5500)
6520 netntlm_t
*netntlms
= (netntlm_t
*) data
.esalts_buf
;
6522 netntlm_t
*netntlm
= &netntlms
[salt_pos
];
6525 char domain_buf
[64];
6526 char srvchall_buf
[1024];
6527 char clichall_buf
[1024];
6529 memset (user_buf
, 0, sizeof (user_buf
));
6530 memset (domain_buf
, 0, sizeof (domain_buf
));
6531 memset (srvchall_buf
, 0, sizeof (srvchall_buf
));
6532 memset (clichall_buf
, 0, sizeof (clichall_buf
));
6534 for (uint i
= 0, j
= 0; j
< netntlm
->user_len
; i
+= 1, j
+= 2)
6536 char *ptr
= (char *) netntlm
->userdomain_buf
;
6538 user_buf
[i
] = ptr
[j
];
6541 for (uint i
= 0, j
= 0; j
< netntlm
->domain_len
; i
+= 1, j
+= 2)
6543 char *ptr
= (char *) netntlm
->userdomain_buf
;
6545 domain_buf
[i
] = ptr
[netntlm
->user_len
+ j
];
6548 for (uint i
= 0, j
= 0; i
< netntlm
->srvchall_len
; i
+= 1, j
+= 2)
6550 char *ptr
= (char *) netntlm
->chall_buf
;
6552 sprintf (srvchall_buf
+ j
, "%02x", (uint8_t) ptr
[i
]);
6555 for (uint i
= 0, j
= 0; i
< netntlm
->clichall_len
; i
+= 1, j
+= 2)
6557 char *ptr
= (char *) netntlm
->chall_buf
;
6559 sprintf (clichall_buf
+ j
, "%02x", (uint8_t) ptr
[netntlm
->srvchall_len
+ i
]);
6562 snprintf (out_buf
, len
-1, "%s::%s:%s:%08x%08x%08x%08x%08x%08x:%s",
6570 byte_swap_32 (salt
.salt_buf_pc
[0]),
6571 byte_swap_32 (salt
.salt_buf_pc
[1]),
6574 else if (hash_mode
== 5600)
6576 netntlm_t
*netntlms
= (netntlm_t
*) data
.esalts_buf
;
6578 netntlm_t
*netntlm
= &netntlms
[salt_pos
];
6581 char domain_buf
[64];
6582 char srvchall_buf
[1024];
6583 char clichall_buf
[1024];
6585 memset (user_buf
, 0, sizeof (user_buf
));
6586 memset (domain_buf
, 0, sizeof (domain_buf
));
6587 memset (srvchall_buf
, 0, sizeof (srvchall_buf
));
6588 memset (clichall_buf
, 0, sizeof (clichall_buf
));
6590 for (uint i
= 0, j
= 0; j
< netntlm
->user_len
; i
+= 1, j
+= 2)
6592 char *ptr
= (char *) netntlm
->userdomain_buf
;
6594 user_buf
[i
] = ptr
[j
];
6597 for (uint i
= 0, j
= 0; j
< netntlm
->domain_len
; i
+= 1, j
+= 2)
6599 char *ptr
= (char *) netntlm
->userdomain_buf
;
6601 domain_buf
[i
] = ptr
[netntlm
->user_len
+ j
];
6604 for (uint i
= 0, j
= 0; i
< netntlm
->srvchall_len
; i
+= 1, j
+= 2)
6606 char *ptr
= (char *) netntlm
->chall_buf
;
6608 sprintf (srvchall_buf
+ j
, "%02x", (uint8_t) ptr
[i
]);
6611 for (uint i
= 0, j
= 0; i
< netntlm
->clichall_len
; i
+= 1, j
+= 2)
6613 char *ptr
= (char *) netntlm
->chall_buf
;
6615 sprintf (clichall_buf
+ j
, "%02x", (uint8_t) ptr
[netntlm
->srvchall_len
+ i
]);
6618 snprintf (out_buf
, len
-1, "%s::%s:%s:%08x%08x%08x%08x:%s",
6628 else if (hash_mode
== 5700)
6630 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6632 digest_buf
[0] = byte_swap_32 (digest_buf
[0]);
6633 digest_buf
[1] = byte_swap_32 (digest_buf
[1]);
6634 digest_buf
[2] = byte_swap_32 (digest_buf
[2]);
6635 digest_buf
[3] = byte_swap_32 (digest_buf
[3]);
6636 digest_buf
[4] = byte_swap_32 (digest_buf
[4]);
6637 digest_buf
[5] = byte_swap_32 (digest_buf
[5]);
6638 digest_buf
[6] = byte_swap_32 (digest_buf
[6]);
6639 digest_buf
[7] = byte_swap_32 (digest_buf
[7]);
6641 memcpy (tmp_buf
, digest_buf
, 32);
6643 base64_encode (int_to_itoa64
, tmp_buf
, 32, ptr_plain
);
6647 snprintf (out_buf
, len
-1, "%s", ptr_plain
);
6649 else if (hash_mode
== 5800)
6651 digest_buf
[0] = byte_swap_32 (digest_buf
[0]);
6652 digest_buf
[1] = byte_swap_32 (digest_buf
[1]);
6653 digest_buf
[2] = byte_swap_32 (digest_buf
[2]);
6654 digest_buf
[3] = byte_swap_32 (digest_buf
[3]);
6655 digest_buf
[4] = byte_swap_32 (digest_buf
[4]);
6657 snprintf (out_buf
, len
-1, "%08x%08x%08x%08x%08x",
6664 else if ((hash_mode
>= 6200) && (hash_mode
<= 6299))
6666 snprintf (out_buf
, len
-1, "%s", hashfile
);
6668 else if (hash_mode
== 6300)
6670 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
6672 digest_buf
[0] = byte_swap_32 (digest_buf
[0]);
6673 digest_buf
[1] = byte_swap_32 (digest_buf
[1]);
6674 digest_buf
[2] = byte_swap_32 (digest_buf
[2]);
6675 digest_buf
[3] = byte_swap_32 (digest_buf
[3]);
6677 md5crypt_encode ((unsigned char *) digest_buf
, (unsigned char *) ptr_plain
);
6679 snprintf (out_buf
, len
-1, "{smd5}%s$%s", (char *) salt
.salt_buf
, (char *) ptr_plain
);
6681 else if (hash_mode
== 6400)
6683 sha256aix_encode ((unsigned char *) digest_buf
, (unsigned char *) ptr_plain
);
6685 snprintf (out_buf
, len
-1, "{ssha256}%02d$%s$%s", salt
.salt_sign
[0], (char *) salt
.salt_buf
, (char *) ptr_plain
);
6687 else if (hash_mode
== 6500)
6689 sha512aix_encode ((unsigned char *) digest_buf64
, (unsigned char *) ptr_plain
);
6691 snprintf (out_buf
, len
-1, "{ssha512}%02d$%s$%s", salt
.salt_sign
[0], (char *) salt
.salt_buf
, (char *) ptr_plain
);
6693 else if (hash_mode
== 6600)
6695 agilekey_t
*agilekeys
= (agilekey_t
*) data
.esalts_buf
;
6697 agilekey_t
*agilekey
= &agilekeys
[salt_pos
];
6699 salt
.salt_buf
[0] = byte_swap_32 (salt
.salt_buf
[0]);
6700 salt
.salt_buf
[1] = byte_swap_32 (salt
.salt_buf
[1]);
6702 uint buf_len
= len
- 1;
6704 uint off
= snprintf (out_buf
, buf_len
, "%d:%08x%08x:", salt
.salt_iter
+ 1, salt
.salt_buf
[0], salt
.salt_buf
[1]);
6707 for (uint i
= 0, j
= off
; i
< 1040; i
++, j
+= 2)
6709 snprintf (out_buf
+ j
, buf_len
, "%02x", agilekey
->cipher
[i
]);
6714 else if (hash_mode
== 6700)
6716 sha1aix_encode ((unsigned char *) digest_buf
, (unsigned char *) ptr_plain
);
6718 snprintf (out_buf
, len
-1, "{ssha1}%02d$%s$%s", salt
.salt_sign
[0], (char *) salt
.salt_buf
, (char *) ptr_plain
);
6720 else if (hash_mode
== 6800)
6722 snprintf (out_buf
, len
-1, "%s", (char *) salt
.salt_buf
);
6724 else if (hash_mode
== 7100)
6726 uint
*ptr
= digest_buf
;
6728 pbkdf2_sha512_t
*pbkdf2_sha512s
= (pbkdf2_sha512_t
*) data
.esalts_buf
;
6730 pbkdf2_sha512_t
*pbkdf2_sha512
= &pbkdf2_sha512s
[salt_pos
];
6734 esalt
[0] = byte_swap_32 (pbkdf2_sha512
->salt_buf
[0]);
6735 esalt
[1] = byte_swap_32 (pbkdf2_sha512
->salt_buf
[1]);
6736 esalt
[2] = byte_swap_32 (pbkdf2_sha512
->salt_buf
[2]);
6737 esalt
[3] = byte_swap_32 (pbkdf2_sha512
->salt_buf
[3]);
6738 esalt
[4] = byte_swap_32 (pbkdf2_sha512
->salt_buf
[4]);
6739 esalt
[5] = byte_swap_32 (pbkdf2_sha512
->salt_buf
[5]);
6740 esalt
[6] = byte_swap_32 (pbkdf2_sha512
->salt_buf
[6]);
6741 esalt
[7] = byte_swap_32 (pbkdf2_sha512
->salt_buf
[7]);
6743 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",
6744 SIGNATURE_SHA512OSX
,
6746 esalt
[ 0], esalt
[ 1],
6747 esalt
[ 2], esalt
[ 3],
6748 esalt
[ 4], esalt
[ 5],
6749 esalt
[ 6], esalt
[ 7],
6757 ptr
[15], ptr
[14]);
6759 else if (hash_mode
== 7200)
6761 uint
*ptr
= digest_buf
;
6763 pbkdf2_sha512_t
*pbkdf2_sha512s
= (pbkdf2_sha512_t
*) data
.esalts_buf
;
6765 pbkdf2_sha512_t
*pbkdf2_sha512
= &pbkdf2_sha512s
[salt_pos
];
6769 snprintf (out_buf
+ len_used
, len
- len_used
- 1, "%s%i.", SIGNATURE_SHA512GRUB
, salt
.salt_iter
+ 1);
6771 len_used
= strlen (out_buf
);
6773 unsigned char *salt_buf_ptr
= (unsigned char *) pbkdf2_sha512
->salt_buf
;
6775 for (uint i
= 0; i
< salt
.salt_len
; i
++, len_used
+= 2)
6777 snprintf (out_buf
+ len_used
, len
- len_used
- 1, "%02x", salt_buf_ptr
[i
]);
6780 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",
6788 ptr
[15], ptr
[14]);
6790 else if (hash_mode
== 7300)
6792 rakp_t
*rakps
= (rakp_t
*) data
.esalts_buf
;
6794 rakp_t
*rakp
= &rakps
[salt_pos
];
6796 for (uint i
= 0, j
= 0; (i
* 4) < rakp
->salt_len
; i
+= 1, j
+= 8)
6798 sprintf (out_buf
+ j
, "%08x", rakp
->salt_buf
[i
]);
6801 snprintf (out_buf
+ rakp
->salt_len
* 2, len
- 1, ":%08x%08x%08x%08x%08x",
6808 else if (hash_mode
== 7400)
6810 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6812 digest_buf
[0] = byte_swap_32 (digest_buf
[0]);
6813 digest_buf
[1] = byte_swap_32 (digest_buf
[1]);
6814 digest_buf
[2] = byte_swap_32 (digest_buf
[2]);
6815 digest_buf
[3] = byte_swap_32 (digest_buf
[3]);
6816 digest_buf
[4] = byte_swap_32 (digest_buf
[4]);
6817 digest_buf
[5] = byte_swap_32 (digest_buf
[5]);
6818 digest_buf
[6] = byte_swap_32 (digest_buf
[6]);
6819 digest_buf
[7] = byte_swap_32 (digest_buf
[7]);
6821 sha256crypt_encode ((unsigned char *) digest_buf
, (unsigned char *) ptr_plain
);
6823 if (salt
.salt_iter
== ROUNDS_SHA256CRYPT
)
6825 snprintf (out_buf
, len
-1, "$5$%s$%s", (char *) salt
.salt_buf
, (char *) ptr_plain
);
6829 snprintf (out_buf
, len
-1, "$5$rounds=%i$%s$%s", salt
.salt_iter
, (char *) salt
.salt_buf
, (char *) ptr_plain
);
6832 else if (hash_mode
== 7500)
6834 krb5pa_t
*krb5pas
= (krb5pa_t
*) data
.esalts_buf
;
6836 krb5pa_t
*krb5pa
= &krb5pas
[salt_pos
];
6838 uint8_t *ptr_timestamp
= (uint8_t *) krb5pa
->timestamp
;
6839 uint8_t *ptr_checksum
= (uint8_t *) krb5pa
->checksum
;
6843 char *ptr_data
= data
;
6845 for (uint i
= 0; i
< 36; i
++, ptr_data
+= 2)
6847 sprintf (ptr_data
, "%02x", ptr_timestamp
[i
]);
6850 for (uint i
= 0; i
< 16; i
++, ptr_data
+= 2)
6852 sprintf (ptr_data
, "%02x", ptr_checksum
[i
]);
6857 snprintf (out_buf
, len
-1, "%s$%s$%s$%s$%s",
6859 (char *) krb5pa
->user
,
6860 (char *) krb5pa
->realm
,
6861 (char *) krb5pa
->salt
,
6864 else if (hash_mode
== 7700)
6866 snprintf (out_buf
, len
-1, "%s$%08X%08X",
6867 (char *) salt
.salt_buf
,
6871 else if (hash_mode
== 7800)
6873 snprintf (out_buf
, len
-1, "%s$%08X%08X%08X%08X%08X",
6874 (char *) salt
.salt_buf
,
6881 else if (hash_mode
== 7900)
6883 drupal7_encode ((unsigned char *) digest_buf64
, (unsigned char *) ptr_plain
);
6887 char *tmp
= (char *) salt
.salt_buf_pc
;
6889 ptr_plain
[42] = tmp
[0];
6895 snprintf (out_buf
, len
-1, "%s%s%s", (char *) salt
.salt_sign
, (char *) salt
.salt_buf
, (char *) ptr_plain
);
6897 else if (hash_mode
== 8000)
6899 snprintf (out_buf
, len
-1, "0xc007%s%08x%08x%08x%08x%08x%08x%08x%08x",
6900 (unsigned char *) salt
.salt_buf
,
6910 else if (hash_mode
== 8100)
6912 salt
.salt_buf
[0] = byte_swap_32 (salt
.salt_buf
[0]);
6913 salt
.salt_buf
[1] = byte_swap_32 (salt
.salt_buf
[1]);
6915 snprintf (out_buf
, len
-1, "1%s%08x%08x%08x%08x%08x",
6916 (unsigned char *) salt
.salt_buf
,
6923 else if (hash_mode
== 8200)
6925 cloudkey_t
*cloudkeys
= (cloudkey_t
*) data
.esalts_buf
;
6927 cloudkey_t
*cloudkey
= &cloudkeys
[salt_pos
];
6929 char data_buf
[4096];
6931 for (int i
= 0, j
= 0; i
< 512; i
+= 1, j
+= 8)
6933 sprintf (data_buf
+ j
, "%08x", cloudkey
->data_buf
[i
]);
6936 data_buf
[cloudkey
->data_len
* 2] = 0;
6938 digest_buf
[0] = byte_swap_32 (digest_buf
[0]);
6939 digest_buf
[1] = byte_swap_32 (digest_buf
[1]);
6940 digest_buf
[2] = byte_swap_32 (digest_buf
[2]);
6941 digest_buf
[3] = byte_swap_32 (digest_buf
[3]);
6942 digest_buf
[4] = byte_swap_32 (digest_buf
[4]);
6943 digest_buf
[5] = byte_swap_32 (digest_buf
[5]);
6944 digest_buf
[6] = byte_swap_32 (digest_buf
[6]);
6945 digest_buf
[7] = byte_swap_32 (digest_buf
[7]);
6947 salt
.salt_buf
[0] = byte_swap_32 (salt
.salt_buf
[0]);
6948 salt
.salt_buf
[1] = byte_swap_32 (salt
.salt_buf
[1]);
6949 salt
.salt_buf
[2] = byte_swap_32 (salt
.salt_buf
[2]);
6950 salt
.salt_buf
[3] = byte_swap_32 (salt
.salt_buf
[3]);
6952 snprintf (out_buf
, len
-1, "%08x%08x%08x%08x%08x%08x%08x%08x:%08x%08x%08x%08x:%u:%s",
6968 else if (hash_mode
== 8300)
6972 char digest_buf_c
[33];
6974 base32_encode (int_to_itoa32
, (char *) digest_buf
, 32, digest_buf_c
);
6976 digest_buf_c
[32] = 0;
6980 const uint salt_pc_len
= salt
.salt_buf_pc
[7]; // what a hack
6982 char domain_buf_c
[33];
6984 memcpy (domain_buf_c
, (char *) salt
.salt_buf_pc
, salt_pc_len
);
6986 for (uint i
= 0; i
< salt_pc_len
; i
++)
6988 const char next
= domain_buf_c
[i
];
6990 domain_buf_c
[i
] = '.';
6995 domain_buf_c
[salt_pc_len
] = 0;
6999 snprintf (out_buf
, len
-1, "%s:%s:%s:%u", digest_buf_c
, domain_buf_c
, (char *) salt
.salt_buf
, salt
.salt_iter
);
7001 else if (hash_mode
== 8500)
7003 snprintf (out_buf
, len
-1, "%s*%s*%08X%08X", SIGNATURE_RACF
, (char *) salt
.salt_buf
, digest_buf
[0], digest_buf
[1]);
7005 else if (hash_mode
== 2612)
7007 snprintf (out_buf
, len
-1, "%s%s$%08x%08x%08x%08x",
7009 (char *) salt
.salt_buf
,
7015 else if (hash_mode
== 3711)
7017 char *salt_ptr
= (char *) salt
.salt_buf
;
7019 salt_ptr
[salt
.salt_len
- 1] = 0;
7021 snprintf (out_buf
, len
-1, "%s%s$%08x%08x%08x%08x",
7022 SIGNATURE_MEDIAWIKI_B
,
7029 else if (hash_mode
== 8800)
7031 androidfde_t
*androidfdes
= (androidfde_t
*) data
.esalts_buf
;
7033 androidfde_t
*androidfde
= &androidfdes
[salt_pos
];
7037 for (uint i
= 0, j
= 0; i
< 384; i
+= 1, j
+= 8)
7039 sprintf (tmp
+ j
, "%08x", androidfde
->data
[i
]);
7044 snprintf (out_buf
, len
-1, "%s16$%08x%08x%08x%08x$16$%08x%08x%08x%08x$%s",
7045 SIGNATURE_ANDROIDFDE
,
7046 byte_swap_32 (salt
.salt_buf
[0]),
7047 byte_swap_32 (salt
.salt_buf
[1]),
7048 byte_swap_32 (salt
.salt_buf
[2]),
7049 byte_swap_32 (salt
.salt_buf
[3]),
7050 byte_swap_32 (digest_buf
[0]),
7051 byte_swap_32 (digest_buf
[1]),
7052 byte_swap_32 (digest_buf
[2]),
7053 byte_swap_32 (digest_buf
[3]),
7056 else if (hash_mode
== 8900)
7058 uint N
= salt
.scrypt_N
;
7059 uint r
= salt
.scrypt_r
;
7060 uint p
= salt
.scrypt_p
;
7062 char base64_salt
[32];
7064 memset (base64_salt
, 0, 32);
7066 base64_encode (int_to_base64
, (char *) salt
.salt_buf
, salt
.salt_len
, base64_salt
+ 0);
7068 memset (tmp_buf
, 0, 46);
7070 digest_buf
[0] = byte_swap_32 (digest_buf
[0]);
7071 digest_buf
[1] = byte_swap_32 (digest_buf
[1]);
7072 digest_buf
[2] = byte_swap_32 (digest_buf
[2]);
7073 digest_buf
[3] = byte_swap_32 (digest_buf
[3]);
7074 digest_buf
[4] = byte_swap_32 (digest_buf
[4]);
7075 digest_buf
[5] = byte_swap_32 (digest_buf
[5]);
7076 digest_buf
[6] = byte_swap_32 (digest_buf
[6]);
7077 digest_buf
[7] = byte_swap_32 (digest_buf
[7]);
7078 digest_buf
[8] = 0; // needed for base64_encode ()
7080 base64_encode (int_to_base64
, (char *) digest_buf
, 32, tmp_buf
+ 0);
7082 snprintf (out_buf
, len
-1, "%s:%i:%i:%i:%s:%s",
7090 else if (hash_mode
== 9000)
7092 snprintf (out_buf
, len
-1, "%s", hashfile
);
7094 else if (hash_mode
== 9200)
7098 pbkdf2_sha256_t
*pbkdf2_sha256s
= (pbkdf2_sha256_t
*) data
.esalts_buf
;
7100 pbkdf2_sha256_t
*pbkdf2_sha256
= &pbkdf2_sha256s
[salt_pos
];
7102 unsigned char *salt_buf_ptr
= (unsigned char *) pbkdf2_sha256
->salt_buf
;
7106 digest_buf
[0] = byte_swap_32 (digest_buf
[0]);
7107 digest_buf
[1] = byte_swap_32 (digest_buf
[1]);
7108 digest_buf
[2] = byte_swap_32 (digest_buf
[2]);
7109 digest_buf
[3] = byte_swap_32 (digest_buf
[3]);
7110 digest_buf
[4] = byte_swap_32 (digest_buf
[4]);
7111 digest_buf
[5] = byte_swap_32 (digest_buf
[5]);
7112 digest_buf
[6] = byte_swap_32 (digest_buf
[6]);
7113 digest_buf
[7] = byte_swap_32 (digest_buf
[7]);
7114 digest_buf
[8] = 0; // needed for base64_encode ()
7117 memset (tmp_buf
, 0, sizeof (tmp_buf
));
7119 base64_encode (int_to_itoa64
, (char *) digest_buf
, 32, tmp_buf
);
7120 tmp_buf
[43] = 0; // cut it here
7124 snprintf (out_buf
, len
-1, "%s%s$%s", SIGNATURE_CISCO8
, salt_buf_ptr
, tmp_buf
);
7126 else if (hash_mode
== 9300)
7128 digest_buf
[0] = byte_swap_32 (digest_buf
[0]);
7129 digest_buf
[1] = byte_swap_32 (digest_buf
[1]);
7130 digest_buf
[2] = byte_swap_32 (digest_buf
[2]);
7131 digest_buf
[3] = byte_swap_32 (digest_buf
[3]);
7132 digest_buf
[4] = byte_swap_32 (digest_buf
[4]);
7133 digest_buf
[5] = byte_swap_32 (digest_buf
[5]);
7134 digest_buf
[6] = byte_swap_32 (digest_buf
[6]);
7135 digest_buf
[7] = byte_swap_32 (digest_buf
[7]);
7136 digest_buf
[8] = 0; // needed for base64_encode ()
7139 memset (tmp_buf
, 0, sizeof (tmp_buf
));
7141 base64_encode (int_to_itoa64
, (char *) digest_buf
, 32, tmp_buf
);
7142 tmp_buf
[43] = 0; // cut it here
7144 unsigned char *salt_buf_ptr
= (unsigned char *) salt
.salt_buf
;
7146 snprintf (out_buf
, len
-1, "%s%s$%s", SIGNATURE_CISCO9
, salt_buf_ptr
, tmp_buf
);
7148 else if (hash_mode
== 9400)
7150 office2007_t
*office2007s
= (office2007_t
*) data
.esalts_buf
;
7152 office2007_t
*office2007
= &office2007s
[salt_pos
];
7154 snprintf (out_buf
, len
-1, "%s*%u*%u*%u*%u*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7155 SIGNATURE_OFFICE2007
,
7158 office2007
->keySize
,
7164 office2007
->encryptedVerifier
[0],
7165 office2007
->encryptedVerifier
[1],
7166 office2007
->encryptedVerifier
[2],
7167 office2007
->encryptedVerifier
[3],
7168 office2007
->encryptedVerifierHash
[0],
7169 office2007
->encryptedVerifierHash
[1],
7170 office2007
->encryptedVerifierHash
[2],
7171 office2007
->encryptedVerifierHash
[3],
7172 office2007
->encryptedVerifierHash
[4]);
7174 else if (hash_mode
== 9500)
7176 office2010_t
*office2010s
= (office2010_t
*) data
.esalts_buf
;
7178 office2010_t
*office2010
= &office2010s
[salt_pos
];
7180 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,
7186 office2010
->encryptedVerifier
[0],
7187 office2010
->encryptedVerifier
[1],
7188 office2010
->encryptedVerifier
[2],
7189 office2010
->encryptedVerifier
[3],
7190 office2010
->encryptedVerifierHash
[0],
7191 office2010
->encryptedVerifierHash
[1],
7192 office2010
->encryptedVerifierHash
[2],
7193 office2010
->encryptedVerifierHash
[3],
7194 office2010
->encryptedVerifierHash
[4],
7195 office2010
->encryptedVerifierHash
[5],
7196 office2010
->encryptedVerifierHash
[6],
7197 office2010
->encryptedVerifierHash
[7]);
7199 else if (hash_mode
== 9600)
7201 office2013_t
*office2013s
= (office2013_t
*) data
.esalts_buf
;
7203 office2013_t
*office2013
= &office2013s
[salt_pos
];
7205 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,
7211 office2013
->encryptedVerifier
[0],
7212 office2013
->encryptedVerifier
[1],
7213 office2013
->encryptedVerifier
[2],
7214 office2013
->encryptedVerifier
[3],
7215 office2013
->encryptedVerifierHash
[0],
7216 office2013
->encryptedVerifierHash
[1],
7217 office2013
->encryptedVerifierHash
[2],
7218 office2013
->encryptedVerifierHash
[3],
7219 office2013
->encryptedVerifierHash
[4],
7220 office2013
->encryptedVerifierHash
[5],
7221 office2013
->encryptedVerifierHash
[6],
7222 office2013
->encryptedVerifierHash
[7]);
7224 else if (hash_mode
== 9700)
7226 oldoffice01_t
*oldoffice01s
= (oldoffice01_t
*) data
.esalts_buf
;
7228 oldoffice01_t
*oldoffice01
= &oldoffice01s
[salt_pos
];
7230 snprintf (out_buf
, len
-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7231 (oldoffice01
->version
== 0) ? SIGNATURE_OLDOFFICE0
: SIGNATURE_OLDOFFICE1
,
7232 byte_swap_32 (salt
.salt_buf
[0]),
7233 byte_swap_32 (salt
.salt_buf
[1]),
7234 byte_swap_32 (salt
.salt_buf
[2]),
7235 byte_swap_32 (salt
.salt_buf
[3]),
7236 byte_swap_32 (oldoffice01
->encryptedVerifier
[0]),
7237 byte_swap_32 (oldoffice01
->encryptedVerifier
[1]),
7238 byte_swap_32 (oldoffice01
->encryptedVerifier
[2]),
7239 byte_swap_32 (oldoffice01
->encryptedVerifier
[3]),
7240 byte_swap_32 (oldoffice01
->encryptedVerifierHash
[0]),
7241 byte_swap_32 (oldoffice01
->encryptedVerifierHash
[1]),
7242 byte_swap_32 (oldoffice01
->encryptedVerifierHash
[2]),
7243 byte_swap_32 (oldoffice01
->encryptedVerifierHash
[3]));
7245 else if (hash_mode
== 9710)
7247 oldoffice01_t
*oldoffice01s
= (oldoffice01_t
*) data
.esalts_buf
;
7249 oldoffice01_t
*oldoffice01
= &oldoffice01s
[salt_pos
];
7251 snprintf (out_buf
, len
-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7252 (oldoffice01
->version
== 0) ? SIGNATURE_OLDOFFICE0
: SIGNATURE_OLDOFFICE1
,
7253 byte_swap_32 (salt
.salt_buf
[0]),
7254 byte_swap_32 (salt
.salt_buf
[1]),
7255 byte_swap_32 (salt
.salt_buf
[2]),
7256 byte_swap_32 (salt
.salt_buf
[3]),
7257 byte_swap_32 (oldoffice01
->encryptedVerifier
[0]),
7258 byte_swap_32 (oldoffice01
->encryptedVerifier
[1]),
7259 byte_swap_32 (oldoffice01
->encryptedVerifier
[2]),
7260 byte_swap_32 (oldoffice01
->encryptedVerifier
[3]),
7261 byte_swap_32 (oldoffice01
->encryptedVerifierHash
[0]),
7262 byte_swap_32 (oldoffice01
->encryptedVerifierHash
[1]),
7263 byte_swap_32 (oldoffice01
->encryptedVerifierHash
[2]),
7264 byte_swap_32 (oldoffice01
->encryptedVerifierHash
[3]));
7266 else if (hash_mode
== 9720)
7268 oldoffice01_t
*oldoffice01s
= (oldoffice01_t
*) data
.esalts_buf
;
7270 oldoffice01_t
*oldoffice01
= &oldoffice01s
[salt_pos
];
7272 uint8_t *rc4key
= (uint8_t *) oldoffice01
->rc4key
;
7274 snprintf (out_buf
, len
-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7275 (oldoffice01
->version
== 0) ? SIGNATURE_OLDOFFICE0
: SIGNATURE_OLDOFFICE1
,
7276 byte_swap_32 (salt
.salt_buf
[0]),
7277 byte_swap_32 (salt
.salt_buf
[1]),
7278 byte_swap_32 (salt
.salt_buf
[2]),
7279 byte_swap_32 (salt
.salt_buf
[3]),
7280 byte_swap_32 (oldoffice01
->encryptedVerifier
[0]),
7281 byte_swap_32 (oldoffice01
->encryptedVerifier
[1]),
7282 byte_swap_32 (oldoffice01
->encryptedVerifier
[2]),
7283 byte_swap_32 (oldoffice01
->encryptedVerifier
[3]),
7284 byte_swap_32 (oldoffice01
->encryptedVerifierHash
[0]),
7285 byte_swap_32 (oldoffice01
->encryptedVerifierHash
[1]),
7286 byte_swap_32 (oldoffice01
->encryptedVerifierHash
[2]),
7287 byte_swap_32 (oldoffice01
->encryptedVerifierHash
[3]),
7294 else if (hash_mode
== 9800)
7296 oldoffice34_t
*oldoffice34s
= (oldoffice34_t
*) data
.esalts_buf
;
7298 oldoffice34_t
*oldoffice34
= &oldoffice34s
[salt_pos
];
7300 snprintf (out_buf
, len
-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7301 (oldoffice34
->version
== 3) ? SIGNATURE_OLDOFFICE3
: SIGNATURE_OLDOFFICE4
,
7306 byte_swap_32 (oldoffice34
->encryptedVerifier
[0]),
7307 byte_swap_32 (oldoffice34
->encryptedVerifier
[1]),
7308 byte_swap_32 (oldoffice34
->encryptedVerifier
[2]),
7309 byte_swap_32 (oldoffice34
->encryptedVerifier
[3]),
7310 byte_swap_32 (oldoffice34
->encryptedVerifierHash
[0]),
7311 byte_swap_32 (oldoffice34
->encryptedVerifierHash
[1]),
7312 byte_swap_32 (oldoffice34
->encryptedVerifierHash
[2]),
7313 byte_swap_32 (oldoffice34
->encryptedVerifierHash
[3]),
7314 byte_swap_32 (oldoffice34
->encryptedVerifierHash
[4]));
7316 else if (hash_mode
== 9810)
7318 oldoffice34_t
*oldoffice34s
= (oldoffice34_t
*) data
.esalts_buf
;
7320 oldoffice34_t
*oldoffice34
= &oldoffice34s
[salt_pos
];
7322 snprintf (out_buf
, len
-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7323 (oldoffice34
->version
== 3) ? SIGNATURE_OLDOFFICE3
: SIGNATURE_OLDOFFICE4
,
7328 byte_swap_32 (oldoffice34
->encryptedVerifier
[0]),
7329 byte_swap_32 (oldoffice34
->encryptedVerifier
[1]),
7330 byte_swap_32 (oldoffice34
->encryptedVerifier
[2]),
7331 byte_swap_32 (oldoffice34
->encryptedVerifier
[3]),
7332 byte_swap_32 (oldoffice34
->encryptedVerifierHash
[0]),
7333 byte_swap_32 (oldoffice34
->encryptedVerifierHash
[1]),
7334 byte_swap_32 (oldoffice34
->encryptedVerifierHash
[2]),
7335 byte_swap_32 (oldoffice34
->encryptedVerifierHash
[3]),
7336 byte_swap_32 (oldoffice34
->encryptedVerifierHash
[4]));
7338 else if (hash_mode
== 9820)
7340 oldoffice34_t
*oldoffice34s
= (oldoffice34_t
*) data
.esalts_buf
;
7342 oldoffice34_t
*oldoffice34
= &oldoffice34s
[salt_pos
];
7344 uint8_t *rc4key
= (uint8_t *) oldoffice34
->rc4key
;
7346 snprintf (out_buf
, len
-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7347 (oldoffice34
->version
== 3) ? SIGNATURE_OLDOFFICE3
: SIGNATURE_OLDOFFICE4
,
7352 byte_swap_32 (oldoffice34
->encryptedVerifier
[0]),
7353 byte_swap_32 (oldoffice34
->encryptedVerifier
[1]),
7354 byte_swap_32 (oldoffice34
->encryptedVerifier
[2]),
7355 byte_swap_32 (oldoffice34
->encryptedVerifier
[3]),
7356 byte_swap_32 (oldoffice34
->encryptedVerifierHash
[0]),
7357 byte_swap_32 (oldoffice34
->encryptedVerifierHash
[1]),
7358 byte_swap_32 (oldoffice34
->encryptedVerifierHash
[2]),
7359 byte_swap_32 (oldoffice34
->encryptedVerifierHash
[3]),
7360 byte_swap_32 (oldoffice34
->encryptedVerifierHash
[4]),
7367 else if (hash_mode
== 10000)
7371 pbkdf2_sha256_t
*pbkdf2_sha256s
= (pbkdf2_sha256_t
*) data
.esalts_buf
;
7373 pbkdf2_sha256_t
*pbkdf2_sha256
= &pbkdf2_sha256s
[salt_pos
];
7375 unsigned char *salt_buf_ptr
= (unsigned char *) pbkdf2_sha256
->salt_buf
;
7379 digest_buf
[0] = byte_swap_32 (digest_buf
[0]);
7380 digest_buf
[1] = byte_swap_32 (digest_buf
[1]);
7381 digest_buf
[2] = byte_swap_32 (digest_buf
[2]);
7382 digest_buf
[3] = byte_swap_32 (digest_buf
[3]);
7383 digest_buf
[4] = byte_swap_32 (digest_buf
[4]);
7384 digest_buf
[5] = byte_swap_32 (digest_buf
[5]);
7385 digest_buf
[6] = byte_swap_32 (digest_buf
[6]);
7386 digest_buf
[7] = byte_swap_32 (digest_buf
[7]);
7387 digest_buf
[8] = 0; // needed for base64_encode ()
7390 memset (tmp_buf
, 0, sizeof (tmp_buf
));
7392 base64_encode (int_to_base64
, (char *) digest_buf
, 32, tmp_buf
);
7396 snprintf (out_buf
, len
-1, "%s%i$%s$%s", SIGNATURE_DJANGOPBKDF2
, salt
.salt_iter
+ 1, salt_buf_ptr
, tmp_buf
);
7398 else if (hash_mode
== 10100)
7400 snprintf (out_buf
, len
-1, "%08x%08x:%u:%u:%08x%08x%08x%08x",
7405 byte_swap_32 (salt
.salt_buf
[0]),
7406 byte_swap_32 (salt
.salt_buf
[1]),
7407 byte_swap_32 (salt
.salt_buf
[2]),
7408 byte_swap_32 (salt
.salt_buf
[3]));
7410 else if (hash_mode
== 10200)
7412 cram_md5_t
*cram_md5s
= (cram_md5_t
*) data
.esalts_buf
;
7414 cram_md5_t
*cram_md5
= &cram_md5s
[salt_pos
];
7418 char challenge
[100];
7420 memset (challenge
, 0, sizeof (challenge
));
7422 base64_encode (int_to_base64
, (char *) salt
.salt_buf
, salt
.salt_len
, challenge
);
7428 uint tmp_len
= snprintf (tmp_buf
, 100, "%s %08x%08x%08x%08x",
7429 (char *) cram_md5
->user
,
7437 memset (response
, 0, sizeof (response
));
7439 base64_encode (int_to_base64
, (char *) tmp_buf
, tmp_len
, response
);
7441 snprintf (out_buf
, len
-1, "%s%s$%s", SIGNATURE_CRAM_MD5
, challenge
, response
);
7443 else if (hash_mode
== 10300)
7447 memset (tmp_buf
, 0, sizeof (tmp_buf
));
7449 memcpy (tmp_buf
+ 0, digest_buf
, 20);
7450 memcpy (tmp_buf
+ 20, salt
.salt_buf
, salt
.salt_len
);
7452 uint tmp_len
= 20 + salt
.salt_len
;
7456 char base64_encoded
[100];
7458 memset (base64_encoded
, 0, sizeof (base64_encoded
));
7460 base64_encode (int_to_base64
, (char *) tmp_buf
, tmp_len
, base64_encoded
);
7462 snprintf (out_buf
, len
-1, "%s%i}%s", SIGNATURE_SAPH_SHA1
, salt
.salt_iter
+ 1, base64_encoded
);
7464 else if (hash_mode
== 10400)
7466 pdf_t
*pdfs
= (pdf_t
*) data
.esalts_buf
;
7468 pdf_t
*pdf
= &pdfs
[salt_pos
];
7470 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",
7478 byte_swap_32 (pdf
->id_buf
[0]),
7479 byte_swap_32 (pdf
->id_buf
[1]),
7480 byte_swap_32 (pdf
->id_buf
[2]),
7481 byte_swap_32 (pdf
->id_buf
[3]),
7483 byte_swap_32 (pdf
->u_buf
[0]),
7484 byte_swap_32 (pdf
->u_buf
[1]),
7485 byte_swap_32 (pdf
->u_buf
[2]),
7486 byte_swap_32 (pdf
->u_buf
[3]),
7487 byte_swap_32 (pdf
->u_buf
[4]),
7488 byte_swap_32 (pdf
->u_buf
[5]),
7489 byte_swap_32 (pdf
->u_buf
[6]),
7490 byte_swap_32 (pdf
->u_buf
[7]),
7492 byte_swap_32 (pdf
->o_buf
[0]),
7493 byte_swap_32 (pdf
->o_buf
[1]),
7494 byte_swap_32 (pdf
->o_buf
[2]),
7495 byte_swap_32 (pdf
->o_buf
[3]),
7496 byte_swap_32 (pdf
->o_buf
[4]),
7497 byte_swap_32 (pdf
->o_buf
[5]),
7498 byte_swap_32 (pdf
->o_buf
[6]),
7499 byte_swap_32 (pdf
->o_buf
[7])
7502 else if (hash_mode
== 10410)
7504 pdf_t
*pdfs
= (pdf_t
*) data
.esalts_buf
;
7506 pdf_t
*pdf
= &pdfs
[salt_pos
];
7508 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",
7516 byte_swap_32 (pdf
->id_buf
[0]),
7517 byte_swap_32 (pdf
->id_buf
[1]),
7518 byte_swap_32 (pdf
->id_buf
[2]),
7519 byte_swap_32 (pdf
->id_buf
[3]),
7521 byte_swap_32 (pdf
->u_buf
[0]),
7522 byte_swap_32 (pdf
->u_buf
[1]),
7523 byte_swap_32 (pdf
->u_buf
[2]),
7524 byte_swap_32 (pdf
->u_buf
[3]),
7525 byte_swap_32 (pdf
->u_buf
[4]),
7526 byte_swap_32 (pdf
->u_buf
[5]),
7527 byte_swap_32 (pdf
->u_buf
[6]),
7528 byte_swap_32 (pdf
->u_buf
[7]),
7530 byte_swap_32 (pdf
->o_buf
[0]),
7531 byte_swap_32 (pdf
->o_buf
[1]),
7532 byte_swap_32 (pdf
->o_buf
[2]),
7533 byte_swap_32 (pdf
->o_buf
[3]),
7534 byte_swap_32 (pdf
->o_buf
[4]),
7535 byte_swap_32 (pdf
->o_buf
[5]),
7536 byte_swap_32 (pdf
->o_buf
[6]),
7537 byte_swap_32 (pdf
->o_buf
[7])
7540 else if (hash_mode
== 10420)
7542 pdf_t
*pdfs
= (pdf_t
*) data
.esalts_buf
;
7544 pdf_t
*pdf
= &pdfs
[salt_pos
];
7546 uint8_t *rc4key
= (uint8_t *) pdf
->rc4key
;
7548 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",
7556 byte_swap_32 (pdf
->id_buf
[0]),
7557 byte_swap_32 (pdf
->id_buf
[1]),
7558 byte_swap_32 (pdf
->id_buf
[2]),
7559 byte_swap_32 (pdf
->id_buf
[3]),
7561 byte_swap_32 (pdf
->u_buf
[0]),
7562 byte_swap_32 (pdf
->u_buf
[1]),
7563 byte_swap_32 (pdf
->u_buf
[2]),
7564 byte_swap_32 (pdf
->u_buf
[3]),
7565 byte_swap_32 (pdf
->u_buf
[4]),
7566 byte_swap_32 (pdf
->u_buf
[5]),
7567 byte_swap_32 (pdf
->u_buf
[6]),
7568 byte_swap_32 (pdf
->u_buf
[7]),
7570 byte_swap_32 (pdf
->o_buf
[0]),
7571 byte_swap_32 (pdf
->o_buf
[1]),
7572 byte_swap_32 (pdf
->o_buf
[2]),
7573 byte_swap_32 (pdf
->o_buf
[3]),
7574 byte_swap_32 (pdf
->o_buf
[4]),
7575 byte_swap_32 (pdf
->o_buf
[5]),
7576 byte_swap_32 (pdf
->o_buf
[6]),
7577 byte_swap_32 (pdf
->o_buf
[7]),
7585 else if (hash_mode
== 10500)
7587 pdf_t
*pdfs
= (pdf_t
*) data
.esalts_buf
;
7589 pdf_t
*pdf
= &pdfs
[salt_pos
];
7591 if (pdf
->id_len
== 32)
7593 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",
7601 byte_swap_32 (pdf
->id_buf
[0]),
7602 byte_swap_32 (pdf
->id_buf
[1]),
7603 byte_swap_32 (pdf
->id_buf
[2]),
7604 byte_swap_32 (pdf
->id_buf
[3]),
7605 byte_swap_32 (pdf
->id_buf
[4]),
7606 byte_swap_32 (pdf
->id_buf
[5]),
7607 byte_swap_32 (pdf
->id_buf
[6]),
7608 byte_swap_32 (pdf
->id_buf
[7]),
7610 byte_swap_32 (pdf
->u_buf
[0]),
7611 byte_swap_32 (pdf
->u_buf
[1]),
7612 byte_swap_32 (pdf
->u_buf
[2]),
7613 byte_swap_32 (pdf
->u_buf
[3]),
7614 byte_swap_32 (pdf
->u_buf
[4]),
7615 byte_swap_32 (pdf
->u_buf
[5]),
7616 byte_swap_32 (pdf
->u_buf
[6]),
7617 byte_swap_32 (pdf
->u_buf
[7]),
7619 byte_swap_32 (pdf
->o_buf
[0]),
7620 byte_swap_32 (pdf
->o_buf
[1]),
7621 byte_swap_32 (pdf
->o_buf
[2]),
7622 byte_swap_32 (pdf
->o_buf
[3]),
7623 byte_swap_32 (pdf
->o_buf
[4]),
7624 byte_swap_32 (pdf
->o_buf
[5]),
7625 byte_swap_32 (pdf
->o_buf
[6]),
7626 byte_swap_32 (pdf
->o_buf
[7])
7631 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",
7639 byte_swap_32 (pdf
->id_buf
[0]),
7640 byte_swap_32 (pdf
->id_buf
[1]),
7641 byte_swap_32 (pdf
->id_buf
[2]),
7642 byte_swap_32 (pdf
->id_buf
[3]),
7644 byte_swap_32 (pdf
->u_buf
[0]),
7645 byte_swap_32 (pdf
->u_buf
[1]),
7646 byte_swap_32 (pdf
->u_buf
[2]),
7647 byte_swap_32 (pdf
->u_buf
[3]),
7648 byte_swap_32 (pdf
->u_buf
[4]),
7649 byte_swap_32 (pdf
->u_buf
[5]),
7650 byte_swap_32 (pdf
->u_buf
[6]),
7651 byte_swap_32 (pdf
->u_buf
[7]),
7653 byte_swap_32 (pdf
->o_buf
[0]),
7654 byte_swap_32 (pdf
->o_buf
[1]),
7655 byte_swap_32 (pdf
->o_buf
[2]),
7656 byte_swap_32 (pdf
->o_buf
[3]),
7657 byte_swap_32 (pdf
->o_buf
[4]),
7658 byte_swap_32 (pdf
->o_buf
[5]),
7659 byte_swap_32 (pdf
->o_buf
[6]),
7660 byte_swap_32 (pdf
->o_buf
[7])
7664 else if (hash_mode
== 10600)
7666 uint digest_idx
= salt
.digests_offset
+ digest_pos
;
7668 hashinfo_t
**hashinfo_ptr
= data
.hash_info
;
7669 char *hash_buf
= hashinfo_ptr
[digest_idx
]->orighash
;
7671 snprintf (out_buf
, len
-1, "%s", hash_buf
);
7673 else if (hash_mode
== 10700)
7675 uint digest_idx
= salt
.digests_offset
+ digest_pos
;
7677 hashinfo_t
**hashinfo_ptr
= data
.hash_info
;
7678 char *hash_buf
= hashinfo_ptr
[digest_idx
]->orighash
;
7680 snprintf (out_buf
, len
-1, "%s", hash_buf
);
7682 else if (hash_mode
== 10900)
7684 uint digest_idx
= salt
.digests_offset
+ digest_pos
;
7686 hashinfo_t
**hashinfo_ptr
= data
.hash_info
;
7687 char *hash_buf
= hashinfo_ptr
[digest_idx
]->orighash
;
7689 snprintf (out_buf
, len
-1, "%s", hash_buf
);
7691 else if (hash_mode
== 11100)
7693 uint32_t salt_challenge
= salt
.salt_buf
[0];
7695 salt_challenge
= byte_swap_32 (salt_challenge
);
7697 unsigned char *user_name
= (unsigned char *) (salt
.salt_buf
+ 1);
7699 snprintf (out_buf
, len
-1, "%s%s*%08x*%08x%08x%08x%08x",
7700 SIGNATURE_POSTGRESQL_AUTH
,
7708 else if (hash_mode
== 11200)
7710 snprintf (out_buf
, len
-1, "%s%s*%08x%08x%08x%08x%08x",
7711 SIGNATURE_MYSQL_AUTH
,
7712 (unsigned char *) salt
.salt_buf
,
7719 else if (hash_mode
== 11300)
7721 bitcoin_wallet_t
*bitcoin_wallets
= (bitcoin_wallet_t
*) data
.esalts_buf
;
7723 bitcoin_wallet_t
*bitcoin_wallet
= &bitcoin_wallets
[salt_pos
];
7725 const uint cry_master_len
= bitcoin_wallet
->cry_master_len
;
7726 const uint ckey_len
= bitcoin_wallet
->ckey_len
;
7727 const uint public_key_len
= bitcoin_wallet
->public_key_len
;
7729 char *cry_master_buf
= (char *) mymalloc ((cry_master_len
* 2) + 1);
7730 char *ckey_buf
= (char *) mymalloc ((ckey_len
* 2) + 1);
7731 char *public_key_buf
= (char *) mymalloc ((public_key_len
* 2) + 1);
7733 for (uint i
= 0, j
= 0; i
< cry_master_len
; i
+= 1, j
+= 2)
7735 const uint8_t *ptr
= (const uint8_t *) bitcoin_wallet
->cry_master_buf
;
7737 sprintf (cry_master_buf
+ j
, "%02x", ptr
[i
]);
7740 for (uint i
= 0, j
= 0; i
< ckey_len
; i
+= 1, j
+= 2)
7742 const uint8_t *ptr
= (const uint8_t *) bitcoin_wallet
->ckey_buf
;
7744 sprintf (ckey_buf
+ j
, "%02x", ptr
[i
]);
7747 for (uint i
= 0, j
= 0; i
< public_key_len
; i
+= 1, j
+= 2)
7749 const uint8_t *ptr
= (const uint8_t *) bitcoin_wallet
->public_key_buf
;
7751 sprintf (public_key_buf
+ j
, "%02x", ptr
[i
]);
7754 snprintf (out_buf
, len
-1, "%s%d$%s$%d$%s$%d$%d$%s$%d$%s",
7755 SIGNATURE_BITCOIN_WALLET
,
7759 (unsigned char *) salt
.salt_buf
,
7767 free (cry_master_buf
);
7769 free (public_key_buf
);
7771 else if (hash_mode
== 11400)
7773 uint digest_idx
= salt
.digests_offset
+ digest_pos
;
7775 hashinfo_t
**hashinfo_ptr
= data
.hash_info
;
7776 char *hash_buf
= hashinfo_ptr
[digest_idx
]->orighash
;
7778 snprintf (out_buf
, len
-1, "%s", hash_buf
);
7780 else if (hash_mode
== 11600)
7782 seven_zip_t
*seven_zips
= (seven_zip_t
*) data
.esalts_buf
;
7784 seven_zip_t
*seven_zip
= &seven_zips
[salt_pos
];
7786 const uint data_len
= seven_zip
->data_len
;
7788 char *data_buf
= (char *) mymalloc ((data_len
* 2) + 1);
7790 for (uint i
= 0, j
= 0; i
< data_len
; i
+= 1, j
+= 2)
7792 const uint8_t *ptr
= (const uint8_t *) seven_zip
->data_buf
;
7794 sprintf (data_buf
+ j
, "%02x", ptr
[i
]);
7797 snprintf (out_buf
, len
-1, "%s%u$%u$%u$%s$%u$%08x%08x%08x%08x$%u$%u$%u$%s",
7798 SIGNATURE_SEVEN_ZIP
,
7802 (char *) seven_zip
->salt_buf
,
7804 seven_zip
->iv_buf
[0],
7805 seven_zip
->iv_buf
[1],
7806 seven_zip
->iv_buf
[2],
7807 seven_zip
->iv_buf
[3],
7809 seven_zip
->data_len
,
7810 seven_zip
->unpack_size
,
7815 else if (hash_mode
== 11700)
7817 snprintf (out_buf
, len
-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
7827 else if (hash_mode
== 11800)
7829 snprintf (out_buf
, len
-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
7847 else if (hash_mode
== 11900)
7849 uint digest_idx
= salt
.digests_offset
+ digest_pos
;
7851 hashinfo_t
**hashinfo_ptr
= data
.hash_info
;
7852 char *hash_buf
= hashinfo_ptr
[digest_idx
]->orighash
;
7854 snprintf (out_buf
, len
-1, "%s", hash_buf
);
7856 else if (hash_mode
== 12000)
7858 uint digest_idx
= salt
.digests_offset
+ digest_pos
;
7860 hashinfo_t
**hashinfo_ptr
= data
.hash_info
;
7861 char *hash_buf
= hashinfo_ptr
[digest_idx
]->orighash
;
7863 snprintf (out_buf
, len
-1, "%s", hash_buf
);
7865 else if (hash_mode
== 12100)
7867 uint digest_idx
= salt
.digests_offset
+ digest_pos
;
7869 hashinfo_t
**hashinfo_ptr
= data
.hash_info
;
7870 char *hash_buf
= hashinfo_ptr
[digest_idx
]->orighash
;
7872 snprintf (out_buf
, len
-1, "%s", hash_buf
);
7874 else if (hash_mode
== 12200)
7876 uint
*ptr_digest
= digest_buf
;
7877 uint
*ptr_salt
= salt
.salt_buf
;
7879 snprintf (out_buf
, len
-1, "%s0$1$%08x%08x$%08x%08x",
7886 else if (hash_mode
== 12300)
7888 uint
*ptr_digest
= digest_buf
;
7889 uint
*ptr_salt
= salt
.salt_buf
;
7891 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",
7892 ptr_digest
[ 0], ptr_digest
[ 1],
7893 ptr_digest
[ 2], ptr_digest
[ 3],
7894 ptr_digest
[ 4], ptr_digest
[ 5],
7895 ptr_digest
[ 6], ptr_digest
[ 7],
7896 ptr_digest
[ 8], ptr_digest
[ 9],
7897 ptr_digest
[10], ptr_digest
[11],
7898 ptr_digest
[12], ptr_digest
[13],
7899 ptr_digest
[14], ptr_digest
[15],
7905 else if (hash_mode
== 12400)
7907 // encode iteration count
7911 salt_iter
[0] = int_to_itoa64 ((salt
.salt_iter
) & 0x3f);
7912 salt_iter
[1] = int_to_itoa64 ((salt
.salt_iter
>> 6) & 0x3f);
7913 salt_iter
[2] = int_to_itoa64 ((salt
.salt_iter
>> 12) & 0x3f);
7914 salt_iter
[3] = int_to_itoa64 ((salt
.salt_iter
>> 18) & 0x3f);
7919 ptr_salt
[0] = int_to_itoa64 ((salt
.salt_buf
[0] ) & 0x3f);
7920 ptr_salt
[1] = int_to_itoa64 ((salt
.salt_buf
[0] >> 6) & 0x3f);
7921 ptr_salt
[2] = int_to_itoa64 ((salt
.salt_buf
[0] >> 12) & 0x3f);
7922 ptr_salt
[3] = int_to_itoa64 ((salt
.salt_buf
[0] >> 18) & 0x3f);
7927 memset (tmp_buf
, 0, sizeof (tmp_buf
));
7929 digest_buf
[0] = byte_swap_32 (digest_buf
[0]);
7930 digest_buf
[1] = byte_swap_32 (digest_buf
[1]);
7932 memcpy (tmp_buf
, digest_buf
, 8);
7934 base64_encode (int_to_itoa64
, tmp_buf
, 8, ptr_plain
);
7938 // fill the resulting buffer
7940 snprintf (out_buf
, len
- 1, "_%s%s%s", salt_iter
, ptr_salt
, ptr_plain
);
7942 else if (hash_mode
== 12500)
7944 snprintf (out_buf
, len
- 1, "%s*0*%08x%08x*%08x%08x%08x%08x",
7946 byte_swap_32 (salt
.salt_buf
[0]),
7947 byte_swap_32 (salt
.salt_buf
[1]),
7953 else if (hash_mode
== 12600)
7955 snprintf (out_buf
, len
- 1, "%08x%08x%08x%08x%08x%08x%08x%08x",
7956 digest_buf
[0] + salt
.salt_buf_pc
[0],
7957 digest_buf
[1] + salt
.salt_buf_pc
[1],
7958 digest_buf
[2] + salt
.salt_buf_pc
[2],
7959 digest_buf
[3] + salt
.salt_buf_pc
[3],
7960 digest_buf
[4] + salt
.salt_buf_pc
[4],
7961 digest_buf
[5] + salt
.salt_buf_pc
[5],
7962 digest_buf
[6] + salt
.salt_buf_pc
[6],
7963 digest_buf
[7] + salt
.salt_buf_pc
[7]);
7965 else if (hash_mode
== 12700)
7967 uint digest_idx
= salt
.digests_offset
+ digest_pos
;
7969 hashinfo_t
**hashinfo_ptr
= data
.hash_info
;
7970 char *hash_buf
= hashinfo_ptr
[digest_idx
]->orighash
;
7972 snprintf (out_buf
, len
-1, "%s", hash_buf
);
7974 else if (hash_mode
== 12800)
7976 const uint8_t *ptr
= (const uint8_t *) salt
.salt_buf
;
7978 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",
7991 byte_swap_32 (digest_buf
[0]),
7992 byte_swap_32 (digest_buf
[1]),
7993 byte_swap_32 (digest_buf
[2]),
7994 byte_swap_32 (digest_buf
[3]),
7995 byte_swap_32 (digest_buf
[4]),
7996 byte_swap_32 (digest_buf
[5]),
7997 byte_swap_32 (digest_buf
[6]),
7998 byte_swap_32 (digest_buf
[7])
8003 if (hash_type
== HASH_TYPE_MD4
)
8005 snprintf (out_buf
, 255, "%08x%08x%08x%08x",
8011 else if (hash_type
== HASH_TYPE_MD5
)
8013 snprintf (out_buf
, len
-1, "%08x%08x%08x%08x",
8019 else if (hash_type
== HASH_TYPE_SHA1
)
8021 snprintf (out_buf
, len
-1, "%08x%08x%08x%08x%08x",
8028 else if (hash_type
== HASH_TYPE_SHA256
)
8030 snprintf (out_buf
, len
-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8040 else if (hash_type
== HASH_TYPE_SHA384
)
8042 uint
*ptr
= digest_buf
;
8044 snprintf (out_buf
, len
-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8052 else if (hash_type
== HASH_TYPE_SHA512
)
8054 uint
*ptr
= digest_buf
;
8056 snprintf (out_buf
, len
-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8066 else if (hash_type
== HASH_TYPE_LM
)
8068 snprintf (out_buf
, len
-1, "%08x%08x",
8072 else if (hash_type
== HASH_TYPE_ORACLEH
)
8074 snprintf (out_buf
, len
-1, "%08X%08X",
8078 else if (hash_type
== HASH_TYPE_BCRYPT
)
8080 base64_encode (int_to_bf64
, (char *) salt
.salt_buf
, 16, tmp_buf
+ 0);
8081 base64_encode (int_to_bf64
, (char *) digest_buf
, 23, tmp_buf
+ 22);
8083 tmp_buf
[22 + 31] = 0; // base64_encode wants to pad
8085 snprintf (out_buf
, len
-1, "%s$%s", (char *) salt
.salt_sign
, tmp_buf
);
8087 else if (hash_type
== HASH_TYPE_KECCAK
)
8089 uint
*ptr
= digest_buf
;
8091 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",
8119 out_buf
[salt
.keccak_mdlen
* 2] = 0;
8121 else if (hash_type
== HASH_TYPE_RIPEMD160
)
8123 snprintf (out_buf
, 255, "%08x%08x%08x%08x%08x",
8130 else if (hash_type
== HASH_TYPE_WHIRLPOOL
)
8132 digest_buf
[ 0] = digest_buf
[ 0];
8133 digest_buf
[ 1] = digest_buf
[ 1];
8134 digest_buf
[ 2] = digest_buf
[ 2];
8135 digest_buf
[ 3] = digest_buf
[ 3];
8136 digest_buf
[ 4] = digest_buf
[ 4];
8137 digest_buf
[ 5] = digest_buf
[ 5];
8138 digest_buf
[ 6] = digest_buf
[ 6];
8139 digest_buf
[ 7] = digest_buf
[ 7];
8140 digest_buf
[ 8] = digest_buf
[ 8];
8141 digest_buf
[ 9] = digest_buf
[ 9];
8142 digest_buf
[10] = digest_buf
[10];
8143 digest_buf
[11] = digest_buf
[11];
8144 digest_buf
[12] = digest_buf
[12];
8145 digest_buf
[13] = digest_buf
[13];
8146 digest_buf
[14] = digest_buf
[14];
8147 digest_buf
[15] = digest_buf
[15];
8149 snprintf (out_buf
, len
-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8167 else if (hash_type
== HASH_TYPE_GOST
)
8169 snprintf (out_buf
, len
-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8179 else if (hash_type
== HASH_TYPE_MYSQL
)
8181 snprintf (out_buf
, len
-1, "%08x%08x",
8185 else if (hash_type
== HASH_TYPE_LOTUS5
)
8187 snprintf (out_buf
, len
-1, "%08x%08x%08x%08x",
8193 else if (hash_type
== HASH_TYPE_LOTUS6
)
8195 digest_buf
[ 0] = byte_swap_32 (digest_buf
[ 0]);
8196 digest_buf
[ 1] = byte_swap_32 (digest_buf
[ 1]);
8197 digest_buf
[ 2] = byte_swap_32 (digest_buf
[ 2]);
8198 digest_buf
[ 3] = byte_swap_32 (digest_buf
[ 3]);
8202 memcpy (buf
+ 0, salt
.salt_buf
, 5);
8203 memcpy (buf
+ 5, digest_buf
, 9);
8207 base64_encode (int_to_lotus64
, buf
, 14, tmp_buf
);
8209 tmp_buf
[18] = salt
.salt_buf_pc
[7];
8212 snprintf (out_buf
, len
-1, "(G%s)", tmp_buf
);
8214 else if (hash_type
== HASH_TYPE_LOTUS8
)
8218 memset (buf
, 0, sizeof (buf
));
8222 memcpy (buf
+ 0, salt
.salt_buf
, 16);
8228 snprintf (buf
+ 16, 11, "%010i", salt
.salt_iter
+ 1);
8232 buf
[26] = salt
.salt_buf_pc
[0];
8233 buf
[27] = salt
.salt_buf_pc
[1];
8237 memcpy (buf
+ 28, digest_buf
, 8);
8239 base64_encode (int_to_lotus64
, buf
, 36, tmp_buf
);
8243 snprintf (out_buf
, len
-1, "(H%s)", tmp_buf
);
8245 else if (hash_type
== HASH_TYPE_CRC32
)
8247 snprintf (out_buf
, len
-1, "%08x", byte_swap_32 (digest_buf
[0]));
8251 if (salt_type
== SALT_TYPE_INTERN
)
8253 size_t pos
= strlen (out_buf
);
8255 out_buf
[pos
] = data
.separator
;
8257 char *ptr
= (char *) salt
.salt_buf
;
8259 memcpy (out_buf
+ pos
+ 1, ptr
, salt
.salt_len
);
8261 out_buf
[pos
+ 1 + salt
.salt_len
] = 0;
8265 void to_hccap_t (hccap_t
*hccap
, uint salt_pos
, uint digest_pos
)
8267 memset (hccap
, 0, sizeof (hccap_t
));
8269 salt_t
*salt
= &data
.salts_buf
[salt_pos
];
8271 memcpy (hccap
->essid
, salt
->salt_buf
, salt
->salt_len
);
8273 wpa_t
*wpas
= (wpa_t
*) data
.esalts_buf
;
8274 wpa_t
*wpa
= &wpas
[salt_pos
];
8276 hccap
->keyver
= wpa
->keyver
;
8278 hccap
->eapol_size
= wpa
->eapol_size
;
8280 if (wpa
->keyver
!= 1)
8284 for (uint i
= 0; i
< 64; i
++)
8286 eapol_tmp
[i
] = byte_swap_32 (wpa
->eapol
[i
]);
8289 memcpy (hccap
->eapol
, eapol_tmp
, wpa
->eapol_size
);
8293 memcpy (hccap
->eapol
, wpa
->eapol
, wpa
->eapol_size
);
8298 for (int i
= 5; i
< 25; i
++)
8300 pke_tmp
[i
] = byte_swap_32 (wpa
->pke
[i
]);
8303 char *pke_ptr
= (char *) pke_tmp
;
8305 memcpy (hccap
->mac1
, pke_ptr
+ 23, 6);
8306 memcpy (hccap
->mac2
, pke_ptr
+ 29, 6);
8307 memcpy (hccap
->nonce1
, pke_ptr
+ 67, 32);
8308 memcpy (hccap
->nonce2
, pke_ptr
+ 35, 32);
8310 char *digests_buf_ptr
= (char *) data
.digests_buf
;
8312 uint dgst_size
= data
.dgst_size
;
8314 uint
*digest_ptr
= (uint
*) (digests_buf_ptr
+ (data
.salts_buf
[salt_pos
].digests_offset
* dgst_size
) + (digest_pos
* dgst_size
));
8316 if (wpa
->keyver
!= 1)
8320 digest_tmp
[0] = byte_swap_32 (digest_ptr
[0]);
8321 digest_tmp
[1] = byte_swap_32 (digest_ptr
[1]);
8322 digest_tmp
[2] = byte_swap_32 (digest_ptr
[2]);
8323 digest_tmp
[3] = byte_swap_32 (digest_ptr
[3]);
8325 memcpy (hccap
->keymic
, digest_tmp
, 16);
8329 memcpy (hccap
->keymic
, digest_ptr
, 16);
8333 void SuspendThreads ()
8335 if (data
.devices_status
== STATUS_RUNNING
)
8337 hc_timer_set (&data
.timer_paused
);
8339 data
.devices_status
= STATUS_PAUSED
;
8341 log_info ("Paused");
8345 void ResumeThreads ()
8347 if (data
.devices_status
== STATUS_PAUSED
)
8351 hc_timer_get (data
.timer_paused
, ms_paused
);
8353 data
.ms_paused
+= ms_paused
;
8355 data
.devices_status
= STATUS_RUNNING
;
8357 log_info ("Resumed");
8363 if (data
.devices_status
!= STATUS_RUNNING
) return;
8365 data
.devices_status
= STATUS_BYPASS
;
8367 log_info ("Next dictionary / mask in queue selected, bypassing current one");
8370 void stop_at_checkpoint ()
8372 if (data
.devices_status
!= STATUS_STOP_AT_CHECKPOINT
)
8374 if (data
.devices_status
!= STATUS_RUNNING
) return;
8377 // this feature only makes sense if --restore-disable was not specified
8379 if (data
.restore_disable
== 1)
8381 log_info ("WARNING: this feature is disabled when --restore-disable was specified");
8386 // check if monitoring of Restore Point updates should be enabled or disabled
8388 if (data
.devices_status
!= STATUS_STOP_AT_CHECKPOINT
)
8390 data
.devices_status
= STATUS_STOP_AT_CHECKPOINT
;
8392 // save the current restore point value
8394 data
.checkpoint_cur_words
= get_lowest_words_done ();
8396 log_info ("Checkpoint enabled: will quit at next Restore Point update");
8400 data
.devices_status
= STATUS_RUNNING
;
8402 // reset the global value for checkpoint checks
8404 data
.checkpoint_cur_words
= 0;
8406 log_info ("Checkpoint disabled: Restore Point updates will no longer be monitored");
8412 if (data
.devices_status
== STATUS_INIT
) return;
8413 if (data
.devices_status
== STATUS_STARTING
) return;
8415 data
.devices_status
= STATUS_ABORTED
;
8420 if (data
.devices_status
== STATUS_INIT
) return;
8421 if (data
.devices_status
== STATUS_STARTING
) return;
8423 data
.devices_status
= STATUS_QUIT
;
8426 void load_kernel (const char *kernel_file
, int num_devices
, size_t *kernel_lengths
, const unsigned char **kernel_sources
)
8430 if ((fp
= fopen (kernel_file
, "rb")) != NULL
)
8434 memset (&st
, 0, sizeof (st
));
8436 stat (kernel_file
, &st
);
8438 unsigned char *buf
= (unsigned char *) mymalloc (st
.st_size
+ 1);
8440 size_t num_read
= fread (buf
, sizeof (unsigned char), st
.st_size
, fp
);
8442 if (num_read
!= (size_t) st
.st_size
)
8444 log_error ("ERROR: %s: %s", kernel_file
, strerror (errno
));
8451 buf
[st
.st_size
] = 0;
8453 for (int i
= 0; i
< num_devices
; i
++)
8455 kernel_lengths
[i
] = (size_t) st
.st_size
;
8457 kernel_sources
[i
] = buf
;
8462 log_error ("ERROR: %s: %s", kernel_file
, strerror (errno
));
8470 void writeProgramBin (char *dst
, unsigned char *binary
, size_t binary_size
)
8472 FILE *fp
= fopen (dst
, "wb");
8474 fwrite (binary
, sizeof (unsigned char), binary_size
, fp
);
8484 restore_data_t
*init_restore (int argc
, char **argv
)
8486 restore_data_t
*rd
= (restore_data_t
*) mymalloc (sizeof (restore_data_t
));
8488 if (data
.restore_disable
== 0)
8490 FILE *fp
= fopen (data
.eff_restore_file
, "rb");
8494 size_t nread
= fread (rd
, sizeof (restore_data_t
), 1, fp
);
8498 log_error ("ERROR: cannot read %s", data
.eff_restore_file
);
8507 char pidbin
[BUFSIZ
];
8512 memset (pidbin
, 0, sizeof (pidbin
));
8514 snprintf (pidbin
, sizeof (pidbin
) - 1, "/proc/%d/cmdline", rd
->pid
);
8516 FILE *fd
= fopen (pidbin
, "rb");
8520 pidbin_len
= fread (pidbin
, 1, BUFSIZ
, fd
);
8522 pidbin
[pidbin_len
] = 0;
8526 char *argv0_r
= strrchr (argv
[0], '/');
8528 char *pidbin_r
= strrchr (pidbin
, '/');
8530 if (argv0_r
== NULL
) argv0_r
= argv
[0];
8532 if (pidbin_r
== NULL
) pidbin_r
= pidbin
;
8534 if (strcmp (argv0_r
, pidbin_r
) == 0)
8536 log_error ("ERROR: already an instance %s running on pid %d", pidbin
, rd
->pid
);
8543 HANDLE hProcess
= OpenProcess (PROCESS_ALL_ACCESS
, FALSE
, rd
->pid
);
8545 char pidbin2
[BUFSIZ
];
8549 memset (pidbin2
, 0, sizeof (pidbin2
));
8551 pidbin_len
= GetModuleFileName (NULL
, pidbin
, BUFSIZ
);
8552 pidbin2_len
= GetModuleFileNameEx (hProcess
, NULL
, pidbin2
, BUFSIZ
);
8554 pidbin
[pidbin_len
] = 0;
8555 pidbin2
[pidbin2_len
] = 0;
8559 if (strcmp (pidbin
, pidbin2
) == 0)
8561 log_error ("ERROR: already an instance %s running on pid %d", pidbin2
, rd
->pid
);
8569 if (rd
->version_bin
< RESTORE_MIN
)
8571 log_error ("ERROR: cannot use outdated %s. Please remove it.", data
.eff_restore_file
);
8578 memset (rd
, 0, sizeof (restore_data_t
));
8580 rd
->version_bin
= VERSION_BIN
;
8583 rd
->pid
= getpid ();
8585 rd
->pid
= GetCurrentProcessId ();
8588 if (getcwd (rd
->cwd
, 255) == NULL
)
8601 void read_restore (const char *eff_restore_file
, restore_data_t
*rd
)
8603 FILE *fp
= fopen (eff_restore_file
, "rb");
8607 log_error ("ERROR: restore file '%s': %s", eff_restore_file
, strerror (errno
));
8612 if (fread (rd
, sizeof (restore_data_t
), 1, fp
) != 1)
8614 log_error ("ERROR: cannot read %s", eff_restore_file
);
8619 rd
->argv
= (char **) mycalloc (rd
->argc
, sizeof (char *));
8621 for (uint i
= 0; i
< rd
->argc
; i
++)
8625 if (fgets (buf
, BUFSIZ
- 1, fp
) == NULL
)
8627 log_error ("ERROR: cannot read %s", eff_restore_file
);
8632 size_t len
= strlen (buf
);
8634 if (len
) buf
[len
- 1] = 0;
8636 rd
->argv
[i
] = mystrdup (buf
);
8643 char *nwd
= getcwd (new_cwd
, sizeof (new_cwd
));
8647 log_error ("Restore file is corrupted");
8650 if (strncmp (new_cwd
, rd
->cwd
, sizeof (new_cwd
)) != 0)
8652 if (getcwd (rd
->cwd
, sizeof (rd
->cwd
)) == NULL
)
8654 log_error ("ERROR: could not determine current user path: %s", strerror (errno
));
8659 log_info ("WARNING: Found old restore file, updating path to %s...", new_cwd
);
8663 if (chdir (rd
->cwd
))
8665 log_error ("ERROR: cannot chdir to %s: %s", rd
->cwd
, strerror (errno
));
8671 uint64_t get_lowest_words_done ()
8673 uint64_t words_cur
= -1;
8675 for (uint device_id
= 0; device_id
< data
.devices_cnt
; device_id
++)
8677 hc_device_param_t
*device_param
= &data
.devices_param
[device_id
];
8679 const uint64_t words_done
= device_param
->words_done
;
8681 if (words_done
< words_cur
) words_cur
= words_done
;
8684 // It's possible that a GPU's workload isn't finished right after a restore-case.
8685 // In that case, this function would return 0 and overwrite the real restore point
8686 // There's also data.words_cur which is set to rd->words_cur but it changes while
8687 // the attack is running therefore we should stick to rd->words_cur.
8688 // Note that -s influences rd->words_cur we should keep a close look on that.
8690 if (words_cur
< data
.rd
->words_cur
) words_cur
= data
.rd
->words_cur
;
8695 void write_restore (const char *new_restore_file
, restore_data_t
*rd
)
8697 uint64_t words_cur
= get_lowest_words_done ();
8699 rd
->words_cur
= words_cur
;
8701 FILE *fp
= fopen (new_restore_file
, "wb");
8705 log_error ("ERROR: %s: %s", new_restore_file
, strerror (errno
));
8710 if (setvbuf (fp
, NULL
, _IONBF
, 0))
8712 log_error ("ERROR: setvbuf file '%s': %s", new_restore_file
, strerror (errno
));
8717 fwrite (rd
, sizeof (restore_data_t
), 1, fp
);
8719 for (uint i
= 0; i
< rd
->argc
; i
++)
8721 fprintf (fp
, "%s", rd
->argv
[i
]);
8727 fsync (fileno (fp
));
8732 void cycle_restore ()
8734 const char *eff_restore_file
= data
.eff_restore_file
;
8735 const char *new_restore_file
= data
.new_restore_file
;
8737 restore_data_t
*rd
= data
.rd
;
8739 write_restore (new_restore_file
, rd
);
8743 memset (&st
, 0, sizeof(st
));
8745 if (stat (eff_restore_file
, &st
) == 0)
8747 if (unlink (eff_restore_file
))
8749 log_info ("WARN: unlink file '%s': %s", eff_restore_file
, strerror (errno
));
8753 if (rename (new_restore_file
, eff_restore_file
))
8755 log_info ("WARN: rename file '%s' to '%s': %s", new_restore_file
, eff_restore_file
, strerror (errno
));
8759 void check_checkpoint ()
8761 // if (data.restore_disable == 1) break; (this is already implied by previous checks)
8763 uint64_t words_cur
= get_lowest_words_done ();
8765 if (words_cur
!= data
.checkpoint_cur_words
)
8775 uint
set_gpu_accel (uint hash_mode
)
8779 case 0: return GET_ACCEL (0);
8780 case 10: return GET_ACCEL (10);
8781 case 11: return GET_ACCEL (11);
8782 case 12: return GET_ACCEL (12);
8783 case 20: return GET_ACCEL (20);
8784 case 21: return GET_ACCEL (21);
8785 case 22: return GET_ACCEL (22);
8786 case 23: return GET_ACCEL (23);
8787 case 30: return GET_ACCEL (30);
8788 case 40: return GET_ACCEL (40);
8789 case 50: return GET_ACCEL (50);
8790 case 60: return GET_ACCEL (60);
8791 case 100: return GET_ACCEL (100);
8792 case 101: return GET_ACCEL (101);
8793 case 110: return GET_ACCEL (110);
8794 case 111: return GET_ACCEL (111);
8795 case 112: return GET_ACCEL (112);
8796 case 120: return GET_ACCEL (120);
8797 case 121: return GET_ACCEL (121);
8798 case 122: return GET_ACCEL (122);
8799 case 124: return GET_ACCEL (124);
8800 case 130: return GET_ACCEL (130);
8801 case 131: return GET_ACCEL (131);
8802 case 132: return GET_ACCEL (132);
8803 case 133: return GET_ACCEL (133);
8804 case 140: return GET_ACCEL (140);
8805 case 141: return GET_ACCEL (141);
8806 case 150: return GET_ACCEL (150);
8807 case 160: return GET_ACCEL (160);
8808 case 190: return GET_ACCEL (190);
8809 case 200: return GET_ACCEL (200);
8810 case 300: return GET_ACCEL (300);
8811 case 400: return GET_ACCEL (400);
8812 case 500: return GET_ACCEL (500);
8813 case 501: return GET_ACCEL (501);
8814 case 900: return GET_ACCEL (900);
8815 case 910: return GET_ACCEL (910);
8816 case 1000: return GET_ACCEL (1000);
8817 case 1100: return GET_ACCEL (1100);
8818 case 1400: return GET_ACCEL (1400);
8819 case 1410: return GET_ACCEL (1410);
8820 case 1420: return GET_ACCEL (1420);
8821 case 1421: return GET_ACCEL (1421);
8822 case 1430: return GET_ACCEL (1430);
8823 case 1440: return GET_ACCEL (1440);
8824 case 1441: return GET_ACCEL (1441);
8825 case 1450: return GET_ACCEL (1450);
8826 case 1460: return GET_ACCEL (1460);
8827 case 1500: return GET_ACCEL (1500);
8828 case 1600: return GET_ACCEL (1600);
8829 case 1700: return GET_ACCEL (1700);
8830 case 1710: return GET_ACCEL (1710);
8831 case 1711: return GET_ACCEL (1711);
8832 case 1720: return GET_ACCEL (1720);
8833 case 1722: return GET_ACCEL (1722);
8834 case 1730: return GET_ACCEL (1730);
8835 case 1731: return GET_ACCEL (1731);
8836 case 1740: return GET_ACCEL (1740);
8837 case 1750: return GET_ACCEL (1750);
8838 case 1760: return GET_ACCEL (1760);
8839 case 1800: return GET_ACCEL (1800);
8840 case 2100: return GET_ACCEL (2100);
8841 case 2400: return GET_ACCEL (2400);
8842 case 2410: return GET_ACCEL (2410);
8843 case 2500: return GET_ACCEL (2500);
8844 case 2600: return GET_ACCEL (2600);
8845 case 2611: return GET_ACCEL (2611);
8846 case 2612: return GET_ACCEL (2612);
8847 case 2711: return GET_ACCEL (2711);
8848 case 2811: return GET_ACCEL (2811);
8849 case 3000: return GET_ACCEL (3000);
8850 case 3100: return GET_ACCEL (3100);
8851 case 3200: return GET_ACCEL (3200);
8852 case 3710: return GET_ACCEL (3710);
8853 case 3711: return GET_ACCEL (3711);
8854 case 3800: return GET_ACCEL (3800);
8855 case 4300: return GET_ACCEL (4300);
8856 case 4400: return GET_ACCEL (4400);
8857 case 4500: return GET_ACCEL (4500);
8858 case 4700: return GET_ACCEL (4700);
8859 case 4800: return GET_ACCEL (4800);
8860 case 4900: return GET_ACCEL (4900);
8861 case 5000: return GET_ACCEL (5000);
8862 case 5100: return GET_ACCEL (5100);
8863 case 5200: return GET_ACCEL (5200);
8864 case 5300: return GET_ACCEL (5300);
8865 case 5400: return GET_ACCEL (5400);
8866 case 5500: return GET_ACCEL (5500);
8867 case 5600: return GET_ACCEL (5600);
8868 case 5700: return GET_ACCEL (5700);
8869 case 5800: return GET_ACCEL (5800);
8870 case 6000: return GET_ACCEL (6000);
8871 case 6100: return GET_ACCEL (6100);
8872 case 6211: return GET_ACCEL (6211);
8873 case 6212: return GET_ACCEL (6212);
8874 case 6213: return GET_ACCEL (6213);
8875 case 6221: return GET_ACCEL (6221);
8876 case 6222: return GET_ACCEL (6222);
8877 case 6223: return GET_ACCEL (6223);
8878 case 6231: return GET_ACCEL (6231);
8879 case 6232: return GET_ACCEL (6232);
8880 case 6233: return GET_ACCEL (6233);
8881 case 6241: return GET_ACCEL (6241);
8882 case 6242: return GET_ACCEL (6242);
8883 case 6243: return GET_ACCEL (6243);
8884 case 6300: return GET_ACCEL (6300);
8885 case 6400: return GET_ACCEL (6400);
8886 case 6500: return GET_ACCEL (6500);
8887 case 6600: return GET_ACCEL (6600);
8888 case 6700: return GET_ACCEL (6700);
8889 case 6800: return GET_ACCEL (6800);
8890 case 6900: return GET_ACCEL (6900);
8891 case 7100: return GET_ACCEL (7100);
8892 case 7200: return GET_ACCEL (7200);
8893 case 7300: return GET_ACCEL (7300);
8894 case 7400: return GET_ACCEL (7400);
8895 case 7500: return GET_ACCEL (7500);
8896 case 7600: return GET_ACCEL (7600);
8897 case 7700: return GET_ACCEL (7700);
8898 case 7800: return GET_ACCEL (7800);
8899 case 7900: return GET_ACCEL (7900);
8900 case 8000: return GET_ACCEL (8000);
8901 case 8100: return GET_ACCEL (8100);
8902 case 8200: return GET_ACCEL (8200);
8903 case 8300: return GET_ACCEL (8300);
8904 case 8400: return GET_ACCEL (8400);
8905 case 8500: return GET_ACCEL (8500);
8906 case 8600: return GET_ACCEL (8600);
8907 case 8700: return GET_ACCEL (8700);
8908 case 8800: return GET_ACCEL (8800);
8909 case 8900: return GET_ACCEL (8900);
8910 case 9000: return GET_ACCEL (9000);
8911 case 9100: return GET_ACCEL (9100);
8912 case 9200: return GET_ACCEL (9200);
8913 case 9300: return GET_ACCEL (9300);
8914 case 9400: return GET_ACCEL (9400);
8915 case 9500: return GET_ACCEL (9500);
8916 case 9600: return GET_ACCEL (9600);
8917 case 9700: return GET_ACCEL (9700);
8918 case 9710: return GET_ACCEL (9710);
8919 case 9720: return GET_ACCEL (9720);
8920 case 9800: return GET_ACCEL (9800);
8921 case 9810: return GET_ACCEL (9810);
8922 case 9820: return GET_ACCEL (9820);
8923 case 9900: return GET_ACCEL (9900);
8924 case 10000: return GET_ACCEL (10000);
8925 case 10100: return GET_ACCEL (10100);
8926 case 10200: return GET_ACCEL (10200);
8927 case 10300: return GET_ACCEL (10300);
8928 case 10400: return GET_ACCEL (10400);
8929 case 10410: return GET_ACCEL (10410);
8930 case 10420: return GET_ACCEL (10420);
8931 case 10500: return GET_ACCEL (10500);
8932 case 10600: return GET_ACCEL (10600);
8933 case 10700: return GET_ACCEL (10700);
8934 case 10800: return GET_ACCEL (10800);
8935 case 10900: return GET_ACCEL (10900);
8936 case 11000: return GET_ACCEL (11000);
8937 case 11100: return GET_ACCEL (11100);
8938 case 11200: return GET_ACCEL (11200);
8939 case 11300: return GET_ACCEL (11300);
8940 case 11400: return GET_ACCEL (11400);
8941 case 11500: return GET_ACCEL (11500);
8942 case 11600: return GET_ACCEL (11600);
8943 case 11700: return GET_ACCEL (11700);
8944 case 11800: return GET_ACCEL (11800);
8945 case 11900: return GET_ACCEL (11900);
8946 case 12000: return GET_ACCEL (12000);
8947 case 12100: return GET_ACCEL (12100);
8948 case 12200: return GET_ACCEL (12200);
8949 case 12300: return GET_ACCEL (12300);
8950 case 12400: return GET_ACCEL (12400);
8951 case 12500: return GET_ACCEL (12500);
8952 case 12600: return GET_ACCEL (12600);
8953 case 12700: return GET_ACCEL (12700);
8954 case 12800: return GET_ACCEL (12800);
8960 uint
set_gpu_loops (uint hash_mode
)
8964 case 0: return GET_LOOPS (0);
8965 case 10: return GET_LOOPS (10);
8966 case 11: return GET_LOOPS (11);
8967 case 12: return GET_LOOPS (12);
8968 case 20: return GET_LOOPS (20);
8969 case 21: return GET_LOOPS (21);
8970 case 22: return GET_LOOPS (22);
8971 case 23: return GET_LOOPS (23);
8972 case 30: return GET_LOOPS (30);
8973 case 40: return GET_LOOPS (40);
8974 case 50: return GET_LOOPS (50);
8975 case 60: return GET_LOOPS (60);
8976 case 100: return GET_LOOPS (100);
8977 case 101: return GET_LOOPS (101);
8978 case 110: return GET_LOOPS (110);
8979 case 111: return GET_LOOPS (111);
8980 case 112: return GET_LOOPS (112);
8981 case 120: return GET_LOOPS (120);
8982 case 121: return GET_LOOPS (121);
8983 case 122: return GET_LOOPS (122);
8984 case 124: return GET_LOOPS (124);
8985 case 130: return GET_LOOPS (130);
8986 case 131: return GET_LOOPS (131);
8987 case 132: return GET_LOOPS (132);
8988 case 133: return GET_LOOPS (133);
8989 case 140: return GET_LOOPS (140);
8990 case 141: return GET_LOOPS (141);
8991 case 150: return GET_LOOPS (150);
8992 case 160: return GET_LOOPS (160);
8993 case 190: return GET_LOOPS (190);
8994 case 200: return GET_LOOPS (200);
8995 case 300: return GET_LOOPS (300);
8996 case 400: return GET_LOOPS (400);
8997 case 500: return GET_LOOPS (500);
8998 case 501: return GET_LOOPS (501);
8999 case 900: return GET_LOOPS (900);
9000 case 910: return GET_LOOPS (910);
9001 case 1000: return GET_LOOPS (1000);
9002 case 1100: return GET_LOOPS (1100);
9003 case 1400: return GET_LOOPS (1400);
9004 case 1410: return GET_LOOPS (1410);
9005 case 1420: return GET_LOOPS (1420);
9006 case 1421: return GET_LOOPS (1421);
9007 case 1430: return GET_LOOPS (1430);
9008 case 1440: return GET_LOOPS (1440);
9009 case 1441: return GET_LOOPS (1441);
9010 case 1450: return GET_LOOPS (1450);
9011 case 1460: return GET_LOOPS (1460);
9012 case 1500: return GET_LOOPS (1500);
9013 case 1600: return GET_LOOPS (1600);
9014 case 1700: return GET_LOOPS (1700);
9015 case 1710: return GET_LOOPS (1710);
9016 case 1711: return GET_LOOPS (1711);
9017 case 1720: return GET_LOOPS (1720);
9018 case 1722: return GET_LOOPS (1722);
9019 case 1730: return GET_LOOPS (1730);
9020 case 1731: return GET_LOOPS (1731);
9021 case 1740: return GET_LOOPS (1740);
9022 case 1750: return GET_LOOPS (1750);
9023 case 1760: return GET_LOOPS (1760);
9024 case 1800: return GET_LOOPS (1800);
9025 case 2100: return GET_LOOPS (2100);
9026 case 2400: return GET_LOOPS (2400);
9027 case 2410: return GET_LOOPS (2410);
9028 case 2500: return GET_LOOPS (2500);
9029 case 2600: return GET_LOOPS (2600);
9030 case 2611: return GET_LOOPS (2611);
9031 case 2612: return GET_LOOPS (2612);
9032 case 2711: return GET_LOOPS (2711);
9033 case 2811: return GET_LOOPS (2811);
9034 case 3000: return GET_LOOPS (3000);
9035 case 3100: return GET_LOOPS (3100);
9036 case 3200: return GET_LOOPS (3200);
9037 case 3710: return GET_LOOPS (3710);
9038 case 3711: return GET_LOOPS (3711);
9039 case 3800: return GET_LOOPS (3800);
9040 case 4300: return GET_LOOPS (4300);
9041 case 4400: return GET_LOOPS (4400);
9042 case 4500: return GET_LOOPS (4500);
9043 case 4700: return GET_LOOPS (4700);
9044 case 4800: return GET_LOOPS (4800);
9045 case 4900: return GET_LOOPS (4900);
9046 case 5000: return GET_LOOPS (5000);
9047 case 5100: return GET_LOOPS (5100);
9048 case 5200: return GET_LOOPS (5200);
9049 case 5300: return GET_LOOPS (5300);
9050 case 5400: return GET_LOOPS (5400);
9051 case 5500: return GET_LOOPS (5500);
9052 case 5600: return GET_LOOPS (5600);
9053 case 5700: return GET_LOOPS (5700);
9054 case 5800: return GET_LOOPS (5800);
9055 case 6000: return GET_LOOPS (6000);
9056 case 6100: return GET_LOOPS (6100);
9057 case 6211: return GET_LOOPS (6211);
9058 case 6212: return GET_LOOPS (6212);
9059 case 6213: return GET_LOOPS (6213);
9060 case 6221: return GET_LOOPS (6221);
9061 case 6222: return GET_LOOPS (6222);
9062 case 6223: return GET_LOOPS (6223);
9063 case 6231: return GET_LOOPS (6231);
9064 case 6232: return GET_LOOPS (6232);
9065 case 6233: return GET_LOOPS (6233);
9066 case 6241: return GET_LOOPS (6241);
9067 case 6242: return GET_LOOPS (6242);
9068 case 6243: return GET_LOOPS (6243);
9069 case 6300: return GET_LOOPS (6300);
9070 case 6400: return GET_LOOPS (6400);
9071 case 6500: return GET_LOOPS (6500);
9072 case 6600: return GET_LOOPS (6600);
9073 case 6700: return GET_LOOPS (6700);
9074 case 6800: return GET_LOOPS (6800);
9075 case 6900: return GET_LOOPS (6900);
9076 case 7100: return GET_LOOPS (7100);
9077 case 7200: return GET_LOOPS (7200);
9078 case 7300: return GET_LOOPS (7300);
9079 case 7400: return GET_LOOPS (7400);
9080 case 7500: return GET_LOOPS (7500);
9081 case 7600: return GET_LOOPS (7600);
9082 case 7700: return GET_LOOPS (7700);
9083 case 7800: return GET_LOOPS (7800);
9084 case 7900: return GET_LOOPS (7900);
9085 case 8000: return GET_LOOPS (8000);
9086 case 8100: return GET_LOOPS (8100);
9087 case 8200: return GET_LOOPS (8200);
9088 case 8300: return GET_LOOPS (8300);
9089 case 8400: return GET_LOOPS (8400);
9090 case 8500: return GET_LOOPS (8500);
9091 case 8600: return GET_LOOPS (8600);
9092 case 8700: return GET_LOOPS (8700);
9093 case 8800: return GET_LOOPS (8800);
9094 case 8900: return GET_LOOPS (8900);
9095 case 9000: return GET_LOOPS (9000);
9096 case 9100: return GET_LOOPS (9100);
9097 case 9200: return GET_LOOPS (9200);
9098 case 9300: return GET_LOOPS (9300);
9099 case 9400: return GET_LOOPS (9400);
9100 case 9500: return GET_LOOPS (9500);
9101 case 9600: return GET_LOOPS (9600);
9102 case 9700: return GET_LOOPS (9700);
9103 case 9710: return GET_LOOPS (9710);
9104 case 9720: return GET_LOOPS (9720);
9105 case 9800: return GET_LOOPS (9800);
9106 case 9810: return GET_LOOPS (9810);
9107 case 9820: return GET_LOOPS (9820);
9108 case 9900: return GET_LOOPS (9900);
9109 case 10000: return GET_LOOPS (10000);
9110 case 10100: return GET_LOOPS (10100);
9111 case 10200: return GET_LOOPS (10200);
9112 case 10300: return GET_LOOPS (10300);
9113 case 10400: return GET_LOOPS (10400);
9114 case 10410: return GET_LOOPS (10410);
9115 case 10420: return GET_LOOPS (10420);
9116 case 10500: return GET_LOOPS (10500);
9117 case 10600: return GET_LOOPS (10600);
9118 case 10700: return GET_LOOPS (10700);
9119 case 10800: return GET_LOOPS (10800);
9120 case 10900: return GET_LOOPS (10900);
9121 case 11000: return GET_LOOPS (11000);
9122 case 11100: return GET_LOOPS (11100);
9123 case 11200: return GET_LOOPS (11200);
9124 case 11300: return GET_LOOPS (11300);
9125 case 11400: return GET_LOOPS (11400);
9126 case 11500: return GET_LOOPS (11500);
9127 case 11600: return GET_LOOPS (11600);
9128 case 11700: return GET_LOOPS (11700);
9129 case 11800: return GET_LOOPS (11800);
9130 case 11900: return GET_LOOPS (11900);
9131 case 12000: return GET_LOOPS (12000);
9132 case 12100: return GET_LOOPS (12100);
9133 case 12200: return GET_LOOPS (12200);
9134 case 12300: return GET_LOOPS (12300);
9135 case 12400: return GET_LOOPS (12400);
9136 case 12500: return GET_LOOPS (12500);
9137 case 12600: return GET_LOOPS (12600);
9138 case 12700: return GET_LOOPS (12700);
9139 case 12800: return GET_LOOPS (12800);
9149 uint
parse_and_store_salt (char *out
, char *in
, uint salt_len
)
9153 if (salt_len
> sizeof(tmp
))
9158 memset (tmp
, 0, sizeof (tmp
));
9159 memcpy (tmp
, in
, salt_len
);
9161 if (data
.opts_type
& OPTS_TYPE_ST_HEX
)
9163 if ((salt_len
% 2) == 0)
9165 uint new_salt_len
= salt_len
/ 2;
9167 for (uint i
= 0, j
= 0; i
< new_salt_len
; i
+= 1, j
+= 2)
9169 char p0
= tmp
[j
+ 0];
9170 char p1
= tmp
[j
+ 1];
9172 tmp
[i
] = hex_convert (p1
) << 0;
9173 tmp
[i
] |= hex_convert (p0
) << 4;
9176 salt_len
= new_salt_len
;
9183 else if (data
.opts_type
& OPTS_TYPE_ST_BASE64
)
9185 salt_len
= base64_decode (base64_to_int
, in
, salt_len
, tmp
);
9188 memset (tmp
+ salt_len
, 0, sizeof (tmp
) - salt_len
);
9190 if (data
.opts_type
& OPTS_TYPE_ST_UNICODE
)
9194 uint
*tmp_uint
= (uint
*) tmp
;
9196 tmp_uint
[9] = ((tmp_uint
[4] >> 8) & 0x00FF0000) | ((tmp_uint
[4] >> 16) & 0x000000FF);
9197 tmp_uint
[8] = ((tmp_uint
[4] << 8) & 0x00FF0000) | ((tmp_uint
[4] >> 0) & 0x000000FF);
9198 tmp_uint
[7] = ((tmp_uint
[3] >> 8) & 0x00FF0000) | ((tmp_uint
[3] >> 16) & 0x000000FF);
9199 tmp_uint
[6] = ((tmp_uint
[3] << 8) & 0x00FF0000) | ((tmp_uint
[3] >> 0) & 0x000000FF);
9200 tmp_uint
[5] = ((tmp_uint
[2] >> 8) & 0x00FF0000) | ((tmp_uint
[2] >> 16) & 0x000000FF);
9201 tmp_uint
[4] = ((tmp_uint
[2] << 8) & 0x00FF0000) | ((tmp_uint
[2] >> 0) & 0x000000FF);
9202 tmp_uint
[3] = ((tmp_uint
[1] >> 8) & 0x00FF0000) | ((tmp_uint
[1] >> 16) & 0x000000FF);
9203 tmp_uint
[2] = ((tmp_uint
[1] << 8) & 0x00FF0000) | ((tmp_uint
[1] >> 0) & 0x000000FF);
9204 tmp_uint
[1] = ((tmp_uint
[0] >> 8) & 0x00FF0000) | ((tmp_uint
[0] >> 16) & 0x000000FF);
9205 tmp_uint
[0] = ((tmp_uint
[0] << 8) & 0x00FF0000) | ((tmp_uint
[0] >> 0) & 0x000000FF);
9207 salt_len
= salt_len
* 2;
9215 if (data
.opts_type
& OPTS_TYPE_ST_LOWER
)
9217 lowercase (tmp
, salt_len
);
9220 if (data
.opts_type
& OPTS_TYPE_ST_UPPER
)
9222 uppercase (tmp
, salt_len
);
9225 uint len
= salt_len
;
9227 if (data
.opts_type
& OPTS_TYPE_ST_ADD80
)
9232 if (data
.opts_type
& OPTS_TYPE_ST_ADD01
)
9237 if (data
.opts_type
& OPTS_TYPE_ST_GENERATE_LE
)
9239 uint
*tmp_uint
= (uint
*) tmp
;
9245 for (uint i
= 0; i
< max
; i
++)
9247 tmp_uint
[i
] = byte_swap_32 (tmp_uint
[i
]);
9250 // Important: we may need to increase the length of memcpy since
9251 // we don't want to "loose" some swapped bytes (could happen if
9252 // they do not perfectly fit in the 4-byte blocks)
9253 // Memcpy does always copy the bytes in the BE order, but since
9254 // we swapped them, some important bytes could be in positions
9255 // we normally skip with the original len
9257 if (len
% 4) len
+= 4 - (len
% 4);
9260 memcpy (out
, tmp
, len
);
9265 int bcrypt_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
9267 if ((input_len
< DISPLAY_LEN_MIN_3200
) || (input_len
> DISPLAY_LEN_MAX_3200
)) return (PARSER_GLOBAL_LENGTH
);
9269 if ((memcmp (SIGNATURE_BCRYPT1
, input_buf
, 4)) && (memcmp (SIGNATURE_BCRYPT2
, input_buf
, 4)) && (memcmp (SIGNATURE_BCRYPT3
, input_buf
, 4))) return (PARSER_SIGNATURE_UNMATCHED
);
9271 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
9273 salt_t
*salt
= hash_buf
->salt
;
9275 memcpy ((char *) salt
->salt_sign
, input_buf
, 6);
9277 char *iter_pos
= input_buf
+ 4;
9279 salt
->salt_iter
= 1 << atoi (iter_pos
);
9281 char *salt_pos
= strchr (iter_pos
, '$');
9283 if (salt_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
9289 salt
->salt_len
= salt_len
;
9293 memset (tmp_buf
, 0, sizeof (tmp_buf
));
9295 base64_decode (bf64_to_int
, salt_pos
, 22, tmp_buf
);
9297 char *salt_buf_ptr
= (char *) salt
->salt_buf
;
9299 memcpy (salt_buf_ptr
, tmp_buf
, 16);
9301 salt
->salt_buf
[0] = byte_swap_32 (salt
->salt_buf
[0]);
9302 salt
->salt_buf
[1] = byte_swap_32 (salt
->salt_buf
[1]);
9303 salt
->salt_buf
[2] = byte_swap_32 (salt
->salt_buf
[2]);
9304 salt
->salt_buf
[3] = byte_swap_32 (salt
->salt_buf
[3]);
9306 char *hash_pos
= salt_pos
+ 22;
9308 memset (tmp_buf
, 0, sizeof (tmp_buf
));
9310 base64_decode (bf64_to_int
, hash_pos
, 31, tmp_buf
);
9312 memcpy (digest
, tmp_buf
, 24);
9314 digest
[0] = byte_swap_32 (digest
[0]);
9315 digest
[1] = byte_swap_32 (digest
[1]);
9316 digest
[2] = byte_swap_32 (digest
[2]);
9317 digest
[3] = byte_swap_32 (digest
[3]);
9318 digest
[4] = byte_swap_32 (digest
[4]);
9319 digest
[5] = byte_swap_32 (digest
[5]);
9321 digest
[5] &= ~0xff; // its just 23 not 24 !
9326 int cisco4_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
9328 if ((input_len
< DISPLAY_LEN_MIN_5700
) || (input_len
> DISPLAY_LEN_MAX_5700
)) return (PARSER_GLOBAL_LENGTH
);
9330 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
9334 memset (tmp_buf
, 0, sizeof (tmp_buf
));
9336 base64_decode (itoa64_to_int
, input_buf
, 43, tmp_buf
);
9338 memcpy (digest
, tmp_buf
, 32);
9340 digest
[0] = byte_swap_32 (digest
[0]);
9341 digest
[1] = byte_swap_32 (digest
[1]);
9342 digest
[2] = byte_swap_32 (digest
[2]);
9343 digest
[3] = byte_swap_32 (digest
[3]);
9344 digest
[4] = byte_swap_32 (digest
[4]);
9345 digest
[5] = byte_swap_32 (digest
[5]);
9346 digest
[6] = byte_swap_32 (digest
[6]);
9347 digest
[7] = byte_swap_32 (digest
[7]);
9349 digest
[0] -= SHA256M_A
;
9350 digest
[1] -= SHA256M_B
;
9351 digest
[2] -= SHA256M_C
;
9352 digest
[3] -= SHA256M_D
;
9353 digest
[4] -= SHA256M_E
;
9354 digest
[5] -= SHA256M_F
;
9355 digest
[6] -= SHA256M_G
;
9356 digest
[7] -= SHA256M_H
;
9361 int lm_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
9363 if ((input_len
< DISPLAY_LEN_MIN_3000
) || (input_len
> DISPLAY_LEN_MAX_3000
)) return (PARSER_GLOBAL_LENGTH
);
9365 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
9367 digest
[0] = hex_to_uint (&input_buf
[ 0]);
9368 digest
[1] = hex_to_uint (&input_buf
[ 8]);
9370 digest
[0] = byte_swap_32 (digest
[0]);
9371 digest
[1] = byte_swap_32 (digest
[1]);
9375 IP (digest
[0], digest
[1], tt
);
9377 digest
[0] = digest
[0];
9378 digest
[1] = digest
[1];
9385 int osx1_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
9387 if ((input_len
< DISPLAY_LEN_MIN_122
) || (input_len
> DISPLAY_LEN_MAX_122
)) return (PARSER_GLOBAL_LENGTH
);
9389 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
9391 salt_t
*salt
= hash_buf
->salt
;
9393 char *hash_pos
= input_buf
+ 8;
9395 digest
[0] = hex_to_uint (&hash_pos
[ 0]);
9396 digest
[1] = hex_to_uint (&hash_pos
[ 8]);
9397 digest
[2] = hex_to_uint (&hash_pos
[16]);
9398 digest
[3] = hex_to_uint (&hash_pos
[24]);
9399 digest
[4] = hex_to_uint (&hash_pos
[32]);
9401 digest
[0] -= SHA1M_A
;
9402 digest
[1] -= SHA1M_B
;
9403 digest
[2] -= SHA1M_C
;
9404 digest
[3] -= SHA1M_D
;
9405 digest
[4] -= SHA1M_E
;
9409 char *salt_buf_ptr
= (char *) salt
->salt_buf
;
9411 salt_len
= parse_and_store_salt (salt_buf_ptr
, input_buf
, salt_len
);
9413 if (salt_len
== UINT_MAX
) return (PARSER_SALT_LENGTH
);
9415 salt
->salt_len
= salt_len
;
9420 int osx512_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
9422 if ((input_len
< DISPLAY_LEN_MIN_1722
) || (input_len
> DISPLAY_LEN_MAX_1722
)) return (PARSER_GLOBAL_LENGTH
);
9424 uint64_t *digest
= (uint64_t *) hash_buf
->digest
;
9426 salt_t
*salt
= hash_buf
->salt
;
9428 char *hash_pos
= input_buf
+ 8;
9430 digest
[0] = hex_to_uint64_t (&hash_pos
[ 0]);
9431 digest
[1] = hex_to_uint64_t (&hash_pos
[ 16]);
9432 digest
[2] = hex_to_uint64_t (&hash_pos
[ 32]);
9433 digest
[3] = hex_to_uint64_t (&hash_pos
[ 48]);
9434 digest
[4] = hex_to_uint64_t (&hash_pos
[ 64]);
9435 digest
[5] = hex_to_uint64_t (&hash_pos
[ 80]);
9436 digest
[6] = hex_to_uint64_t (&hash_pos
[ 96]);
9437 digest
[7] = hex_to_uint64_t (&hash_pos
[112]);
9439 digest
[0] -= SHA512M_A
;
9440 digest
[1] -= SHA512M_B
;
9441 digest
[2] -= SHA512M_C
;
9442 digest
[3] -= SHA512M_D
;
9443 digest
[4] -= SHA512M_E
;
9444 digest
[5] -= SHA512M_F
;
9445 digest
[6] -= SHA512M_G
;
9446 digest
[7] -= SHA512M_H
;
9450 char *salt_buf_ptr
= (char *) salt
->salt_buf
;
9452 salt_len
= parse_and_store_salt (salt_buf_ptr
, input_buf
, salt_len
);
9454 if (salt_len
== UINT_MAX
) return (PARSER_SALT_LENGTH
);
9456 salt
->salt_len
= salt_len
;
9461 int osc_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
9463 if (data
.opts_type
& OPTS_TYPE_ST_HEX
)
9465 if ((input_len
< DISPLAY_LEN_MIN_21H
) || (input_len
> DISPLAY_LEN_MAX_21H
)) return (PARSER_GLOBAL_LENGTH
);
9469 if ((input_len
< DISPLAY_LEN_MIN_21
) || (input_len
> DISPLAY_LEN_MAX_21
)) return (PARSER_GLOBAL_LENGTH
);
9472 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
9474 salt_t
*salt
= hash_buf
->salt
;
9476 digest
[0] = hex_to_uint (&input_buf
[ 0]);
9477 digest
[1] = hex_to_uint (&input_buf
[ 8]);
9478 digest
[2] = hex_to_uint (&input_buf
[16]);
9479 digest
[3] = hex_to_uint (&input_buf
[24]);
9481 digest
[0] = byte_swap_32 (digest
[0]);
9482 digest
[1] = byte_swap_32 (digest
[1]);
9483 digest
[2] = byte_swap_32 (digest
[2]);
9484 digest
[3] = byte_swap_32 (digest
[3]);
9486 digest
[0] -= MD5M_A
;
9487 digest
[1] -= MD5M_B
;
9488 digest
[2] -= MD5M_C
;
9489 digest
[3] -= MD5M_D
;
9491 if (input_buf
[32] != data
.separator
) return (PARSER_SEPARATOR_UNMATCHED
);
9493 uint salt_len
= input_len
- 32 - 1;
9495 char *salt_buf
= input_buf
+ 32 + 1;
9497 char *salt_buf_ptr
= (char *) salt
->salt_buf
;
9499 salt_len
= parse_and_store_salt (salt_buf_ptr
, salt_buf
, salt_len
);
9501 if (salt_len
== UINT_MAX
) return (PARSER_SALT_LENGTH
);
9503 salt
->salt_len
= salt_len
;
9508 int netscreen_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
9510 if (data
.opts_type
& OPTS_TYPE_ST_HEX
)
9512 if ((input_len
< DISPLAY_LEN_MIN_22H
) || (input_len
> DISPLAY_LEN_MAX_22H
)) return (PARSER_GLOBAL_LENGTH
);
9516 if ((input_len
< DISPLAY_LEN_MIN_22
) || (input_len
> DISPLAY_LEN_MAX_22
)) return (PARSER_GLOBAL_LENGTH
);
9521 char clean_input_buf
[32];
9523 char sig
[6] = { 'n', 'r', 'c', 's', 't', 'n' };
9524 int pos
[6] = { 0, 6, 12, 17, 23, 29 };
9526 for (int i
= 0, j
= 0, k
= 0; i
< 30; i
++)
9530 if (sig
[j
] != input_buf
[i
]) return (PARSER_SIGNATURE_UNMATCHED
);
9536 clean_input_buf
[k
] = input_buf
[i
];
9544 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
9546 salt_t
*salt
= hash_buf
->salt
;
9548 char a
, b
, c
, d
, e
, f
;
9550 a
= base64_to_int (clean_input_buf
[ 0] & 0x7f);
9551 b
= base64_to_int (clean_input_buf
[ 1] & 0x7f);
9552 c
= base64_to_int (clean_input_buf
[ 2] & 0x7f);
9553 d
= base64_to_int (clean_input_buf
[ 3] & 0x7f);
9554 e
= base64_to_int (clean_input_buf
[ 4] & 0x7f);
9555 f
= base64_to_int (clean_input_buf
[ 5] & 0x7f);
9557 digest
[0] = (((a
<< 12) | (b
<< 6) | (c
)) << 16)
9558 | (((d
<< 12) | (e
<< 6) | (f
)) << 0);
9560 a
= base64_to_int (clean_input_buf
[ 6] & 0x7f);
9561 b
= base64_to_int (clean_input_buf
[ 7] & 0x7f);
9562 c
= base64_to_int (clean_input_buf
[ 8] & 0x7f);
9563 d
= base64_to_int (clean_input_buf
[ 9] & 0x7f);
9564 e
= base64_to_int (clean_input_buf
[10] & 0x7f);
9565 f
= base64_to_int (clean_input_buf
[11] & 0x7f);
9567 digest
[1] = (((a
<< 12) | (b
<< 6) | (c
)) << 16)
9568 | (((d
<< 12) | (e
<< 6) | (f
)) << 0);
9570 a
= base64_to_int (clean_input_buf
[12] & 0x7f);
9571 b
= base64_to_int (clean_input_buf
[13] & 0x7f);
9572 c
= base64_to_int (clean_input_buf
[14] & 0x7f);
9573 d
= base64_to_int (clean_input_buf
[15] & 0x7f);
9574 e
= base64_to_int (clean_input_buf
[16] & 0x7f);
9575 f
= base64_to_int (clean_input_buf
[17] & 0x7f);
9577 digest
[2] = (((a
<< 12) | (b
<< 6) | (c
)) << 16)
9578 | (((d
<< 12) | (e
<< 6) | (f
)) << 0);
9580 a
= base64_to_int (clean_input_buf
[18] & 0x7f);
9581 b
= base64_to_int (clean_input_buf
[19] & 0x7f);
9582 c
= base64_to_int (clean_input_buf
[20] & 0x7f);
9583 d
= base64_to_int (clean_input_buf
[21] & 0x7f);
9584 e
= base64_to_int (clean_input_buf
[22] & 0x7f);
9585 f
= base64_to_int (clean_input_buf
[23] & 0x7f);
9587 digest
[3] = (((a
<< 12) | (b
<< 6) | (c
)) << 16)
9588 | (((d
<< 12) | (e
<< 6) | (f
)) << 0);
9590 digest
[0] = byte_swap_32 (digest
[0]);
9591 digest
[1] = byte_swap_32 (digest
[1]);
9592 digest
[2] = byte_swap_32 (digest
[2]);
9593 digest
[3] = byte_swap_32 (digest
[3]);
9595 digest
[0] -= MD5M_A
;
9596 digest
[1] -= MD5M_B
;
9597 digest
[2] -= MD5M_C
;
9598 digest
[3] -= MD5M_D
;
9600 if (input_buf
[30] != ':') return (PARSER_SEPARATOR_UNMATCHED
);
9602 uint salt_len
= input_len
- 30 - 1;
9604 char *salt_buf
= input_buf
+ 30 + 1;
9606 char *salt_buf_ptr
= (char *) salt
->salt_buf
;
9608 salt_len
= parse_and_store_salt (salt_buf_ptr
, salt_buf
, salt_len
);
9610 if (salt_len
== UINT_MAX
) return (PARSER_SALT_LENGTH
);
9612 salt
->salt_len
= salt_len
;
9614 memcpy (salt_buf_ptr
+ salt_len
, ":Administration Tools:", 22);
9616 salt
->salt_len
+= 22;
9621 int smf_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
9623 if (data
.opts_type
& OPTS_TYPE_ST_HEX
)
9625 if ((input_len
< DISPLAY_LEN_MIN_121H
) || (input_len
> DISPLAY_LEN_MAX_121H
)) return (PARSER_GLOBAL_LENGTH
);
9629 if ((input_len
< DISPLAY_LEN_MIN_121
) || (input_len
> DISPLAY_LEN_MAX_121
)) return (PARSER_GLOBAL_LENGTH
);
9632 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
9634 salt_t
*salt
= hash_buf
->salt
;
9636 digest
[0] = hex_to_uint (&input_buf
[ 0]);
9637 digest
[1] = hex_to_uint (&input_buf
[ 8]);
9638 digest
[2] = hex_to_uint (&input_buf
[16]);
9639 digest
[3] = hex_to_uint (&input_buf
[24]);
9640 digest
[4] = hex_to_uint (&input_buf
[32]);
9642 digest
[0] -= SHA1M_A
;
9643 digest
[1] -= SHA1M_B
;
9644 digest
[2] -= SHA1M_C
;
9645 digest
[3] -= SHA1M_D
;
9646 digest
[4] -= SHA1M_E
;
9648 if (input_buf
[40] != data
.separator
) return (PARSER_SEPARATOR_UNMATCHED
);
9650 uint salt_len
= input_len
- 40 - 1;
9652 char *salt_buf
= input_buf
+ 40 + 1;
9654 char *salt_buf_ptr
= (char *) salt
->salt_buf
;
9656 salt_len
= parse_and_store_salt (salt_buf_ptr
, salt_buf
, salt_len
);
9658 if (salt_len
== UINT_MAX
) return (PARSER_SALT_LENGTH
);
9660 salt
->salt_len
= salt_len
;
9665 int dcc2_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
9667 if (data
.opts_type
& OPTS_TYPE_ST_HEX
)
9669 if ((input_len
< DISPLAY_LEN_MIN_2100H
) || (input_len
> DISPLAY_LEN_MAX_2100H
)) return (PARSER_GLOBAL_LENGTH
);
9673 if ((input_len
< DISPLAY_LEN_MIN_2100
) || (input_len
> DISPLAY_LEN_MAX_2100
)) return (PARSER_GLOBAL_LENGTH
);
9676 if (memcmp (SIGNATURE_DCC2
, input_buf
, 6)) return (PARSER_SIGNATURE_UNMATCHED
);
9678 char *iter_pos
= input_buf
+ 6;
9680 salt_t
*salt
= hash_buf
->salt
;
9682 salt
->salt_iter
= atoi (iter_pos
) - 1;
9684 char *salt_pos
= strchr (iter_pos
, '#');
9686 if (salt_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
9690 char *digest_pos
= strchr (salt_pos
, '#');
9692 if (digest_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
9696 uint salt_len
= digest_pos
- salt_pos
- 1;
9698 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
9700 digest
[0] = hex_to_uint (&digest_pos
[ 0]);
9701 digest
[1] = hex_to_uint (&digest_pos
[ 8]);
9702 digest
[2] = hex_to_uint (&digest_pos
[16]);
9703 digest
[3] = hex_to_uint (&digest_pos
[24]);
9705 char *salt_buf_ptr
= (char *) salt
->salt_buf
;
9707 salt_len
= parse_and_store_salt (salt_buf_ptr
, salt_pos
, salt_len
);
9709 if (salt_len
== UINT_MAX
) return (PARSER_SALT_LENGTH
);
9711 salt
->salt_len
= salt_len
;
9716 int wpa_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
9718 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
9720 salt_t
*salt
= hash_buf
->salt
;
9722 wpa_t
*wpa
= (wpa_t
*) hash_buf
->esalt
;
9726 memcpy (&in
, input_buf
, input_len
);
9728 if (in
.eapol_size
< 1 || in
.eapol_size
> 255) return (PARSER_HCCAP_EAPOL_SIZE
);
9730 memcpy (digest
, in
.keymic
, 16);
9733 http://www.one-net.eu/jsw/j_sec/m_ptype.html
9734 The phrase "Pairwise key expansion"
9735 Access Point Address (Referred to as Authenticator Address AA)
9736 Supplicant Address (referred to as Supplicant Address SA)
9737 Access Point Nonce (referred to as Authenticator Anonce)
9738 Wireless Device Nonce (referred to as Supplicant Nonce Snonce)
9741 uint salt_len
= strlen (in
.essid
);
9743 memcpy (salt
->salt_buf
, in
.essid
, salt_len
);
9745 salt
->salt_len
= salt_len
;
9747 salt
->salt_iter
= ROUNDS_WPA2
- 1;
9749 unsigned char *pke_ptr
= (unsigned char *) wpa
->pke
;
9751 memcpy (pke_ptr
, "Pairwise key expansion", 23);
9753 if (memcmp (in
.mac1
, in
.mac2
, 6) < 0)
9755 memcpy (pke_ptr
+ 23, in
.mac1
, 6);
9756 memcpy (pke_ptr
+ 29, in
.mac2
, 6);
9760 memcpy (pke_ptr
+ 23, in
.mac2
, 6);
9761 memcpy (pke_ptr
+ 29, in
.mac1
, 6);
9764 if (memcmp (in
.nonce1
, in
.nonce2
, 32) < 0)
9766 memcpy (pke_ptr
+ 35, in
.nonce1
, 32);
9767 memcpy (pke_ptr
+ 67, in
.nonce2
, 32);
9771 memcpy (pke_ptr
+ 35, in
.nonce2
, 32);
9772 memcpy (pke_ptr
+ 67, in
.nonce1
, 32);
9775 for (int i
= 0; i
< 25; i
++)
9777 wpa
->pke
[i
] = byte_swap_32 (wpa
->pke
[i
]);
9780 wpa
->keyver
= in
.keyver
;
9782 if (wpa
->keyver
> 255)
9784 log_info ("ATTENTION!");
9785 log_info (" The WPA/WPA2 key version in your .hccap file is invalid!");
9786 log_info (" This could be due to a recent aircrack-ng bug.");
9787 log_info (" The key version was automatically reset to a reasonable value.");
9790 wpa
->keyver
&= 0xff;
9793 wpa
->eapol_size
= in
.eapol_size
;
9795 unsigned char *eapol_ptr
= (unsigned char *) wpa
->eapol
;
9797 memcpy (eapol_ptr
, in
.eapol
, wpa
->eapol_size
);
9799 memset (eapol_ptr
+ wpa
->eapol_size
, 0, 256 - wpa
->eapol_size
);
9801 eapol_ptr
[wpa
->eapol_size
] = (unsigned char) 0x80;
9803 if (wpa
->keyver
== 1)
9809 digest
[0] = byte_swap_32 (digest
[0]);
9810 digest
[1] = byte_swap_32 (digest
[1]);
9811 digest
[2] = byte_swap_32 (digest
[2]);
9812 digest
[3] = byte_swap_32 (digest
[3]);
9814 for (int i
= 0; i
< 64; i
++)
9816 wpa
->eapol
[i
] = byte_swap_32 (wpa
->eapol
[i
]);
9820 salt
->salt_buf
[10] = digest
[1];
9821 salt
->salt_buf
[11] = digest
[2];
9826 int psafe2_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
9828 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
9830 salt_t
*salt
= hash_buf
->salt
;
9834 log_error ("Password Safe v2 container not specified");
9839 FILE *fp
= fopen (input_buf
, "rb");
9843 log_error ("%s: %s", input_buf
, strerror (errno
));
9852 uint32_t salt
[5]; // unused, but makes better valid check
9853 uint32_t iv
[2]; // unused, but makes better valid check
9859 int n
= fread (&buf
, sizeof (psafe2_hdr
), 1, fp
);
9863 if (n
!= 1) return (PARSER_PSAFE2_FILE_SIZE
);
9865 salt
->salt_buf
[0] = buf
.random
[0];
9866 salt
->salt_buf
[1] = buf
.random
[1];
9869 salt
->salt_iter
= 1000;
9871 digest
[0] = byte_swap_32 (buf
.hash
[0]);
9872 digest
[1] = byte_swap_32 (buf
.hash
[1]);
9873 digest
[2] = byte_swap_32 (buf
.hash
[2]);
9874 digest
[3] = byte_swap_32 (buf
.hash
[3]);
9875 digest
[4] = byte_swap_32 (buf
.hash
[4]);
9880 int psafe3_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
9882 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
9884 salt_t
*salt
= hash_buf
->salt
;
9888 log_error (".psafe3 not specified");
9893 FILE *fp
= fopen (input_buf
, "rb");
9897 log_error ("%s: %s", input_buf
, strerror (errno
));
9904 int n
= fread (&in
, sizeof (psafe3_t
), 1, fp
);
9908 data
.hashfile
= input_buf
; // we will need this in case it gets cracked
9910 if (memcmp (SIGNATURE_PSAFE3
, in
.signature
, 4)) return (PARSER_SIGNATURE_UNMATCHED
);
9912 if (n
!= 1) return (PARSER_PSAFE3_FILE_SIZE
);
9914 salt
->salt_iter
= in
.iterations
+ 1;
9916 salt
->salt_buf
[0] = in
.salt_buf
[0];
9917 salt
->salt_buf
[1] = in
.salt_buf
[1];
9918 salt
->salt_buf
[2] = in
.salt_buf
[2];
9919 salt
->salt_buf
[3] = in
.salt_buf
[3];
9920 salt
->salt_buf
[4] = in
.salt_buf
[4];
9921 salt
->salt_buf
[5] = in
.salt_buf
[5];
9922 salt
->salt_buf
[6] = in
.salt_buf
[6];
9923 salt
->salt_buf
[7] = in
.salt_buf
[7];
9925 salt
->salt_len
= 32;
9927 digest
[0] = in
.hash_buf
[0];
9928 digest
[1] = in
.hash_buf
[1];
9929 digest
[2] = in
.hash_buf
[2];
9930 digest
[3] = in
.hash_buf
[3];
9931 digest
[4] = in
.hash_buf
[4];
9932 digest
[5] = in
.hash_buf
[5];
9933 digest
[6] = in
.hash_buf
[6];
9934 digest
[7] = in
.hash_buf
[7];
9936 digest
[0] = byte_swap_32 (digest
[0]);
9937 digest
[1] = byte_swap_32 (digest
[1]);
9938 digest
[2] = byte_swap_32 (digest
[2]);
9939 digest
[3] = byte_swap_32 (digest
[3]);
9940 digest
[4] = byte_swap_32 (digest
[4]);
9941 digest
[5] = byte_swap_32 (digest
[5]);
9942 digest
[6] = byte_swap_32 (digest
[6]);
9943 digest
[7] = byte_swap_32 (digest
[7]);
9948 int phpass_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
9950 if ((input_len
< DISPLAY_LEN_MIN_400
) || (input_len
> DISPLAY_LEN_MAX_400
)) return (PARSER_GLOBAL_LENGTH
);
9952 if ((memcmp (SIGNATURE_PHPASS1
, input_buf
, 3)) && (memcmp (SIGNATURE_PHPASS2
, input_buf
, 3))) return (PARSER_SIGNATURE_UNMATCHED
);
9954 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
9956 salt_t
*salt
= hash_buf
->salt
;
9958 char *iter_pos
= input_buf
+ 3;
9960 uint salt_iter
= 1 << itoa64_to_int (iter_pos
[0]);
9962 if (salt_iter
> 0x80000000) return (PARSER_SALT_ITERATION
);
9964 memcpy ((char *) salt
->salt_sign
, input_buf
, 4);
9966 salt
->salt_iter
= salt_iter
;
9968 char *salt_pos
= iter_pos
+ 1;
9972 memcpy ((char *) salt
->salt_buf
, salt_pos
, salt_len
);
9974 salt
->salt_len
= salt_len
;
9976 char *hash_pos
= salt_pos
+ salt_len
;
9978 phpass_decode ((unsigned char *) digest
, (unsigned char *) hash_pos
);
9983 int md5crypt_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
9985 if (memcmp (SIGNATURE_MD5CRYPT
, input_buf
, 3)) return (PARSER_SIGNATURE_UNMATCHED
);
9987 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
9989 salt_t
*salt
= hash_buf
->salt
;
9991 char *salt_pos
= input_buf
+ 3;
9993 uint iterations_len
= 0;
9995 if (memcmp (salt_pos
, "rounds=", 7) == 0)
9999 for (iterations_len
= 0; salt_pos
[0] >= '0' && salt_pos
[0] <= '9' && iterations_len
< 7; iterations_len
++, salt_pos
+= 1) continue;
10001 if (iterations_len
== 0 ) return (PARSER_SALT_ITERATION
);
10002 if (salt_pos
[0] != '$') return (PARSER_SIGNATURE_UNMATCHED
);
10006 salt
->salt_iter
= atoi (salt_pos
- iterations_len
);
10010 iterations_len
+= 8;
10014 salt
->salt_iter
= ROUNDS_MD5CRYPT
;
10017 if ((input_len
< DISPLAY_LEN_MIN_500
) || (input_len
> (DISPLAY_LEN_MAX_500
+ iterations_len
))) return (PARSER_GLOBAL_LENGTH
);
10019 char *hash_pos
= strchr (salt_pos
, '$');
10021 if (hash_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
10023 uint salt_len
= hash_pos
- salt_pos
;
10025 if (salt_len
> 8) return (PARSER_SALT_LENGTH
);
10027 memcpy ((char *) salt
->salt_buf
, salt_pos
, salt_len
);
10029 salt
->salt_len
= salt_len
;
10033 uint hash_len
= input_len
- 3 - iterations_len
- salt_len
- 1;
10035 if (hash_len
!= 22) return (PARSER_HASH_LENGTH
);
10037 md5crypt_decode ((unsigned char *) digest
, (unsigned char *) hash_pos
);
10039 return (PARSER_OK
);
10042 int md5apr1_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
10044 if (memcmp (SIGNATURE_MD5APR1
, input_buf
, 6)) return (PARSER_SIGNATURE_UNMATCHED
);
10046 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
10048 salt_t
*salt
= hash_buf
->salt
;
10050 char *salt_pos
= input_buf
+ 6;
10052 uint iterations_len
= 0;
10054 if (memcmp (salt_pos
, "rounds=", 7) == 0)
10058 for (iterations_len
= 0; salt_pos
[0] >= '0' && salt_pos
[0] <= '9' && iterations_len
< 7; iterations_len
++, salt_pos
+= 1) continue;
10060 if (iterations_len
== 0 ) return (PARSER_SALT_ITERATION
);
10061 if (salt_pos
[0] != '$') return (PARSER_SIGNATURE_UNMATCHED
);
10065 salt
->salt_iter
= atoi (salt_pos
- iterations_len
);
10069 iterations_len
+= 8;
10073 salt
->salt_iter
= ROUNDS_MD5CRYPT
;
10076 if ((input_len
< DISPLAY_LEN_MIN_1600
) || (input_len
> DISPLAY_LEN_MAX_1600
+ iterations_len
)) return (PARSER_GLOBAL_LENGTH
);
10078 char *hash_pos
= strchr (salt_pos
, '$');
10080 if (hash_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
10082 uint salt_len
= hash_pos
- salt_pos
;
10084 if (salt_len
> 8) return (PARSER_SALT_LENGTH
);
10086 memcpy ((char *) salt
->salt_buf
, salt_pos
, salt_len
);
10088 salt
->salt_len
= salt_len
;
10092 md5crypt_decode ((unsigned char *) digest
, (unsigned char *) hash_pos
);
10094 return (PARSER_OK
);
10097 int episerver_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
10099 if ((input_len
< DISPLAY_LEN_MIN_141
) || (input_len
> DISPLAY_LEN_MAX_141
)) return (PARSER_GLOBAL_LENGTH
);
10101 if (memcmp (SIGNATURE_EPISERVER
, input_buf
, 14)) return (PARSER_SIGNATURE_UNMATCHED
);
10103 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
10105 salt_t
*salt
= hash_buf
->salt
;
10107 char *salt_pos
= input_buf
+ 14;
10109 char *hash_pos
= strchr (salt_pos
, '*');
10111 if (hash_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
10115 uint salt_len
= hash_pos
- salt_pos
- 1;
10117 char *salt_buf_ptr
= (char *) salt
->salt_buf
;
10119 salt_len
= parse_and_store_salt (salt_buf_ptr
, salt_pos
, salt_len
);
10121 if (salt_len
== UINT_MAX
) return (PARSER_SALT_LENGTH
);
10123 salt
->salt_len
= salt_len
;
10125 char tmp_buf
[100]; memset (tmp_buf
, 0, sizeof (tmp_buf
));
10127 base64_decode (base64_to_int
, hash_pos
, 27, tmp_buf
);
10129 memcpy (digest
, tmp_buf
, 20);
10131 digest
[0] = byte_swap_32 (digest
[0]);
10132 digest
[1] = byte_swap_32 (digest
[1]);
10133 digest
[2] = byte_swap_32 (digest
[2]);
10134 digest
[3] = byte_swap_32 (digest
[3]);
10135 digest
[4] = byte_swap_32 (digest
[4]);
10137 digest
[0] -= SHA1M_A
;
10138 digest
[1] -= SHA1M_B
;
10139 digest
[2] -= SHA1M_C
;
10140 digest
[3] -= SHA1M_D
;
10141 digest
[4] -= SHA1M_E
;
10143 return (PARSER_OK
);
10146 int descrypt_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
10148 if ((input_len
< DISPLAY_LEN_MIN_1500
) || (input_len
> DISPLAY_LEN_MAX_1500
)) return (PARSER_GLOBAL_LENGTH
);
10150 unsigned char c12
= itoa64_to_int (input_buf
[12]);
10152 if (c12
& 3) return (PARSER_HASH_VALUE
);
10154 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
10156 salt_t
*salt
= hash_buf
->salt
;
10158 // for ascii_digest
10159 salt
->salt_sign
[0] = input_buf
[0];
10160 salt
->salt_sign
[1] = input_buf
[1];
10162 salt
->salt_buf
[0] = itoa64_to_int (input_buf
[0])
10163 | itoa64_to_int (input_buf
[1]) << 6;
10165 salt
->salt_len
= 2;
10169 memset (tmp_buf
, 0, sizeof (tmp_buf
));
10171 base64_decode (itoa64_to_int
, input_buf
+ 2, 11, tmp_buf
);
10173 memcpy (digest
, tmp_buf
, 8);
10177 IP (digest
[0], digest
[1], tt
);
10182 return (PARSER_OK
);
10185 int md4_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
10187 if ((input_len
< DISPLAY_LEN_MIN_900
) || (input_len
> DISPLAY_LEN_MAX_900
)) return (PARSER_GLOBAL_LENGTH
);
10189 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
10191 digest
[0] = hex_to_uint (&input_buf
[ 0]);
10192 digest
[1] = hex_to_uint (&input_buf
[ 8]);
10193 digest
[2] = hex_to_uint (&input_buf
[16]);
10194 digest
[3] = hex_to_uint (&input_buf
[24]);
10196 digest
[0] = byte_swap_32 (digest
[0]);
10197 digest
[1] = byte_swap_32 (digest
[1]);
10198 digest
[2] = byte_swap_32 (digest
[2]);
10199 digest
[3] = byte_swap_32 (digest
[3]);
10201 digest
[0] -= MD4M_A
;
10202 digest
[1] -= MD4M_B
;
10203 digest
[2] -= MD4M_C
;
10204 digest
[3] -= MD4M_D
;
10206 return (PARSER_OK
);
10209 int md4s_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
10211 if (data
.opts_type
& OPTS_TYPE_ST_HEX
)
10213 if ((input_len
< DISPLAY_LEN_MIN_910H
) || (input_len
> DISPLAY_LEN_MAX_910H
)) return (PARSER_GLOBAL_LENGTH
);
10217 if ((input_len
< DISPLAY_LEN_MIN_910
) || (input_len
> DISPLAY_LEN_MAX_910
)) return (PARSER_GLOBAL_LENGTH
);
10220 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
10222 salt_t
*salt
= hash_buf
->salt
;
10224 digest
[0] = hex_to_uint (&input_buf
[ 0]);
10225 digest
[1] = hex_to_uint (&input_buf
[ 8]);
10226 digest
[2] = hex_to_uint (&input_buf
[16]);
10227 digest
[3] = hex_to_uint (&input_buf
[24]);
10229 digest
[0] = byte_swap_32 (digest
[0]);
10230 digest
[1] = byte_swap_32 (digest
[1]);
10231 digest
[2] = byte_swap_32 (digest
[2]);
10232 digest
[3] = byte_swap_32 (digest
[3]);
10234 digest
[0] -= MD4M_A
;
10235 digest
[1] -= MD4M_B
;
10236 digest
[2] -= MD4M_C
;
10237 digest
[3] -= MD4M_D
;
10239 if (input_buf
[32] != data
.separator
) return (PARSER_SEPARATOR_UNMATCHED
);
10241 uint salt_len
= input_len
- 32 - 1;
10243 char *salt_buf
= input_buf
+ 32 + 1;
10245 char *salt_buf_ptr
= (char *) salt
->salt_buf
;
10247 salt_len
= parse_and_store_salt (salt_buf_ptr
, salt_buf
, salt_len
);
10249 if (salt_len
== UINT_MAX
) return (PARSER_SALT_LENGTH
);
10251 salt
->salt_len
= salt_len
;
10253 return (PARSER_OK
);
10256 int md5_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
10258 if ((input_len
< DISPLAY_LEN_MIN_0
) || (input_len
> DISPLAY_LEN_MAX_0
)) return (PARSER_GLOBAL_LENGTH
);
10260 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
10262 digest
[0] = hex_to_uint (&input_buf
[ 0]);
10263 digest
[1] = hex_to_uint (&input_buf
[ 8]);
10264 digest
[2] = hex_to_uint (&input_buf
[16]);
10265 digest
[3] = hex_to_uint (&input_buf
[24]);
10267 digest
[0] = byte_swap_32 (digest
[0]);
10268 digest
[1] = byte_swap_32 (digest
[1]);
10269 digest
[2] = byte_swap_32 (digest
[2]);
10270 digest
[3] = byte_swap_32 (digest
[3]);
10272 digest
[0] -= MD5M_A
;
10273 digest
[1] -= MD5M_B
;
10274 digest
[2] -= MD5M_C
;
10275 digest
[3] -= MD5M_D
;
10277 return (PARSER_OK
);
10280 int md5half_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
10282 if ((input_len
< DISPLAY_LEN_MIN_5100
) || (input_len
> DISPLAY_LEN_MAX_5100
)) return (PARSER_GLOBAL_LENGTH
);
10284 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
10286 digest
[0] = hex_to_uint (&input_buf
[0]);
10287 digest
[1] = hex_to_uint (&input_buf
[8]);
10291 digest
[0] = byte_swap_32 (digest
[0]);
10292 digest
[1] = byte_swap_32 (digest
[1]);
10294 return (PARSER_OK
);
10297 int md5s_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
10299 if (data
.opts_type
& OPTS_TYPE_ST_HEX
)
10301 if ((input_len
< DISPLAY_LEN_MIN_10H
) || (input_len
> DISPLAY_LEN_MAX_10H
)) return (PARSER_GLOBAL_LENGTH
);
10305 if ((input_len
< DISPLAY_LEN_MIN_10
) || (input_len
> DISPLAY_LEN_MAX_10
)) return (PARSER_GLOBAL_LENGTH
);
10308 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
10310 salt_t
*salt
= hash_buf
->salt
;
10312 digest
[0] = hex_to_uint (&input_buf
[ 0]);
10313 digest
[1] = hex_to_uint (&input_buf
[ 8]);
10314 digest
[2] = hex_to_uint (&input_buf
[16]);
10315 digest
[3] = hex_to_uint (&input_buf
[24]);
10317 digest
[0] = byte_swap_32 (digest
[0]);
10318 digest
[1] = byte_swap_32 (digest
[1]);
10319 digest
[2] = byte_swap_32 (digest
[2]);
10320 digest
[3] = byte_swap_32 (digest
[3]);
10322 digest
[0] -= MD5M_A
;
10323 digest
[1] -= MD5M_B
;
10324 digest
[2] -= MD5M_C
;
10325 digest
[3] -= MD5M_D
;
10327 if (input_buf
[32] != data
.separator
) return (PARSER_SEPARATOR_UNMATCHED
);
10329 uint salt_len
= input_len
- 32 - 1;
10331 char *salt_buf
= input_buf
+ 32 + 1;
10333 char *salt_buf_ptr
= (char *) salt
->salt_buf
;
10335 salt_len
= parse_and_store_salt (salt_buf_ptr
, salt_buf
, salt_len
);
10337 if (salt_len
== UINT_MAX
) return (PARSER_SALT_LENGTH
);
10339 salt
->salt_len
= salt_len
;
10341 return (PARSER_OK
);
10344 int md5pix_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
10346 if ((input_len
< DISPLAY_LEN_MIN_2400
) || (input_len
> DISPLAY_LEN_MAX_2400
)) return (PARSER_GLOBAL_LENGTH
);
10348 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
10350 digest
[0] = itoa64_to_int (input_buf
[ 0]) << 0
10351 | itoa64_to_int (input_buf
[ 1]) << 6
10352 | itoa64_to_int (input_buf
[ 2]) << 12
10353 | itoa64_to_int (input_buf
[ 3]) << 18;
10354 digest
[1] = itoa64_to_int (input_buf
[ 4]) << 0
10355 | itoa64_to_int (input_buf
[ 5]) << 6
10356 | itoa64_to_int (input_buf
[ 6]) << 12
10357 | itoa64_to_int (input_buf
[ 7]) << 18;
10358 digest
[2] = itoa64_to_int (input_buf
[ 8]) << 0
10359 | itoa64_to_int (input_buf
[ 9]) << 6
10360 | itoa64_to_int (input_buf
[10]) << 12
10361 | itoa64_to_int (input_buf
[11]) << 18;
10362 digest
[3] = itoa64_to_int (input_buf
[12]) << 0
10363 | itoa64_to_int (input_buf
[13]) << 6
10364 | itoa64_to_int (input_buf
[14]) << 12
10365 | itoa64_to_int (input_buf
[15]) << 18;
10367 digest
[0] -= MD5M_A
;
10368 digest
[1] -= MD5M_B
;
10369 digest
[2] -= MD5M_C
;
10370 digest
[3] -= MD5M_D
;
10372 digest
[0] &= 0x00ffffff;
10373 digest
[1] &= 0x00ffffff;
10374 digest
[2] &= 0x00ffffff;
10375 digest
[3] &= 0x00ffffff;
10377 return (PARSER_OK
);
10380 int md5asa_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
10382 if (data
.opts_type
& OPTS_TYPE_ST_HEX
)
10384 if ((input_len
< DISPLAY_LEN_MIN_2410H
) || (input_len
> DISPLAY_LEN_MAX_2410H
)) return (PARSER_GLOBAL_LENGTH
);
10388 if ((input_len
< DISPLAY_LEN_MIN_2410
) || (input_len
> DISPLAY_LEN_MAX_2410
)) return (PARSER_GLOBAL_LENGTH
);
10391 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
10393 salt_t
*salt
= hash_buf
->salt
;
10395 digest
[0] = itoa64_to_int (input_buf
[ 0]) << 0
10396 | itoa64_to_int (input_buf
[ 1]) << 6
10397 | itoa64_to_int (input_buf
[ 2]) << 12
10398 | itoa64_to_int (input_buf
[ 3]) << 18;
10399 digest
[1] = itoa64_to_int (input_buf
[ 4]) << 0
10400 | itoa64_to_int (input_buf
[ 5]) << 6
10401 | itoa64_to_int (input_buf
[ 6]) << 12
10402 | itoa64_to_int (input_buf
[ 7]) << 18;
10403 digest
[2] = itoa64_to_int (input_buf
[ 8]) << 0
10404 | itoa64_to_int (input_buf
[ 9]) << 6
10405 | itoa64_to_int (input_buf
[10]) << 12
10406 | itoa64_to_int (input_buf
[11]) << 18;
10407 digest
[3] = itoa64_to_int (input_buf
[12]) << 0
10408 | itoa64_to_int (input_buf
[13]) << 6
10409 | itoa64_to_int (input_buf
[14]) << 12
10410 | itoa64_to_int (input_buf
[15]) << 18;
10412 digest
[0] -= MD5M_A
;
10413 digest
[1] -= MD5M_B
;
10414 digest
[2] -= MD5M_C
;
10415 digest
[3] -= MD5M_D
;
10417 digest
[0] &= 0x00ffffff;
10418 digest
[1] &= 0x00ffffff;
10419 digest
[2] &= 0x00ffffff;
10420 digest
[3] &= 0x00ffffff;
10422 if (input_buf
[16] != data
.separator
) return (PARSER_SEPARATOR_UNMATCHED
);
10424 uint salt_len
= input_len
- 16 - 1;
10426 char *salt_buf
= input_buf
+ 16 + 1;
10428 char *salt_buf_ptr
= (char *) salt
->salt_buf
;
10430 salt_len
= parse_and_store_salt (salt_buf_ptr
, salt_buf
, salt_len
);
10432 if (salt_len
== UINT_MAX
) return (PARSER_SALT_LENGTH
);
10434 salt
->salt_len
= salt_len
;
10436 return (PARSER_OK
);
10439 void transform_netntlmv1_key (const uint8_t *nthash
, uint8_t *key
)
10441 key
[0] = (nthash
[0] >> 0);
10442 key
[1] = (nthash
[0] << 7) | (nthash
[1] >> 1);
10443 key
[2] = (nthash
[1] << 6) | (nthash
[2] >> 2);
10444 key
[3] = (nthash
[2] << 5) | (nthash
[3] >> 3);
10445 key
[4] = (nthash
[3] << 4) | (nthash
[4] >> 4);
10446 key
[5] = (nthash
[4] << 3) | (nthash
[5] >> 5);
10447 key
[6] = (nthash
[5] << 2) | (nthash
[6] >> 6);
10448 key
[7] = (nthash
[6] << 1);
10460 int netntlmv1_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
10462 if ((input_len
< DISPLAY_LEN_MIN_5500
) || (input_len
> DISPLAY_LEN_MAX_5500
)) return (PARSER_GLOBAL_LENGTH
);
10464 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
10466 salt_t
*salt
= hash_buf
->salt
;
10468 netntlm_t
*netntlm
= (netntlm_t
*) hash_buf
->esalt
;
10474 char *user_pos
= input_buf
;
10476 char *unused_pos
= strchr (user_pos
, ':');
10478 if (unused_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
10480 uint user_len
= unused_pos
- user_pos
;
10482 if (user_len
> 60) return (PARSER_SALT_LENGTH
);
10486 char *domain_pos
= strchr (unused_pos
, ':');
10488 if (domain_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
10490 uint unused_len
= domain_pos
- unused_pos
;
10492 if (unused_len
!= 0) return (PARSER_SALT_LENGTH
);
10496 char *srvchall_pos
= strchr (domain_pos
, ':');
10498 if (srvchall_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
10500 uint domain_len
= srvchall_pos
- domain_pos
;
10502 if (domain_len
> 45) return (PARSER_SALT_LENGTH
);
10506 char *hash_pos
= strchr (srvchall_pos
, ':');
10508 if (srvchall_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
10510 uint srvchall_len
= hash_pos
- srvchall_pos
;
10512 // if (srvchall_len != 0) return (PARSER_SALT_LENGTH);
10516 char *clichall_pos
= strchr (hash_pos
, ':');
10518 if (clichall_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
10520 uint hash_len
= clichall_pos
- hash_pos
;
10522 if (hash_len
!= 48) return (PARSER_HASH_LENGTH
);
10526 uint clichall_len
= input_len
- user_len
- 1 - unused_len
- 1 - domain_len
- 1 - srvchall_len
- 1 - hash_len
- 1;
10528 if (clichall_len
!= 16) return (PARSER_SALT_LENGTH
);
10531 * store some data for later use
10534 netntlm
->user_len
= user_len
* 2;
10535 netntlm
->domain_len
= domain_len
* 2;
10536 netntlm
->srvchall_len
= srvchall_len
/ 2;
10537 netntlm
->clichall_len
= clichall_len
/ 2;
10539 char *userdomain_ptr
= (char *) netntlm
->userdomain_buf
;
10540 char *chall_ptr
= (char *) netntlm
->chall_buf
;
10543 * handle username and domainname
10546 for (uint i
= 0; i
< user_len
; i
++)
10548 *userdomain_ptr
++ = user_pos
[i
];
10549 *userdomain_ptr
++ = 0;
10552 for (uint i
= 0; i
< domain_len
; i
++)
10554 *userdomain_ptr
++ = domain_pos
[i
];
10555 *userdomain_ptr
++ = 0;
10559 * handle server challenge encoding
10562 for (uint i
= 0; i
< srvchall_len
; i
+= 2)
10564 const char p0
= srvchall_pos
[i
+ 0];
10565 const char p1
= srvchall_pos
[i
+ 1];
10567 *chall_ptr
++ = hex_convert (p1
) << 0
10568 | hex_convert (p0
) << 4;
10572 * handle client challenge encoding
10575 for (uint i
= 0; i
< clichall_len
; i
+= 2)
10577 const char p0
= clichall_pos
[i
+ 0];
10578 const char p1
= clichall_pos
[i
+ 1];
10580 *chall_ptr
++ = hex_convert (p1
) << 0
10581 | hex_convert (p0
) << 4;
10588 char *salt_buf_ptr
= (char *) salt
->salt_buf
;
10590 uint salt_len
= parse_and_store_salt (salt_buf_ptr
, clichall_pos
, clichall_len
);
10592 if (salt_len
== UINT_MAX
) return (PARSER_SALT_LENGTH
);
10594 salt
->salt_len
= salt_len
;
10596 digest
[0] = hex_to_uint (&hash_pos
[ 0]);
10597 digest
[1] = hex_to_uint (&hash_pos
[ 8]);
10598 digest
[2] = hex_to_uint (&hash_pos
[16]);
10599 digest
[3] = hex_to_uint (&hash_pos
[24]);
10601 digest
[0] = byte_swap_32 (digest
[0]);
10602 digest
[1] = byte_swap_32 (digest
[1]);
10603 digest
[2] = byte_swap_32 (digest
[2]);
10604 digest
[3] = byte_swap_32 (digest
[3]);
10606 /* special case, last 8 byte do not need to be checked since they are brute-forced next */
10608 uint digest_tmp
[2];
10610 digest_tmp
[0] = hex_to_uint (&hash_pos
[32]);
10611 digest_tmp
[1] = hex_to_uint (&hash_pos
[40]);
10613 digest_tmp
[0] = byte_swap_32 (digest_tmp
[0]);
10614 digest_tmp
[1] = byte_swap_32 (digest_tmp
[1]);
10616 /* special case 2: ESS */
10618 if (srvchall_len
== 48)
10620 if ((netntlm
->chall_buf
[2] == 0) && (netntlm
->chall_buf
[3] == 0) && (netntlm
->chall_buf
[4] == 0) && (netntlm
->chall_buf
[5] == 0))
10624 w
[ 0] = netntlm
->chall_buf
[6];
10625 w
[ 1] = netntlm
->chall_buf
[7];
10626 w
[ 2] = netntlm
->chall_buf
[0];
10627 w
[ 3] = netntlm
->chall_buf
[1];
10650 salt
->salt_buf
[0] = dgst
[0];
10651 salt
->salt_buf
[1] = dgst
[1];
10655 /* precompute netntlmv1 exploit start */
10657 for (uint i
= 0; i
< 0x10000; i
++)
10659 uint key_md4
[2] = { i
, 0 };
10660 uint key_des
[2] = { 0, 0 };
10662 transform_netntlmv1_key ((uint8_t *) key_md4
, (uint8_t *) key_des
);
10667 _des_keysetup (key_des
, Kc
, Kd
, c_skb
);
10669 uint data3
[2] = { salt
->salt_buf
[0], salt
->salt_buf
[1] };
10671 _des_encrypt (data3
, Kc
, Kd
, c_SPtrans
);
10673 if (data3
[0] != digest_tmp
[0]) continue;
10674 if (data3
[1] != digest_tmp
[1]) continue;
10676 salt
->salt_buf
[2] = i
;
10678 salt
->salt_len
= 24;
10683 salt
->salt_buf_pc
[0] = digest_tmp
[0];
10684 salt
->salt_buf_pc
[1] = digest_tmp
[1];
10686 /* precompute netntlmv1 exploit stop */
10690 IP (digest
[0], digest
[1], tt
);
10691 IP (digest
[2], digest
[3], tt
);
10693 digest
[0] = ROTATE_RIGHT (digest
[0], 29);
10694 digest
[1] = ROTATE_RIGHT (digest
[1], 29);
10695 digest
[2] = ROTATE_RIGHT (digest
[2], 29);
10696 digest
[3] = ROTATE_RIGHT (digest
[3], 29);
10698 IP (salt
->salt_buf
[0], salt
->salt_buf
[1], tt
);
10700 salt
->salt_buf
[0] = ROTATE_LEFT (salt
->salt_buf
[0], 3);
10701 salt
->salt_buf
[1] = ROTATE_LEFT (salt
->salt_buf
[1], 3);
10703 return (PARSER_OK
);
10706 int netntlmv2_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
10708 if ((input_len
< DISPLAY_LEN_MIN_5600
) || (input_len
> DISPLAY_LEN_MAX_5600
)) return (PARSER_GLOBAL_LENGTH
);
10710 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
10712 salt_t
*salt
= hash_buf
->salt
;
10714 netntlm_t
*netntlm
= (netntlm_t
*) hash_buf
->esalt
;
10720 char *user_pos
= input_buf
;
10722 char *unused_pos
= strchr (user_pos
, ':');
10724 if (unused_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
10726 uint user_len
= unused_pos
- user_pos
;
10728 if (user_len
> 60) return (PARSER_SALT_LENGTH
);
10732 char *domain_pos
= strchr (unused_pos
, ':');
10734 if (domain_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
10736 uint unused_len
= domain_pos
- unused_pos
;
10738 if (unused_len
!= 0) return (PARSER_SALT_LENGTH
);
10742 char *srvchall_pos
= strchr (domain_pos
, ':');
10744 if (srvchall_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
10746 uint domain_len
= srvchall_pos
- domain_pos
;
10748 if (domain_len
> 45) return (PARSER_SALT_LENGTH
);
10752 char *hash_pos
= strchr (srvchall_pos
, ':');
10754 if (srvchall_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
10756 uint srvchall_len
= hash_pos
- srvchall_pos
;
10758 if (srvchall_len
!= 16) return (PARSER_SALT_LENGTH
);
10762 char *clichall_pos
= strchr (hash_pos
, ':');
10764 if (clichall_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
10766 uint hash_len
= clichall_pos
- hash_pos
;
10768 if (hash_len
!= 32) return (PARSER_HASH_LENGTH
);
10772 uint clichall_len
= input_len
- user_len
- 1 - unused_len
- 1 - domain_len
- 1 - srvchall_len
- 1 - hash_len
- 1;
10774 if (clichall_len
> 1024) return (PARSER_SALT_LENGTH
);
10776 if (clichall_len
% 2) return (PARSER_SALT_VALUE
);
10779 * store some data for later use
10782 netntlm
->user_len
= user_len
* 2;
10783 netntlm
->domain_len
= domain_len
* 2;
10784 netntlm
->srvchall_len
= srvchall_len
/ 2;
10785 netntlm
->clichall_len
= clichall_len
/ 2;
10787 char *userdomain_ptr
= (char *) netntlm
->userdomain_buf
;
10788 char *chall_ptr
= (char *) netntlm
->chall_buf
;
10791 * handle username and domainname
10794 for (uint i
= 0; i
< user_len
; i
++)
10796 *userdomain_ptr
++ = toupper (user_pos
[i
]);
10797 *userdomain_ptr
++ = 0;
10800 for (uint i
= 0; i
< domain_len
; i
++)
10802 *userdomain_ptr
++ = domain_pos
[i
];
10803 *userdomain_ptr
++ = 0;
10806 *userdomain_ptr
++ = 0x80;
10809 * handle server challenge encoding
10812 for (uint i
= 0; i
< srvchall_len
; i
+= 2)
10814 const char p0
= srvchall_pos
[i
+ 0];
10815 const char p1
= srvchall_pos
[i
+ 1];
10817 *chall_ptr
++ = hex_convert (p1
) << 0
10818 | hex_convert (p0
) << 4;
10822 * handle client challenge encoding
10825 for (uint i
= 0; i
< clichall_len
; i
+= 2)
10827 const char p0
= clichall_pos
[i
+ 0];
10828 const char p1
= clichall_pos
[i
+ 1];
10830 *chall_ptr
++ = hex_convert (p1
) << 0
10831 | hex_convert (p0
) << 4;
10834 *chall_ptr
++ = 0x80;
10837 * handle hash itself
10840 digest
[0] = hex_to_uint (&hash_pos
[ 0]);
10841 digest
[1] = hex_to_uint (&hash_pos
[ 8]);
10842 digest
[2] = hex_to_uint (&hash_pos
[16]);
10843 digest
[3] = hex_to_uint (&hash_pos
[24]);
10845 digest
[0] = byte_swap_32 (digest
[0]);
10846 digest
[1] = byte_swap_32 (digest
[1]);
10847 digest
[2] = byte_swap_32 (digest
[2]);
10848 digest
[3] = byte_swap_32 (digest
[3]);
10851 * reuse challange data as salt_buf, its the buffer that is most likely unique
10854 salt
->salt_buf
[0] = 0;
10855 salt
->salt_buf
[1] = 0;
10856 salt
->salt_buf
[2] = 0;
10857 salt
->salt_buf
[3] = 0;
10858 salt
->salt_buf
[4] = 0;
10859 salt
->salt_buf
[5] = 0;
10860 salt
->salt_buf
[6] = 0;
10861 salt
->salt_buf
[7] = 0;
10865 uptr
= (uint
*) netntlm
->userdomain_buf
;
10867 for (uint i
= 0; i
< 16; i
+= 16)
10869 md5_64 (uptr
, salt
->salt_buf
);
10872 uptr
= (uint
*) netntlm
->chall_buf
;
10874 for (uint i
= 0; i
< 256; i
+= 16)
10876 md5_64 (uptr
, salt
->salt_buf
);
10879 salt
->salt_len
= 16;
10881 return (PARSER_OK
);
10884 int joomla_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
10886 if (data
.opts_type
& OPTS_TYPE_ST_HEX
)
10888 if ((input_len
< DISPLAY_LEN_MIN_11H
) || (input_len
> DISPLAY_LEN_MAX_11H
)) return (PARSER_GLOBAL_LENGTH
);
10892 if ((input_len
< DISPLAY_LEN_MIN_11
) || (input_len
> DISPLAY_LEN_MAX_11
)) return (PARSER_GLOBAL_LENGTH
);
10895 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
10897 salt_t
*salt
= hash_buf
->salt
;
10899 digest
[0] = hex_to_uint (&input_buf
[ 0]);
10900 digest
[1] = hex_to_uint (&input_buf
[ 8]);
10901 digest
[2] = hex_to_uint (&input_buf
[16]);
10902 digest
[3] = hex_to_uint (&input_buf
[24]);
10904 digest
[0] = byte_swap_32 (digest
[0]);
10905 digest
[1] = byte_swap_32 (digest
[1]);
10906 digest
[2] = byte_swap_32 (digest
[2]);
10907 digest
[3] = byte_swap_32 (digest
[3]);
10909 digest
[0] -= MD5M_A
;
10910 digest
[1] -= MD5M_B
;
10911 digest
[2] -= MD5M_C
;
10912 digest
[3] -= MD5M_D
;
10914 if (input_buf
[32] != data
.separator
) return (PARSER_SEPARATOR_UNMATCHED
);
10916 uint salt_len
= input_len
- 32 - 1;
10918 char *salt_buf
= input_buf
+ 32 + 1;
10920 char *salt_buf_ptr
= (char *) salt
->salt_buf
;
10922 salt_len
= parse_and_store_salt (salt_buf_ptr
, salt_buf
, salt_len
);
10924 if (salt_len
== UINT_MAX
) return (PARSER_SALT_LENGTH
);
10926 salt
->salt_len
= salt_len
;
10928 return (PARSER_OK
);
10931 int postgresql_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
10933 if (data
.opts_type
& OPTS_TYPE_ST_HEX
)
10935 if ((input_len
< DISPLAY_LEN_MIN_12H
) || (input_len
> DISPLAY_LEN_MAX_12H
)) return (PARSER_GLOBAL_LENGTH
);
10939 if ((input_len
< DISPLAY_LEN_MIN_12
) || (input_len
> DISPLAY_LEN_MAX_12
)) return (PARSER_GLOBAL_LENGTH
);
10942 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
10944 salt_t
*salt
= hash_buf
->salt
;
10946 digest
[0] = hex_to_uint (&input_buf
[ 0]);
10947 digest
[1] = hex_to_uint (&input_buf
[ 8]);
10948 digest
[2] = hex_to_uint (&input_buf
[16]);
10949 digest
[3] = hex_to_uint (&input_buf
[24]);
10951 digest
[0] = byte_swap_32 (digest
[0]);
10952 digest
[1] = byte_swap_32 (digest
[1]);
10953 digest
[2] = byte_swap_32 (digest
[2]);
10954 digest
[3] = byte_swap_32 (digest
[3]);
10956 digest
[0] -= MD5M_A
;
10957 digest
[1] -= MD5M_B
;
10958 digest
[2] -= MD5M_C
;
10959 digest
[3] -= MD5M_D
;
10961 if (input_buf
[32] != data
.separator
) return (PARSER_SEPARATOR_UNMATCHED
);
10963 uint salt_len
= input_len
- 32 - 1;
10965 char *salt_buf
= input_buf
+ 32 + 1;
10967 char *salt_buf_ptr
= (char *) salt
->salt_buf
;
10969 salt_len
= parse_and_store_salt (salt_buf_ptr
, salt_buf
, salt_len
);
10971 if (salt_len
== UINT_MAX
) return (PARSER_SALT_LENGTH
);
10973 salt
->salt_len
= salt_len
;
10975 return (PARSER_OK
);
10978 int md5md5_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
10980 if ((input_len
< DISPLAY_LEN_MIN_2600
) || (input_len
> DISPLAY_LEN_MAX_2600
)) return (PARSER_GLOBAL_LENGTH
);
10982 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
10984 salt_t
*salt
= hash_buf
->salt
;
10986 digest
[0] = hex_to_uint (&input_buf
[ 0]);
10987 digest
[1] = hex_to_uint (&input_buf
[ 8]);
10988 digest
[2] = hex_to_uint (&input_buf
[16]);
10989 digest
[3] = hex_to_uint (&input_buf
[24]);
10991 digest
[0] = byte_swap_32 (digest
[0]);
10992 digest
[1] = byte_swap_32 (digest
[1]);
10993 digest
[2] = byte_swap_32 (digest
[2]);
10994 digest
[3] = byte_swap_32 (digest
[3]);
10996 digest
[0] -= MD5M_A
;
10997 digest
[1] -= MD5M_B
;
10998 digest
[2] -= MD5M_C
;
10999 digest
[3] -= MD5M_D
;
11002 * This is a virtual salt. While the algorithm is basically not salted
11003 * we can exploit the salt buffer to set the 0x80 and the w[14] value.
11004 * This way we can save a special md5md5 kernel and reuse the one from vbull.
11007 char *salt_buf_ptr
= (char *) salt
->salt_buf
;
11009 uint salt_len
= parse_and_store_salt (salt_buf_ptr
, (char *) "", 0);
11011 if (salt_len
== UINT_MAX
) return (PARSER_SALT_LENGTH
);
11013 salt
->salt_len
= salt_len
;
11015 return (PARSER_OK
);
11018 int vb3_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
11020 if (data
.opts_type
& OPTS_TYPE_ST_HEX
)
11022 if ((input_len
< DISPLAY_LEN_MIN_2611H
) || (input_len
> DISPLAY_LEN_MAX_2611H
)) return (PARSER_GLOBAL_LENGTH
);
11026 if ((input_len
< DISPLAY_LEN_MIN_2611
) || (input_len
> DISPLAY_LEN_MAX_2611
)) return (PARSER_GLOBAL_LENGTH
);
11029 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
11031 salt_t
*salt
= hash_buf
->salt
;
11033 digest
[0] = hex_to_uint (&input_buf
[ 0]);
11034 digest
[1] = hex_to_uint (&input_buf
[ 8]);
11035 digest
[2] = hex_to_uint (&input_buf
[16]);
11036 digest
[3] = hex_to_uint (&input_buf
[24]);
11038 digest
[0] = byte_swap_32 (digest
[0]);
11039 digest
[1] = byte_swap_32 (digest
[1]);
11040 digest
[2] = byte_swap_32 (digest
[2]);
11041 digest
[3] = byte_swap_32 (digest
[3]);
11043 digest
[0] -= MD5M_A
;
11044 digest
[1] -= MD5M_B
;
11045 digest
[2] -= MD5M_C
;
11046 digest
[3] -= MD5M_D
;
11048 if (input_buf
[32] != data
.separator
) return (PARSER_SEPARATOR_UNMATCHED
);
11050 uint salt_len
= input_len
- 32 - 1;
11052 char *salt_buf
= input_buf
+ 32 + 1;
11054 char *salt_buf_ptr
= (char *) salt
->salt_buf
;
11056 salt_len
= parse_and_store_salt (salt_buf_ptr
, salt_buf
, salt_len
);
11058 if (salt_len
== UINT_MAX
) return (PARSER_SALT_LENGTH
);
11060 salt
->salt_len
= salt_len
;
11062 return (PARSER_OK
);
11065 int vb30_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
11067 if (data
.opts_type
& OPTS_TYPE_ST_HEX
)
11069 if ((input_len
< DISPLAY_LEN_MIN_2711H
) || (input_len
> DISPLAY_LEN_MAX_2711H
)) return (PARSER_GLOBAL_LENGTH
);
11073 if ((input_len
< DISPLAY_LEN_MIN_2711
) || (input_len
> DISPLAY_LEN_MAX_2711
)) return (PARSER_GLOBAL_LENGTH
);
11076 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
11078 salt_t
*salt
= hash_buf
->salt
;
11080 digest
[0] = hex_to_uint (&input_buf
[ 0]);
11081 digest
[1] = hex_to_uint (&input_buf
[ 8]);
11082 digest
[2] = hex_to_uint (&input_buf
[16]);
11083 digest
[3] = hex_to_uint (&input_buf
[24]);
11085 digest
[0] = byte_swap_32 (digest
[0]);
11086 digest
[1] = byte_swap_32 (digest
[1]);
11087 digest
[2] = byte_swap_32 (digest
[2]);
11088 digest
[3] = byte_swap_32 (digest
[3]);
11090 if (input_buf
[32] != data
.separator
) return (PARSER_SEPARATOR_UNMATCHED
);
11092 uint salt_len
= input_len
- 32 - 1;
11094 char *salt_buf
= input_buf
+ 32 + 1;
11096 char *salt_buf_ptr
= (char *) salt
->salt_buf
;
11098 salt_len
= parse_and_store_salt (salt_buf_ptr
, salt_buf
, salt_len
);
11100 if (salt_len
== UINT_MAX
) return (PARSER_SALT_LENGTH
);
11102 salt
->salt_len
= salt_len
;
11104 return (PARSER_OK
);
11107 int dcc_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
11109 if (data
.opts_type
& OPTS_TYPE_ST_HEX
)
11111 if ((input_len
< DISPLAY_LEN_MIN_1100H
) || (input_len
> DISPLAY_LEN_MAX_1100H
)) return (PARSER_GLOBAL_LENGTH
);
11115 if ((input_len
< DISPLAY_LEN_MIN_1100
) || (input_len
> DISPLAY_LEN_MAX_1100
)) return (PARSER_GLOBAL_LENGTH
);
11118 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
11120 salt_t
*salt
= hash_buf
->salt
;
11122 digest
[0] = hex_to_uint (&input_buf
[ 0]);
11123 digest
[1] = hex_to_uint (&input_buf
[ 8]);
11124 digest
[2] = hex_to_uint (&input_buf
[16]);
11125 digest
[3] = hex_to_uint (&input_buf
[24]);
11127 digest
[0] = byte_swap_32 (digest
[0]);
11128 digest
[1] = byte_swap_32 (digest
[1]);
11129 digest
[2] = byte_swap_32 (digest
[2]);
11130 digest
[3] = byte_swap_32 (digest
[3]);
11132 digest
[0] -= MD4M_A
;
11133 digest
[1] -= MD4M_B
;
11134 digest
[2] -= MD4M_C
;
11135 digest
[3] -= MD4M_D
;
11137 if (input_buf
[32] != data
.separator
) return (PARSER_SEPARATOR_UNMATCHED
);
11139 uint salt_len
= input_len
- 32 - 1;
11141 char *salt_buf
= input_buf
+ 32 + 1;
11143 char *salt_buf_ptr
= (char *) salt
->salt_buf
;
11145 salt_len
= parse_and_store_salt (salt_buf_ptr
, salt_buf
, salt_len
);
11147 if (salt_len
== UINT_MAX
) return (PARSER_SALT_LENGTH
);
11149 salt
->salt_len
= salt_len
;
11151 return (PARSER_OK
);
11154 int ipb2_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
11156 if (data
.opts_type
& OPTS_TYPE_ST_HEX
)
11158 if ((input_len
< DISPLAY_LEN_MIN_2811H
) || (input_len
> DISPLAY_LEN_MAX_2811H
)) return (PARSER_GLOBAL_LENGTH
);
11162 if ((input_len
< DISPLAY_LEN_MIN_2811
) || (input_len
> DISPLAY_LEN_MAX_2811
)) return (PARSER_GLOBAL_LENGTH
);
11165 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
11167 salt_t
*salt
= hash_buf
->salt
;
11169 digest
[0] = hex_to_uint (&input_buf
[ 0]);
11170 digest
[1] = hex_to_uint (&input_buf
[ 8]);
11171 digest
[2] = hex_to_uint (&input_buf
[16]);
11172 digest
[3] = hex_to_uint (&input_buf
[24]);
11174 digest
[0] = byte_swap_32 (digest
[0]);
11175 digest
[1] = byte_swap_32 (digest
[1]);
11176 digest
[2] = byte_swap_32 (digest
[2]);
11177 digest
[3] = byte_swap_32 (digest
[3]);
11179 if (input_buf
[32] != data
.separator
) return (PARSER_SEPARATOR_UNMATCHED
);
11181 uint salt_len
= input_len
- 32 - 1;
11183 char *salt_buf
= input_buf
+ 32 + 1;
11185 uint salt_pc_block
[16];
11187 memset (salt_pc_block
, 0, sizeof (salt_pc_block
));
11189 char *salt_pc_block_ptr
= (char *) salt_pc_block
;
11191 salt_len
= parse_and_store_salt (salt_pc_block_ptr
, salt_buf
, salt_len
);
11193 if (salt_len
== UINT_MAX
) return (PARSER_SALT_LENGTH
);
11195 salt_pc_block_ptr
[salt_len
] = (unsigned char) 0x80;
11197 salt_pc_block
[14] = salt_len
* 8;
11199 uint salt_pc_digest
[4];
11201 salt_pc_digest
[0] = MAGIC_A
;
11202 salt_pc_digest
[1] = MAGIC_B
;
11203 salt_pc_digest
[2] = MAGIC_C
;
11204 salt_pc_digest
[3] = MAGIC_D
;
11206 md5_64 (salt_pc_block
, salt_pc_digest
);
11208 salt_pc_digest
[0] = byte_swap_32 (salt_pc_digest
[0]);
11209 salt_pc_digest
[1] = byte_swap_32 (salt_pc_digest
[1]);
11210 salt_pc_digest
[2] = byte_swap_32 (salt_pc_digest
[2]);
11211 salt_pc_digest
[3] = byte_swap_32 (salt_pc_digest
[3]);
11213 char *salt_buf_ptr
= (char *) salt
->salt_buf
;
11215 memcpy (salt_buf_ptr
, salt_buf
, salt_len
);
11217 char *salt_buf_pc_ptr
= (char *) salt
->salt_buf_pc
;
11219 bin_to_hex_lower (salt_pc_digest
[0], salt_buf_pc_ptr
+ 0);
11220 bin_to_hex_lower (salt_pc_digest
[1], salt_buf_pc_ptr
+ 8);
11221 bin_to_hex_lower (salt_pc_digest
[2], salt_buf_pc_ptr
+ 16);
11222 bin_to_hex_lower (salt_pc_digest
[3], salt_buf_pc_ptr
+ 24);
11224 salt
->salt_len
= 32; // changed, was salt_len before -- was a bug? 32 should be correct
11226 return (PARSER_OK
);
11229 int sha1_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
11231 if ((input_len
< DISPLAY_LEN_MIN_100
) || (input_len
> DISPLAY_LEN_MAX_100
)) return (PARSER_GLOBAL_LENGTH
);
11233 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
11235 digest
[0] = hex_to_uint (&input_buf
[ 0]);
11236 digest
[1] = hex_to_uint (&input_buf
[ 8]);
11237 digest
[2] = hex_to_uint (&input_buf
[16]);
11238 digest
[3] = hex_to_uint (&input_buf
[24]);
11239 digest
[4] = hex_to_uint (&input_buf
[32]);
11241 digest
[0] -= SHA1M_A
;
11242 digest
[1] -= SHA1M_B
;
11243 digest
[2] -= SHA1M_C
;
11244 digest
[3] -= SHA1M_D
;
11245 digest
[4] -= SHA1M_E
;
11247 return (PARSER_OK
);
11250 int sha1linkedin_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
11252 if ((input_len
< DISPLAY_LEN_MIN_100
) || (input_len
> DISPLAY_LEN_MAX_100
)) return (PARSER_GLOBAL_LENGTH
);
11254 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
11256 digest
[0] = hex_to_uint (&input_buf
[ 0]);
11257 digest
[1] = hex_to_uint (&input_buf
[ 8]);
11258 digest
[2] = hex_to_uint (&input_buf
[16]);
11259 digest
[3] = hex_to_uint (&input_buf
[24]);
11260 digest
[4] = hex_to_uint (&input_buf
[32]);
11262 return (PARSER_OK
);
11265 int sha1s_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
11267 if (data
.opts_type
& OPTS_TYPE_ST_HEX
)
11269 if ((input_len
< DISPLAY_LEN_MIN_110H
) || (input_len
> DISPLAY_LEN_MAX_110H
)) return (PARSER_GLOBAL_LENGTH
);
11273 if ((input_len
< DISPLAY_LEN_MIN_110
) || (input_len
> DISPLAY_LEN_MAX_110
)) return (PARSER_GLOBAL_LENGTH
);
11276 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
11278 salt_t
*salt
= hash_buf
->salt
;
11280 digest
[0] = hex_to_uint (&input_buf
[ 0]);
11281 digest
[1] = hex_to_uint (&input_buf
[ 8]);
11282 digest
[2] = hex_to_uint (&input_buf
[16]);
11283 digest
[3] = hex_to_uint (&input_buf
[24]);
11284 digest
[4] = hex_to_uint (&input_buf
[32]);
11286 digest
[0] -= SHA1M_A
;
11287 digest
[1] -= SHA1M_B
;
11288 digest
[2] -= SHA1M_C
;
11289 digest
[3] -= SHA1M_D
;
11290 digest
[4] -= SHA1M_E
;
11292 if (input_buf
[40] != data
.separator
) return (PARSER_SEPARATOR_UNMATCHED
);
11294 uint salt_len
= input_len
- 40 - 1;
11296 char *salt_buf
= input_buf
+ 40 + 1;
11298 char *salt_buf_ptr
= (char *) salt
->salt_buf
;
11300 salt_len
= parse_and_store_salt (salt_buf_ptr
, salt_buf
, salt_len
);
11302 if (salt_len
== UINT_MAX
) return (PARSER_SALT_LENGTH
);
11304 salt
->salt_len
= salt_len
;
11306 return (PARSER_OK
);
11309 int sha1b64_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
11311 if ((input_len
< DISPLAY_LEN_MIN_101
) || (input_len
> DISPLAY_LEN_MAX_101
)) return (PARSER_GLOBAL_LENGTH
);
11313 if (memcmp (SIGNATURE_SHA1B64
, input_buf
, 5)) return (PARSER_SIGNATURE_UNMATCHED
);
11315 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
11319 memset (tmp_buf
, 0, sizeof (tmp_buf
));
11321 base64_decode (base64_to_int
, input_buf
+ 5, input_len
- 5, tmp_buf
);
11323 memcpy (digest
, tmp_buf
, 20);
11325 digest
[0] = byte_swap_32 (digest
[0]);
11326 digest
[1] = byte_swap_32 (digest
[1]);
11327 digest
[2] = byte_swap_32 (digest
[2]);
11328 digest
[3] = byte_swap_32 (digest
[3]);
11329 digest
[4] = byte_swap_32 (digest
[4]);
11331 digest
[0] -= SHA1M_A
;
11332 digest
[1] -= SHA1M_B
;
11333 digest
[2] -= SHA1M_C
;
11334 digest
[3] -= SHA1M_D
;
11335 digest
[4] -= SHA1M_E
;
11337 return (PARSER_OK
);
11340 int sha1b64s_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
11342 if ((input_len
< DISPLAY_LEN_MIN_111
) || (input_len
> DISPLAY_LEN_MAX_111
)) return (PARSER_GLOBAL_LENGTH
);
11344 if (memcmp (SIGNATURE_SSHA1B64_lower
, input_buf
, 6) && memcmp (SIGNATURE_SSHA1B64_upper
, input_buf
, 6)) return (PARSER_SIGNATURE_UNMATCHED
);
11346 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
11348 salt_t
*salt
= hash_buf
->salt
;
11352 memset (tmp_buf
, 0, sizeof (tmp_buf
));
11354 int tmp_len
= base64_decode (base64_to_int
, input_buf
+ 6, input_len
- 6, tmp_buf
);
11356 memcpy (digest
, tmp_buf
, 20);
11358 salt
->salt_len
= tmp_len
- 20;
11360 memcpy (salt
->salt_buf
, tmp_buf
+ 20, salt
->salt_len
);
11362 if (data
.opts_type
& OPTS_TYPE_ST_ADD80
)
11364 char *ptr
= (char *) salt
->salt_buf
;
11366 ptr
[salt
->salt_len
] = 0x80;
11369 digest
[0] = byte_swap_32 (digest
[0]);
11370 digest
[1] = byte_swap_32 (digest
[1]);
11371 digest
[2] = byte_swap_32 (digest
[2]);
11372 digest
[3] = byte_swap_32 (digest
[3]);
11373 digest
[4] = byte_swap_32 (digest
[4]);
11375 digest
[0] -= SHA1M_A
;
11376 digest
[1] -= SHA1M_B
;
11377 digest
[2] -= SHA1M_C
;
11378 digest
[3] -= SHA1M_D
;
11379 digest
[4] -= SHA1M_E
;
11381 return (PARSER_OK
);
11384 int mssql2000_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
11386 if ((input_len
< DISPLAY_LEN_MIN_131
) || (input_len
> DISPLAY_LEN_MAX_131
)) return (PARSER_GLOBAL_LENGTH
);
11388 if (memcmp (SIGNATURE_MSSQL
, input_buf
, 6)) return (PARSER_SIGNATURE_UNMATCHED
);
11390 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
11392 salt_t
*salt
= hash_buf
->salt
;
11394 char *salt_buf
= input_buf
+ 6;
11398 char *salt_buf_ptr
= (char *) salt
->salt_buf
;
11400 salt_len
= parse_and_store_salt (salt_buf_ptr
, salt_buf
, salt_len
);
11402 if (salt_len
== UINT_MAX
) return (PARSER_SALT_LENGTH
);
11404 salt
->salt_len
= salt_len
;
11406 char *hash_pos
= input_buf
+ 6 + 8 + 40;
11408 digest
[0] = hex_to_uint (&hash_pos
[ 0]);
11409 digest
[1] = hex_to_uint (&hash_pos
[ 8]);
11410 digest
[2] = hex_to_uint (&hash_pos
[16]);
11411 digest
[3] = hex_to_uint (&hash_pos
[24]);
11412 digest
[4] = hex_to_uint (&hash_pos
[32]);
11414 digest
[0] -= SHA1M_A
;
11415 digest
[1] -= SHA1M_B
;
11416 digest
[2] -= SHA1M_C
;
11417 digest
[3] -= SHA1M_D
;
11418 digest
[4] -= SHA1M_E
;
11420 return (PARSER_OK
);
11423 int mssql2005_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
11425 if ((input_len
< DISPLAY_LEN_MIN_132
) || (input_len
> DISPLAY_LEN_MAX_132
)) return (PARSER_GLOBAL_LENGTH
);
11427 if (memcmp (SIGNATURE_MSSQL
, input_buf
, 6)) return (PARSER_SIGNATURE_UNMATCHED
);
11429 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
11431 salt_t
*salt
= hash_buf
->salt
;
11433 char *salt_buf
= input_buf
+ 6;
11437 char *salt_buf_ptr
= (char *) salt
->salt_buf
;
11439 salt_len
= parse_and_store_salt (salt_buf_ptr
, salt_buf
, salt_len
);
11441 if (salt_len
== UINT_MAX
) return (PARSER_SALT_LENGTH
);
11443 salt
->salt_len
= salt_len
;
11445 char *hash_pos
= input_buf
+ 6 + 8;
11447 digest
[0] = hex_to_uint (&hash_pos
[ 0]);
11448 digest
[1] = hex_to_uint (&hash_pos
[ 8]);
11449 digest
[2] = hex_to_uint (&hash_pos
[16]);
11450 digest
[3] = hex_to_uint (&hash_pos
[24]);
11451 digest
[4] = hex_to_uint (&hash_pos
[32]);
11453 digest
[0] -= SHA1M_A
;
11454 digest
[1] -= SHA1M_B
;
11455 digest
[2] -= SHA1M_C
;
11456 digest
[3] -= SHA1M_D
;
11457 digest
[4] -= SHA1M_E
;
11459 return (PARSER_OK
);
11462 int mssql2012_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
11464 if ((input_len
< DISPLAY_LEN_MIN_1731
) || (input_len
> DISPLAY_LEN_MAX_1731
)) return (PARSER_GLOBAL_LENGTH
);
11466 if (memcmp (SIGNATURE_MSSQL2012
, input_buf
, 6)) return (PARSER_SIGNATURE_UNMATCHED
);
11468 uint64_t *digest
= (uint64_t *) hash_buf
->digest
;
11470 salt_t
*salt
= hash_buf
->salt
;
11472 char *salt_buf
= input_buf
+ 6;
11476 char *salt_buf_ptr
= (char *) salt
->salt_buf
;
11478 salt_len
= parse_and_store_salt (salt_buf_ptr
, salt_buf
, salt_len
);
11480 if (salt_len
== UINT_MAX
) return (PARSER_SALT_LENGTH
);
11482 salt
->salt_len
= salt_len
;
11484 char *hash_pos
= input_buf
+ 6 + 8;
11486 digest
[0] = hex_to_uint64_t (&hash_pos
[ 0]);
11487 digest
[1] = hex_to_uint64_t (&hash_pos
[ 16]);
11488 digest
[2] = hex_to_uint64_t (&hash_pos
[ 32]);
11489 digest
[3] = hex_to_uint64_t (&hash_pos
[ 48]);
11490 digest
[4] = hex_to_uint64_t (&hash_pos
[ 64]);
11491 digest
[5] = hex_to_uint64_t (&hash_pos
[ 80]);
11492 digest
[6] = hex_to_uint64_t (&hash_pos
[ 96]);
11493 digest
[7] = hex_to_uint64_t (&hash_pos
[112]);
11495 digest
[0] -= SHA512M_A
;
11496 digest
[1] -= SHA512M_B
;
11497 digest
[2] -= SHA512M_C
;
11498 digest
[3] -= SHA512M_D
;
11499 digest
[4] -= SHA512M_E
;
11500 digest
[5] -= SHA512M_F
;
11501 digest
[6] -= SHA512M_G
;
11502 digest
[7] -= SHA512M_H
;
11504 return (PARSER_OK
);
11507 int oracleh_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
11509 if (data
.opts_type
& OPTS_TYPE_ST_HEX
)
11511 if ((input_len
< DISPLAY_LEN_MIN_3100H
) || (input_len
> DISPLAY_LEN_MAX_3100H
)) return (PARSER_GLOBAL_LENGTH
);
11515 if ((input_len
< DISPLAY_LEN_MIN_3100
) || (input_len
> DISPLAY_LEN_MAX_3100
)) return (PARSER_GLOBAL_LENGTH
);
11518 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
11520 salt_t
*salt
= hash_buf
->salt
;
11522 digest
[0] = hex_to_uint (&input_buf
[ 0]);
11523 digest
[1] = hex_to_uint (&input_buf
[ 8]);
11527 digest
[0] = byte_swap_32 (digest
[0]);
11528 digest
[1] = byte_swap_32 (digest
[1]);
11530 if (input_buf
[16] != data
.separator
) return (PARSER_SEPARATOR_UNMATCHED
);
11532 uint salt_len
= input_len
- 16 - 1;
11534 char *salt_buf
= input_buf
+ 16 + 1;
11536 char *salt_buf_ptr
= (char *) salt
->salt_buf
;
11538 salt_len
= parse_and_store_salt (salt_buf_ptr
, salt_buf
, salt_len
);
11540 if (salt_len
== UINT_MAX
) return (PARSER_SALT_LENGTH
);
11542 salt
->salt_len
= salt_len
;
11544 return (PARSER_OK
);
11547 int oracles_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
11549 if ((input_len
< DISPLAY_LEN_MIN_112
) || (input_len
> DISPLAY_LEN_MAX_112
)) return (PARSER_GLOBAL_LENGTH
);
11551 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
11553 salt_t
*salt
= hash_buf
->salt
;
11555 digest
[0] = hex_to_uint (&input_buf
[ 0]);
11556 digest
[1] = hex_to_uint (&input_buf
[ 8]);
11557 digest
[2] = hex_to_uint (&input_buf
[16]);
11558 digest
[3] = hex_to_uint (&input_buf
[24]);
11559 digest
[4] = hex_to_uint (&input_buf
[32]);
11561 digest
[0] -= SHA1M_A
;
11562 digest
[1] -= SHA1M_B
;
11563 digest
[2] -= SHA1M_C
;
11564 digest
[3] -= SHA1M_D
;
11565 digest
[4] -= SHA1M_E
;
11567 if (input_buf
[40] != data
.separator
) return (PARSER_SEPARATOR_UNMATCHED
);
11569 uint salt_len
= input_len
- 40 - 1;
11571 char *salt_buf
= input_buf
+ 40 + 1;
11573 char *salt_buf_ptr
= (char *) salt
->salt_buf
;
11575 salt_len
= parse_and_store_salt (salt_buf_ptr
, salt_buf
, salt_len
);
11577 if (salt_len
== UINT_MAX
) return (PARSER_SALT_LENGTH
);
11579 salt
->salt_len
= salt_len
;
11581 return (PARSER_OK
);
11584 int oraclet_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
11586 if ((input_len
< DISPLAY_LEN_MIN_12300
) || (input_len
> DISPLAY_LEN_MAX_12300
)) return (PARSER_GLOBAL_LENGTH
);
11588 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
11590 salt_t
*salt
= hash_buf
->salt
;
11592 char *hash_pos
= input_buf
;
11594 digest
[ 0] = hex_to_uint (&hash_pos
[ 0]);
11595 digest
[ 1] = hex_to_uint (&hash_pos
[ 8]);
11596 digest
[ 2] = hex_to_uint (&hash_pos
[ 16]);
11597 digest
[ 3] = hex_to_uint (&hash_pos
[ 24]);
11598 digest
[ 4] = hex_to_uint (&hash_pos
[ 32]);
11599 digest
[ 5] = hex_to_uint (&hash_pos
[ 40]);
11600 digest
[ 6] = hex_to_uint (&hash_pos
[ 48]);
11601 digest
[ 7] = hex_to_uint (&hash_pos
[ 56]);
11602 digest
[ 8] = hex_to_uint (&hash_pos
[ 64]);
11603 digest
[ 9] = hex_to_uint (&hash_pos
[ 72]);
11604 digest
[10] = hex_to_uint (&hash_pos
[ 80]);
11605 digest
[11] = hex_to_uint (&hash_pos
[ 88]);
11606 digest
[12] = hex_to_uint (&hash_pos
[ 96]);
11607 digest
[13] = hex_to_uint (&hash_pos
[104]);
11608 digest
[14] = hex_to_uint (&hash_pos
[112]);
11609 digest
[15] = hex_to_uint (&hash_pos
[120]);
11611 char *salt_pos
= input_buf
+ 128;
11613 salt
->salt_buf
[0] = hex_to_uint (&salt_pos
[ 0]);
11614 salt
->salt_buf
[1] = hex_to_uint (&salt_pos
[ 8]);
11615 salt
->salt_buf
[2] = hex_to_uint (&salt_pos
[16]);
11616 salt
->salt_buf
[3] = hex_to_uint (&salt_pos
[24]);
11618 salt
->salt_iter
= ROUNDS_ORACLET
- 1;
11619 salt
->salt_len
= 16;
11621 return (PARSER_OK
);
11624 int sha256_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
11626 if ((input_len
< DISPLAY_LEN_MIN_1400
) || (input_len
> DISPLAY_LEN_MAX_1400
)) return (PARSER_GLOBAL_LENGTH
);
11628 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
11630 digest
[0] = hex_to_uint (&input_buf
[ 0]);
11631 digest
[1] = hex_to_uint (&input_buf
[ 8]);
11632 digest
[2] = hex_to_uint (&input_buf
[16]);
11633 digest
[3] = hex_to_uint (&input_buf
[24]);
11634 digest
[4] = hex_to_uint (&input_buf
[32]);
11635 digest
[5] = hex_to_uint (&input_buf
[40]);
11636 digest
[6] = hex_to_uint (&input_buf
[48]);
11637 digest
[7] = hex_to_uint (&input_buf
[56]);
11639 digest
[0] -= SHA256M_A
;
11640 digest
[1] -= SHA256M_B
;
11641 digest
[2] -= SHA256M_C
;
11642 digest
[3] -= SHA256M_D
;
11643 digest
[4] -= SHA256M_E
;
11644 digest
[5] -= SHA256M_F
;
11645 digest
[6] -= SHA256M_G
;
11646 digest
[7] -= SHA256M_H
;
11648 return (PARSER_OK
);
11651 int sha256s_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
11653 if (data
.opts_type
& OPTS_TYPE_ST_HEX
)
11655 if ((input_len
< DISPLAY_LEN_MIN_1410H
) || (input_len
> DISPLAY_LEN_MAX_1410H
)) return (PARSER_GLOBAL_LENGTH
);
11659 if ((input_len
< DISPLAY_LEN_MIN_1410
) || (input_len
> DISPLAY_LEN_MAX_1410
)) return (PARSER_GLOBAL_LENGTH
);
11662 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
11664 salt_t
*salt
= hash_buf
->salt
;
11666 digest
[0] = hex_to_uint (&input_buf
[ 0]);
11667 digest
[1] = hex_to_uint (&input_buf
[ 8]);
11668 digest
[2] = hex_to_uint (&input_buf
[16]);
11669 digest
[3] = hex_to_uint (&input_buf
[24]);
11670 digest
[4] = hex_to_uint (&input_buf
[32]);
11671 digest
[5] = hex_to_uint (&input_buf
[40]);
11672 digest
[6] = hex_to_uint (&input_buf
[48]);
11673 digest
[7] = hex_to_uint (&input_buf
[56]);
11675 digest
[0] -= SHA256M_A
;
11676 digest
[1] -= SHA256M_B
;
11677 digest
[2] -= SHA256M_C
;
11678 digest
[3] -= SHA256M_D
;
11679 digest
[4] -= SHA256M_E
;
11680 digest
[5] -= SHA256M_F
;
11681 digest
[6] -= SHA256M_G
;
11682 digest
[7] -= SHA256M_H
;
11684 if (input_buf
[64] != data
.separator
) return (PARSER_SEPARATOR_UNMATCHED
);
11686 uint salt_len
= input_len
- 64 - 1;
11688 char *salt_buf
= input_buf
+ 64 + 1;
11690 char *salt_buf_ptr
= (char *) salt
->salt_buf
;
11692 salt_len
= parse_and_store_salt (salt_buf_ptr
, salt_buf
, salt_len
);
11694 if (salt_len
== UINT_MAX
) return (PARSER_SALT_LENGTH
);
11696 salt
->salt_len
= salt_len
;
11698 return (PARSER_OK
);
11701 int sha384_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
11703 if ((input_len
< DISPLAY_LEN_MIN_10800
) || (input_len
> DISPLAY_LEN_MAX_10800
)) return (PARSER_GLOBAL_LENGTH
);
11705 uint64_t *digest
= (uint64_t *) hash_buf
->digest
;
11707 digest
[0] = hex_to_uint64_t (&input_buf
[ 0]);
11708 digest
[1] = hex_to_uint64_t (&input_buf
[ 16]);
11709 digest
[2] = hex_to_uint64_t (&input_buf
[ 32]);
11710 digest
[3] = hex_to_uint64_t (&input_buf
[ 48]);
11711 digest
[4] = hex_to_uint64_t (&input_buf
[ 64]);
11712 digest
[5] = hex_to_uint64_t (&input_buf
[ 80]);
11716 digest
[0] -= SHA384M_A
;
11717 digest
[1] -= SHA384M_B
;
11718 digest
[2] -= SHA384M_C
;
11719 digest
[3] -= SHA384M_D
;
11720 digest
[4] -= SHA384M_E
;
11721 digest
[5] -= SHA384M_F
;
11725 return (PARSER_OK
);
11728 int sha512_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
11730 if ((input_len
< DISPLAY_LEN_MIN_1700
) || (input_len
> DISPLAY_LEN_MAX_1700
)) return (PARSER_GLOBAL_LENGTH
);
11732 uint64_t *digest
= (uint64_t *) hash_buf
->digest
;
11734 digest
[0] = hex_to_uint64_t (&input_buf
[ 0]);
11735 digest
[1] = hex_to_uint64_t (&input_buf
[ 16]);
11736 digest
[2] = hex_to_uint64_t (&input_buf
[ 32]);
11737 digest
[3] = hex_to_uint64_t (&input_buf
[ 48]);
11738 digest
[4] = hex_to_uint64_t (&input_buf
[ 64]);
11739 digest
[5] = hex_to_uint64_t (&input_buf
[ 80]);
11740 digest
[6] = hex_to_uint64_t (&input_buf
[ 96]);
11741 digest
[7] = hex_to_uint64_t (&input_buf
[112]);
11743 digest
[0] -= SHA512M_A
;
11744 digest
[1] -= SHA512M_B
;
11745 digest
[2] -= SHA512M_C
;
11746 digest
[3] -= SHA512M_D
;
11747 digest
[4] -= SHA512M_E
;
11748 digest
[5] -= SHA512M_F
;
11749 digest
[6] -= SHA512M_G
;
11750 digest
[7] -= SHA512M_H
;
11752 return (PARSER_OK
);
11755 int sha512s_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
11757 if (data
.opts_type
& OPTS_TYPE_ST_HEX
)
11759 if ((input_len
< DISPLAY_LEN_MIN_1710H
) || (input_len
> DISPLAY_LEN_MAX_1710H
)) return (PARSER_GLOBAL_LENGTH
);
11763 if ((input_len
< DISPLAY_LEN_MIN_1710
) || (input_len
> DISPLAY_LEN_MAX_1710
)) return (PARSER_GLOBAL_LENGTH
);
11766 uint64_t *digest
= (uint64_t *) hash_buf
->digest
;
11768 salt_t
*salt
= hash_buf
->salt
;
11770 digest
[0] = hex_to_uint64_t (&input_buf
[ 0]);
11771 digest
[1] = hex_to_uint64_t (&input_buf
[ 16]);
11772 digest
[2] = hex_to_uint64_t (&input_buf
[ 32]);
11773 digest
[3] = hex_to_uint64_t (&input_buf
[ 48]);
11774 digest
[4] = hex_to_uint64_t (&input_buf
[ 64]);
11775 digest
[5] = hex_to_uint64_t (&input_buf
[ 80]);
11776 digest
[6] = hex_to_uint64_t (&input_buf
[ 96]);
11777 digest
[7] = hex_to_uint64_t (&input_buf
[112]);
11779 digest
[0] -= SHA512M_A
;
11780 digest
[1] -= SHA512M_B
;
11781 digest
[2] -= SHA512M_C
;
11782 digest
[3] -= SHA512M_D
;
11783 digest
[4] -= SHA512M_E
;
11784 digest
[5] -= SHA512M_F
;
11785 digest
[6] -= SHA512M_G
;
11786 digest
[7] -= SHA512M_H
;
11788 if (input_buf
[128] != data
.separator
) return (PARSER_SEPARATOR_UNMATCHED
);
11790 uint salt_len
= input_len
- 128 - 1;
11792 char *salt_buf
= input_buf
+ 128 + 1;
11794 char *salt_buf_ptr
= (char *) salt
->salt_buf
;
11796 salt_len
= parse_and_store_salt (salt_buf_ptr
, salt_buf
, salt_len
);
11798 if (salt_len
== UINT_MAX
) return (PARSER_SALT_LENGTH
);
11800 salt
->salt_len
= salt_len
;
11802 return (PARSER_OK
);
11805 int sha512crypt_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
11807 if (memcmp (SIGNATURE_SHA512CRYPT
, input_buf
, 3)) return (PARSER_SIGNATURE_UNMATCHED
);
11809 uint64_t *digest
= (uint64_t *) hash_buf
->digest
;
11811 salt_t
*salt
= hash_buf
->salt
;
11813 char *salt_pos
= input_buf
+ 3;
11815 uint iterations_len
= 0;
11817 if (memcmp (salt_pos
, "rounds=", 7) == 0)
11821 for (iterations_len
= 0; salt_pos
[0] >= '0' && salt_pos
[0] <= '9' && iterations_len
< 7; iterations_len
++, salt_pos
+= 1) continue;
11823 if (iterations_len
== 0 ) return (PARSER_SALT_ITERATION
);
11824 if (salt_pos
[0] != '$') return (PARSER_SIGNATURE_UNMATCHED
);
11828 salt
->salt_iter
= atoi (salt_pos
- iterations_len
);
11832 iterations_len
+= 8;
11836 salt
->salt_iter
= ROUNDS_SHA512CRYPT
;
11839 if ((input_len
< DISPLAY_LEN_MIN_1800
) || (input_len
> DISPLAY_LEN_MAX_1800
+ iterations_len
)) return (PARSER_GLOBAL_LENGTH
);
11841 char *hash_pos
= strchr (salt_pos
, '$');
11843 if (hash_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
11845 uint salt_len
= hash_pos
- salt_pos
;
11847 if (salt_len
> 16) return (PARSER_SALT_LENGTH
);
11849 memcpy ((char *) salt
->salt_buf
, salt_pos
, salt_len
);
11851 salt
->salt_len
= salt_len
;
11855 sha512crypt_decode ((unsigned char *) digest
, (unsigned char *) hash_pos
);
11857 return (PARSER_OK
);
11860 int keccak_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
11862 if ((input_len
< DISPLAY_LEN_MIN_5000
) || (input_len
> DISPLAY_LEN_MAX_5000
)) return (PARSER_GLOBAL_LENGTH
);
11864 if (input_len
% 16) return (PARSER_GLOBAL_LENGTH
);
11866 uint64_t *digest
= (uint64_t *) hash_buf
->digest
;
11868 salt_t
*salt
= hash_buf
->salt
;
11870 uint keccak_mdlen
= input_len
/ 2;
11872 for (uint i
= 0; i
< keccak_mdlen
/ 8; i
++)
11874 digest
[i
] = hex_to_uint64_t (&input_buf
[i
* 16]);
11876 digest
[i
] = byte_swap_64 (digest
[i
]);
11879 salt
->keccak_mdlen
= keccak_mdlen
;
11881 return (PARSER_OK
);
11884 int ikepsk_md5_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
11886 if ((input_len
< DISPLAY_LEN_MIN_5300
) || (input_len
> DISPLAY_LEN_MAX_5300
)) return (PARSER_GLOBAL_LENGTH
);
11888 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
11890 salt_t
*salt
= hash_buf
->salt
;
11892 ikepsk_t
*ikepsk
= (ikepsk_t
*) hash_buf
->esalt
;
11895 * Parse that strange long line
11902 in_off
[0] = strtok (input_buf
, ":");
11904 in_len
[0] = strlen (in_off
[0]);
11908 for (i
= 1; i
< 9; i
++)
11910 in_off
[i
] = strtok (NULL
, ":");
11912 if (in_off
[i
] == NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
11914 in_len
[i
] = strlen (in_off
[i
]);
11919 ptr
= (char *) ikepsk
->msg_buf
;
11921 for (i
= 0; i
< in_len
[0]; i
+= 2) *ptr
++ = hex_to_char (in_off
[0] + i
);
11922 for (i
= 0; i
< in_len
[1]; i
+= 2) *ptr
++ = hex_to_char (in_off
[1] + i
);
11923 for (i
= 0; i
< in_len
[2]; i
+= 2) *ptr
++ = hex_to_char (in_off
[2] + i
);
11924 for (i
= 0; i
< in_len
[3]; i
+= 2) *ptr
++ = hex_to_char (in_off
[3] + i
);
11925 for (i
= 0; i
< in_len
[4]; i
+= 2) *ptr
++ = hex_to_char (in_off
[4] + i
);
11926 for (i
= 0; i
< in_len
[5]; i
+= 2) *ptr
++ = hex_to_char (in_off
[5] + i
);
11930 ikepsk
->msg_len
= (in_len
[0] + in_len
[1] + in_len
[2] + in_len
[3] + in_len
[4] + in_len
[5]) / 2;
11932 ptr
= (char *) ikepsk
->nr_buf
;
11934 for (i
= 0; i
< in_len
[6]; i
+= 2) *ptr
++ = hex_to_char (in_off
[6] + i
);
11935 for (i
= 0; i
< in_len
[7]; i
+= 2) *ptr
++ = hex_to_char (in_off
[7] + i
);
11939 ikepsk
->nr_len
= (in_len
[6] + in_len
[7]) / 2;
11942 * Store to database
11947 digest
[0] = hex_to_uint (&ptr
[ 0]);
11948 digest
[1] = hex_to_uint (&ptr
[ 8]);
11949 digest
[2] = hex_to_uint (&ptr
[16]);
11950 digest
[3] = hex_to_uint (&ptr
[24]);
11952 digest
[0] = byte_swap_32 (digest
[0]);
11953 digest
[1] = byte_swap_32 (digest
[1]);
11954 digest
[2] = byte_swap_32 (digest
[2]);
11955 digest
[3] = byte_swap_32 (digest
[3]);
11957 salt
->salt_len
= 32;
11959 salt
->salt_buf
[0] = ikepsk
->nr_buf
[0];
11960 salt
->salt_buf
[1] = ikepsk
->nr_buf
[1];
11961 salt
->salt_buf
[2] = ikepsk
->nr_buf
[2];
11962 salt
->salt_buf
[3] = ikepsk
->nr_buf
[3];
11963 salt
->salt_buf
[4] = ikepsk
->nr_buf
[4];
11964 salt
->salt_buf
[5] = ikepsk
->nr_buf
[5];
11965 salt
->salt_buf
[6] = ikepsk
->nr_buf
[6];
11966 salt
->salt_buf
[7] = ikepsk
->nr_buf
[7];
11968 return (PARSER_OK
);
11971 int ikepsk_sha1_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
11973 if ((input_len
< DISPLAY_LEN_MIN_5400
) || (input_len
> DISPLAY_LEN_MAX_5400
)) return (PARSER_GLOBAL_LENGTH
);
11975 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
11977 salt_t
*salt
= hash_buf
->salt
;
11979 ikepsk_t
*ikepsk
= (ikepsk_t
*) hash_buf
->esalt
;
11982 * Parse that strange long line
11989 in_off
[0] = strtok (input_buf
, ":");
11991 in_len
[0] = strlen (in_off
[0]);
11995 for (i
= 1; i
< 9; i
++)
11997 in_off
[i
] = strtok (NULL
, ":");
11999 if (in_off
[i
] == NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
12001 in_len
[i
] = strlen (in_off
[i
]);
12006 ptr
= (char *) ikepsk
->msg_buf
;
12008 for (i
= 0; i
< in_len
[0]; i
+= 2) *ptr
++ = hex_to_char (in_off
[0] + i
);
12009 for (i
= 0; i
< in_len
[1]; i
+= 2) *ptr
++ = hex_to_char (in_off
[1] + i
);
12010 for (i
= 0; i
< in_len
[2]; i
+= 2) *ptr
++ = hex_to_char (in_off
[2] + i
);
12011 for (i
= 0; i
< in_len
[3]; i
+= 2) *ptr
++ = hex_to_char (in_off
[3] + i
);
12012 for (i
= 0; i
< in_len
[4]; i
+= 2) *ptr
++ = hex_to_char (in_off
[4] + i
);
12013 for (i
= 0; i
< in_len
[5]; i
+= 2) *ptr
++ = hex_to_char (in_off
[5] + i
);
12017 ikepsk
->msg_len
= (in_len
[0] + in_len
[1] + in_len
[2] + in_len
[3] + in_len
[4] + in_len
[5]) / 2;
12019 ptr
= (char *) ikepsk
->nr_buf
;
12021 for (i
= 0; i
< in_len
[6]; i
+= 2) *ptr
++ = hex_to_char (in_off
[6] + i
);
12022 for (i
= 0; i
< in_len
[7]; i
+= 2) *ptr
++ = hex_to_char (in_off
[7] + i
);
12026 ikepsk
->nr_len
= (in_len
[6] + in_len
[7]) / 2;
12029 * Store to database
12034 digest
[0] = hex_to_uint (&ptr
[ 0]);
12035 digest
[1] = hex_to_uint (&ptr
[ 8]);
12036 digest
[2] = hex_to_uint (&ptr
[16]);
12037 digest
[3] = hex_to_uint (&ptr
[24]);
12038 digest
[4] = hex_to_uint (&ptr
[32]);
12040 salt
->salt_len
= 32;
12042 salt
->salt_buf
[0] = ikepsk
->nr_buf
[0];
12043 salt
->salt_buf
[1] = ikepsk
->nr_buf
[1];
12044 salt
->salt_buf
[2] = ikepsk
->nr_buf
[2];
12045 salt
->salt_buf
[3] = ikepsk
->nr_buf
[3];
12046 salt
->salt_buf
[4] = ikepsk
->nr_buf
[4];
12047 salt
->salt_buf
[5] = ikepsk
->nr_buf
[5];
12048 salt
->salt_buf
[6] = ikepsk
->nr_buf
[6];
12049 salt
->salt_buf
[7] = ikepsk
->nr_buf
[7];
12051 return (PARSER_OK
);
12054 int ripemd160_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
12056 if ((input_len
< DISPLAY_LEN_MIN_6000
) || (input_len
> DISPLAY_LEN_MAX_6000
)) return (PARSER_GLOBAL_LENGTH
);
12058 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
12060 digest
[0] = hex_to_uint (&input_buf
[ 0]);
12061 digest
[1] = hex_to_uint (&input_buf
[ 8]);
12062 digest
[2] = hex_to_uint (&input_buf
[16]);
12063 digest
[3] = hex_to_uint (&input_buf
[24]);
12064 digest
[4] = hex_to_uint (&input_buf
[32]);
12066 digest
[0] = byte_swap_32 (digest
[0]);
12067 digest
[1] = byte_swap_32 (digest
[1]);
12068 digest
[2] = byte_swap_32 (digest
[2]);
12069 digest
[3] = byte_swap_32 (digest
[3]);
12070 digest
[4] = byte_swap_32 (digest
[4]);
12072 return (PARSER_OK
);
12075 int whirlpool_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
12077 if ((input_len
< DISPLAY_LEN_MIN_6100
) || (input_len
> DISPLAY_LEN_MAX_6100
)) return (PARSER_GLOBAL_LENGTH
);
12079 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
12081 digest
[ 0] = hex_to_uint (&input_buf
[ 0]);
12082 digest
[ 1] = hex_to_uint (&input_buf
[ 8]);
12083 digest
[ 2] = hex_to_uint (&input_buf
[ 16]);
12084 digest
[ 3] = hex_to_uint (&input_buf
[ 24]);
12085 digest
[ 4] = hex_to_uint (&input_buf
[ 32]);
12086 digest
[ 5] = hex_to_uint (&input_buf
[ 40]);
12087 digest
[ 6] = hex_to_uint (&input_buf
[ 48]);
12088 digest
[ 7] = hex_to_uint (&input_buf
[ 56]);
12089 digest
[ 8] = hex_to_uint (&input_buf
[ 64]);
12090 digest
[ 9] = hex_to_uint (&input_buf
[ 72]);
12091 digest
[10] = hex_to_uint (&input_buf
[ 80]);
12092 digest
[11] = hex_to_uint (&input_buf
[ 88]);
12093 digest
[12] = hex_to_uint (&input_buf
[ 96]);
12094 digest
[13] = hex_to_uint (&input_buf
[104]);
12095 digest
[14] = hex_to_uint (&input_buf
[112]);
12096 digest
[15] = hex_to_uint (&input_buf
[120]);
12098 return (PARSER_OK
);
12101 int androidpin_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
12103 if ((input_len
< DISPLAY_LEN_MIN_5800
) || (input_len
> DISPLAY_LEN_MAX_5800
)) return (PARSER_GLOBAL_LENGTH
);
12105 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
12107 salt_t
*salt
= hash_buf
->salt
;
12109 digest
[0] = hex_to_uint (&input_buf
[ 0]);
12110 digest
[1] = hex_to_uint (&input_buf
[ 8]);
12111 digest
[2] = hex_to_uint (&input_buf
[16]);
12112 digest
[3] = hex_to_uint (&input_buf
[24]);
12113 digest
[4] = hex_to_uint (&input_buf
[32]);
12115 if (input_buf
[40] != data
.separator
) return (PARSER_SEPARATOR_UNMATCHED
);
12117 uint salt_len
= input_len
- 40 - 1;
12119 char *salt_buf
= input_buf
+ 40 + 1;
12121 char *salt_buf_ptr
= (char *) salt
->salt_buf
;
12123 salt_len
= parse_and_store_salt (salt_buf_ptr
, salt_buf
, salt_len
);
12125 if (salt_len
== UINT_MAX
) return (PARSER_SALT_LENGTH
);
12127 salt
->salt_len
= salt_len
;
12129 salt
->salt_iter
= ROUNDS_ANDROIDPIN
- 1;
12131 return (PARSER_OK
);
12134 int truecrypt_parse_hash_1k (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
12136 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
12138 salt_t
*salt
= hash_buf
->salt
;
12140 tc_t
*tc
= (tc_t
*) hash_buf
->esalt
;
12142 if (input_len
== 0)
12144 log_error ("TrueCrypt container not specified");
12149 FILE *fp
= fopen (input_buf
, "rb");
12153 log_error ("%s: %s", input_buf
, strerror (errno
));
12160 int n
= fread (buf
, 1, sizeof (buf
), fp
);
12164 if (n
!= 512) return (PARSER_TC_FILE_SIZE
);
12166 memcpy (tc
->salt_buf
, buf
, 64);
12168 memcpy (tc
->data_buf
, buf
+ 64, 512 - 64);
12170 salt
->salt_buf
[0] = tc
->salt_buf
[0];
12172 salt
->salt_len
= 4;
12174 salt
->salt_iter
= 1000 - 1;
12176 digest
[0] = tc
->data_buf
[0];
12178 return (PARSER_OK
);
12181 int truecrypt_parse_hash_2k (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
12183 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
12185 salt_t
*salt
= hash_buf
->salt
;
12187 tc_t
*tc
= (tc_t
*) hash_buf
->esalt
;
12189 if (input_len
== 0)
12191 log_error ("TrueCrypt container not specified");
12196 FILE *fp
= fopen (input_buf
, "rb");
12200 log_error ("%s: %s", input_buf
, strerror (errno
));
12207 int n
= fread (buf
, 1, sizeof (buf
), fp
);
12211 if (n
!= 512) return (PARSER_TC_FILE_SIZE
);
12213 memcpy (tc
->salt_buf
, buf
, 64);
12215 memcpy (tc
->data_buf
, buf
+ 64, 512 - 64);
12217 salt
->salt_buf
[0] = tc
->salt_buf
[0];
12219 salt
->salt_len
= 4;
12221 salt
->salt_iter
= 2000 - 1;
12223 digest
[0] = tc
->data_buf
[0];
12225 return (PARSER_OK
);
12228 int md5aix_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
12230 if ((input_len
< DISPLAY_LEN_MIN_6300
) || (input_len
> DISPLAY_LEN_MAX_6300
)) return (PARSER_GLOBAL_LENGTH
);
12232 if (memcmp (SIGNATURE_MD5AIX
, input_buf
, 6)) return (PARSER_SIGNATURE_UNMATCHED
);
12234 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
12236 salt_t
*salt
= hash_buf
->salt
;
12238 char *salt_pos
= input_buf
+ 6;
12240 char *hash_pos
= strchr (salt_pos
, '$');
12242 if (hash_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
12244 uint salt_len
= hash_pos
- salt_pos
;
12246 if (salt_len
< 8) return (PARSER_SALT_LENGTH
);
12248 memcpy ((char *) salt
->salt_buf
, salt_pos
, salt_len
);
12250 salt
->salt_len
= salt_len
;
12252 salt
->salt_iter
= 1000;
12256 md5crypt_decode ((unsigned char *) digest
, (unsigned char *) hash_pos
);
12258 return (PARSER_OK
);
12261 int sha1aix_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
12263 if ((input_len
< DISPLAY_LEN_MIN_6700
) || (input_len
> DISPLAY_LEN_MAX_6700
)) return (PARSER_GLOBAL_LENGTH
);
12265 if (memcmp (SIGNATURE_SHA1AIX
, input_buf
, 7)) return (PARSER_SIGNATURE_UNMATCHED
);
12267 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
12269 salt_t
*salt
= hash_buf
->salt
;
12271 char *iter_pos
= input_buf
+ 7;
12273 char *salt_pos
= strchr (iter_pos
, '$');
12275 if (salt_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
12279 char *hash_pos
= strchr (salt_pos
, '$');
12281 if (hash_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
12283 uint salt_len
= hash_pos
- salt_pos
;
12285 if (salt_len
< 16) return (PARSER_SALT_LENGTH
);
12287 memcpy ((char *) salt
->salt_buf
, salt_pos
, salt_len
);
12289 salt
->salt_len
= salt_len
;
12291 char salt_iter
[3] = { iter_pos
[0], iter_pos
[1], 0 };
12293 salt
->salt_sign
[0] = atoi (salt_iter
);
12295 salt
->salt_iter
= (1 << atoi (salt_iter
)) - 1;
12299 sha1aix_decode ((unsigned char *) digest
, (unsigned char *) hash_pos
);
12301 digest
[0] = byte_swap_32 (digest
[0]);
12302 digest
[1] = byte_swap_32 (digest
[1]);
12303 digest
[2] = byte_swap_32 (digest
[2]);
12304 digest
[3] = byte_swap_32 (digest
[3]);
12305 digest
[4] = byte_swap_32 (digest
[4]);
12307 return (PARSER_OK
);
12310 int sha256aix_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
12312 if ((input_len
< DISPLAY_LEN_MIN_6400
) || (input_len
> DISPLAY_LEN_MAX_6400
)) return (PARSER_GLOBAL_LENGTH
);
12314 if (memcmp (SIGNATURE_SHA256AIX
, input_buf
, 9)) return (PARSER_SIGNATURE_UNMATCHED
);
12316 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
12318 salt_t
*salt
= hash_buf
->salt
;
12320 char *iter_pos
= input_buf
+ 9;
12322 char *salt_pos
= strchr (iter_pos
, '$');
12324 if (salt_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
12328 char *hash_pos
= strchr (salt_pos
, '$');
12330 if (hash_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
12332 uint salt_len
= hash_pos
- salt_pos
;
12334 if (salt_len
< 16) return (PARSER_SALT_LENGTH
);
12336 memcpy ((char *) salt
->salt_buf
, salt_pos
, salt_len
);
12338 salt
->salt_len
= salt_len
;
12340 char salt_iter
[3] = { iter_pos
[0], iter_pos
[1], 0 };
12342 salt
->salt_sign
[0] = atoi (salt_iter
);
12344 salt
->salt_iter
= (1 << atoi (salt_iter
)) - 1;
12348 sha256aix_decode ((unsigned char *) digest
, (unsigned char *) hash_pos
);
12350 digest
[0] = byte_swap_32 (digest
[0]);
12351 digest
[1] = byte_swap_32 (digest
[1]);
12352 digest
[2] = byte_swap_32 (digest
[2]);
12353 digest
[3] = byte_swap_32 (digest
[3]);
12354 digest
[4] = byte_swap_32 (digest
[4]);
12355 digest
[5] = byte_swap_32 (digest
[5]);
12356 digest
[6] = byte_swap_32 (digest
[6]);
12357 digest
[7] = byte_swap_32 (digest
[7]);
12359 return (PARSER_OK
);
12362 int sha512aix_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
12364 if ((input_len
< DISPLAY_LEN_MIN_6500
) || (input_len
> DISPLAY_LEN_MAX_6500
)) return (PARSER_GLOBAL_LENGTH
);
12366 if (memcmp (SIGNATURE_SHA512AIX
, input_buf
, 9)) return (PARSER_SIGNATURE_UNMATCHED
);
12368 uint64_t *digest
= (uint64_t *) hash_buf
->digest
;
12370 salt_t
*salt
= hash_buf
->salt
;
12372 char *iter_pos
= input_buf
+ 9;
12374 char *salt_pos
= strchr (iter_pos
, '$');
12376 if (salt_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
12380 char *hash_pos
= strchr (salt_pos
, '$');
12382 if (hash_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
12384 uint salt_len
= hash_pos
- salt_pos
;
12386 if (salt_len
< 16) return (PARSER_SALT_LENGTH
);
12388 memcpy ((char *) salt
->salt_buf
, salt_pos
, salt_len
);
12390 salt
->salt_len
= salt_len
;
12392 char salt_iter
[3] = { iter_pos
[0], iter_pos
[1], 0 };
12394 salt
->salt_sign
[0] = atoi (salt_iter
);
12396 salt
->salt_iter
= (1 << atoi (salt_iter
)) - 1;
12400 sha512aix_decode ((unsigned char *) digest
, (unsigned char *) hash_pos
);
12402 digest
[0] = byte_swap_64 (digest
[0]);
12403 digest
[1] = byte_swap_64 (digest
[1]);
12404 digest
[2] = byte_swap_64 (digest
[2]);
12405 digest
[3] = byte_swap_64 (digest
[3]);
12406 digest
[4] = byte_swap_64 (digest
[4]);
12407 digest
[5] = byte_swap_64 (digest
[5]);
12408 digest
[6] = byte_swap_64 (digest
[6]);
12409 digest
[7] = byte_swap_64 (digest
[7]);
12411 return (PARSER_OK
);
12414 int agilekey_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
12416 if ((input_len
< DISPLAY_LEN_MIN_6600
) || (input_len
> DISPLAY_LEN_MAX_6600
)) return (PARSER_GLOBAL_LENGTH
);
12418 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
12420 salt_t
*salt
= hash_buf
->salt
;
12422 agilekey_t
*agilekey
= (agilekey_t
*) hash_buf
->esalt
;
12428 char *iterations_pos
= input_buf
;
12430 char *saltbuf_pos
= strchr (iterations_pos
, ':');
12432 if (saltbuf_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
12434 uint iterations_len
= saltbuf_pos
- iterations_pos
;
12436 if (iterations_len
> 6) return (PARSER_SALT_LENGTH
);
12440 char *cipherbuf_pos
= strchr (saltbuf_pos
, ':');
12442 if (cipherbuf_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
12444 uint saltbuf_len
= cipherbuf_pos
- saltbuf_pos
;
12446 if (saltbuf_len
!= 16) return (PARSER_SALT_LENGTH
);
12448 uint cipherbuf_len
= input_len
- iterations_len
- 1 - saltbuf_len
- 1;
12450 if (cipherbuf_len
!= 2080) return (PARSER_HASH_LENGTH
);
12455 * pbkdf2 iterations
12458 salt
->salt_iter
= atoi (iterations_pos
) - 1;
12461 * handle salt encoding
12464 char *saltbuf_ptr
= (char *) salt
->salt_buf
;
12466 for (uint i
= 0; i
< saltbuf_len
; i
+= 2)
12468 const char p0
= saltbuf_pos
[i
+ 0];
12469 const char p1
= saltbuf_pos
[i
+ 1];
12471 *saltbuf_ptr
++ = hex_convert (p1
) << 0
12472 | hex_convert (p0
) << 4;
12475 salt
->salt_len
= saltbuf_len
/ 2;
12478 * handle cipher encoding
12481 uint
*tmp
= (uint
*) mymalloc (32);
12483 char *cipherbuf_ptr
= (char *) tmp
;
12485 for (uint i
= 2016; i
< cipherbuf_len
; i
+= 2)
12487 const char p0
= cipherbuf_pos
[i
+ 0];
12488 const char p1
= cipherbuf_pos
[i
+ 1];
12490 *cipherbuf_ptr
++ = hex_convert (p1
) << 0
12491 | hex_convert (p0
) << 4;
12494 // iv is stored at salt_buf 4 (length 16)
12495 // data is stored at salt_buf 8 (length 16)
12497 salt
->salt_buf
[ 4] = byte_swap_32 (tmp
[0]);
12498 salt
->salt_buf
[ 5] = byte_swap_32 (tmp
[1]);
12499 salt
->salt_buf
[ 6] = byte_swap_32 (tmp
[2]);
12500 salt
->salt_buf
[ 7] = byte_swap_32 (tmp
[3]);
12502 salt
->salt_buf
[ 8] = byte_swap_32 (tmp
[4]);
12503 salt
->salt_buf
[ 9] = byte_swap_32 (tmp
[5]);
12504 salt
->salt_buf
[10] = byte_swap_32 (tmp
[6]);
12505 salt
->salt_buf
[11] = byte_swap_32 (tmp
[7]);
12509 for (uint i
= 0, j
= 0; i
< 1040; i
+= 1, j
+= 2)
12511 const char p0
= cipherbuf_pos
[j
+ 0];
12512 const char p1
= cipherbuf_pos
[j
+ 1];
12514 agilekey
->cipher
[i
] = hex_convert (p1
) << 0
12515 | hex_convert (p0
) << 4;
12522 digest
[0] = 0x10101010;
12523 digest
[1] = 0x10101010;
12524 digest
[2] = 0x10101010;
12525 digest
[3] = 0x10101010;
12527 return (PARSER_OK
);
12530 int lastpass_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
12532 if ((input_len
< DISPLAY_LEN_MIN_6800
) || (input_len
> DISPLAY_LEN_MAX_6800
)) return (PARSER_GLOBAL_LENGTH
);
12534 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
12536 salt_t
*salt
= hash_buf
->salt
;
12538 char *hashbuf_pos
= input_buf
;
12540 char *iterations_pos
= strchr (hashbuf_pos
, ':');
12542 if (iterations_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
12544 uint hash_len
= iterations_pos
- hashbuf_pos
;
12546 if ((hash_len
!= 32) && (hash_len
!= 64)) return (PARSER_HASH_LENGTH
);
12550 char *saltbuf_pos
= strchr (iterations_pos
, ':');
12552 if (saltbuf_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
12554 uint iterations_len
= saltbuf_pos
- iterations_pos
;
12558 uint salt_len
= input_len
- hash_len
- 1 - iterations_len
- 1;
12560 if (salt_len
> 32) return (PARSER_SALT_LENGTH
);
12562 char *salt_buf_ptr
= (char *) salt
->salt_buf
;
12564 salt_len
= parse_and_store_salt (salt_buf_ptr
, saltbuf_pos
, salt_len
);
12566 if (salt_len
== UINT_MAX
) return (PARSER_SALT_LENGTH
);
12568 salt
->salt_len
= salt_len
;
12570 salt
->salt_iter
= atoi (iterations_pos
) - 1;
12572 digest
[0] = hex_to_uint (&hashbuf_pos
[ 0]);
12573 digest
[1] = hex_to_uint (&hashbuf_pos
[ 8]);
12574 digest
[2] = hex_to_uint (&hashbuf_pos
[16]);
12575 digest
[3] = hex_to_uint (&hashbuf_pos
[24]);
12577 return (PARSER_OK
);
12580 int gost_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
12582 if ((input_len
< DISPLAY_LEN_MIN_6900
) || (input_len
> DISPLAY_LEN_MAX_6900
)) return (PARSER_GLOBAL_LENGTH
);
12584 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
12586 digest
[0] = hex_to_uint (&input_buf
[ 0]);
12587 digest
[1] = hex_to_uint (&input_buf
[ 8]);
12588 digest
[2] = hex_to_uint (&input_buf
[16]);
12589 digest
[3] = hex_to_uint (&input_buf
[24]);
12590 digest
[4] = hex_to_uint (&input_buf
[32]);
12591 digest
[5] = hex_to_uint (&input_buf
[40]);
12592 digest
[6] = hex_to_uint (&input_buf
[48]);
12593 digest
[7] = hex_to_uint (&input_buf
[56]);
12595 digest
[0] = byte_swap_32 (digest
[0]);
12596 digest
[1] = byte_swap_32 (digest
[1]);
12597 digest
[2] = byte_swap_32 (digest
[2]);
12598 digest
[3] = byte_swap_32 (digest
[3]);
12599 digest
[4] = byte_swap_32 (digest
[4]);
12600 digest
[5] = byte_swap_32 (digest
[5]);
12601 digest
[6] = byte_swap_32 (digest
[6]);
12602 digest
[7] = byte_swap_32 (digest
[7]);
12604 return (PARSER_OK
);
12607 int sha256crypt_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
12609 if (memcmp (SIGNATURE_SHA256CRYPT
, input_buf
, 3)) return (PARSER_SIGNATURE_UNMATCHED
);
12611 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
12613 salt_t
*salt
= hash_buf
->salt
;
12615 char *salt_pos
= input_buf
+ 3;
12617 uint iterations_len
= 0;
12619 if (memcmp (salt_pos
, "rounds=", 7) == 0)
12623 for (iterations_len
= 0; salt_pos
[0] >= '0' && salt_pos
[0] <= '9' && iterations_len
< 7; iterations_len
++, salt_pos
+= 1) continue;
12625 if (iterations_len
== 0 ) return (PARSER_SALT_ITERATION
);
12626 if (salt_pos
[0] != '$') return (PARSER_SIGNATURE_UNMATCHED
);
12630 salt
->salt_iter
= atoi (salt_pos
- iterations_len
);
12634 iterations_len
+= 8;
12638 salt
->salt_iter
= ROUNDS_SHA256CRYPT
;
12641 if ((input_len
< DISPLAY_LEN_MIN_7400
) || (input_len
> DISPLAY_LEN_MAX_7400
+ iterations_len
)) return (PARSER_GLOBAL_LENGTH
);
12643 char *hash_pos
= strchr (salt_pos
, '$');
12645 if (hash_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
12647 uint salt_len
= hash_pos
- salt_pos
;
12649 if (salt_len
> 16) return (PARSER_SALT_LENGTH
);
12651 memcpy ((char *) salt
->salt_buf
, salt_pos
, salt_len
);
12653 salt
->salt_len
= salt_len
;
12657 sha256crypt_decode ((unsigned char *) digest
, (unsigned char *) hash_pos
);
12659 return (PARSER_OK
);
12662 int sha512osx_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
12664 uint max_len
= DISPLAY_LEN_MAX_7100
+ (2 * 128);
12666 if ((input_len
< DISPLAY_LEN_MIN_7100
) || (input_len
> max_len
)) return (PARSER_GLOBAL_LENGTH
);
12668 if (memcmp (SIGNATURE_SHA512OSX
, input_buf
, 4)) return (PARSER_SIGNATURE_UNMATCHED
);
12670 uint64_t *digest
= (uint64_t *) hash_buf
->digest
;
12672 salt_t
*salt
= hash_buf
->salt
;
12674 pbkdf2_sha512_t
*pbkdf2_sha512
= (pbkdf2_sha512_t
*) hash_buf
->esalt
;
12676 char *iter_pos
= input_buf
+ 4;
12678 char *salt_pos
= strchr (iter_pos
, '$');
12680 if (salt_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
12684 char *hash_pos
= strchr (salt_pos
, '$');
12686 if (hash_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
12688 if (((input_len
- (hash_pos
- input_buf
) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH
);
12692 digest
[0] = hex_to_uint64_t (&hash_pos
[ 0]);
12693 digest
[1] = hex_to_uint64_t (&hash_pos
[ 16]);
12694 digest
[2] = hex_to_uint64_t (&hash_pos
[ 32]);
12695 digest
[3] = hex_to_uint64_t (&hash_pos
[ 48]);
12696 digest
[4] = hex_to_uint64_t (&hash_pos
[ 64]);
12697 digest
[5] = hex_to_uint64_t (&hash_pos
[ 80]);
12698 digest
[6] = hex_to_uint64_t (&hash_pos
[ 96]);
12699 digest
[7] = hex_to_uint64_t (&hash_pos
[112]);
12701 uint salt_len
= hash_pos
- salt_pos
- 1;
12703 if ((salt_len
% 2) != 0) return (PARSER_SALT_LENGTH
);
12705 salt
->salt_len
= salt_len
/ 2;
12707 pbkdf2_sha512
->salt_buf
[0] = hex_to_uint (&salt_pos
[ 0]);
12708 pbkdf2_sha512
->salt_buf
[1] = hex_to_uint (&salt_pos
[ 8]);
12709 pbkdf2_sha512
->salt_buf
[2] = hex_to_uint (&salt_pos
[16]);
12710 pbkdf2_sha512
->salt_buf
[3] = hex_to_uint (&salt_pos
[24]);
12711 pbkdf2_sha512
->salt_buf
[4] = hex_to_uint (&salt_pos
[32]);
12712 pbkdf2_sha512
->salt_buf
[5] = hex_to_uint (&salt_pos
[40]);
12713 pbkdf2_sha512
->salt_buf
[6] = hex_to_uint (&salt_pos
[48]);
12714 pbkdf2_sha512
->salt_buf
[7] = hex_to_uint (&salt_pos
[56]);
12716 pbkdf2_sha512
->salt_buf
[0] = byte_swap_32 (pbkdf2_sha512
->salt_buf
[0]);
12717 pbkdf2_sha512
->salt_buf
[1] = byte_swap_32 (pbkdf2_sha512
->salt_buf
[1]);
12718 pbkdf2_sha512
->salt_buf
[2] = byte_swap_32 (pbkdf2_sha512
->salt_buf
[2]);
12719 pbkdf2_sha512
->salt_buf
[3] = byte_swap_32 (pbkdf2_sha512
->salt_buf
[3]);
12720 pbkdf2_sha512
->salt_buf
[4] = byte_swap_32 (pbkdf2_sha512
->salt_buf
[4]);
12721 pbkdf2_sha512
->salt_buf
[5] = byte_swap_32 (pbkdf2_sha512
->salt_buf
[5]);
12722 pbkdf2_sha512
->salt_buf
[6] = byte_swap_32 (pbkdf2_sha512
->salt_buf
[6]);
12723 pbkdf2_sha512
->salt_buf
[7] = byte_swap_32 (pbkdf2_sha512
->salt_buf
[7]);
12724 pbkdf2_sha512
->salt_buf
[8] = 0x01000000;
12725 pbkdf2_sha512
->salt_buf
[9] = 0x80;
12727 salt
->salt_buf
[0] = pbkdf2_sha512
->salt_buf
[0];
12729 salt
->salt_iter
= atoi (iter_pos
) - 1;
12731 return (PARSER_OK
);
12734 int episerver4_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
12736 if ((input_len
< DISPLAY_LEN_MIN_1441
) || (input_len
> DISPLAY_LEN_MAX_1441
)) return (PARSER_GLOBAL_LENGTH
);
12738 if (memcmp (SIGNATURE_EPISERVER4
, input_buf
, 14)) return (PARSER_SIGNATURE_UNMATCHED
);
12740 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
12742 salt_t
*salt
= hash_buf
->salt
;
12744 char *salt_pos
= input_buf
+ 14;
12746 char *hash_pos
= strchr (salt_pos
, '*');
12748 if (hash_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
12752 uint salt_len
= hash_pos
- salt_pos
- 1;
12754 char *salt_buf_ptr
= (char *) salt
->salt_buf
;
12756 salt_len
= parse_and_store_salt (salt_buf_ptr
, salt_pos
, salt_len
);
12758 if (salt_len
== UINT_MAX
) return (PARSER_SALT_LENGTH
);
12760 salt
->salt_len
= salt_len
;
12762 char tmp_buf
[100]; memset (tmp_buf
, 0, sizeof (tmp_buf
));
12764 base64_decode (base64_to_int
, hash_pos
, 43, tmp_buf
);
12766 memcpy (digest
, tmp_buf
, 32);
12768 digest
[0] = byte_swap_32 (digest
[0]);
12769 digest
[1] = byte_swap_32 (digest
[1]);
12770 digest
[2] = byte_swap_32 (digest
[2]);
12771 digest
[3] = byte_swap_32 (digest
[3]);
12772 digest
[4] = byte_swap_32 (digest
[4]);
12773 digest
[5] = byte_swap_32 (digest
[5]);
12774 digest
[6] = byte_swap_32 (digest
[6]);
12775 digest
[7] = byte_swap_32 (digest
[7]);
12777 digest
[0] -= SHA256M_A
;
12778 digest
[1] -= SHA256M_B
;
12779 digest
[2] -= SHA256M_C
;
12780 digest
[3] -= SHA256M_D
;
12781 digest
[4] -= SHA256M_E
;
12782 digest
[5] -= SHA256M_F
;
12783 digest
[6] -= SHA256M_G
;
12784 digest
[7] -= SHA256M_H
;
12786 return (PARSER_OK
);
12789 int sha512grub_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
12791 uint max_len
= DISPLAY_LEN_MAX_7200
+ (8 * 128);
12793 if ((input_len
< DISPLAY_LEN_MIN_7200
) || (input_len
> max_len
)) return (PARSER_GLOBAL_LENGTH
);
12795 if (memcmp (SIGNATURE_SHA512GRUB
, input_buf
, 19)) return (PARSER_SIGNATURE_UNMATCHED
);
12797 uint64_t *digest
= (uint64_t *) hash_buf
->digest
;
12799 salt_t
*salt
= hash_buf
->salt
;
12801 pbkdf2_sha512_t
*pbkdf2_sha512
= (pbkdf2_sha512_t
*) hash_buf
->esalt
;
12803 char *iter_pos
= input_buf
+ 19;
12805 char *salt_pos
= strchr (iter_pos
, '.');
12807 if (salt_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
12811 char *hash_pos
= strchr (salt_pos
, '.');
12813 if (hash_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
12815 if (((input_len
- (hash_pos
- input_buf
) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH
);
12819 digest
[0] = hex_to_uint64_t (&hash_pos
[ 0]);
12820 digest
[1] = hex_to_uint64_t (&hash_pos
[ 16]);
12821 digest
[2] = hex_to_uint64_t (&hash_pos
[ 32]);
12822 digest
[3] = hex_to_uint64_t (&hash_pos
[ 48]);
12823 digest
[4] = hex_to_uint64_t (&hash_pos
[ 64]);
12824 digest
[5] = hex_to_uint64_t (&hash_pos
[ 80]);
12825 digest
[6] = hex_to_uint64_t (&hash_pos
[ 96]);
12826 digest
[7] = hex_to_uint64_t (&hash_pos
[112]);
12828 uint salt_len
= hash_pos
- salt_pos
- 1;
12832 char *salt_buf_ptr
= (char *) pbkdf2_sha512
->salt_buf
;
12836 for (i
= 0; i
< salt_len
; i
++)
12838 salt_buf_ptr
[i
] = hex_to_char (&salt_pos
[i
* 2]);
12841 salt_buf_ptr
[salt_len
+ 3] = 0x01;
12842 salt_buf_ptr
[salt_len
+ 4] = 0x80;
12844 salt
->salt_buf
[0] = pbkdf2_sha512
->salt_buf
[0];
12846 salt
->salt_len
= salt_len
;
12848 salt
->salt_iter
= atoi (iter_pos
) - 1;
12850 return (PARSER_OK
);
12853 int sha512b64s_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
12855 if ((input_len
< DISPLAY_LEN_MIN_1711
) || (input_len
> DISPLAY_LEN_MAX_1711
)) return (PARSER_GLOBAL_LENGTH
);
12857 if (memcmp (SIGNATURE_SHA512B64S
, input_buf
, 9)) return (PARSER_SIGNATURE_UNMATCHED
);
12859 uint64_t *digest
= (uint64_t *) hash_buf
->digest
;
12861 salt_t
*salt
= hash_buf
->salt
;
12865 memset (tmp_buf
, 0, sizeof (tmp_buf
));
12867 int tmp_len
= base64_decode (base64_to_int
, input_buf
+ 9, input_len
- 9, tmp_buf
);
12869 memcpy (digest
, tmp_buf
, 64);
12871 digest
[0] = byte_swap_64 (digest
[0]);
12872 digest
[1] = byte_swap_64 (digest
[1]);
12873 digest
[2] = byte_swap_64 (digest
[2]);
12874 digest
[3] = byte_swap_64 (digest
[3]);
12875 digest
[4] = byte_swap_64 (digest
[4]);
12876 digest
[5] = byte_swap_64 (digest
[5]);
12877 digest
[6] = byte_swap_64 (digest
[6]);
12878 digest
[7] = byte_swap_64 (digest
[7]);
12880 digest
[0] -= SHA512M_A
;
12881 digest
[1] -= SHA512M_B
;
12882 digest
[2] -= SHA512M_C
;
12883 digest
[3] -= SHA512M_D
;
12884 digest
[4] -= SHA512M_E
;
12885 digest
[5] -= SHA512M_F
;
12886 digest
[6] -= SHA512M_G
;
12887 digest
[7] -= SHA512M_H
;
12889 salt
->salt_len
= tmp_len
- 64;
12891 memcpy (salt
->salt_buf
, tmp_buf
+ 64, salt
->salt_len
);
12893 if (data
.opts_type
& OPTS_TYPE_ST_ADD80
)
12895 char *ptr
= (char *) salt
->salt_buf
;
12897 ptr
[salt
->salt_len
] = 0x80;
12900 return (PARSER_OK
);
12903 int hmacmd5_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
12905 if (data
.opts_type
& OPTS_TYPE_ST_HEX
)
12907 if ((input_len
< DISPLAY_LEN_MIN_50H
) || (input_len
> DISPLAY_LEN_MAX_50H
)) return (PARSER_GLOBAL_LENGTH
);
12911 if ((input_len
< DISPLAY_LEN_MIN_50
) || (input_len
> DISPLAY_LEN_MAX_50
)) return (PARSER_GLOBAL_LENGTH
);
12914 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
12916 salt_t
*salt
= hash_buf
->salt
;
12918 digest
[0] = hex_to_uint (&input_buf
[ 0]);
12919 digest
[1] = hex_to_uint (&input_buf
[ 8]);
12920 digest
[2] = hex_to_uint (&input_buf
[16]);
12921 digest
[3] = hex_to_uint (&input_buf
[24]);
12923 digest
[0] = byte_swap_32 (digest
[0]);
12924 digest
[1] = byte_swap_32 (digest
[1]);
12925 digest
[2] = byte_swap_32 (digest
[2]);
12926 digest
[3] = byte_swap_32 (digest
[3]);
12928 if (input_buf
[32] != data
.separator
) return (PARSER_SEPARATOR_UNMATCHED
);
12930 uint salt_len
= input_len
- 32 - 1;
12932 char *salt_buf
= input_buf
+ 32 + 1;
12934 char *salt_buf_ptr
= (char *) salt
->salt_buf
;
12936 salt_len
= parse_and_store_salt (salt_buf_ptr
, salt_buf
, salt_len
);
12938 if (salt_len
== UINT_MAX
) return (PARSER_SALT_LENGTH
);
12940 salt
->salt_len
= salt_len
;
12942 return (PARSER_OK
);
12945 int hmacsha1_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
12947 if (data
.opts_type
& OPTS_TYPE_ST_HEX
)
12949 if ((input_len
< DISPLAY_LEN_MIN_150H
) || (input_len
> DISPLAY_LEN_MAX_150H
)) return (PARSER_GLOBAL_LENGTH
);
12953 if ((input_len
< DISPLAY_LEN_MIN_150
) || (input_len
> DISPLAY_LEN_MAX_150
)) return (PARSER_GLOBAL_LENGTH
);
12956 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
12958 salt_t
*salt
= hash_buf
->salt
;
12960 digest
[0] = hex_to_uint (&input_buf
[ 0]);
12961 digest
[1] = hex_to_uint (&input_buf
[ 8]);
12962 digest
[2] = hex_to_uint (&input_buf
[16]);
12963 digest
[3] = hex_to_uint (&input_buf
[24]);
12964 digest
[4] = hex_to_uint (&input_buf
[32]);
12966 if (input_buf
[40] != data
.separator
) return (PARSER_SEPARATOR_UNMATCHED
);
12968 uint salt_len
= input_len
- 40 - 1;
12970 char *salt_buf
= input_buf
+ 40 + 1;
12972 char *salt_buf_ptr
= (char *) salt
->salt_buf
;
12974 salt_len
= parse_and_store_salt (salt_buf_ptr
, salt_buf
, salt_len
);
12976 if (salt_len
== UINT_MAX
) return (PARSER_SALT_LENGTH
);
12978 salt
->salt_len
= salt_len
;
12980 return (PARSER_OK
);
12983 int hmacsha256_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
12985 if (data
.opts_type
& OPTS_TYPE_ST_HEX
)
12987 if ((input_len
< DISPLAY_LEN_MIN_1450H
) || (input_len
> DISPLAY_LEN_MAX_1450H
)) return (PARSER_GLOBAL_LENGTH
);
12991 if ((input_len
< DISPLAY_LEN_MIN_1450
) || (input_len
> DISPLAY_LEN_MAX_1450
)) return (PARSER_GLOBAL_LENGTH
);
12994 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
12996 salt_t
*salt
= hash_buf
->salt
;
12998 digest
[0] = hex_to_uint (&input_buf
[ 0]);
12999 digest
[1] = hex_to_uint (&input_buf
[ 8]);
13000 digest
[2] = hex_to_uint (&input_buf
[16]);
13001 digest
[3] = hex_to_uint (&input_buf
[24]);
13002 digest
[4] = hex_to_uint (&input_buf
[32]);
13003 digest
[5] = hex_to_uint (&input_buf
[40]);
13004 digest
[6] = hex_to_uint (&input_buf
[48]);
13005 digest
[7] = hex_to_uint (&input_buf
[56]);
13007 if (input_buf
[64] != data
.separator
) return (PARSER_SEPARATOR_UNMATCHED
);
13009 uint salt_len
= input_len
- 64 - 1;
13011 char *salt_buf
= input_buf
+ 64 + 1;
13013 char *salt_buf_ptr
= (char *) salt
->salt_buf
;
13015 salt_len
= parse_and_store_salt (salt_buf_ptr
, salt_buf
, salt_len
);
13017 if (salt_len
== UINT_MAX
) return (PARSER_SALT_LENGTH
);
13019 salt
->salt_len
= salt_len
;
13021 return (PARSER_OK
);
13024 int hmacsha512_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
13026 if (data
.opts_type
& OPTS_TYPE_ST_HEX
)
13028 if ((input_len
< DISPLAY_LEN_MIN_1750H
) || (input_len
> DISPLAY_LEN_MAX_1750H
)) return (PARSER_GLOBAL_LENGTH
);
13032 if ((input_len
< DISPLAY_LEN_MIN_1750
) || (input_len
> DISPLAY_LEN_MAX_1750
)) return (PARSER_GLOBAL_LENGTH
);
13035 uint64_t *digest
= (uint64_t *) hash_buf
->digest
;
13037 salt_t
*salt
= hash_buf
->salt
;
13039 digest
[0] = hex_to_uint64_t (&input_buf
[ 0]);
13040 digest
[1] = hex_to_uint64_t (&input_buf
[ 16]);
13041 digest
[2] = hex_to_uint64_t (&input_buf
[ 32]);
13042 digest
[3] = hex_to_uint64_t (&input_buf
[ 48]);
13043 digest
[4] = hex_to_uint64_t (&input_buf
[ 64]);
13044 digest
[5] = hex_to_uint64_t (&input_buf
[ 80]);
13045 digest
[6] = hex_to_uint64_t (&input_buf
[ 96]);
13046 digest
[7] = hex_to_uint64_t (&input_buf
[112]);
13048 if (input_buf
[128] != data
.separator
) return (PARSER_SEPARATOR_UNMATCHED
);
13050 uint salt_len
= input_len
- 128 - 1;
13052 char *salt_buf
= input_buf
+ 128 + 1;
13054 char *salt_buf_ptr
= (char *) salt
->salt_buf
;
13056 salt_len
= parse_and_store_salt (salt_buf_ptr
, salt_buf
, salt_len
);
13058 if (salt_len
== UINT_MAX
) return (PARSER_SALT_LENGTH
);
13060 salt
->salt_len
= salt_len
;
13062 return (PARSER_OK
);
13065 int krb5pa_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
13067 if ((input_len
< DISPLAY_LEN_MIN_7500
) || (input_len
> DISPLAY_LEN_MAX_7500
)) return (PARSER_GLOBAL_LENGTH
);
13069 if (memcmp (SIGNATURE_KRB5PA
, input_buf
, 10)) return (PARSER_SIGNATURE_UNMATCHED
);
13071 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
13073 salt_t
*salt
= hash_buf
->salt
;
13075 krb5pa_t
*krb5pa
= (krb5pa_t
*) hash_buf
->esalt
;
13081 char *user_pos
= input_buf
+ 10 + 1;
13083 char *realm_pos
= strchr (user_pos
, '$');
13085 if (realm_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
13087 uint user_len
= realm_pos
- user_pos
;
13089 if (user_len
>= 64) return (PARSER_SALT_LENGTH
);
13093 char *salt_pos
= strchr (realm_pos
, '$');
13095 if (salt_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
13097 uint realm_len
= salt_pos
- realm_pos
;
13099 if (realm_len
>= 64) return (PARSER_SALT_LENGTH
);
13103 char *data_pos
= strchr (salt_pos
, '$');
13105 if (data_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
13107 uint salt_len
= data_pos
- salt_pos
;
13109 if (salt_len
>= 128) return (PARSER_SALT_LENGTH
);
13113 uint data_len
= input_len
- 10 - 1 - user_len
- 1 - realm_len
- 1 - salt_len
- 1;
13115 if (data_len
!= ((36 + 16) * 2)) return (PARSER_SALT_LENGTH
);
13121 memcpy (krb5pa
->user
, user_pos
, user_len
);
13122 memcpy (krb5pa
->realm
, realm_pos
, realm_len
);
13123 memcpy (krb5pa
->salt
, salt_pos
, salt_len
);
13125 char *timestamp_ptr
= (char *) krb5pa
->timestamp
;
13127 for (uint i
= 0; i
< (36 * 2); i
+= 2)
13129 const char p0
= data_pos
[i
+ 0];
13130 const char p1
= data_pos
[i
+ 1];
13132 *timestamp_ptr
++ = hex_convert (p1
) << 0
13133 | hex_convert (p0
) << 4;
13136 char *checksum_ptr
= (char *) krb5pa
->checksum
;
13138 for (uint i
= (36 * 2); i
< ((36 + 16) * 2); i
+= 2)
13140 const char p0
= data_pos
[i
+ 0];
13141 const char p1
= data_pos
[i
+ 1];
13143 *checksum_ptr
++ = hex_convert (p1
) << 0
13144 | hex_convert (p0
) << 4;
13148 * copy some data to generic buffers to make sorting happy
13151 salt
->salt_buf
[0] = krb5pa
->timestamp
[0];
13152 salt
->salt_buf
[1] = krb5pa
->timestamp
[1];
13153 salt
->salt_buf
[2] = krb5pa
->timestamp
[2];
13154 salt
->salt_buf
[3] = krb5pa
->timestamp
[3];
13155 salt
->salt_buf
[4] = krb5pa
->timestamp
[4];
13156 salt
->salt_buf
[5] = krb5pa
->timestamp
[5];
13157 salt
->salt_buf
[6] = krb5pa
->timestamp
[6];
13158 salt
->salt_buf
[7] = krb5pa
->timestamp
[7];
13159 salt
->salt_buf
[8] = krb5pa
->timestamp
[8];
13161 salt
->salt_len
= 36;
13163 digest
[0] = krb5pa
->checksum
[0];
13164 digest
[1] = krb5pa
->checksum
[1];
13165 digest
[2] = krb5pa
->checksum
[2];
13166 digest
[3] = krb5pa
->checksum
[3];
13168 return (PARSER_OK
);
13171 int sapb_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
13173 if ((input_len
< DISPLAY_LEN_MIN_7700
) || (input_len
> DISPLAY_LEN_MAX_7700
)) return (PARSER_GLOBAL_LENGTH
);
13175 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
13177 salt_t
*salt
= hash_buf
->salt
;
13183 char *salt_pos
= input_buf
;
13185 char *hash_pos
= strchr (salt_pos
, '$');
13187 if (hash_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
13189 uint salt_len
= hash_pos
- salt_pos
;
13191 if (salt_len
>= 40) return (PARSER_SALT_LENGTH
);
13195 uint hash_len
= input_len
- 1 - salt_len
;
13197 if (hash_len
!= 16) return (PARSER_HASH_LENGTH
);
13205 for (uint i
= 0; i
< salt_len
; i
++)
13207 if (salt_pos
[i
] == ' ') continue;
13212 // SAP user names cannot be longer than 12 characters
13213 if (user_len
> 12) return (PARSER_SALT_LENGTH
);
13215 // SAP user name cannot start with ! or ?
13216 if (salt_pos
[0] == '!' || salt_pos
[0] == '?') return (PARSER_SALT_VALUE
);
13222 char *salt_buf_ptr
= (char *) salt
->salt_buf
;
13224 salt_len
= parse_and_store_salt (salt_buf_ptr
, salt_pos
, salt_len
);
13226 if (salt_len
== UINT_MAX
) return (PARSER_SALT_LENGTH
);
13228 salt
->salt_len
= salt_len
;
13230 digest
[0] = hex_to_uint (&hash_pos
[0]);
13231 digest
[1] = hex_to_uint (&hash_pos
[8]);
13235 digest
[0] = byte_swap_32 (digest
[0]);
13236 digest
[1] = byte_swap_32 (digest
[1]);
13238 return (PARSER_OK
);
13241 int sapg_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
13243 if ((input_len
< DISPLAY_LEN_MIN_7800
) || (input_len
> DISPLAY_LEN_MAX_7800
)) return (PARSER_GLOBAL_LENGTH
);
13245 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
13247 salt_t
*salt
= hash_buf
->salt
;
13253 char *salt_pos
= input_buf
;
13255 char *hash_pos
= strchr (salt_pos
, '$');
13257 if (hash_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
13259 uint salt_len
= hash_pos
- salt_pos
;
13261 if (salt_len
>= 40) return (PARSER_SALT_LENGTH
);
13265 uint hash_len
= input_len
- 1 - salt_len
;
13267 if (hash_len
!= 40) return (PARSER_HASH_LENGTH
);
13275 for (uint i
= 0; i
< salt_len
; i
++)
13277 if (salt_pos
[i
] == ' ') continue;
13282 // SAP user names cannot be longer than 12 characters
13283 if (user_len
> 12) return (PARSER_SALT_LENGTH
);
13285 // SAP user name cannot start with ! or ?
13286 if (salt_pos
[0] == '!' || salt_pos
[0] == '?') return (PARSER_SALT_VALUE
);
13292 char *salt_buf_ptr
= (char *) salt
->salt_buf
;
13294 salt_len
= parse_and_store_salt (salt_buf_ptr
, salt_pos
, salt_len
);
13296 if (salt_len
== UINT_MAX
) return (PARSER_SALT_LENGTH
);
13298 salt
->salt_len
= salt_len
;
13300 digest
[0] = hex_to_uint (&hash_pos
[ 0]);
13301 digest
[1] = hex_to_uint (&hash_pos
[ 8]);
13302 digest
[2] = hex_to_uint (&hash_pos
[16]);
13303 digest
[3] = hex_to_uint (&hash_pos
[24]);
13304 digest
[4] = hex_to_uint (&hash_pos
[32]);
13306 return (PARSER_OK
);
13309 int drupal7_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
13311 if ((input_len
< DISPLAY_LEN_MIN_7900
) || (input_len
> DISPLAY_LEN_MAX_7900
)) return (PARSER_GLOBAL_LENGTH
);
13313 if (memcmp (SIGNATURE_DRUPAL7
, input_buf
, 3)) return (PARSER_SIGNATURE_UNMATCHED
);
13315 uint64_t *digest
= (uint64_t *) hash_buf
->digest
;
13317 salt_t
*salt
= hash_buf
->salt
;
13319 char *iter_pos
= input_buf
+ 3;
13321 uint salt_iter
= 1 << itoa64_to_int (iter_pos
[0]);
13323 if (salt_iter
> 0x80000000) return (PARSER_SALT_ITERATION
);
13325 memcpy ((char *) salt
->salt_sign
, input_buf
, 4);
13327 salt
->salt_iter
= salt_iter
;
13329 char *salt_pos
= iter_pos
+ 1;
13333 memcpy ((char *) salt
->salt_buf
, salt_pos
, salt_len
);
13335 salt
->salt_len
= salt_len
;
13337 char *hash_pos
= salt_pos
+ salt_len
;
13339 drupal7_decode ((unsigned char *) digest
, (unsigned char *) hash_pos
);
13343 char *tmp
= (char *) salt
->salt_buf_pc
;
13345 tmp
[0] = hash_pos
[42];
13349 digest
[ 0] = byte_swap_64 (digest
[ 0]);
13350 digest
[ 1] = byte_swap_64 (digest
[ 1]);
13351 digest
[ 2] = byte_swap_64 (digest
[ 2]);
13352 digest
[ 3] = byte_swap_64 (digest
[ 3]);
13358 return (PARSER_OK
);
13361 int sybasease_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
13363 if ((input_len
< DISPLAY_LEN_MIN_8000
) || (input_len
> DISPLAY_LEN_MAX_8000
)) return (PARSER_GLOBAL_LENGTH
);
13365 if (memcmp (SIGNATURE_SYBASEASE
, input_buf
, 6)) return (PARSER_SIGNATURE_UNMATCHED
);
13367 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
13369 salt_t
*salt
= hash_buf
->salt
;
13371 char *salt_buf
= input_buf
+ 6;
13373 uint salt_len
= 16;
13375 char *salt_buf_ptr
= (char *) salt
->salt_buf
;
13377 salt_len
= parse_and_store_salt (salt_buf_ptr
, salt_buf
, salt_len
);
13379 if (salt_len
== UINT_MAX
) return (PARSER_SALT_LENGTH
);
13381 salt
->salt_len
= salt_len
;
13383 char *hash_pos
= input_buf
+ 6 + 16;
13385 digest
[0] = hex_to_uint (&hash_pos
[ 0]);
13386 digest
[1] = hex_to_uint (&hash_pos
[ 8]);
13387 digest
[2] = hex_to_uint (&hash_pos
[16]);
13388 digest
[3] = hex_to_uint (&hash_pos
[24]);
13389 digest
[4] = hex_to_uint (&hash_pos
[32]);
13390 digest
[5] = hex_to_uint (&hash_pos
[40]);
13391 digest
[6] = hex_to_uint (&hash_pos
[48]);
13392 digest
[7] = hex_to_uint (&hash_pos
[56]);
13394 return (PARSER_OK
);
13397 int mysql323_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
13399 if ((input_len
< DISPLAY_LEN_MIN_200
) || (input_len
> DISPLAY_LEN_MAX_200
)) return (PARSER_GLOBAL_LENGTH
);
13401 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
13403 digest
[0] = hex_to_uint (&input_buf
[ 0]);
13404 digest
[1] = hex_to_uint (&input_buf
[ 8]);
13408 return (PARSER_OK
);
13411 int rakp_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
13413 if ((input_len
< DISPLAY_LEN_MIN_7300
) || (input_len
> DISPLAY_LEN_MAX_7300
)) return (PARSER_GLOBAL_LENGTH
);
13415 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
13417 salt_t
*salt
= hash_buf
->salt
;
13419 rakp_t
*rakp
= (rakp_t
*) hash_buf
->esalt
;
13421 char *saltbuf_pos
= input_buf
;
13423 char *hashbuf_pos
= strchr (saltbuf_pos
, ':');
13425 if (hashbuf_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
13427 uint saltbuf_len
= hashbuf_pos
- saltbuf_pos
;
13429 if (saltbuf_len
< 64) return (PARSER_SALT_LENGTH
);
13430 if (saltbuf_len
> 512) return (PARSER_SALT_LENGTH
);
13432 if (saltbuf_len
& 1) return (PARSER_SALT_LENGTH
); // muss gerade sein wegen hex
13436 uint hashbuf_len
= input_len
- saltbuf_len
- 1;
13438 if (hashbuf_len
!= 40) return (PARSER_HASH_LENGTH
);
13440 char *salt_ptr
= (char *) saltbuf_pos
;
13441 char *rakp_ptr
= (char *) rakp
->salt_buf
;
13446 for (i
= 0, j
= 0; i
< saltbuf_len
; i
+= 2, j
+= 1)
13448 rakp_ptr
[j
] = hex_to_char (&salt_ptr
[i
]);
13451 rakp_ptr
[j
] = 0x80;
13453 rakp
->salt_len
= j
;
13455 for (i
= 0; i
< 64; i
++)
13457 rakp
->salt_buf
[i
] = byte_swap_32 (rakp
->salt_buf
[i
]);
13460 salt
->salt_buf
[0] = rakp
->salt_buf
[0];
13461 salt
->salt_buf
[1] = rakp
->salt_buf
[1];
13462 salt
->salt_buf
[2] = rakp
->salt_buf
[2];
13463 salt
->salt_buf
[3] = rakp
->salt_buf
[3];
13464 salt
->salt_buf
[4] = rakp
->salt_buf
[4];
13465 salt
->salt_buf
[5] = rakp
->salt_buf
[5];
13466 salt
->salt_buf
[6] = rakp
->salt_buf
[6];
13467 salt
->salt_buf
[7] = rakp
->salt_buf
[7];
13469 salt
->salt_len
= 32; // muss min. 32 haben
13471 digest
[0] = hex_to_uint (&hashbuf_pos
[ 0]);
13472 digest
[1] = hex_to_uint (&hashbuf_pos
[ 8]);
13473 digest
[2] = hex_to_uint (&hashbuf_pos
[16]);
13474 digest
[3] = hex_to_uint (&hashbuf_pos
[24]);
13475 digest
[4] = hex_to_uint (&hashbuf_pos
[32]);
13477 return (PARSER_OK
);
13480 int netscaler_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
13482 if ((input_len
< DISPLAY_LEN_MIN_8100
) || (input_len
> DISPLAY_LEN_MAX_8100
)) return (PARSER_GLOBAL_LENGTH
);
13484 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
13486 salt_t
*salt
= hash_buf
->salt
;
13488 if (memcmp (SIGNATURE_NETSCALER
, input_buf
, 1)) return (PARSER_SIGNATURE_UNMATCHED
);
13490 char *salt_pos
= input_buf
+ 1;
13492 memcpy (salt
->salt_buf
, salt_pos
, 8);
13494 salt
->salt_buf
[0] = byte_swap_32 (salt
->salt_buf
[0]);
13495 salt
->salt_buf
[1] = byte_swap_32 (salt
->salt_buf
[1]);
13497 salt
->salt_len
= 8;
13499 char *hash_pos
= salt_pos
+ 8;
13501 digest
[0] = hex_to_uint (&hash_pos
[ 0]);
13502 digest
[1] = hex_to_uint (&hash_pos
[ 8]);
13503 digest
[2] = hex_to_uint (&hash_pos
[16]);
13504 digest
[3] = hex_to_uint (&hash_pos
[24]);
13505 digest
[4] = hex_to_uint (&hash_pos
[32]);
13507 digest
[0] -= SHA1M_A
;
13508 digest
[1] -= SHA1M_B
;
13509 digest
[2] -= SHA1M_C
;
13510 digest
[3] -= SHA1M_D
;
13511 digest
[4] -= SHA1M_E
;
13513 return (PARSER_OK
);
13516 int chap_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
13518 if ((input_len
< DISPLAY_LEN_MIN_4800
) || (input_len
> DISPLAY_LEN_MAX_4800
)) return (PARSER_GLOBAL_LENGTH
);
13520 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
13522 salt_t
*salt
= hash_buf
->salt
;
13524 digest
[0] = hex_to_uint (&input_buf
[ 0]);
13525 digest
[1] = hex_to_uint (&input_buf
[ 8]);
13526 digest
[2] = hex_to_uint (&input_buf
[16]);
13527 digest
[3] = hex_to_uint (&input_buf
[24]);
13529 digest
[0] = byte_swap_32 (digest
[0]);
13530 digest
[1] = byte_swap_32 (digest
[1]);
13531 digest
[2] = byte_swap_32 (digest
[2]);
13532 digest
[3] = byte_swap_32 (digest
[3]);
13534 digest
[0] -= MD5M_A
;
13535 digest
[1] -= MD5M_B
;
13536 digest
[2] -= MD5M_C
;
13537 digest
[3] -= MD5M_D
;
13539 if (input_buf
[32] != data
.separator
) return (PARSER_SEPARATOR_UNMATCHED
);
13541 char *salt_buf_ptr
= input_buf
+ 32 + 1;
13543 uint32_t *salt_buf
= salt
->salt_buf
;
13545 salt_buf
[0] = hex_to_uint (&salt_buf_ptr
[ 0]);
13546 salt_buf
[1] = hex_to_uint (&salt_buf_ptr
[ 8]);
13547 salt_buf
[2] = hex_to_uint (&salt_buf_ptr
[16]);
13548 salt_buf
[3] = hex_to_uint (&salt_buf_ptr
[24]);
13550 salt_buf
[0] = byte_swap_32 (salt_buf
[0]);
13551 salt_buf
[1] = byte_swap_32 (salt_buf
[1]);
13552 salt_buf
[2] = byte_swap_32 (salt_buf
[2]);
13553 salt_buf
[3] = byte_swap_32 (salt_buf
[3]);
13555 salt
->salt_len
= 16 + 1;
13557 if (input_buf
[65] != data
.separator
) return (PARSER_SEPARATOR_UNMATCHED
);
13559 char *idbyte_buf_ptr
= input_buf
+ 32 + 1 + 32 + 1;
13561 salt_buf
[4] = hex_to_char (&idbyte_buf_ptr
[0]) & 0xff;
13563 return (PARSER_OK
);
13566 int cloudkey_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
13568 if ((input_len
< DISPLAY_LEN_MIN_8200
) || (input_len
> DISPLAY_LEN_MAX_8200
)) return (PARSER_GLOBAL_LENGTH
);
13570 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
13572 salt_t
*salt
= hash_buf
->salt
;
13574 cloudkey_t
*cloudkey
= (cloudkey_t
*) hash_buf
->esalt
;
13580 char *hashbuf_pos
= input_buf
;
13582 char *saltbuf_pos
= strchr (hashbuf_pos
, ':');
13584 if (saltbuf_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
13586 const uint hashbuf_len
= saltbuf_pos
- hashbuf_pos
;
13588 if (hashbuf_len
!= 64) return (PARSER_HASH_LENGTH
);
13592 char *iteration_pos
= strchr (saltbuf_pos
, ':');
13594 if (iteration_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
13596 const uint saltbuf_len
= iteration_pos
- saltbuf_pos
;
13598 if (saltbuf_len
!= 32) return (PARSER_SALT_LENGTH
);
13602 char *databuf_pos
= strchr (iteration_pos
, ':');
13604 if (databuf_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
13606 const uint iteration_len
= databuf_pos
- iteration_pos
;
13608 if (iteration_len
< 1) return (PARSER_SALT_ITERATION
);
13609 if (iteration_len
> 8) return (PARSER_SALT_ITERATION
);
13611 const uint databuf_len
= input_len
- hashbuf_len
- 1 - saltbuf_len
- 1 - iteration_len
- 1;
13613 if (databuf_len
< 1) return (PARSER_SALT_LENGTH
);
13614 if (databuf_len
> 2048) return (PARSER_SALT_LENGTH
);
13620 digest
[0] = hex_to_uint (&hashbuf_pos
[ 0]);
13621 digest
[1] = hex_to_uint (&hashbuf_pos
[ 8]);
13622 digest
[2] = hex_to_uint (&hashbuf_pos
[16]);
13623 digest
[3] = hex_to_uint (&hashbuf_pos
[24]);
13624 digest
[4] = hex_to_uint (&hashbuf_pos
[32]);
13625 digest
[5] = hex_to_uint (&hashbuf_pos
[40]);
13626 digest
[6] = hex_to_uint (&hashbuf_pos
[48]);
13627 digest
[7] = hex_to_uint (&hashbuf_pos
[56]);
13631 char *saltbuf_ptr
= (char *) salt
->salt_buf
;
13633 for (uint i
= 0; i
< saltbuf_len
; i
+= 2)
13635 const char p0
= saltbuf_pos
[i
+ 0];
13636 const char p1
= saltbuf_pos
[i
+ 1];
13638 *saltbuf_ptr
++ = hex_convert (p1
) << 0
13639 | hex_convert (p0
) << 4;
13642 salt
->salt_buf
[4] = 0x01000000;
13643 salt
->salt_buf
[5] = 0x80;
13645 salt
->salt_len
= saltbuf_len
/ 2;
13649 salt
->salt_iter
= atoi (iteration_pos
) - 1;
13653 char *databuf_ptr
= (char *) cloudkey
->data_buf
;
13655 for (uint i
= 0; i
< databuf_len
; i
+= 2)
13657 const char p0
= databuf_pos
[i
+ 0];
13658 const char p1
= databuf_pos
[i
+ 1];
13660 *databuf_ptr
++ = hex_convert (p1
) << 0
13661 | hex_convert (p0
) << 4;
13664 *databuf_ptr
++ = 0x80;
13666 for (uint i
= 0; i
< 512; i
++)
13668 cloudkey
->data_buf
[i
] = byte_swap_32 (cloudkey
->data_buf
[i
]);
13671 cloudkey
->data_len
= databuf_len
/ 2;
13673 return (PARSER_OK
);
13676 int nsec3_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
13678 if ((input_len
< DISPLAY_LEN_MIN_8300
) || (input_len
> DISPLAY_LEN_MAX_8300
)) return (PARSER_GLOBAL_LENGTH
);
13680 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
13682 salt_t
*salt
= hash_buf
->salt
;
13688 char *hashbuf_pos
= input_buf
;
13690 char *domainbuf_pos
= strchr (hashbuf_pos
, ':');
13692 if (domainbuf_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
13694 const uint hashbuf_len
= domainbuf_pos
- hashbuf_pos
;
13696 if (hashbuf_len
!= 32) return (PARSER_HASH_LENGTH
);
13700 if (domainbuf_pos
[0] != '.') return (PARSER_SALT_VALUE
);
13702 char *saltbuf_pos
= strchr (domainbuf_pos
, ':');
13704 if (saltbuf_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
13706 const uint domainbuf_len
= saltbuf_pos
- domainbuf_pos
;
13708 if (domainbuf_len
>= 32) return (PARSER_SALT_LENGTH
);
13712 char *iteration_pos
= strchr (saltbuf_pos
, ':');
13714 if (iteration_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
13716 const uint saltbuf_len
= iteration_pos
- saltbuf_pos
;
13718 if (saltbuf_len
>= 28) return (PARSER_SALT_LENGTH
); // 28 = 32 - 4; 4 = length
13720 if ((domainbuf_len
+ saltbuf_len
) >= 48) return (PARSER_SALT_LENGTH
);
13724 const uint iteration_len
= input_len
- hashbuf_len
- 1 - domainbuf_len
- 1 - saltbuf_len
- 1;
13726 if (iteration_len
< 1) return (PARSER_SALT_ITERATION
);
13727 if (iteration_len
> 5) return (PARSER_SALT_ITERATION
);
13729 // ok, the plan for this algorithm is the following:
13730 // we have 2 salts here, the domain-name and a random salt
13731 // while both are used in the initial transformation,
13732 // only the random salt is used in the following iterations
13733 // so we create two buffer, one that includes domain-name (stored into salt_buf_pc[])
13734 // and one that includes only the real salt (stored into salt_buf[]).
13735 // the domain-name length is put into array position 7 of salt_buf_pc[] since there is not salt_pc_len
13737 char tmp_buf
[100]; memset (tmp_buf
, 0, sizeof (tmp_buf
));
13739 base32_decode (itoa32_to_int
, hashbuf_pos
, 32, tmp_buf
);
13741 memcpy (digest
, tmp_buf
, 20);
13743 digest
[0] = byte_swap_32 (digest
[0]);
13744 digest
[1] = byte_swap_32 (digest
[1]);
13745 digest
[2] = byte_swap_32 (digest
[2]);
13746 digest
[3] = byte_swap_32 (digest
[3]);
13747 digest
[4] = byte_swap_32 (digest
[4]);
13751 char *salt_buf_pc_ptr
= (char *) salt
->salt_buf_pc
;
13753 memcpy (salt_buf_pc_ptr
, domainbuf_pos
, domainbuf_len
);
13755 char *len_ptr
= NULL
;
13757 for (uint i
= 0; i
< domainbuf_len
; i
++)
13759 if (salt_buf_pc_ptr
[i
] == '.')
13761 len_ptr
= &salt_buf_pc_ptr
[i
];
13771 salt
->salt_buf_pc
[7] = domainbuf_len
;
13775 char *salt_buf_ptr
= (char *) salt
->salt_buf
;
13777 const uint salt_len
= parse_and_store_salt (salt_buf_ptr
, saltbuf_pos
, saltbuf_len
);
13779 if (salt_len
== UINT_MAX
) return (PARSER_SALT_LENGTH
);
13781 salt
->salt_len
= salt_len
;
13785 salt
->salt_iter
= atoi (iteration_pos
);
13787 return (PARSER_OK
);
13790 int wbb3_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
13792 if ((input_len
< DISPLAY_LEN_MIN_8400
) || (input_len
> DISPLAY_LEN_MAX_8400
)) return (PARSER_GLOBAL_LENGTH
);
13794 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
13796 salt_t
*salt
= hash_buf
->salt
;
13798 digest
[0] = hex_to_uint (&input_buf
[ 0]);
13799 digest
[1] = hex_to_uint (&input_buf
[ 8]);
13800 digest
[2] = hex_to_uint (&input_buf
[16]);
13801 digest
[3] = hex_to_uint (&input_buf
[24]);
13802 digest
[4] = hex_to_uint (&input_buf
[32]);
13804 if (input_buf
[40] != data
.separator
) return (PARSER_SEPARATOR_UNMATCHED
);
13806 uint salt_len
= input_len
- 40 - 1;
13808 char *salt_buf
= input_buf
+ 40 + 1;
13810 char *salt_buf_ptr
= (char *) salt
->salt_buf
;
13812 salt_len
= parse_and_store_salt (salt_buf_ptr
, salt_buf
, salt_len
);
13814 if (salt_len
== UINT_MAX
) return (PARSER_SALT_LENGTH
);
13816 salt
->salt_len
= salt_len
;
13818 return (PARSER_OK
);
13821 int racf_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
13823 const uint8_t ascii_to_ebcdic
[] =
13825 0x00, 0x01, 0x02, 0x03, 0x37, 0x2d, 0x2e, 0x2f, 0x16, 0x05, 0x25, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
13826 0x10, 0x11, 0x12, 0x13, 0x3c, 0x3d, 0x32, 0x26, 0x18, 0x19, 0x3f, 0x27, 0x1c, 0x1d, 0x1e, 0x1f,
13827 0x40, 0x4f, 0x7f, 0x7b, 0x5b, 0x6c, 0x50, 0x7d, 0x4d, 0x5d, 0x5c, 0x4e, 0x6b, 0x60, 0x4b, 0x61,
13828 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0x7a, 0x5e, 0x4c, 0x7e, 0x6e, 0x6f,
13829 0x7c, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6,
13830 0xd7, 0xd8, 0xd9, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0x4a, 0xe0, 0x5a, 0x5f, 0x6d,
13831 0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
13832 0x97, 0x98, 0x99, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xc0, 0x6a, 0xd0, 0xa1, 0x07,
13833 0x20, 0x21, 0x22, 0x23, 0x24, 0x15, 0x06, 0x17, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x09, 0x0a, 0x1b,
13834 0x30, 0x31, 0x1a, 0x33, 0x34, 0x35, 0x36, 0x08, 0x38, 0x39, 0x3a, 0x3b, 0x04, 0x14, 0x3e, 0xe1,
13835 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
13836 0x58, 0x59, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75,
13837 0x76, 0x77, 0x78, 0x80, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e,
13838 0x9f, 0xa0, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
13839 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xda, 0xdb,
13840 0xdc, 0xdd, 0xde, 0xdf, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
13843 if ((input_len
< DISPLAY_LEN_MIN_8500
) || (input_len
> DISPLAY_LEN_MAX_8500
)) return (PARSER_GLOBAL_LENGTH
);
13845 if (memcmp (SIGNATURE_RACF
, input_buf
, 6)) return (PARSER_SIGNATURE_UNMATCHED
);
13847 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
13849 salt_t
*salt
= hash_buf
->salt
;
13851 char *salt_pos
= input_buf
+ 6 + 1;
13853 char *digest_pos
= strchr (salt_pos
, '*');
13855 if (digest_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
13857 uint salt_len
= digest_pos
- salt_pos
;
13859 if (salt_len
> 8) return (PARSER_SALT_LENGTH
);
13861 uint hash_len
= input_len
- 1 - salt_len
- 1 - 6;
13863 if (hash_len
!= 16) return (PARSER_HASH_LENGTH
);
13867 char *salt_buf_ptr
= (char *) salt
->salt_buf
;
13868 char *salt_buf_pc_ptr
= (char *) salt
->salt_buf_pc
;
13870 salt_len
= parse_and_store_salt (salt_buf_ptr
, salt_pos
, salt_len
);
13872 if (salt_len
== UINT_MAX
) return (PARSER_SALT_LENGTH
);
13874 salt
->salt_len
= salt_len
;
13876 for (uint i
= 0; i
< salt_len
; i
++)
13878 salt_buf_pc_ptr
[i
] = ascii_to_ebcdic
[(int) salt_buf_ptr
[i
]];
13880 for (uint i
= salt_len
; i
< 8; i
++)
13882 salt_buf_pc_ptr
[i
] = 0x40;
13887 IP (salt
->salt_buf_pc
[0], salt
->salt_buf_pc
[1], tt
);
13889 salt
->salt_buf_pc
[0] = ROTATE_LEFT (salt
->salt_buf_pc
[0], 3u);
13890 salt
->salt_buf_pc
[1] = ROTATE_LEFT (salt
->salt_buf_pc
[1], 3u);
13892 digest
[0] = hex_to_uint (&digest_pos
[ 0]);
13893 digest
[1] = hex_to_uint (&digest_pos
[ 8]);
13895 digest
[0] = byte_swap_32 (digest
[0]);
13896 digest
[1] = byte_swap_32 (digest
[1]);
13898 IP (digest
[0], digest
[1], tt
);
13900 digest
[0] = ROTATE_RIGHT (digest
[0], 29);
13901 digest
[1] = ROTATE_RIGHT (digest
[1], 29);
13905 return (PARSER_OK
);
13908 int lotus5_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
13910 if ((input_len
< DISPLAY_LEN_MIN_8600
) || (input_len
> DISPLAY_LEN_MAX_8600
)) return (PARSER_GLOBAL_LENGTH
);
13912 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
13914 digest
[0] = hex_to_uint (&input_buf
[ 0]);
13915 digest
[1] = hex_to_uint (&input_buf
[ 8]);
13916 digest
[2] = hex_to_uint (&input_buf
[16]);
13917 digest
[3] = hex_to_uint (&input_buf
[24]);
13919 digest
[0] = byte_swap_32 (digest
[0]);
13920 digest
[1] = byte_swap_32 (digest
[1]);
13921 digest
[2] = byte_swap_32 (digest
[2]);
13922 digest
[3] = byte_swap_32 (digest
[3]);
13924 return (PARSER_OK
);
13927 int lotus6_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
13929 if ((input_len
< DISPLAY_LEN_MIN_8700
) || (input_len
> DISPLAY_LEN_MAX_8700
)) return (PARSER_GLOBAL_LENGTH
);
13931 if ((input_buf
[0] != '(') || (input_buf
[1] != 'G') || (input_buf
[21] != ')')) return (PARSER_SIGNATURE_UNMATCHED
);
13933 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
13935 salt_t
*salt
= hash_buf
->salt
;
13939 memset (tmp_buf
, 0, sizeof (tmp_buf
));
13941 base64_decode (lotus64_to_int
, input_buf
+ 2, input_len
- 3, tmp_buf
);
13943 tmp_buf
[3] += -4; // dont ask!
13945 memcpy (salt
->salt_buf
, tmp_buf
, 5);
13947 salt
->salt_len
= 5;
13949 memcpy (digest
, tmp_buf
+ 5, 9);
13951 // yes, only 9 byte are needed to crack, but 10 to display
13953 salt
->salt_buf_pc
[7] = input_buf
[20];
13955 return (PARSER_OK
);
13958 int lotus8_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
13960 if ((input_len
< DISPLAY_LEN_MIN_9100
) || (input_len
> DISPLAY_LEN_MAX_9100
)) return (PARSER_GLOBAL_LENGTH
);
13962 if ((input_buf
[0] != '(') || (input_buf
[1] != 'H') || (input_buf
[DISPLAY_LEN_MAX_9100
- 1] != ')')) return (PARSER_SIGNATURE_UNMATCHED
);
13964 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
13966 salt_t
*salt
= hash_buf
->salt
;
13970 memset (tmp_buf
, 0, sizeof (tmp_buf
));
13972 base64_decode (lotus64_to_int
, input_buf
+ 2, input_len
- 3, tmp_buf
);
13974 tmp_buf
[3] += -4; // dont ask!
13978 memcpy (salt
->salt_buf
, tmp_buf
, 16);
13980 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)
13984 char tmp_iter_buf
[11];
13986 memcpy (tmp_iter_buf
, tmp_buf
+ 16, 10);
13988 tmp_iter_buf
[10] = 0;
13990 salt
->salt_iter
= atoi (tmp_iter_buf
);
13992 if (salt
->salt_iter
< 1) // well, the limit hopefully is much higher
13994 return (PARSER_SALT_ITERATION
);
13997 salt
->salt_iter
--; // first round in init
13999 // 2 additional bytes for display only
14001 salt
->salt_buf_pc
[0] = tmp_buf
[26];
14002 salt
->salt_buf_pc
[1] = tmp_buf
[27];
14006 memcpy (digest
, tmp_buf
+ 28, 8);
14008 digest
[0] = byte_swap_32 (digest
[0]);
14009 digest
[1] = byte_swap_32 (digest
[1]);
14013 return (PARSER_OK
);
14016 int hmailserver_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
14018 if ((input_len
< DISPLAY_LEN_MIN_1421
) || (input_len
> DISPLAY_LEN_MAX_1421
)) return (PARSER_GLOBAL_LENGTH
);
14020 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
14022 salt_t
*salt
= hash_buf
->salt
;
14024 char *salt_buf_pos
= input_buf
;
14026 char *hash_buf_pos
= salt_buf_pos
+ 6;
14028 digest
[0] = hex_to_uint (&hash_buf_pos
[ 0]);
14029 digest
[1] = hex_to_uint (&hash_buf_pos
[ 8]);
14030 digest
[2] = hex_to_uint (&hash_buf_pos
[16]);
14031 digest
[3] = hex_to_uint (&hash_buf_pos
[24]);
14032 digest
[4] = hex_to_uint (&hash_buf_pos
[32]);
14033 digest
[5] = hex_to_uint (&hash_buf_pos
[40]);
14034 digest
[6] = hex_to_uint (&hash_buf_pos
[48]);
14035 digest
[7] = hex_to_uint (&hash_buf_pos
[56]);
14037 digest
[0] -= SHA256M_A
;
14038 digest
[1] -= SHA256M_B
;
14039 digest
[2] -= SHA256M_C
;
14040 digest
[3] -= SHA256M_D
;
14041 digest
[4] -= SHA256M_E
;
14042 digest
[5] -= SHA256M_F
;
14043 digest
[6] -= SHA256M_G
;
14044 digest
[7] -= SHA256M_H
;
14046 char *salt_buf_ptr
= (char *) salt
->salt_buf
;
14048 const uint salt_len
= parse_and_store_salt (salt_buf_ptr
, salt_buf_pos
, 6);
14050 if (salt_len
== UINT_MAX
) return (PARSER_SALT_LENGTH
);
14052 salt
->salt_len
= salt_len
;
14054 return (PARSER_OK
);
14057 int phps_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
14059 if ((input_len
< DISPLAY_LEN_MIN_2612
) || (input_len
> DISPLAY_LEN_MAX_2612
)) return (PARSER_GLOBAL_LENGTH
);
14061 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
14063 if (memcmp (SIGNATURE_PHPS
, input_buf
, 6)) return (PARSER_SIGNATURE_UNMATCHED
);
14065 salt_t
*salt
= hash_buf
->salt
;
14067 char *salt_buf
= input_buf
+ 6;
14069 char *digest_buf
= strchr (salt_buf
, '$');
14071 if (digest_buf
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
14073 uint salt_len
= digest_buf
- salt_buf
;
14075 digest_buf
++; // skip the '$' symbol
14077 char *salt_buf_ptr
= (char *) salt
->salt_buf
;
14079 salt_len
= parse_and_store_salt (salt_buf_ptr
, salt_buf
, salt_len
);
14081 if (salt_len
== UINT_MAX
) return (PARSER_SALT_LENGTH
);
14083 salt
->salt_len
= salt_len
;
14085 digest
[0] = hex_to_uint (&digest_buf
[ 0]);
14086 digest
[1] = hex_to_uint (&digest_buf
[ 8]);
14087 digest
[2] = hex_to_uint (&digest_buf
[16]);
14088 digest
[3] = hex_to_uint (&digest_buf
[24]);
14090 digest
[0] = byte_swap_32 (digest
[0]);
14091 digest
[1] = byte_swap_32 (digest
[1]);
14092 digest
[2] = byte_swap_32 (digest
[2]);
14093 digest
[3] = byte_swap_32 (digest
[3]);
14095 digest
[0] -= MD5M_A
;
14096 digest
[1] -= MD5M_B
;
14097 digest
[2] -= MD5M_C
;
14098 digest
[3] -= MD5M_D
;
14100 return (PARSER_OK
);
14103 int mediawiki_b_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
14105 if ((input_len
< DISPLAY_LEN_MIN_3711
) || (input_len
> DISPLAY_LEN_MAX_3711
)) return (PARSER_GLOBAL_LENGTH
);
14107 if (memcmp (SIGNATURE_MEDIAWIKI_B
, input_buf
, 3)) return (PARSER_SIGNATURE_UNMATCHED
);
14109 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
14111 salt_t
*salt
= hash_buf
->salt
;
14113 char *salt_buf
= input_buf
+ 3;
14115 char *digest_buf
= strchr (salt_buf
, '$');
14117 if (digest_buf
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
14119 uint salt_len
= digest_buf
- salt_buf
;
14121 digest_buf
++; // skip the '$' symbol
14123 char *salt_buf_ptr
= (char *) salt
->salt_buf
;
14125 salt_len
= parse_and_store_salt (salt_buf_ptr
, salt_buf
, salt_len
);
14127 if (salt_len
== UINT_MAX
) return (PARSER_SALT_LENGTH
);
14129 salt_buf_ptr
[salt_len
] = 0x2d;
14131 salt
->salt_len
= salt_len
+ 1;
14133 digest
[0] = hex_to_uint (&digest_buf
[ 0]);
14134 digest
[1] = hex_to_uint (&digest_buf
[ 8]);
14135 digest
[2] = hex_to_uint (&digest_buf
[16]);
14136 digest
[3] = hex_to_uint (&digest_buf
[24]);
14138 digest
[0] = byte_swap_32 (digest
[0]);
14139 digest
[1] = byte_swap_32 (digest
[1]);
14140 digest
[2] = byte_swap_32 (digest
[2]);
14141 digest
[3] = byte_swap_32 (digest
[3]);
14143 digest
[0] -= MD5M_A
;
14144 digest
[1] -= MD5M_B
;
14145 digest
[2] -= MD5M_C
;
14146 digest
[3] -= MD5M_D
;
14148 return (PARSER_OK
);
14151 int peoplesoft_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
14153 if ((input_len
< DISPLAY_LEN_MIN_133
) || (input_len
> DISPLAY_LEN_MAX_133
)) return (PARSER_GLOBAL_LENGTH
);
14155 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
14159 memset (tmp_buf
, 0, sizeof (tmp_buf
));
14161 base64_decode (base64_to_int
, input_buf
, input_len
, tmp_buf
);
14163 memcpy (digest
, tmp_buf
, 20);
14165 digest
[0] = byte_swap_32 (digest
[0]);
14166 digest
[1] = byte_swap_32 (digest
[1]);
14167 digest
[2] = byte_swap_32 (digest
[2]);
14168 digest
[3] = byte_swap_32 (digest
[3]);
14169 digest
[4] = byte_swap_32 (digest
[4]);
14171 digest
[0] -= SHA1M_A
;
14172 digest
[1] -= SHA1M_B
;
14173 digest
[2] -= SHA1M_C
;
14174 digest
[3] -= SHA1M_D
;
14175 digest
[4] -= SHA1M_E
;
14177 return (PARSER_OK
);
14180 int skype_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
14182 if ((input_len
< DISPLAY_LEN_MIN_23
) || (input_len
> DISPLAY_LEN_MAX_23
)) return (PARSER_GLOBAL_LENGTH
);
14184 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
14186 salt_t
*salt
= hash_buf
->salt
;
14188 digest
[0] = hex_to_uint (&input_buf
[ 0]);
14189 digest
[1] = hex_to_uint (&input_buf
[ 8]);
14190 digest
[2] = hex_to_uint (&input_buf
[16]);
14191 digest
[3] = hex_to_uint (&input_buf
[24]);
14193 digest
[0] = byte_swap_32 (digest
[0]);
14194 digest
[1] = byte_swap_32 (digest
[1]);
14195 digest
[2] = byte_swap_32 (digest
[2]);
14196 digest
[3] = byte_swap_32 (digest
[3]);
14198 digest
[0] -= MD5M_A
;
14199 digest
[1] -= MD5M_B
;
14200 digest
[2] -= MD5M_C
;
14201 digest
[3] -= MD5M_D
;
14203 if (input_buf
[32] != ':') return (PARSER_SEPARATOR_UNMATCHED
);
14205 uint salt_len
= input_len
- 32 - 1;
14207 char *salt_buf
= input_buf
+ 32 + 1;
14209 char *salt_buf_ptr
= (char *) salt
->salt_buf
;
14211 salt_len
= parse_and_store_salt (salt_buf_ptr
, salt_buf
, salt_len
);
14213 if (salt_len
== UINT_MAX
) return (PARSER_SALT_LENGTH
);
14216 * add static "salt" part
14219 memcpy (salt_buf_ptr
+ salt_len
, "\nskyper\n", 8);
14223 salt
->salt_len
= salt_len
;
14225 return (PARSER_OK
);
14228 int androidfde_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
14230 if ((input_len
< DISPLAY_LEN_MIN_8800
) || (input_len
> DISPLAY_LEN_MAX_8800
)) return (PARSER_GLOBAL_LENGTH
);
14232 if (memcmp (SIGNATURE_ANDROIDFDE
, input_buf
, 5)) return (PARSER_SIGNATURE_UNMATCHED
);
14234 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
14236 salt_t
*salt
= hash_buf
->salt
;
14238 androidfde_t
*androidfde
= (androidfde_t
*) hash_buf
->esalt
;
14244 char *saltlen_pos
= input_buf
+ 1 + 3 + 1;
14246 char *saltbuf_pos
= strchr (saltlen_pos
, '$');
14248 if (saltbuf_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
14250 uint saltlen_len
= saltbuf_pos
- saltlen_pos
;
14252 if (saltlen_len
!= 2) return (PARSER_SALT_LENGTH
);
14256 char *keylen_pos
= strchr (saltbuf_pos
, '$');
14258 if (keylen_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
14260 uint saltbuf_len
= keylen_pos
- saltbuf_pos
;
14262 if (saltbuf_len
!= 32) return (PARSER_SALT_LENGTH
);
14266 char *keybuf_pos
= strchr (keylen_pos
, '$');
14268 if (keybuf_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
14270 uint keylen_len
= keybuf_pos
- keylen_pos
;
14272 if (keylen_len
!= 2) return (PARSER_SALT_LENGTH
);
14276 char *databuf_pos
= strchr (keybuf_pos
, '$');
14278 if (databuf_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
14280 uint keybuf_len
= databuf_pos
- keybuf_pos
;
14282 if (keybuf_len
!= 32) return (PARSER_SALT_LENGTH
);
14286 uint data_len
= input_len
- 1 - 3 - 1 - saltlen_len
- 1 - saltbuf_len
- 1 - keylen_len
- 1 - keybuf_len
- 1;
14288 if (data_len
!= 3072) return (PARSER_SALT_LENGTH
);
14294 digest
[0] = hex_to_uint (&keybuf_pos
[ 0]);
14295 digest
[1] = hex_to_uint (&keybuf_pos
[ 8]);
14296 digest
[2] = hex_to_uint (&keybuf_pos
[16]);
14297 digest
[3] = hex_to_uint (&keybuf_pos
[24]);
14299 salt
->salt_buf
[0] = hex_to_uint (&saltbuf_pos
[ 0]);
14300 salt
->salt_buf
[1] = hex_to_uint (&saltbuf_pos
[ 8]);
14301 salt
->salt_buf
[2] = hex_to_uint (&saltbuf_pos
[16]);
14302 salt
->salt_buf
[3] = hex_to_uint (&saltbuf_pos
[24]);
14304 salt
->salt_buf
[0] = byte_swap_32 (salt
->salt_buf
[0]);
14305 salt
->salt_buf
[1] = byte_swap_32 (salt
->salt_buf
[1]);
14306 salt
->salt_buf
[2] = byte_swap_32 (salt
->salt_buf
[2]);
14307 salt
->salt_buf
[3] = byte_swap_32 (salt
->salt_buf
[3]);
14309 salt
->salt_len
= 16;
14310 salt
->salt_iter
= ROUNDS_ANDROIDFDE
- 1;
14312 for (uint i
= 0, j
= 0; i
< 3072; i
+= 8, j
+= 1)
14314 androidfde
->data
[j
] = hex_to_uint (&databuf_pos
[i
]);
14317 return (PARSER_OK
);
14320 int scrypt_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
14322 if ((input_len
< DISPLAY_LEN_MIN_8900
) || (input_len
> DISPLAY_LEN_MAX_8900
)) return (PARSER_GLOBAL_LENGTH
);
14324 if (memcmp (SIGNATURE_SCRYPT
, input_buf
, 6)) return (PARSER_SIGNATURE_UNMATCHED
);
14326 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
14328 salt_t
*salt
= hash_buf
->salt
;
14334 // first is the N salt parameter
14336 char *N_pos
= input_buf
+ 6;
14338 if (N_pos
[0] != ':') return (PARSER_SEPARATOR_UNMATCHED
);
14342 salt
->scrypt_N
= atoi (N_pos
);
14346 char *r_pos
= strchr (N_pos
, ':');
14348 if (r_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
14352 salt
->scrypt_r
= atoi (r_pos
);
14356 char *p_pos
= strchr (r_pos
, ':');
14358 if (p_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
14362 salt
->scrypt_p
= atoi (p_pos
);
14366 char *saltbuf_pos
= strchr (p_pos
, ':');
14368 if (saltbuf_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
14372 char *hash_pos
= strchr (saltbuf_pos
, ':');
14374 if (hash_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
14382 memset (tmp_buf
, 0, sizeof (tmp_buf
));
14384 int tmp_len
= base64_decode (base64_to_int
, saltbuf_pos
, hash_pos
- saltbuf_pos
, tmp_buf
);
14386 char *salt_buf_ptr
= (char *) salt
->salt_buf
;
14388 memcpy (salt_buf_ptr
, tmp_buf
, tmp_len
);
14390 salt
->salt_len
= tmp_len
;
14391 salt
->salt_iter
= 1;
14393 // digest - base64 decode
14395 memset (tmp_buf
, 0, sizeof (tmp_buf
));
14397 tmp_len
= input_len
- (hash_pos
- input_buf
);
14399 if (tmp_len
!= 44) return (PARSER_GLOBAL_LENGTH
);
14401 base64_decode (base64_to_int
, hash_pos
, tmp_len
, tmp_buf
);
14403 memcpy (digest
, tmp_buf
, 32);
14405 return (PARSER_OK
);
14408 int juniper_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
14410 if ((input_len
< DISPLAY_LEN_MIN_501
) || (input_len
> DISPLAY_LEN_MAX_501
)) return (PARSER_GLOBAL_LENGTH
);
14412 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
14414 salt_t
*salt
= hash_buf
->salt
;
14420 char decrypted
[76]; // iv + hash
14422 juniper_decrypt_hash (input_buf
, decrypted
);
14424 char *md5crypt_hash
= decrypted
+ 12;
14426 if (memcmp (md5crypt_hash
, "$1$danastre$", 12)) return (PARSER_SALT_VALUE
);
14428 salt
->salt_iter
= ROUNDS_MD5CRYPT
;
14430 char *salt_pos
= md5crypt_hash
+ 3;
14432 char *hash_pos
= strchr (salt_pos
, '$'); // or simply salt_pos + 8
14434 salt
->salt_len
= hash_pos
- salt_pos
; // should be 8
14436 memcpy ((char *) salt
->salt_buf
, salt_pos
, salt
->salt_len
);
14440 md5crypt_decode ((unsigned char *) digest
, (unsigned char *) hash_pos
);
14442 return (PARSER_OK
);
14445 int cisco8_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
14447 if ((input_len
< DISPLAY_LEN_MIN_9200
) || (input_len
> DISPLAY_LEN_MAX_9200
)) return (PARSER_GLOBAL_LENGTH
);
14449 if (memcmp (SIGNATURE_CISCO8
, input_buf
, 3)) return (PARSER_SIGNATURE_UNMATCHED
);
14451 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
14453 salt_t
*salt
= hash_buf
->salt
;
14455 pbkdf2_sha256_t
*pbkdf2_sha256
= (pbkdf2_sha256_t
*) hash_buf
->esalt
;
14461 // first is *raw* salt
14463 char *salt_pos
= input_buf
+ 3;
14465 char *hash_pos
= strchr (salt_pos
, '$');
14467 if (hash_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
14469 uint salt_len
= hash_pos
- salt_pos
;
14471 if (salt_len
!= 14) return (PARSER_SALT_LENGTH
);
14475 char *salt_buf_ptr
= (char *) pbkdf2_sha256
->salt_buf
;
14477 memcpy (salt_buf_ptr
, salt_pos
, 14);
14479 salt_buf_ptr
[17] = 0x01;
14480 salt_buf_ptr
[18] = 0x80;
14482 // add some stuff to normal salt to make sorted happy
14484 salt
->salt_buf
[0] = pbkdf2_sha256
->salt_buf
[0];
14485 salt
->salt_buf
[1] = pbkdf2_sha256
->salt_buf
[1];
14486 salt
->salt_buf
[2] = pbkdf2_sha256
->salt_buf
[2];
14487 salt
->salt_buf
[3] = pbkdf2_sha256
->salt_buf
[3];
14489 salt
->salt_len
= salt_len
;
14490 salt
->salt_iter
= ROUNDS_CISCO8
- 1;
14492 // base64 decode hash
14496 memset (tmp_buf
, 0, sizeof (tmp_buf
));
14498 uint hash_len
= input_len
- 3 - salt_len
- 1;
14500 int tmp_len
= base64_decode (itoa64_to_int
, hash_pos
, hash_len
, tmp_buf
);
14502 if (tmp_len
!= 32) return (PARSER_HASH_LENGTH
);
14504 memcpy (digest
, tmp_buf
, 32);
14506 digest
[0] = byte_swap_32 (digest
[0]);
14507 digest
[1] = byte_swap_32 (digest
[1]);
14508 digest
[2] = byte_swap_32 (digest
[2]);
14509 digest
[3] = byte_swap_32 (digest
[3]);
14510 digest
[4] = byte_swap_32 (digest
[4]);
14511 digest
[5] = byte_swap_32 (digest
[5]);
14512 digest
[6] = byte_swap_32 (digest
[6]);
14513 digest
[7] = byte_swap_32 (digest
[7]);
14515 return (PARSER_OK
);
14518 int cisco9_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
14520 if ((input_len
< DISPLAY_LEN_MIN_9300
) || (input_len
> DISPLAY_LEN_MAX_9300
)) return (PARSER_GLOBAL_LENGTH
);
14522 if (memcmp (SIGNATURE_CISCO9
, input_buf
, 3)) return (PARSER_SIGNATURE_UNMATCHED
);
14524 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
14526 salt_t
*salt
= hash_buf
->salt
;
14532 // first is *raw* salt
14534 char *salt_pos
= input_buf
+ 3;
14536 char *hash_pos
= strchr (salt_pos
, '$');
14538 if (hash_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
14540 uint salt_len
= hash_pos
- salt_pos
;
14542 if (salt_len
!= 14) return (PARSER_SALT_LENGTH
);
14544 salt
->salt_len
= salt_len
;
14547 char *salt_buf_ptr
= (char *) salt
->salt_buf
;
14549 memcpy (salt_buf_ptr
, salt_pos
, salt_len
);
14550 salt_buf_ptr
[salt_len
] = 0;
14552 // base64 decode hash
14556 memset (tmp_buf
, 0, sizeof (tmp_buf
));
14558 uint hash_len
= input_len
- 3 - salt_len
- 1;
14560 int tmp_len
= base64_decode (itoa64_to_int
, hash_pos
, hash_len
, tmp_buf
);
14562 if (tmp_len
!= 32) return (PARSER_HASH_LENGTH
);
14564 memcpy (digest
, tmp_buf
, 32);
14567 salt
->scrypt_N
= 16384;
14568 salt
->scrypt_r
= 1;
14569 salt
->scrypt_p
= 1;
14570 salt
->salt_iter
= 1;
14572 return (PARSER_OK
);
14575 int office2007_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
14577 if ((input_len
< DISPLAY_LEN_MIN_9400
) || (input_len
> DISPLAY_LEN_MAX_9400
)) return (PARSER_GLOBAL_LENGTH
);
14579 if (memcmp (SIGNATURE_OFFICE2007
, input_buf
, 8)) return (PARSER_SIGNATURE_UNMATCHED
);
14581 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
14583 salt_t
*salt
= hash_buf
->salt
;
14585 office2007_t
*office2007
= (office2007_t
*) hash_buf
->esalt
;
14591 char *version_pos
= input_buf
+ 8 + 1;
14593 char *verifierHashSize_pos
= strchr (version_pos
, '*');
14595 if (verifierHashSize_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
14597 uint32_t version_len
= verifierHashSize_pos
- version_pos
;
14599 if (version_len
!= 4) return (PARSER_SALT_LENGTH
);
14601 verifierHashSize_pos
++;
14603 char *keySize_pos
= strchr (verifierHashSize_pos
, '*');
14605 if (keySize_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
14607 uint32_t verifierHashSize_len
= keySize_pos
- verifierHashSize_pos
;
14609 if (verifierHashSize_len
!= 2) return (PARSER_SALT_LENGTH
);
14613 char *saltSize_pos
= strchr (keySize_pos
, '*');
14615 if (saltSize_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
14617 uint32_t keySize_len
= saltSize_pos
- keySize_pos
;
14619 if (keySize_len
!= 3) return (PARSER_SALT_LENGTH
);
14623 char *osalt_pos
= strchr (saltSize_pos
, '*');
14625 if (osalt_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
14627 uint32_t saltSize_len
= osalt_pos
- saltSize_pos
;
14629 if (saltSize_len
!= 2) return (PARSER_SALT_LENGTH
);
14633 char *encryptedVerifier_pos
= strchr (osalt_pos
, '*');
14635 if (encryptedVerifier_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
14637 uint32_t osalt_len
= encryptedVerifier_pos
- osalt_pos
;
14639 if (osalt_len
!= 32) return (PARSER_SALT_LENGTH
);
14641 encryptedVerifier_pos
++;
14643 char *encryptedVerifierHash_pos
= strchr (encryptedVerifier_pos
, '*');
14645 if (encryptedVerifierHash_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
14647 uint32_t encryptedVerifier_len
= encryptedVerifierHash_pos
- encryptedVerifier_pos
;
14649 if (encryptedVerifier_len
!= 32) return (PARSER_SALT_LENGTH
);
14651 encryptedVerifierHash_pos
++;
14653 uint32_t encryptedVerifierHash_len
= input_len
- 8 - 1 - version_len
- 1 - verifierHashSize_len
- 1 - keySize_len
- 1 - saltSize_len
- 1 - osalt_len
- 1 - encryptedVerifier_len
- 1;
14655 if (encryptedVerifierHash_len
!= 40) return (PARSER_SALT_LENGTH
);
14657 const uint version
= atoi (version_pos
);
14659 if (version
!= 2007) return (PARSER_SALT_VALUE
);
14661 const uint verifierHashSize
= atoi (verifierHashSize_pos
);
14663 if (verifierHashSize
!= 20) return (PARSER_SALT_VALUE
);
14665 const uint keySize
= atoi (keySize_pos
);
14667 if ((keySize
!= 128) && (keySize
!= 256)) return (PARSER_SALT_VALUE
);
14669 office2007
->keySize
= keySize
;
14671 const uint saltSize
= atoi (saltSize_pos
);
14673 if (saltSize
!= 16) return (PARSER_SALT_VALUE
);
14679 salt
->salt_len
= 16;
14680 salt
->salt_iter
= ROUNDS_OFFICE2007
;
14682 salt
->salt_buf
[0] = hex_to_uint (&osalt_pos
[ 0]);
14683 salt
->salt_buf
[1] = hex_to_uint (&osalt_pos
[ 8]);
14684 salt
->salt_buf
[2] = hex_to_uint (&osalt_pos
[16]);
14685 salt
->salt_buf
[3] = hex_to_uint (&osalt_pos
[24]);
14691 office2007
->encryptedVerifier
[0] = hex_to_uint (&encryptedVerifier_pos
[ 0]);
14692 office2007
->encryptedVerifier
[1] = hex_to_uint (&encryptedVerifier_pos
[ 8]);
14693 office2007
->encryptedVerifier
[2] = hex_to_uint (&encryptedVerifier_pos
[16]);
14694 office2007
->encryptedVerifier
[3] = hex_to_uint (&encryptedVerifier_pos
[24]);
14696 office2007
->encryptedVerifierHash
[0] = hex_to_uint (&encryptedVerifierHash_pos
[ 0]);
14697 office2007
->encryptedVerifierHash
[1] = hex_to_uint (&encryptedVerifierHash_pos
[ 8]);
14698 office2007
->encryptedVerifierHash
[2] = hex_to_uint (&encryptedVerifierHash_pos
[16]);
14699 office2007
->encryptedVerifierHash
[3] = hex_to_uint (&encryptedVerifierHash_pos
[24]);
14700 office2007
->encryptedVerifierHash
[4] = hex_to_uint (&encryptedVerifierHash_pos
[32]);
14706 digest
[0] = office2007
->encryptedVerifierHash
[0];
14707 digest
[1] = office2007
->encryptedVerifierHash
[1];
14708 digest
[2] = office2007
->encryptedVerifierHash
[2];
14709 digest
[3] = office2007
->encryptedVerifierHash
[3];
14711 return (PARSER_OK
);
14714 int office2010_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
14716 if ((input_len
< DISPLAY_LEN_MIN_9500
) || (input_len
> DISPLAY_LEN_MAX_9500
)) return (PARSER_GLOBAL_LENGTH
);
14718 if (memcmp (SIGNATURE_OFFICE2010
, input_buf
, 8)) return (PARSER_SIGNATURE_UNMATCHED
);
14720 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
14722 salt_t
*salt
= hash_buf
->salt
;
14724 office2010_t
*office2010
= (office2010_t
*) hash_buf
->esalt
;
14730 char *version_pos
= input_buf
+ 8 + 1;
14732 char *spinCount_pos
= strchr (version_pos
, '*');
14734 if (spinCount_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
14736 uint32_t version_len
= spinCount_pos
- version_pos
;
14738 if (version_len
!= 4) return (PARSER_SALT_LENGTH
);
14742 char *keySize_pos
= strchr (spinCount_pos
, '*');
14744 if (keySize_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
14746 uint32_t spinCount_len
= keySize_pos
- spinCount_pos
;
14748 if (spinCount_len
!= 6) return (PARSER_SALT_LENGTH
);
14752 char *saltSize_pos
= strchr (keySize_pos
, '*');
14754 if (saltSize_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
14756 uint32_t keySize_len
= saltSize_pos
- keySize_pos
;
14758 if (keySize_len
!= 3) return (PARSER_SALT_LENGTH
);
14762 char *osalt_pos
= strchr (saltSize_pos
, '*');
14764 if (osalt_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
14766 uint32_t saltSize_len
= osalt_pos
- saltSize_pos
;
14768 if (saltSize_len
!= 2) return (PARSER_SALT_LENGTH
);
14772 char *encryptedVerifier_pos
= strchr (osalt_pos
, '*');
14774 if (encryptedVerifier_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
14776 uint32_t osalt_len
= encryptedVerifier_pos
- osalt_pos
;
14778 if (osalt_len
!= 32) return (PARSER_SALT_LENGTH
);
14780 encryptedVerifier_pos
++;
14782 char *encryptedVerifierHash_pos
= strchr (encryptedVerifier_pos
, '*');
14784 if (encryptedVerifierHash_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
14786 uint32_t encryptedVerifier_len
= encryptedVerifierHash_pos
- encryptedVerifier_pos
;
14788 if (encryptedVerifier_len
!= 32) return (PARSER_SALT_LENGTH
);
14790 encryptedVerifierHash_pos
++;
14792 uint32_t encryptedVerifierHash_len
= input_len
- 8 - 1 - version_len
- 1 - spinCount_len
- 1 - keySize_len
- 1 - saltSize_len
- 1 - osalt_len
- 1 - encryptedVerifier_len
- 1;
14794 if (encryptedVerifierHash_len
!= 64) return (PARSER_SALT_LENGTH
);
14796 const uint version
= atoi (version_pos
);
14798 if (version
!= 2010) return (PARSER_SALT_VALUE
);
14800 const uint spinCount
= atoi (spinCount_pos
);
14802 if (spinCount
!= 100000) return (PARSER_SALT_VALUE
);
14804 const uint keySize
= atoi (keySize_pos
);
14806 if (keySize
!= 128) return (PARSER_SALT_VALUE
);
14808 const uint saltSize
= atoi (saltSize_pos
);
14810 if (saltSize
!= 16) return (PARSER_SALT_VALUE
);
14816 salt
->salt_len
= 16;
14817 salt
->salt_iter
= spinCount
;
14819 salt
->salt_buf
[0] = hex_to_uint (&osalt_pos
[ 0]);
14820 salt
->salt_buf
[1] = hex_to_uint (&osalt_pos
[ 8]);
14821 salt
->salt_buf
[2] = hex_to_uint (&osalt_pos
[16]);
14822 salt
->salt_buf
[3] = hex_to_uint (&osalt_pos
[24]);
14828 office2010
->encryptedVerifier
[0] = hex_to_uint (&encryptedVerifier_pos
[ 0]);
14829 office2010
->encryptedVerifier
[1] = hex_to_uint (&encryptedVerifier_pos
[ 8]);
14830 office2010
->encryptedVerifier
[2] = hex_to_uint (&encryptedVerifier_pos
[16]);
14831 office2010
->encryptedVerifier
[3] = hex_to_uint (&encryptedVerifier_pos
[24]);
14833 office2010
->encryptedVerifierHash
[0] = hex_to_uint (&encryptedVerifierHash_pos
[ 0]);
14834 office2010
->encryptedVerifierHash
[1] = hex_to_uint (&encryptedVerifierHash_pos
[ 8]);
14835 office2010
->encryptedVerifierHash
[2] = hex_to_uint (&encryptedVerifierHash_pos
[16]);
14836 office2010
->encryptedVerifierHash
[3] = hex_to_uint (&encryptedVerifierHash_pos
[24]);
14837 office2010
->encryptedVerifierHash
[4] = hex_to_uint (&encryptedVerifierHash_pos
[32]);
14838 office2010
->encryptedVerifierHash
[5] = hex_to_uint (&encryptedVerifierHash_pos
[40]);
14839 office2010
->encryptedVerifierHash
[6] = hex_to_uint (&encryptedVerifierHash_pos
[48]);
14840 office2010
->encryptedVerifierHash
[7] = hex_to_uint (&encryptedVerifierHash_pos
[56]);
14846 digest
[0] = office2010
->encryptedVerifierHash
[0];
14847 digest
[1] = office2010
->encryptedVerifierHash
[1];
14848 digest
[2] = office2010
->encryptedVerifierHash
[2];
14849 digest
[3] = office2010
->encryptedVerifierHash
[3];
14851 return (PARSER_OK
);
14854 int office2013_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
14856 if ((input_len
< DISPLAY_LEN_MIN_9600
) || (input_len
> DISPLAY_LEN_MAX_9600
)) return (PARSER_GLOBAL_LENGTH
);
14858 if (memcmp (SIGNATURE_OFFICE2013
, input_buf
, 8)) return (PARSER_SIGNATURE_UNMATCHED
);
14860 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
14862 salt_t
*salt
= hash_buf
->salt
;
14864 office2013_t
*office2013
= (office2013_t
*) hash_buf
->esalt
;
14870 char *version_pos
= input_buf
+ 8 + 1;
14872 char *spinCount_pos
= strchr (version_pos
, '*');
14874 if (spinCount_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
14876 uint32_t version_len
= spinCount_pos
- version_pos
;
14878 if (version_len
!= 4) return (PARSER_SALT_LENGTH
);
14882 char *keySize_pos
= strchr (spinCount_pos
, '*');
14884 if (keySize_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
14886 uint32_t spinCount_len
= keySize_pos
- spinCount_pos
;
14888 if (spinCount_len
!= 6) return (PARSER_SALT_LENGTH
);
14892 char *saltSize_pos
= strchr (keySize_pos
, '*');
14894 if (saltSize_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
14896 uint32_t keySize_len
= saltSize_pos
- keySize_pos
;
14898 if (keySize_len
!= 3) return (PARSER_SALT_LENGTH
);
14902 char *osalt_pos
= strchr (saltSize_pos
, '*');
14904 if (osalt_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
14906 uint32_t saltSize_len
= osalt_pos
- saltSize_pos
;
14908 if (saltSize_len
!= 2) return (PARSER_SALT_LENGTH
);
14912 char *encryptedVerifier_pos
= strchr (osalt_pos
, '*');
14914 if (encryptedVerifier_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
14916 uint32_t osalt_len
= encryptedVerifier_pos
- osalt_pos
;
14918 if (osalt_len
!= 32) return (PARSER_SALT_LENGTH
);
14920 encryptedVerifier_pos
++;
14922 char *encryptedVerifierHash_pos
= strchr (encryptedVerifier_pos
, '*');
14924 if (encryptedVerifierHash_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
14926 uint32_t encryptedVerifier_len
= encryptedVerifierHash_pos
- encryptedVerifier_pos
;
14928 if (encryptedVerifier_len
!= 32) return (PARSER_SALT_LENGTH
);
14930 encryptedVerifierHash_pos
++;
14932 uint32_t encryptedVerifierHash_len
= input_len
- 8 - 1 - version_len
- 1 - spinCount_len
- 1 - keySize_len
- 1 - saltSize_len
- 1 - osalt_len
- 1 - encryptedVerifier_len
- 1;
14934 if (encryptedVerifierHash_len
!= 64) return (PARSER_SALT_LENGTH
);
14936 const uint version
= atoi (version_pos
);
14938 if (version
!= 2013) return (PARSER_SALT_VALUE
);
14940 const uint spinCount
= atoi (spinCount_pos
);
14942 if (spinCount
!= 100000) return (PARSER_SALT_VALUE
);
14944 const uint keySize
= atoi (keySize_pos
);
14946 if (keySize
!= 256) return (PARSER_SALT_VALUE
);
14948 const uint saltSize
= atoi (saltSize_pos
);
14950 if (saltSize
!= 16) return (PARSER_SALT_VALUE
);
14956 salt
->salt_len
= 16;
14957 salt
->salt_iter
= spinCount
;
14959 salt
->salt_buf
[0] = hex_to_uint (&osalt_pos
[ 0]);
14960 salt
->salt_buf
[1] = hex_to_uint (&osalt_pos
[ 8]);
14961 salt
->salt_buf
[2] = hex_to_uint (&osalt_pos
[16]);
14962 salt
->salt_buf
[3] = hex_to_uint (&osalt_pos
[24]);
14968 office2013
->encryptedVerifier
[0] = hex_to_uint (&encryptedVerifier_pos
[ 0]);
14969 office2013
->encryptedVerifier
[1] = hex_to_uint (&encryptedVerifier_pos
[ 8]);
14970 office2013
->encryptedVerifier
[2] = hex_to_uint (&encryptedVerifier_pos
[16]);
14971 office2013
->encryptedVerifier
[3] = hex_to_uint (&encryptedVerifier_pos
[24]);
14973 office2013
->encryptedVerifierHash
[0] = hex_to_uint (&encryptedVerifierHash_pos
[ 0]);
14974 office2013
->encryptedVerifierHash
[1] = hex_to_uint (&encryptedVerifierHash_pos
[ 8]);
14975 office2013
->encryptedVerifierHash
[2] = hex_to_uint (&encryptedVerifierHash_pos
[16]);
14976 office2013
->encryptedVerifierHash
[3] = hex_to_uint (&encryptedVerifierHash_pos
[24]);
14977 office2013
->encryptedVerifierHash
[4] = hex_to_uint (&encryptedVerifierHash_pos
[32]);
14978 office2013
->encryptedVerifierHash
[5] = hex_to_uint (&encryptedVerifierHash_pos
[40]);
14979 office2013
->encryptedVerifierHash
[6] = hex_to_uint (&encryptedVerifierHash_pos
[48]);
14980 office2013
->encryptedVerifierHash
[7] = hex_to_uint (&encryptedVerifierHash_pos
[56]);
14986 digest
[0] = office2013
->encryptedVerifierHash
[0];
14987 digest
[1] = office2013
->encryptedVerifierHash
[1];
14988 digest
[2] = office2013
->encryptedVerifierHash
[2];
14989 digest
[3] = office2013
->encryptedVerifierHash
[3];
14991 return (PARSER_OK
);
14994 int oldoffice01_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
14996 if ((input_len
< DISPLAY_LEN_MIN_9700
) || (input_len
> DISPLAY_LEN_MAX_9700
)) return (PARSER_GLOBAL_LENGTH
);
14998 if ((memcmp (SIGNATURE_OLDOFFICE0
, input_buf
, 12)) && (memcmp (SIGNATURE_OLDOFFICE1
, input_buf
, 12))) return (PARSER_SIGNATURE_UNMATCHED
);
15000 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
15002 salt_t
*salt
= hash_buf
->salt
;
15004 oldoffice01_t
*oldoffice01
= (oldoffice01_t
*) hash_buf
->esalt
;
15010 char *version_pos
= input_buf
+ 11;
15012 char *osalt_pos
= strchr (version_pos
, '*');
15014 if (osalt_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
15016 uint32_t version_len
= osalt_pos
- version_pos
;
15018 if (version_len
!= 1) return (PARSER_SALT_LENGTH
);
15022 char *encryptedVerifier_pos
= strchr (osalt_pos
, '*');
15024 if (encryptedVerifier_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
15026 uint32_t osalt_len
= encryptedVerifier_pos
- osalt_pos
;
15028 if (osalt_len
!= 32) return (PARSER_SALT_LENGTH
);
15030 encryptedVerifier_pos
++;
15032 char *encryptedVerifierHash_pos
= strchr (encryptedVerifier_pos
, '*');
15034 if (encryptedVerifierHash_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
15036 uint32_t encryptedVerifier_len
= encryptedVerifierHash_pos
- encryptedVerifier_pos
;
15038 if (encryptedVerifier_len
!= 32) return (PARSER_SALT_LENGTH
);
15040 encryptedVerifierHash_pos
++;
15042 uint32_t encryptedVerifierHash_len
= input_len
- 11 - version_len
- 1 - osalt_len
- 1 - encryptedVerifier_len
- 1;
15044 if (encryptedVerifierHash_len
!= 32) return (PARSER_SALT_LENGTH
);
15046 const uint version
= *version_pos
- 0x30;
15048 if (version
!= 0 && version
!= 1) return (PARSER_SALT_VALUE
);
15054 oldoffice01
->version
= version
;
15056 oldoffice01
->encryptedVerifier
[0] = hex_to_uint (&encryptedVerifier_pos
[ 0]);
15057 oldoffice01
->encryptedVerifier
[1] = hex_to_uint (&encryptedVerifier_pos
[ 8]);
15058 oldoffice01
->encryptedVerifier
[2] = hex_to_uint (&encryptedVerifier_pos
[16]);
15059 oldoffice01
->encryptedVerifier
[3] = hex_to_uint (&encryptedVerifier_pos
[24]);
15061 oldoffice01
->encryptedVerifier
[0] = byte_swap_32 (oldoffice01
->encryptedVerifier
[0]);
15062 oldoffice01
->encryptedVerifier
[1] = byte_swap_32 (oldoffice01
->encryptedVerifier
[1]);
15063 oldoffice01
->encryptedVerifier
[2] = byte_swap_32 (oldoffice01
->encryptedVerifier
[2]);
15064 oldoffice01
->encryptedVerifier
[3] = byte_swap_32 (oldoffice01
->encryptedVerifier
[3]);
15066 oldoffice01
->encryptedVerifierHash
[0] = hex_to_uint (&encryptedVerifierHash_pos
[ 0]);
15067 oldoffice01
->encryptedVerifierHash
[1] = hex_to_uint (&encryptedVerifierHash_pos
[ 8]);
15068 oldoffice01
->encryptedVerifierHash
[2] = hex_to_uint (&encryptedVerifierHash_pos
[16]);
15069 oldoffice01
->encryptedVerifierHash
[3] = hex_to_uint (&encryptedVerifierHash_pos
[24]);
15071 oldoffice01
->encryptedVerifierHash
[0] = byte_swap_32 (oldoffice01
->encryptedVerifierHash
[0]);
15072 oldoffice01
->encryptedVerifierHash
[1] = byte_swap_32 (oldoffice01
->encryptedVerifierHash
[1]);
15073 oldoffice01
->encryptedVerifierHash
[2] = byte_swap_32 (oldoffice01
->encryptedVerifierHash
[2]);
15074 oldoffice01
->encryptedVerifierHash
[3] = byte_swap_32 (oldoffice01
->encryptedVerifierHash
[3]);
15080 salt
->salt_len
= 16;
15082 salt
->salt_buf
[0] = hex_to_uint (&osalt_pos
[ 0]);
15083 salt
->salt_buf
[1] = hex_to_uint (&osalt_pos
[ 8]);
15084 salt
->salt_buf
[2] = hex_to_uint (&osalt_pos
[16]);
15085 salt
->salt_buf
[3] = hex_to_uint (&osalt_pos
[24]);
15087 salt
->salt_buf
[0] = byte_swap_32 (salt
->salt_buf
[0]);
15088 salt
->salt_buf
[1] = byte_swap_32 (salt
->salt_buf
[1]);
15089 salt
->salt_buf
[2] = byte_swap_32 (salt
->salt_buf
[2]);
15090 salt
->salt_buf
[3] = byte_swap_32 (salt
->salt_buf
[3]);
15092 // this is a workaround as office produces multiple documents with the same salt
15094 salt
->salt_len
+= 32;
15096 salt
->salt_buf
[ 4] = oldoffice01
->encryptedVerifier
[0];
15097 salt
->salt_buf
[ 5] = oldoffice01
->encryptedVerifier
[1];
15098 salt
->salt_buf
[ 6] = oldoffice01
->encryptedVerifier
[2];
15099 salt
->salt_buf
[ 7] = oldoffice01
->encryptedVerifier
[3];
15100 salt
->salt_buf
[ 8] = oldoffice01
->encryptedVerifierHash
[0];
15101 salt
->salt_buf
[ 9] = oldoffice01
->encryptedVerifierHash
[1];
15102 salt
->salt_buf
[10] = oldoffice01
->encryptedVerifierHash
[2];
15103 salt
->salt_buf
[11] = oldoffice01
->encryptedVerifierHash
[3];
15109 digest
[0] = oldoffice01
->encryptedVerifierHash
[0];
15110 digest
[1] = oldoffice01
->encryptedVerifierHash
[1];
15111 digest
[2] = oldoffice01
->encryptedVerifierHash
[2];
15112 digest
[3] = oldoffice01
->encryptedVerifierHash
[3];
15114 return (PARSER_OK
);
15117 int oldoffice01cm1_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
15119 return oldoffice01_parse_hash (input_buf
, input_len
, hash_buf
);
15122 int oldoffice01cm2_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
15124 if ((input_len
< DISPLAY_LEN_MIN_9720
) || (input_len
> DISPLAY_LEN_MAX_9720
)) return (PARSER_GLOBAL_LENGTH
);
15126 if ((memcmp (SIGNATURE_OLDOFFICE0
, input_buf
, 12)) && (memcmp (SIGNATURE_OLDOFFICE1
, input_buf
, 12))) return (PARSER_SIGNATURE_UNMATCHED
);
15128 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
15130 salt_t
*salt
= hash_buf
->salt
;
15132 oldoffice01_t
*oldoffice01
= (oldoffice01_t
*) hash_buf
->esalt
;
15138 char *version_pos
= input_buf
+ 11;
15140 char *osalt_pos
= strchr (version_pos
, '*');
15142 if (osalt_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
15144 uint32_t version_len
= osalt_pos
- version_pos
;
15146 if (version_len
!= 1) return (PARSER_SALT_LENGTH
);
15150 char *encryptedVerifier_pos
= strchr (osalt_pos
, '*');
15152 if (encryptedVerifier_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
15154 uint32_t osalt_len
= encryptedVerifier_pos
- osalt_pos
;
15156 if (osalt_len
!= 32) return (PARSER_SALT_LENGTH
);
15158 encryptedVerifier_pos
++;
15160 char *encryptedVerifierHash_pos
= strchr (encryptedVerifier_pos
, '*');
15162 if (encryptedVerifierHash_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
15164 uint32_t encryptedVerifier_len
= encryptedVerifierHash_pos
- encryptedVerifier_pos
;
15166 if (encryptedVerifier_len
!= 32) return (PARSER_SALT_LENGTH
);
15168 encryptedVerifierHash_pos
++;
15170 char *rc4key_pos
= strchr (encryptedVerifierHash_pos
, ':');
15172 if (rc4key_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
15174 uint32_t encryptedVerifierHash_len
= rc4key_pos
- encryptedVerifierHash_pos
;
15176 if (encryptedVerifierHash_len
!= 32) return (PARSER_SALT_LENGTH
);
15180 uint32_t rc4key_len
= input_len
- 11 - version_len
- 1 - osalt_len
- 1 - encryptedVerifier_len
- 1 - encryptedVerifierHash_len
- 1;
15182 if (rc4key_len
!= 10) return (PARSER_SALT_LENGTH
);
15184 const uint version
= *version_pos
- 0x30;
15186 if (version
!= 0 && version
!= 1) return (PARSER_SALT_VALUE
);
15192 oldoffice01
->version
= version
;
15194 oldoffice01
->encryptedVerifier
[0] = hex_to_uint (&encryptedVerifier_pos
[ 0]);
15195 oldoffice01
->encryptedVerifier
[1] = hex_to_uint (&encryptedVerifier_pos
[ 8]);
15196 oldoffice01
->encryptedVerifier
[2] = hex_to_uint (&encryptedVerifier_pos
[16]);
15197 oldoffice01
->encryptedVerifier
[3] = hex_to_uint (&encryptedVerifier_pos
[24]);
15199 oldoffice01
->encryptedVerifier
[0] = byte_swap_32 (oldoffice01
->encryptedVerifier
[0]);
15200 oldoffice01
->encryptedVerifier
[1] = byte_swap_32 (oldoffice01
->encryptedVerifier
[1]);
15201 oldoffice01
->encryptedVerifier
[2] = byte_swap_32 (oldoffice01
->encryptedVerifier
[2]);
15202 oldoffice01
->encryptedVerifier
[3] = byte_swap_32 (oldoffice01
->encryptedVerifier
[3]);
15204 oldoffice01
->encryptedVerifierHash
[0] = hex_to_uint (&encryptedVerifierHash_pos
[ 0]);
15205 oldoffice01
->encryptedVerifierHash
[1] = hex_to_uint (&encryptedVerifierHash_pos
[ 8]);
15206 oldoffice01
->encryptedVerifierHash
[2] = hex_to_uint (&encryptedVerifierHash_pos
[16]);
15207 oldoffice01
->encryptedVerifierHash
[3] = hex_to_uint (&encryptedVerifierHash_pos
[24]);
15209 oldoffice01
->encryptedVerifierHash
[0] = byte_swap_32 (oldoffice01
->encryptedVerifierHash
[0]);
15210 oldoffice01
->encryptedVerifierHash
[1] = byte_swap_32 (oldoffice01
->encryptedVerifierHash
[1]);
15211 oldoffice01
->encryptedVerifierHash
[2] = byte_swap_32 (oldoffice01
->encryptedVerifierHash
[2]);
15212 oldoffice01
->encryptedVerifierHash
[3] = byte_swap_32 (oldoffice01
->encryptedVerifierHash
[3]);
15214 oldoffice01
->rc4key
[1] = 0;
15215 oldoffice01
->rc4key
[0] = 0;
15217 oldoffice01
->rc4key
[0] |= hex_convert (rc4key_pos
[0]) << 28;
15218 oldoffice01
->rc4key
[0] |= hex_convert (rc4key_pos
[1]) << 24;
15219 oldoffice01
->rc4key
[0] |= hex_convert (rc4key_pos
[2]) << 20;
15220 oldoffice01
->rc4key
[0] |= hex_convert (rc4key_pos
[3]) << 16;
15221 oldoffice01
->rc4key
[0] |= hex_convert (rc4key_pos
[4]) << 12;
15222 oldoffice01
->rc4key
[0] |= hex_convert (rc4key_pos
[5]) << 8;
15223 oldoffice01
->rc4key
[0] |= hex_convert (rc4key_pos
[6]) << 4;
15224 oldoffice01
->rc4key
[0] |= hex_convert (rc4key_pos
[7]) << 0;
15225 oldoffice01
->rc4key
[1] |= hex_convert (rc4key_pos
[8]) << 28;
15226 oldoffice01
->rc4key
[1] |= hex_convert (rc4key_pos
[9]) << 24;
15228 oldoffice01
->rc4key
[0] = byte_swap_32 (oldoffice01
->rc4key
[0]);
15229 oldoffice01
->rc4key
[1] = byte_swap_32 (oldoffice01
->rc4key
[1]);
15235 salt
->salt_len
= 16;
15237 salt
->salt_buf
[0] = hex_to_uint (&osalt_pos
[ 0]);
15238 salt
->salt_buf
[1] = hex_to_uint (&osalt_pos
[ 8]);
15239 salt
->salt_buf
[2] = hex_to_uint (&osalt_pos
[16]);
15240 salt
->salt_buf
[3] = hex_to_uint (&osalt_pos
[24]);
15242 salt
->salt_buf
[0] = byte_swap_32 (salt
->salt_buf
[0]);
15243 salt
->salt_buf
[1] = byte_swap_32 (salt
->salt_buf
[1]);
15244 salt
->salt_buf
[2] = byte_swap_32 (salt
->salt_buf
[2]);
15245 salt
->salt_buf
[3] = byte_swap_32 (salt
->salt_buf
[3]);
15247 // this is a workaround as office produces multiple documents with the same salt
15249 salt
->salt_len
+= 32;
15251 salt
->salt_buf
[ 4] = oldoffice01
->encryptedVerifier
[0];
15252 salt
->salt_buf
[ 5] = oldoffice01
->encryptedVerifier
[1];
15253 salt
->salt_buf
[ 6] = oldoffice01
->encryptedVerifier
[2];
15254 salt
->salt_buf
[ 7] = oldoffice01
->encryptedVerifier
[3];
15255 salt
->salt_buf
[ 8] = oldoffice01
->encryptedVerifierHash
[0];
15256 salt
->salt_buf
[ 9] = oldoffice01
->encryptedVerifierHash
[1];
15257 salt
->salt_buf
[10] = oldoffice01
->encryptedVerifierHash
[2];
15258 salt
->salt_buf
[11] = oldoffice01
->encryptedVerifierHash
[3];
15264 digest
[0] = oldoffice01
->rc4key
[0];
15265 digest
[1] = oldoffice01
->rc4key
[1];
15269 return (PARSER_OK
);
15272 int oldoffice34_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
15274 if ((input_len
< DISPLAY_LEN_MIN_9800
) || (input_len
> DISPLAY_LEN_MAX_9800
)) return (PARSER_GLOBAL_LENGTH
);
15276 if ((memcmp (SIGNATURE_OLDOFFICE3
, input_buf
, 12)) && (memcmp (SIGNATURE_OLDOFFICE4
, input_buf
, 12))) return (PARSER_SIGNATURE_UNMATCHED
);
15278 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
15280 salt_t
*salt
= hash_buf
->salt
;
15282 oldoffice34_t
*oldoffice34
= (oldoffice34_t
*) hash_buf
->esalt
;
15288 char *version_pos
= input_buf
+ 11;
15290 char *osalt_pos
= strchr (version_pos
, '*');
15292 if (osalt_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
15294 uint32_t version_len
= osalt_pos
- version_pos
;
15296 if (version_len
!= 1) return (PARSER_SALT_LENGTH
);
15300 char *encryptedVerifier_pos
= strchr (osalt_pos
, '*');
15302 if (encryptedVerifier_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
15304 uint32_t osalt_len
= encryptedVerifier_pos
- osalt_pos
;
15306 if (osalt_len
!= 32) return (PARSER_SALT_LENGTH
);
15308 encryptedVerifier_pos
++;
15310 char *encryptedVerifierHash_pos
= strchr (encryptedVerifier_pos
, '*');
15312 if (encryptedVerifierHash_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
15314 uint32_t encryptedVerifier_len
= encryptedVerifierHash_pos
- encryptedVerifier_pos
;
15316 if (encryptedVerifier_len
!= 32) return (PARSER_SALT_LENGTH
);
15318 encryptedVerifierHash_pos
++;
15320 uint32_t encryptedVerifierHash_len
= input_len
- 11 - version_len
- 1 - osalt_len
- 1 - encryptedVerifier_len
- 1;
15322 if (encryptedVerifierHash_len
!= 40) return (PARSER_SALT_LENGTH
);
15324 const uint version
= *version_pos
- 0x30;
15326 if (version
!= 3 && version
!= 4) return (PARSER_SALT_VALUE
);
15332 oldoffice34
->version
= version
;
15334 oldoffice34
->encryptedVerifier
[0] = hex_to_uint (&encryptedVerifier_pos
[ 0]);
15335 oldoffice34
->encryptedVerifier
[1] = hex_to_uint (&encryptedVerifier_pos
[ 8]);
15336 oldoffice34
->encryptedVerifier
[2] = hex_to_uint (&encryptedVerifier_pos
[16]);
15337 oldoffice34
->encryptedVerifier
[3] = hex_to_uint (&encryptedVerifier_pos
[24]);
15339 oldoffice34
->encryptedVerifier
[0] = byte_swap_32 (oldoffice34
->encryptedVerifier
[0]);
15340 oldoffice34
->encryptedVerifier
[1] = byte_swap_32 (oldoffice34
->encryptedVerifier
[1]);
15341 oldoffice34
->encryptedVerifier
[2] = byte_swap_32 (oldoffice34
->encryptedVerifier
[2]);
15342 oldoffice34
->encryptedVerifier
[3] = byte_swap_32 (oldoffice34
->encryptedVerifier
[3]);
15344 oldoffice34
->encryptedVerifierHash
[0] = hex_to_uint (&encryptedVerifierHash_pos
[ 0]);
15345 oldoffice34
->encryptedVerifierHash
[1] = hex_to_uint (&encryptedVerifierHash_pos
[ 8]);
15346 oldoffice34
->encryptedVerifierHash
[2] = hex_to_uint (&encryptedVerifierHash_pos
[16]);
15347 oldoffice34
->encryptedVerifierHash
[3] = hex_to_uint (&encryptedVerifierHash_pos
[24]);
15348 oldoffice34
->encryptedVerifierHash
[4] = hex_to_uint (&encryptedVerifierHash_pos
[32]);
15350 oldoffice34
->encryptedVerifierHash
[0] = byte_swap_32 (oldoffice34
->encryptedVerifierHash
[0]);
15351 oldoffice34
->encryptedVerifierHash
[1] = byte_swap_32 (oldoffice34
->encryptedVerifierHash
[1]);
15352 oldoffice34
->encryptedVerifierHash
[2] = byte_swap_32 (oldoffice34
->encryptedVerifierHash
[2]);
15353 oldoffice34
->encryptedVerifierHash
[3] = byte_swap_32 (oldoffice34
->encryptedVerifierHash
[3]);
15354 oldoffice34
->encryptedVerifierHash
[4] = byte_swap_32 (oldoffice34
->encryptedVerifierHash
[4]);
15360 salt
->salt_len
= 16;
15362 salt
->salt_buf
[0] = hex_to_uint (&osalt_pos
[ 0]);
15363 salt
->salt_buf
[1] = hex_to_uint (&osalt_pos
[ 8]);
15364 salt
->salt_buf
[2] = hex_to_uint (&osalt_pos
[16]);
15365 salt
->salt_buf
[3] = hex_to_uint (&osalt_pos
[24]);
15367 // this is a workaround as office produces multiple documents with the same salt
15369 salt
->salt_len
+= 32;
15371 salt
->salt_buf
[ 4] = oldoffice34
->encryptedVerifier
[0];
15372 salt
->salt_buf
[ 5] = oldoffice34
->encryptedVerifier
[1];
15373 salt
->salt_buf
[ 6] = oldoffice34
->encryptedVerifier
[2];
15374 salt
->salt_buf
[ 7] = oldoffice34
->encryptedVerifier
[3];
15375 salt
->salt_buf
[ 8] = oldoffice34
->encryptedVerifierHash
[0];
15376 salt
->salt_buf
[ 9] = oldoffice34
->encryptedVerifierHash
[1];
15377 salt
->salt_buf
[10] = oldoffice34
->encryptedVerifierHash
[2];
15378 salt
->salt_buf
[11] = oldoffice34
->encryptedVerifierHash
[3];
15384 digest
[0] = oldoffice34
->encryptedVerifierHash
[0];
15385 digest
[1] = oldoffice34
->encryptedVerifierHash
[1];
15386 digest
[2] = oldoffice34
->encryptedVerifierHash
[2];
15387 digest
[3] = oldoffice34
->encryptedVerifierHash
[3];
15389 return (PARSER_OK
);
15392 int oldoffice34cm1_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
15394 if (memcmp (SIGNATURE_OLDOFFICE3
, input_buf
, 12)) return (PARSER_SIGNATURE_UNMATCHED
);
15396 return oldoffice34_parse_hash (input_buf
, input_len
, hash_buf
);
15399 int oldoffice34cm2_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
15401 if ((input_len
< DISPLAY_LEN_MIN_9820
) || (input_len
> DISPLAY_LEN_MAX_9820
)) return (PARSER_GLOBAL_LENGTH
);
15403 if (memcmp (SIGNATURE_OLDOFFICE3
, input_buf
, 12)) return (PARSER_SIGNATURE_UNMATCHED
);
15405 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
15407 salt_t
*salt
= hash_buf
->salt
;
15409 oldoffice34_t
*oldoffice34
= (oldoffice34_t
*) hash_buf
->esalt
;
15415 char *version_pos
= input_buf
+ 11;
15417 char *osalt_pos
= strchr (version_pos
, '*');
15419 if (osalt_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
15421 uint32_t version_len
= osalt_pos
- version_pos
;
15423 if (version_len
!= 1) return (PARSER_SALT_LENGTH
);
15427 char *encryptedVerifier_pos
= strchr (osalt_pos
, '*');
15429 if (encryptedVerifier_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
15431 uint32_t osalt_len
= encryptedVerifier_pos
- osalt_pos
;
15433 if (osalt_len
!= 32) return (PARSER_SALT_LENGTH
);
15435 encryptedVerifier_pos
++;
15437 char *encryptedVerifierHash_pos
= strchr (encryptedVerifier_pos
, '*');
15439 if (encryptedVerifierHash_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
15441 uint32_t encryptedVerifier_len
= encryptedVerifierHash_pos
- encryptedVerifier_pos
;
15443 if (encryptedVerifier_len
!= 32) return (PARSER_SALT_LENGTH
);
15445 encryptedVerifierHash_pos
++;
15447 char *rc4key_pos
= strchr (encryptedVerifierHash_pos
, ':');
15449 if (rc4key_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
15451 uint32_t encryptedVerifierHash_len
= rc4key_pos
- encryptedVerifierHash_pos
;
15453 if (encryptedVerifierHash_len
!= 40) return (PARSER_SALT_LENGTH
);
15457 uint32_t rc4key_len
= input_len
- 11 - version_len
- 1 - osalt_len
- 1 - encryptedVerifier_len
- 1 - encryptedVerifierHash_len
- 1;
15459 if (rc4key_len
!= 10) return (PARSER_SALT_LENGTH
);
15461 const uint version
= *version_pos
- 0x30;
15463 if (version
!= 3 && version
!= 4) return (PARSER_SALT_VALUE
);
15469 oldoffice34
->version
= version
;
15471 oldoffice34
->encryptedVerifier
[0] = hex_to_uint (&encryptedVerifier_pos
[ 0]);
15472 oldoffice34
->encryptedVerifier
[1] = hex_to_uint (&encryptedVerifier_pos
[ 8]);
15473 oldoffice34
->encryptedVerifier
[2] = hex_to_uint (&encryptedVerifier_pos
[16]);
15474 oldoffice34
->encryptedVerifier
[3] = hex_to_uint (&encryptedVerifier_pos
[24]);
15476 oldoffice34
->encryptedVerifier
[0] = byte_swap_32 (oldoffice34
->encryptedVerifier
[0]);
15477 oldoffice34
->encryptedVerifier
[1] = byte_swap_32 (oldoffice34
->encryptedVerifier
[1]);
15478 oldoffice34
->encryptedVerifier
[2] = byte_swap_32 (oldoffice34
->encryptedVerifier
[2]);
15479 oldoffice34
->encryptedVerifier
[3] = byte_swap_32 (oldoffice34
->encryptedVerifier
[3]);
15481 oldoffice34
->encryptedVerifierHash
[0] = hex_to_uint (&encryptedVerifierHash_pos
[ 0]);
15482 oldoffice34
->encryptedVerifierHash
[1] = hex_to_uint (&encryptedVerifierHash_pos
[ 8]);
15483 oldoffice34
->encryptedVerifierHash
[2] = hex_to_uint (&encryptedVerifierHash_pos
[16]);
15484 oldoffice34
->encryptedVerifierHash
[3] = hex_to_uint (&encryptedVerifierHash_pos
[24]);
15485 oldoffice34
->encryptedVerifierHash
[4] = hex_to_uint (&encryptedVerifierHash_pos
[32]);
15487 oldoffice34
->encryptedVerifierHash
[0] = byte_swap_32 (oldoffice34
->encryptedVerifierHash
[0]);
15488 oldoffice34
->encryptedVerifierHash
[1] = byte_swap_32 (oldoffice34
->encryptedVerifierHash
[1]);
15489 oldoffice34
->encryptedVerifierHash
[2] = byte_swap_32 (oldoffice34
->encryptedVerifierHash
[2]);
15490 oldoffice34
->encryptedVerifierHash
[3] = byte_swap_32 (oldoffice34
->encryptedVerifierHash
[3]);
15491 oldoffice34
->encryptedVerifierHash
[4] = byte_swap_32 (oldoffice34
->encryptedVerifierHash
[4]);
15493 oldoffice34
->rc4key
[1] = 0;
15494 oldoffice34
->rc4key
[0] = 0;
15496 oldoffice34
->rc4key
[0] |= hex_convert (rc4key_pos
[0]) << 28;
15497 oldoffice34
->rc4key
[0] |= hex_convert (rc4key_pos
[1]) << 24;
15498 oldoffice34
->rc4key
[0] |= hex_convert (rc4key_pos
[2]) << 20;
15499 oldoffice34
->rc4key
[0] |= hex_convert (rc4key_pos
[3]) << 16;
15500 oldoffice34
->rc4key
[0] |= hex_convert (rc4key_pos
[4]) << 12;
15501 oldoffice34
->rc4key
[0] |= hex_convert (rc4key_pos
[5]) << 8;
15502 oldoffice34
->rc4key
[0] |= hex_convert (rc4key_pos
[6]) << 4;
15503 oldoffice34
->rc4key
[0] |= hex_convert (rc4key_pos
[7]) << 0;
15504 oldoffice34
->rc4key
[1] |= hex_convert (rc4key_pos
[8]) << 28;
15505 oldoffice34
->rc4key
[1] |= hex_convert (rc4key_pos
[9]) << 24;
15507 oldoffice34
->rc4key
[0] = byte_swap_32 (oldoffice34
->rc4key
[0]);
15508 oldoffice34
->rc4key
[1] = byte_swap_32 (oldoffice34
->rc4key
[1]);
15514 salt
->salt_len
= 16;
15516 salt
->salt_buf
[0] = hex_to_uint (&osalt_pos
[ 0]);
15517 salt
->salt_buf
[1] = hex_to_uint (&osalt_pos
[ 8]);
15518 salt
->salt_buf
[2] = hex_to_uint (&osalt_pos
[16]);
15519 salt
->salt_buf
[3] = hex_to_uint (&osalt_pos
[24]);
15521 // this is a workaround as office produces multiple documents with the same salt
15523 salt
->salt_len
+= 32;
15525 salt
->salt_buf
[ 4] = oldoffice34
->encryptedVerifier
[0];
15526 salt
->salt_buf
[ 5] = oldoffice34
->encryptedVerifier
[1];
15527 salt
->salt_buf
[ 6] = oldoffice34
->encryptedVerifier
[2];
15528 salt
->salt_buf
[ 7] = oldoffice34
->encryptedVerifier
[3];
15529 salt
->salt_buf
[ 8] = oldoffice34
->encryptedVerifierHash
[0];
15530 salt
->salt_buf
[ 9] = oldoffice34
->encryptedVerifierHash
[1];
15531 salt
->salt_buf
[10] = oldoffice34
->encryptedVerifierHash
[2];
15532 salt
->salt_buf
[11] = oldoffice34
->encryptedVerifierHash
[3];
15538 digest
[0] = oldoffice34
->rc4key
[0];
15539 digest
[1] = oldoffice34
->rc4key
[1];
15543 return (PARSER_OK
);
15546 int radmin2_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
15548 if ((input_len
< DISPLAY_LEN_MIN_9900
) || (input_len
> DISPLAY_LEN_MAX_9900
)) return (PARSER_GLOBAL_LENGTH
);
15550 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
15552 digest
[0] = hex_to_uint (&input_buf
[ 0]);
15553 digest
[1] = hex_to_uint (&input_buf
[ 8]);
15554 digest
[2] = hex_to_uint (&input_buf
[16]);
15555 digest
[3] = hex_to_uint (&input_buf
[24]);
15557 digest
[0] = byte_swap_32 (digest
[0]);
15558 digest
[1] = byte_swap_32 (digest
[1]);
15559 digest
[2] = byte_swap_32 (digest
[2]);
15560 digest
[3] = byte_swap_32 (digest
[3]);
15562 return (PARSER_OK
);
15565 int djangosha1_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
15567 if ((input_len
< DISPLAY_LEN_MIN_124
) || (input_len
> DISPLAY_LEN_MAX_124
)) return (PARSER_GLOBAL_LENGTH
);
15569 if ((memcmp (SIGNATURE_DJANGOSHA1
, input_buf
, 5)) && (memcmp (SIGNATURE_DJANGOSHA1
, input_buf
, 5))) return (PARSER_SIGNATURE_UNMATCHED
);
15571 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
15573 salt_t
*salt
= hash_buf
->salt
;
15575 char *signature_pos
= input_buf
;
15577 char *salt_pos
= strchr (signature_pos
, '$');
15579 if (salt_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
15581 uint32_t signature_len
= salt_pos
- signature_pos
;
15583 if (signature_len
!= 4) return (PARSER_SIGNATURE_UNMATCHED
);
15587 char *hash_pos
= strchr (salt_pos
, '$');
15589 if (hash_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
15591 uint32_t salt_len
= hash_pos
- salt_pos
;
15593 if (salt_len
> 32) return (PARSER_SALT_LENGTH
);
15597 uint32_t hash_len
= input_len
- signature_len
- 1 - salt_len
- 1;
15599 if (hash_len
!= 40) return (PARSER_SALT_LENGTH
);
15601 digest
[0] = hex_to_uint (&hash_pos
[ 0]);
15602 digest
[1] = hex_to_uint (&hash_pos
[ 8]);
15603 digest
[2] = hex_to_uint (&hash_pos
[16]);
15604 digest
[3] = hex_to_uint (&hash_pos
[24]);
15605 digest
[4] = hex_to_uint (&hash_pos
[32]);
15607 digest
[0] -= SHA1M_A
;
15608 digest
[1] -= SHA1M_B
;
15609 digest
[2] -= SHA1M_C
;
15610 digest
[3] -= SHA1M_D
;
15611 digest
[4] -= SHA1M_E
;
15613 char *salt_buf_ptr
= (char *) salt
->salt_buf
;
15615 memcpy (salt_buf_ptr
, salt_pos
, salt_len
);
15617 salt
->salt_len
= salt_len
;
15619 return (PARSER_OK
);
15622 int djangopbkdf2_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
15624 if ((input_len
< DISPLAY_LEN_MIN_10000
) || (input_len
> DISPLAY_LEN_MAX_10000
)) return (PARSER_GLOBAL_LENGTH
);
15626 if (memcmp (SIGNATURE_DJANGOPBKDF2
, input_buf
, 14)) return (PARSER_SIGNATURE_UNMATCHED
);
15628 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
15630 salt_t
*salt
= hash_buf
->salt
;
15632 pbkdf2_sha256_t
*pbkdf2_sha256
= (pbkdf2_sha256_t
*) hash_buf
->esalt
;
15638 char *iter_pos
= input_buf
+ 14;
15640 const int iter
= atoi (iter_pos
);
15642 if (iter
< 1) return (PARSER_SALT_ITERATION
);
15644 salt
->salt_iter
= iter
- 1;
15646 char *salt_pos
= strchr (iter_pos
, '$');
15648 if (salt_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
15652 char *hash_pos
= strchr (salt_pos
, '$');
15654 if (hash_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
15656 const uint salt_len
= hash_pos
- salt_pos
;
15660 char *salt_buf_ptr
= (char *) pbkdf2_sha256
->salt_buf
;
15662 memcpy (salt_buf_ptr
, salt_pos
, salt_len
);
15664 salt
->salt_len
= salt_len
;
15666 salt_buf_ptr
[salt_len
+ 3] = 0x01;
15667 salt_buf_ptr
[salt_len
+ 4] = 0x80;
15669 // add some stuff to normal salt to make sorted happy
15671 salt
->salt_buf
[0] = pbkdf2_sha256
->salt_buf
[0];
15672 salt
->salt_buf
[1] = pbkdf2_sha256
->salt_buf
[1];
15673 salt
->salt_buf
[2] = pbkdf2_sha256
->salt_buf
[2];
15674 salt
->salt_buf
[3] = pbkdf2_sha256
->salt_buf
[3];
15675 salt
->salt_buf
[4] = salt
->salt_iter
;
15677 // base64 decode hash
15681 memset (tmp_buf
, 0, sizeof (tmp_buf
));
15683 uint hash_len
= input_len
- (hash_pos
- input_buf
);
15685 if (hash_len
!= 44) return (PARSER_HASH_LENGTH
);
15687 base64_decode (base64_to_int
, hash_pos
, hash_len
, tmp_buf
);
15689 memcpy (digest
, tmp_buf
, 32);
15691 digest
[0] = byte_swap_32 (digest
[0]);
15692 digest
[1] = byte_swap_32 (digest
[1]);
15693 digest
[2] = byte_swap_32 (digest
[2]);
15694 digest
[3] = byte_swap_32 (digest
[3]);
15695 digest
[4] = byte_swap_32 (digest
[4]);
15696 digest
[5] = byte_swap_32 (digest
[5]);
15697 digest
[6] = byte_swap_32 (digest
[6]);
15698 digest
[7] = byte_swap_32 (digest
[7]);
15700 return (PARSER_OK
);
15703 int siphash_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
15705 if ((input_len
< DISPLAY_LEN_MIN_10100
) || (input_len
> DISPLAY_LEN_MAX_10100
)) return (PARSER_GLOBAL_LENGTH
);
15707 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
15709 salt_t
*salt
= hash_buf
->salt
;
15711 digest
[0] = hex_to_uint (&input_buf
[ 0]);
15712 digest
[1] = hex_to_uint (&input_buf
[ 8]);
15716 digest
[0] = byte_swap_32 (digest
[0]);
15717 digest
[1] = byte_swap_32 (digest
[1]);
15719 if (input_buf
[16] != data
.separator
) return (PARSER_SEPARATOR_UNMATCHED
);
15720 if (input_buf
[18] != data
.separator
) return (PARSER_SEPARATOR_UNMATCHED
);
15721 if (input_buf
[20] != data
.separator
) return (PARSER_SEPARATOR_UNMATCHED
);
15723 char iter_c
= input_buf
[17];
15724 char iter_d
= input_buf
[19];
15726 // atm only defaults, let's see if there's more request
15727 if (iter_c
!= '2') return (PARSER_SALT_ITERATION
);
15728 if (iter_d
!= '4') return (PARSER_SALT_ITERATION
);
15730 char *salt_buf
= input_buf
+ 16 + 1 + 1 + 1 + 1 + 1;
15732 salt
->salt_buf
[0] = hex_to_uint (&salt_buf
[ 0]);
15733 salt
->salt_buf
[1] = hex_to_uint (&salt_buf
[ 8]);
15734 salt
->salt_buf
[2] = hex_to_uint (&salt_buf
[16]);
15735 salt
->salt_buf
[3] = hex_to_uint (&salt_buf
[24]);
15737 salt
->salt_buf
[0] = byte_swap_32 (salt
->salt_buf
[0]);
15738 salt
->salt_buf
[1] = byte_swap_32 (salt
->salt_buf
[1]);
15739 salt
->salt_buf
[2] = byte_swap_32 (salt
->salt_buf
[2]);
15740 salt
->salt_buf
[3] = byte_swap_32 (salt
->salt_buf
[3]);
15742 salt
->salt_len
= 16;
15744 return (PARSER_OK
);
15747 int crammd5_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
15749 if ((input_len
< DISPLAY_LEN_MIN_10200
) || (input_len
> DISPLAY_LEN_MAX_10200
)) return (PARSER_GLOBAL_LENGTH
);
15751 if (memcmp (SIGNATURE_CRAM_MD5
, input_buf
, 10)) return (PARSER_SIGNATURE_UNMATCHED
);
15753 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
15755 cram_md5_t
*cram_md5
= (cram_md5_t
*) hash_buf
->esalt
;
15757 salt_t
*salt
= hash_buf
->salt
;
15759 char *salt_pos
= input_buf
+ 10;
15761 char *hash_pos
= strchr (salt_pos
, '$');
15763 uint salt_len
= hash_pos
- salt_pos
;
15765 if (hash_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
15769 uint hash_len
= input_len
- 10 - salt_len
- 1;
15771 // base64 decode salt
15775 memset (tmp_buf
, 0, sizeof (tmp_buf
));
15777 salt_len
= base64_decode (base64_to_int
, salt_pos
, salt_len
, tmp_buf
);
15779 if (salt_len
> 55) return (PARSER_SALT_LENGTH
);
15781 tmp_buf
[salt_len
] = 0x80;
15783 memcpy (&salt
->salt_buf
, tmp_buf
, salt_len
+ 1);
15785 salt
->salt_len
= salt_len
;
15787 // base64 decode salt
15789 memset (tmp_buf
, 0, sizeof (tmp_buf
));
15791 hash_len
= base64_decode (base64_to_int
, hash_pos
, hash_len
, tmp_buf
);
15793 uint user_len
= hash_len
- 32;
15795 char *tmp_hash
= tmp_buf
+ user_len
;
15797 user_len
--; // skip the trailing space
15799 digest
[0] = hex_to_uint (&tmp_hash
[ 0]);
15800 digest
[1] = hex_to_uint (&tmp_hash
[ 8]);
15801 digest
[2] = hex_to_uint (&tmp_hash
[16]);
15802 digest
[3] = hex_to_uint (&tmp_hash
[24]);
15804 digest
[0] = byte_swap_32 (digest
[0]);
15805 digest
[1] = byte_swap_32 (digest
[1]);
15806 digest
[2] = byte_swap_32 (digest
[2]);
15807 digest
[3] = byte_swap_32 (digest
[3]);
15809 // store username for host only (output hash if cracked)
15811 memset (cram_md5
->user
, 0, sizeof (cram_md5
->user
));
15812 memcpy (cram_md5
->user
, tmp_buf
, user_len
);
15814 return (PARSER_OK
);
15817 int saph_sha1_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
15819 if ((input_len
< DISPLAY_LEN_MIN_10300
) || (input_len
> DISPLAY_LEN_MAX_10300
)) return (PARSER_GLOBAL_LENGTH
);
15821 if (memcmp (SIGNATURE_SAPH_SHA1
, input_buf
, 10)) return (PARSER_SIGNATURE_UNMATCHED
);
15823 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
15825 salt_t
*salt
= hash_buf
->salt
;
15827 char *iter_pos
= input_buf
+ 10;
15829 uint32_t iter
= atoi (iter_pos
);
15833 return (PARSER_SALT_ITERATION
);
15836 iter
--; // first iteration is special
15838 salt
->salt_iter
= iter
;
15840 char *base64_pos
= strchr (iter_pos
, '}');
15842 if (base64_pos
== NULL
)
15844 return (PARSER_SIGNATURE_UNMATCHED
);
15849 // base64 decode salt
15851 uint32_t base64_len
= input_len
- (base64_pos
- input_buf
);
15855 memset (tmp_buf
, 0, sizeof (tmp_buf
));
15857 uint32_t decoded_len
= base64_decode (base64_to_int
, base64_pos
, base64_len
, tmp_buf
);
15859 if (decoded_len
< 24)
15861 return (PARSER_SALT_LENGTH
);
15866 uint salt_len
= decoded_len
- 20;
15868 if (salt_len
< 4) return (PARSER_SALT_LENGTH
);
15869 if (salt_len
> 16) return (PARSER_SALT_LENGTH
);
15871 memcpy (&salt
->salt_buf
, tmp_buf
+ 20, salt_len
);
15873 salt
->salt_len
= salt_len
;
15877 uint32_t *digest_ptr
= (uint32_t*) tmp_buf
;
15879 digest
[0] = byte_swap_32 (digest_ptr
[0]);
15880 digest
[1] = byte_swap_32 (digest_ptr
[1]);
15881 digest
[2] = byte_swap_32 (digest_ptr
[2]);
15882 digest
[3] = byte_swap_32 (digest_ptr
[3]);
15883 digest
[4] = byte_swap_32 (digest_ptr
[4]);
15885 return (PARSER_OK
);
15888 int redmine_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
15890 if ((input_len
< DISPLAY_LEN_MIN_7600
) || (input_len
> DISPLAY_LEN_MAX_7600
)) return (PARSER_GLOBAL_LENGTH
);
15892 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
15894 salt_t
*salt
= hash_buf
->salt
;
15896 digest
[0] = hex_to_uint (&input_buf
[ 0]);
15897 digest
[1] = hex_to_uint (&input_buf
[ 8]);
15898 digest
[2] = hex_to_uint (&input_buf
[16]);
15899 digest
[3] = hex_to_uint (&input_buf
[24]);
15900 digest
[4] = hex_to_uint (&input_buf
[32]);
15902 if (input_buf
[40] != data
.separator
) return (PARSER_SEPARATOR_UNMATCHED
);
15904 uint salt_len
= input_len
- 40 - 1;
15906 char *salt_buf
= input_buf
+ 40 + 1;
15908 char *salt_buf_ptr
= (char *) salt
->salt_buf
;
15910 salt_len
= parse_and_store_salt (salt_buf_ptr
, salt_buf
, salt_len
);
15912 if (salt_len
!= 32) return (PARSER_SALT_LENGTH
);
15914 salt
->salt_len
= salt_len
;
15916 return (PARSER_OK
);
15919 int pdf11_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
15921 if ((input_len
< DISPLAY_LEN_MIN_10400
) || (input_len
> DISPLAY_LEN_MAX_10400
)) return (PARSER_GLOBAL_LENGTH
);
15923 if ((memcmp (SIGNATURE_PDF
, input_buf
, 5)) && (memcmp (SIGNATURE_PDF
, input_buf
, 5))) return (PARSER_SIGNATURE_UNMATCHED
);
15925 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
15927 salt_t
*salt
= hash_buf
->salt
;
15929 pdf_t
*pdf
= (pdf_t
*) hash_buf
->esalt
;
15935 char *V_pos
= input_buf
+ 5;
15937 char *R_pos
= strchr (V_pos
, '*');
15939 if (R_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
15941 uint32_t V_len
= R_pos
- V_pos
;
15945 char *bits_pos
= strchr (R_pos
, '*');
15947 if (bits_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
15949 uint32_t R_len
= bits_pos
- R_pos
;
15953 char *P_pos
= strchr (bits_pos
, '*');
15955 if (P_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
15957 uint32_t bits_len
= P_pos
- bits_pos
;
15961 char *enc_md_pos
= strchr (P_pos
, '*');
15963 if (enc_md_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
15965 uint32_t P_len
= enc_md_pos
- P_pos
;
15969 char *id_len_pos
= strchr (enc_md_pos
, '*');
15971 if (id_len_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
15973 uint32_t enc_md_len
= id_len_pos
- enc_md_pos
;
15977 char *id_buf_pos
= strchr (id_len_pos
, '*');
15979 if (id_buf_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
15981 uint32_t id_len_len
= id_buf_pos
- id_len_pos
;
15985 char *u_len_pos
= strchr (id_buf_pos
, '*');
15987 if (u_len_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
15989 uint32_t id_buf_len
= u_len_pos
- id_buf_pos
;
15991 if (id_buf_len
!= 32) return (PARSER_SALT_LENGTH
);
15995 char *u_buf_pos
= strchr (u_len_pos
, '*');
15997 if (u_buf_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
15999 uint32_t u_len_len
= u_buf_pos
- u_len_pos
;
16003 char *o_len_pos
= strchr (u_buf_pos
, '*');
16005 if (o_len_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
16007 uint32_t u_buf_len
= o_len_pos
- u_buf_pos
;
16009 if (u_buf_len
!= 64) return (PARSER_SALT_LENGTH
);
16013 char *o_buf_pos
= strchr (o_len_pos
, '*');
16015 if (o_buf_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
16017 uint32_t o_len_len
= o_buf_pos
- o_len_pos
;
16021 uint32_t o_buf_len
= input_len
- 5 - V_len
- 1 - R_len
- 1 - bits_len
- 1 - P_len
- 1 - enc_md_len
- 1 - id_len_len
- 1 - id_buf_len
- 1 - u_len_len
- 1 - u_buf_len
- 1 - o_len_len
- 1;
16023 if (o_buf_len
!= 64) return (PARSER_SALT_LENGTH
);
16027 const int V
= atoi (V_pos
);
16028 const int R
= atoi (R_pos
);
16029 const int P
= atoi (P_pos
);
16031 if (V
!= 1) return (PARSER_SALT_VALUE
);
16032 if (R
!= 2) return (PARSER_SALT_VALUE
);
16034 const int enc_md
= atoi (enc_md_pos
);
16036 if ((enc_md
!= 0) && (enc_md
!= 1)) return (PARSER_SALT_VALUE
);
16038 const int id_len
= atoi (id_len_pos
);
16039 const int u_len
= atoi (u_len_pos
);
16040 const int o_len
= atoi (o_len_pos
);
16042 if (id_len
!= 16) return (PARSER_SALT_VALUE
);
16043 if (u_len
!= 32) return (PARSER_SALT_VALUE
);
16044 if (o_len
!= 32) return (PARSER_SALT_VALUE
);
16046 const int bits
= atoi (bits_pos
);
16048 if (bits
!= 40) return (PARSER_SALT_VALUE
);
16050 // copy data to esalt
16056 pdf
->enc_md
= enc_md
;
16058 pdf
->id_buf
[0] = hex_to_uint (&id_buf_pos
[ 0]);
16059 pdf
->id_buf
[1] = hex_to_uint (&id_buf_pos
[ 8]);
16060 pdf
->id_buf
[2] = hex_to_uint (&id_buf_pos
[16]);
16061 pdf
->id_buf
[3] = hex_to_uint (&id_buf_pos
[24]);
16062 pdf
->id_len
= id_len
;
16064 pdf
->u_buf
[0] = hex_to_uint (&u_buf_pos
[ 0]);
16065 pdf
->u_buf
[1] = hex_to_uint (&u_buf_pos
[ 8]);
16066 pdf
->u_buf
[2] = hex_to_uint (&u_buf_pos
[16]);
16067 pdf
->u_buf
[3] = hex_to_uint (&u_buf_pos
[24]);
16068 pdf
->u_buf
[4] = hex_to_uint (&u_buf_pos
[32]);
16069 pdf
->u_buf
[5] = hex_to_uint (&u_buf_pos
[40]);
16070 pdf
->u_buf
[6] = hex_to_uint (&u_buf_pos
[48]);
16071 pdf
->u_buf
[7] = hex_to_uint (&u_buf_pos
[56]);
16072 pdf
->u_len
= u_len
;
16074 pdf
->o_buf
[0] = hex_to_uint (&o_buf_pos
[ 0]);
16075 pdf
->o_buf
[1] = hex_to_uint (&o_buf_pos
[ 8]);
16076 pdf
->o_buf
[2] = hex_to_uint (&o_buf_pos
[16]);
16077 pdf
->o_buf
[3] = hex_to_uint (&o_buf_pos
[24]);
16078 pdf
->o_buf
[4] = hex_to_uint (&o_buf_pos
[32]);
16079 pdf
->o_buf
[5] = hex_to_uint (&o_buf_pos
[40]);
16080 pdf
->o_buf
[6] = hex_to_uint (&o_buf_pos
[48]);
16081 pdf
->o_buf
[7] = hex_to_uint (&o_buf_pos
[56]);
16082 pdf
->o_len
= o_len
;
16084 pdf
->id_buf
[0] = byte_swap_32 (pdf
->id_buf
[0]);
16085 pdf
->id_buf
[1] = byte_swap_32 (pdf
->id_buf
[1]);
16086 pdf
->id_buf
[2] = byte_swap_32 (pdf
->id_buf
[2]);
16087 pdf
->id_buf
[3] = byte_swap_32 (pdf
->id_buf
[3]);
16089 pdf
->u_buf
[0] = byte_swap_32 (pdf
->u_buf
[0]);
16090 pdf
->u_buf
[1] = byte_swap_32 (pdf
->u_buf
[1]);
16091 pdf
->u_buf
[2] = byte_swap_32 (pdf
->u_buf
[2]);
16092 pdf
->u_buf
[3] = byte_swap_32 (pdf
->u_buf
[3]);
16093 pdf
->u_buf
[4] = byte_swap_32 (pdf
->u_buf
[4]);
16094 pdf
->u_buf
[5] = byte_swap_32 (pdf
->u_buf
[5]);
16095 pdf
->u_buf
[6] = byte_swap_32 (pdf
->u_buf
[6]);
16096 pdf
->u_buf
[7] = byte_swap_32 (pdf
->u_buf
[7]);
16098 pdf
->o_buf
[0] = byte_swap_32 (pdf
->o_buf
[0]);
16099 pdf
->o_buf
[1] = byte_swap_32 (pdf
->o_buf
[1]);
16100 pdf
->o_buf
[2] = byte_swap_32 (pdf
->o_buf
[2]);
16101 pdf
->o_buf
[3] = byte_swap_32 (pdf
->o_buf
[3]);
16102 pdf
->o_buf
[4] = byte_swap_32 (pdf
->o_buf
[4]);
16103 pdf
->o_buf
[5] = byte_swap_32 (pdf
->o_buf
[5]);
16104 pdf
->o_buf
[6] = byte_swap_32 (pdf
->o_buf
[6]);
16105 pdf
->o_buf
[7] = byte_swap_32 (pdf
->o_buf
[7]);
16107 // we use ID for salt, maybe needs to change, we will see...
16109 salt
->salt_buf
[0] = pdf
->id_buf
[0];
16110 salt
->salt_buf
[1] = pdf
->id_buf
[1];
16111 salt
->salt_buf
[2] = pdf
->id_buf
[2];
16112 salt
->salt_buf
[3] = pdf
->id_buf
[3];
16113 salt
->salt_len
= pdf
->id_len
;
16115 digest
[0] = pdf
->u_buf
[0];
16116 digest
[1] = pdf
->u_buf
[1];
16117 digest
[2] = pdf
->u_buf
[2];
16118 digest
[3] = pdf
->u_buf
[3];
16120 return (PARSER_OK
);
16123 int pdf11cm1_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
16125 return pdf11_parse_hash (input_buf
, input_len
, hash_buf
);
16128 int pdf11cm2_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
16130 if ((input_len
< DISPLAY_LEN_MIN_10420
) || (input_len
> DISPLAY_LEN_MAX_10420
)) return (PARSER_GLOBAL_LENGTH
);
16132 if ((memcmp (SIGNATURE_PDF
, input_buf
, 5)) && (memcmp (SIGNATURE_PDF
, input_buf
, 5))) return (PARSER_SIGNATURE_UNMATCHED
);
16134 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
16136 salt_t
*salt
= hash_buf
->salt
;
16138 pdf_t
*pdf
= (pdf_t
*) hash_buf
->esalt
;
16144 char *V_pos
= input_buf
+ 5;
16146 char *R_pos
= strchr (V_pos
, '*');
16148 if (R_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
16150 uint32_t V_len
= R_pos
- V_pos
;
16154 char *bits_pos
= strchr (R_pos
, '*');
16156 if (bits_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
16158 uint32_t R_len
= bits_pos
- R_pos
;
16162 char *P_pos
= strchr (bits_pos
, '*');
16164 if (P_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
16166 uint32_t bits_len
= P_pos
- bits_pos
;
16170 char *enc_md_pos
= strchr (P_pos
, '*');
16172 if (enc_md_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
16174 uint32_t P_len
= enc_md_pos
- P_pos
;
16178 char *id_len_pos
= strchr (enc_md_pos
, '*');
16180 if (id_len_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
16182 uint32_t enc_md_len
= id_len_pos
- enc_md_pos
;
16186 char *id_buf_pos
= strchr (id_len_pos
, '*');
16188 if (id_buf_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
16190 uint32_t id_len_len
= id_buf_pos
- id_len_pos
;
16194 char *u_len_pos
= strchr (id_buf_pos
, '*');
16196 if (u_len_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
16198 uint32_t id_buf_len
= u_len_pos
- id_buf_pos
;
16200 if (id_buf_len
!= 32) return (PARSER_SALT_LENGTH
);
16204 char *u_buf_pos
= strchr (u_len_pos
, '*');
16206 if (u_buf_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
16208 uint32_t u_len_len
= u_buf_pos
- u_len_pos
;
16212 char *o_len_pos
= strchr (u_buf_pos
, '*');
16214 if (o_len_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
16216 uint32_t u_buf_len
= o_len_pos
- u_buf_pos
;
16218 if (u_buf_len
!= 64) return (PARSER_SALT_LENGTH
);
16222 char *o_buf_pos
= strchr (o_len_pos
, '*');
16224 if (o_buf_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
16226 uint32_t o_len_len
= o_buf_pos
- o_len_pos
;
16230 char *rc4key_pos
= strchr (o_buf_pos
, ':');
16232 if (rc4key_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
16234 uint32_t o_buf_len
= rc4key_pos
- o_buf_pos
;
16236 if (o_buf_len
!= 64) return (PARSER_SALT_LENGTH
);
16240 uint32_t rc4key_len
= input_len
- 5 - V_len
- 1 - R_len
- 1 - bits_len
- 1 - P_len
- 1 - enc_md_len
- 1 - id_len_len
- 1 - id_buf_len
- 1 - u_len_len
- 1 - u_buf_len
- 1 - o_len_len
- 1 - o_buf_len
- 1;
16242 if (rc4key_len
!= 10) return (PARSER_SALT_LENGTH
);
16246 const int V
= atoi (V_pos
);
16247 const int R
= atoi (R_pos
);
16248 const int P
= atoi (P_pos
);
16250 if (V
!= 1) return (PARSER_SALT_VALUE
);
16251 if (R
!= 2) return (PARSER_SALT_VALUE
);
16253 const int enc_md
= atoi (enc_md_pos
);
16255 if ((enc_md
!= 0) && (enc_md
!= 1)) return (PARSER_SALT_VALUE
);
16257 const int id_len
= atoi (id_len_pos
);
16258 const int u_len
= atoi (u_len_pos
);
16259 const int o_len
= atoi (o_len_pos
);
16261 if (id_len
!= 16) return (PARSER_SALT_VALUE
);
16262 if (u_len
!= 32) return (PARSER_SALT_VALUE
);
16263 if (o_len
!= 32) return (PARSER_SALT_VALUE
);
16265 const int bits
= atoi (bits_pos
);
16267 if (bits
!= 40) return (PARSER_SALT_VALUE
);
16269 // copy data to esalt
16275 pdf
->enc_md
= enc_md
;
16277 pdf
->id_buf
[0] = hex_to_uint (&id_buf_pos
[ 0]);
16278 pdf
->id_buf
[1] = hex_to_uint (&id_buf_pos
[ 8]);
16279 pdf
->id_buf
[2] = hex_to_uint (&id_buf_pos
[16]);
16280 pdf
->id_buf
[3] = hex_to_uint (&id_buf_pos
[24]);
16281 pdf
->id_len
= id_len
;
16283 pdf
->u_buf
[0] = hex_to_uint (&u_buf_pos
[ 0]);
16284 pdf
->u_buf
[1] = hex_to_uint (&u_buf_pos
[ 8]);
16285 pdf
->u_buf
[2] = hex_to_uint (&u_buf_pos
[16]);
16286 pdf
->u_buf
[3] = hex_to_uint (&u_buf_pos
[24]);
16287 pdf
->u_buf
[4] = hex_to_uint (&u_buf_pos
[32]);
16288 pdf
->u_buf
[5] = hex_to_uint (&u_buf_pos
[40]);
16289 pdf
->u_buf
[6] = hex_to_uint (&u_buf_pos
[48]);
16290 pdf
->u_buf
[7] = hex_to_uint (&u_buf_pos
[56]);
16291 pdf
->u_len
= u_len
;
16293 pdf
->o_buf
[0] = hex_to_uint (&o_buf_pos
[ 0]);
16294 pdf
->o_buf
[1] = hex_to_uint (&o_buf_pos
[ 8]);
16295 pdf
->o_buf
[2] = hex_to_uint (&o_buf_pos
[16]);
16296 pdf
->o_buf
[3] = hex_to_uint (&o_buf_pos
[24]);
16297 pdf
->o_buf
[4] = hex_to_uint (&o_buf_pos
[32]);
16298 pdf
->o_buf
[5] = hex_to_uint (&o_buf_pos
[40]);
16299 pdf
->o_buf
[6] = hex_to_uint (&o_buf_pos
[48]);
16300 pdf
->o_buf
[7] = hex_to_uint (&o_buf_pos
[56]);
16301 pdf
->o_len
= o_len
;
16303 pdf
->id_buf
[0] = byte_swap_32 (pdf
->id_buf
[0]);
16304 pdf
->id_buf
[1] = byte_swap_32 (pdf
->id_buf
[1]);
16305 pdf
->id_buf
[2] = byte_swap_32 (pdf
->id_buf
[2]);
16306 pdf
->id_buf
[3] = byte_swap_32 (pdf
->id_buf
[3]);
16308 pdf
->u_buf
[0] = byte_swap_32 (pdf
->u_buf
[0]);
16309 pdf
->u_buf
[1] = byte_swap_32 (pdf
->u_buf
[1]);
16310 pdf
->u_buf
[2] = byte_swap_32 (pdf
->u_buf
[2]);
16311 pdf
->u_buf
[3] = byte_swap_32 (pdf
->u_buf
[3]);
16312 pdf
->u_buf
[4] = byte_swap_32 (pdf
->u_buf
[4]);
16313 pdf
->u_buf
[5] = byte_swap_32 (pdf
->u_buf
[5]);
16314 pdf
->u_buf
[6] = byte_swap_32 (pdf
->u_buf
[6]);
16315 pdf
->u_buf
[7] = byte_swap_32 (pdf
->u_buf
[7]);
16317 pdf
->o_buf
[0] = byte_swap_32 (pdf
->o_buf
[0]);
16318 pdf
->o_buf
[1] = byte_swap_32 (pdf
->o_buf
[1]);
16319 pdf
->o_buf
[2] = byte_swap_32 (pdf
->o_buf
[2]);
16320 pdf
->o_buf
[3] = byte_swap_32 (pdf
->o_buf
[3]);
16321 pdf
->o_buf
[4] = byte_swap_32 (pdf
->o_buf
[4]);
16322 pdf
->o_buf
[5] = byte_swap_32 (pdf
->o_buf
[5]);
16323 pdf
->o_buf
[6] = byte_swap_32 (pdf
->o_buf
[6]);
16324 pdf
->o_buf
[7] = byte_swap_32 (pdf
->o_buf
[7]);
16326 pdf
->rc4key
[1] = 0;
16327 pdf
->rc4key
[0] = 0;
16329 pdf
->rc4key
[0] |= hex_convert (rc4key_pos
[0]) << 28;
16330 pdf
->rc4key
[0] |= hex_convert (rc4key_pos
[1]) << 24;
16331 pdf
->rc4key
[0] |= hex_convert (rc4key_pos
[2]) << 20;
16332 pdf
->rc4key
[0] |= hex_convert (rc4key_pos
[3]) << 16;
16333 pdf
->rc4key
[0] |= hex_convert (rc4key_pos
[4]) << 12;
16334 pdf
->rc4key
[0] |= hex_convert (rc4key_pos
[5]) << 8;
16335 pdf
->rc4key
[0] |= hex_convert (rc4key_pos
[6]) << 4;
16336 pdf
->rc4key
[0] |= hex_convert (rc4key_pos
[7]) << 0;
16337 pdf
->rc4key
[1] |= hex_convert (rc4key_pos
[8]) << 28;
16338 pdf
->rc4key
[1] |= hex_convert (rc4key_pos
[9]) << 24;
16340 pdf
->rc4key
[0] = byte_swap_32 (pdf
->rc4key
[0]);
16341 pdf
->rc4key
[1] = byte_swap_32 (pdf
->rc4key
[1]);
16343 // we use ID for salt, maybe needs to change, we will see...
16345 salt
->salt_buf
[0] = pdf
->id_buf
[0];
16346 salt
->salt_buf
[1] = pdf
->id_buf
[1];
16347 salt
->salt_buf
[2] = pdf
->id_buf
[2];
16348 salt
->salt_buf
[3] = pdf
->id_buf
[3];
16349 salt
->salt_buf
[4] = pdf
->u_buf
[0];
16350 salt
->salt_buf
[5] = pdf
->u_buf
[1];
16351 salt
->salt_buf
[6] = pdf
->o_buf
[0];
16352 salt
->salt_buf
[7] = pdf
->o_buf
[1];
16353 salt
->salt_len
= pdf
->id_len
+ 16;
16355 digest
[0] = pdf
->rc4key
[0];
16356 digest
[1] = pdf
->rc4key
[1];
16360 return (PARSER_OK
);
16363 int pdf14_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
16365 if ((input_len
< DISPLAY_LEN_MIN_10500
) || (input_len
> DISPLAY_LEN_MAX_10500
)) return (PARSER_GLOBAL_LENGTH
);
16367 if ((memcmp (SIGNATURE_PDF
, input_buf
, 5)) && (memcmp (SIGNATURE_PDF
, input_buf
, 5))) return (PARSER_SIGNATURE_UNMATCHED
);
16369 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
16371 salt_t
*salt
= hash_buf
->salt
;
16373 pdf_t
*pdf
= (pdf_t
*) hash_buf
->esalt
;
16379 char *V_pos
= input_buf
+ 5;
16381 char *R_pos
= strchr (V_pos
, '*');
16383 if (R_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
16385 uint32_t V_len
= R_pos
- V_pos
;
16389 char *bits_pos
= strchr (R_pos
, '*');
16391 if (bits_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
16393 uint32_t R_len
= bits_pos
- R_pos
;
16397 char *P_pos
= strchr (bits_pos
, '*');
16399 if (P_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
16401 uint32_t bits_len
= P_pos
- bits_pos
;
16405 char *enc_md_pos
= strchr (P_pos
, '*');
16407 if (enc_md_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
16409 uint32_t P_len
= enc_md_pos
- P_pos
;
16413 char *id_len_pos
= strchr (enc_md_pos
, '*');
16415 if (id_len_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
16417 uint32_t enc_md_len
= id_len_pos
- enc_md_pos
;
16421 char *id_buf_pos
= strchr (id_len_pos
, '*');
16423 if (id_buf_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
16425 uint32_t id_len_len
= id_buf_pos
- id_len_pos
;
16429 char *u_len_pos
= strchr (id_buf_pos
, '*');
16431 if (u_len_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
16433 uint32_t id_buf_len
= u_len_pos
- id_buf_pos
;
16435 if ((id_buf_len
!= 32) && (id_buf_len
!= 64)) return (PARSER_SALT_LENGTH
);
16439 char *u_buf_pos
= strchr (u_len_pos
, '*');
16441 if (u_buf_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
16443 uint32_t u_len_len
= u_buf_pos
- u_len_pos
;
16447 char *o_len_pos
= strchr (u_buf_pos
, '*');
16449 if (o_len_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
16451 uint32_t u_buf_len
= o_len_pos
- u_buf_pos
;
16453 if (u_buf_len
!= 64) return (PARSER_SALT_LENGTH
);
16457 char *o_buf_pos
= strchr (o_len_pos
, '*');
16459 if (o_buf_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
16461 uint32_t o_len_len
= o_buf_pos
- o_len_pos
;
16465 uint32_t o_buf_len
= input_len
- 5 - V_len
- 1 - R_len
- 1 - bits_len
- 1 - P_len
- 1 - enc_md_len
- 1 - id_len_len
- 1 - id_buf_len
- 1 - u_len_len
- 1 - u_buf_len
- 1 - o_len_len
- 1;
16467 if (o_buf_len
!= 64) return (PARSER_SALT_LENGTH
);
16471 const int V
= atoi (V_pos
);
16472 const int R
= atoi (R_pos
);
16473 const int P
= atoi (P_pos
);
16477 if ((V
== 2) && (R
== 3)) vr_ok
= 1;
16478 if ((V
== 4) && (R
== 4)) vr_ok
= 1;
16480 if (vr_ok
== 0) return (PARSER_SALT_VALUE
);
16482 const int id_len
= atoi (id_len_pos
);
16483 const int u_len
= atoi (u_len_pos
);
16484 const int o_len
= atoi (o_len_pos
);
16486 if ((id_len
!= 16) && (id_len
!= 32)) return (PARSER_SALT_VALUE
);
16488 if (u_len
!= 32) return (PARSER_SALT_VALUE
);
16489 if (o_len
!= 32) return (PARSER_SALT_VALUE
);
16491 const int bits
= atoi (bits_pos
);
16493 if (bits
!= 128) return (PARSER_SALT_VALUE
);
16499 enc_md
= atoi (enc_md_pos
);
16502 // copy data to esalt
16508 pdf
->enc_md
= enc_md
;
16510 pdf
->id_buf
[0] = hex_to_uint (&id_buf_pos
[ 0]);
16511 pdf
->id_buf
[1] = hex_to_uint (&id_buf_pos
[ 8]);
16512 pdf
->id_buf
[2] = hex_to_uint (&id_buf_pos
[16]);
16513 pdf
->id_buf
[3] = hex_to_uint (&id_buf_pos
[24]);
16517 pdf
->id_buf
[4] = hex_to_uint (&id_buf_pos
[32]);
16518 pdf
->id_buf
[5] = hex_to_uint (&id_buf_pos
[40]);
16519 pdf
->id_buf
[6] = hex_to_uint (&id_buf_pos
[48]);
16520 pdf
->id_buf
[7] = hex_to_uint (&id_buf_pos
[56]);
16523 pdf
->id_len
= id_len
;
16525 pdf
->u_buf
[0] = hex_to_uint (&u_buf_pos
[ 0]);
16526 pdf
->u_buf
[1] = hex_to_uint (&u_buf_pos
[ 8]);
16527 pdf
->u_buf
[2] = hex_to_uint (&u_buf_pos
[16]);
16528 pdf
->u_buf
[3] = hex_to_uint (&u_buf_pos
[24]);
16529 pdf
->u_buf
[4] = hex_to_uint (&u_buf_pos
[32]);
16530 pdf
->u_buf
[5] = hex_to_uint (&u_buf_pos
[40]);
16531 pdf
->u_buf
[6] = hex_to_uint (&u_buf_pos
[48]);
16532 pdf
->u_buf
[7] = hex_to_uint (&u_buf_pos
[56]);
16533 pdf
->u_len
= u_len
;
16535 pdf
->o_buf
[0] = hex_to_uint (&o_buf_pos
[ 0]);
16536 pdf
->o_buf
[1] = hex_to_uint (&o_buf_pos
[ 8]);
16537 pdf
->o_buf
[2] = hex_to_uint (&o_buf_pos
[16]);
16538 pdf
->o_buf
[3] = hex_to_uint (&o_buf_pos
[24]);
16539 pdf
->o_buf
[4] = hex_to_uint (&o_buf_pos
[32]);
16540 pdf
->o_buf
[5] = hex_to_uint (&o_buf_pos
[40]);
16541 pdf
->o_buf
[6] = hex_to_uint (&o_buf_pos
[48]);
16542 pdf
->o_buf
[7] = hex_to_uint (&o_buf_pos
[56]);
16543 pdf
->o_len
= o_len
;
16545 pdf
->id_buf
[0] = byte_swap_32 (pdf
->id_buf
[0]);
16546 pdf
->id_buf
[1] = byte_swap_32 (pdf
->id_buf
[1]);
16547 pdf
->id_buf
[2] = byte_swap_32 (pdf
->id_buf
[2]);
16548 pdf
->id_buf
[3] = byte_swap_32 (pdf
->id_buf
[3]);
16552 pdf
->id_buf
[4] = byte_swap_32 (pdf
->id_buf
[4]);
16553 pdf
->id_buf
[5] = byte_swap_32 (pdf
->id_buf
[5]);
16554 pdf
->id_buf
[6] = byte_swap_32 (pdf
->id_buf
[6]);
16555 pdf
->id_buf
[7] = byte_swap_32 (pdf
->id_buf
[7]);
16558 pdf
->u_buf
[0] = byte_swap_32 (pdf
->u_buf
[0]);
16559 pdf
->u_buf
[1] = byte_swap_32 (pdf
->u_buf
[1]);
16560 pdf
->u_buf
[2] = byte_swap_32 (pdf
->u_buf
[2]);
16561 pdf
->u_buf
[3] = byte_swap_32 (pdf
->u_buf
[3]);
16562 pdf
->u_buf
[4] = byte_swap_32 (pdf
->u_buf
[4]);
16563 pdf
->u_buf
[5] = byte_swap_32 (pdf
->u_buf
[5]);
16564 pdf
->u_buf
[6] = byte_swap_32 (pdf
->u_buf
[6]);
16565 pdf
->u_buf
[7] = byte_swap_32 (pdf
->u_buf
[7]);
16567 pdf
->o_buf
[0] = byte_swap_32 (pdf
->o_buf
[0]);
16568 pdf
->o_buf
[1] = byte_swap_32 (pdf
->o_buf
[1]);
16569 pdf
->o_buf
[2] = byte_swap_32 (pdf
->o_buf
[2]);
16570 pdf
->o_buf
[3] = byte_swap_32 (pdf
->o_buf
[3]);
16571 pdf
->o_buf
[4] = byte_swap_32 (pdf
->o_buf
[4]);
16572 pdf
->o_buf
[5] = byte_swap_32 (pdf
->o_buf
[5]);
16573 pdf
->o_buf
[6] = byte_swap_32 (pdf
->o_buf
[6]);
16574 pdf
->o_buf
[7] = byte_swap_32 (pdf
->o_buf
[7]);
16576 // precompute rc4 data for later use
16592 uint salt_pc_block
[32];
16594 char *salt_pc_ptr
= (char *) salt_pc_block
;
16596 memcpy (salt_pc_ptr
, padding
, 32);
16597 memcpy (salt_pc_ptr
+ 32, pdf
->id_buf
, pdf
->id_len
);
16599 uint salt_pc_digest
[4];
16601 md5_complete_no_limit (salt_pc_digest
, salt_pc_block
, 32 + pdf
->id_len
);
16603 pdf
->rc4data
[0] = salt_pc_digest
[0];
16604 pdf
->rc4data
[1] = salt_pc_digest
[1];
16606 // we use ID for salt, maybe needs to change, we will see...
16608 salt
->salt_buf
[0] = pdf
->id_buf
[0];
16609 salt
->salt_buf
[1] = pdf
->id_buf
[1];
16610 salt
->salt_buf
[2] = pdf
->id_buf
[2];
16611 salt
->salt_buf
[3] = pdf
->id_buf
[3];
16612 salt
->salt_buf
[4] = pdf
->u_buf
[0];
16613 salt
->salt_buf
[5] = pdf
->u_buf
[1];
16614 salt
->salt_buf
[6] = pdf
->o_buf
[0];
16615 salt
->salt_buf
[7] = pdf
->o_buf
[1];
16616 salt
->salt_len
= pdf
->id_len
+ 16;
16618 salt
->salt_iter
= ROUNDS_PDF14
;
16620 digest
[0] = pdf
->u_buf
[0];
16621 digest
[1] = pdf
->u_buf
[1];
16625 return (PARSER_OK
);
16628 int pdf17l3_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
16630 int ret
= pdf17l8_parse_hash (input_buf
, input_len
, hash_buf
);
16632 if (ret
!= PARSER_OK
)
16637 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
16639 salt_t
*salt
= hash_buf
->salt
;
16641 digest
[0] -= SHA256M_A
;
16642 digest
[1] -= SHA256M_B
;
16643 digest
[2] -= SHA256M_C
;
16644 digest
[3] -= SHA256M_D
;
16645 digest
[4] -= SHA256M_E
;
16646 digest
[5] -= SHA256M_F
;
16647 digest
[6] -= SHA256M_G
;
16648 digest
[7] -= SHA256M_H
;
16650 salt
->salt_buf
[2] = 0x80;
16652 return (PARSER_OK
);
16655 int pdf17l8_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
16657 if ((input_len
< DISPLAY_LEN_MIN_10600
) || (input_len
> DISPLAY_LEN_MAX_10600
)) return (PARSER_GLOBAL_LENGTH
);
16659 if ((memcmp (SIGNATURE_PDF
, input_buf
, 5)) && (memcmp (SIGNATURE_PDF
, input_buf
, 5))) return (PARSER_SIGNATURE_UNMATCHED
);
16661 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
16663 salt_t
*salt
= hash_buf
->salt
;
16665 pdf_t
*pdf
= (pdf_t
*) hash_buf
->esalt
;
16671 char *V_pos
= input_buf
+ 5;
16673 char *R_pos
= strchr (V_pos
, '*');
16675 if (R_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
16677 uint32_t V_len
= R_pos
- V_pos
;
16681 char *bits_pos
= strchr (R_pos
, '*');
16683 if (bits_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
16685 uint32_t R_len
= bits_pos
- R_pos
;
16689 char *P_pos
= strchr (bits_pos
, '*');
16691 if (P_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
16693 uint32_t bits_len
= P_pos
- bits_pos
;
16697 char *enc_md_pos
= strchr (P_pos
, '*');
16699 if (enc_md_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
16701 uint32_t P_len
= enc_md_pos
- P_pos
;
16705 char *id_len_pos
= strchr (enc_md_pos
, '*');
16707 if (id_len_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
16709 uint32_t enc_md_len
= id_len_pos
- enc_md_pos
;
16713 char *id_buf_pos
= strchr (id_len_pos
, '*');
16715 if (id_buf_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
16717 uint32_t id_len_len
= id_buf_pos
- id_len_pos
;
16721 char *u_len_pos
= strchr (id_buf_pos
, '*');
16723 if (u_len_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
16725 uint32_t id_buf_len
= u_len_pos
- id_buf_pos
;
16729 char *u_buf_pos
= strchr (u_len_pos
, '*');
16731 if (u_buf_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
16733 uint32_t u_len_len
= u_buf_pos
- u_len_pos
;
16737 char *o_len_pos
= strchr (u_buf_pos
, '*');
16739 if (o_len_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
16741 uint32_t u_buf_len
= o_len_pos
- u_buf_pos
;
16745 char *o_buf_pos
= strchr (o_len_pos
, '*');
16747 if (o_buf_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
16749 uint32_t o_len_len
= o_buf_pos
- o_len_pos
;
16753 char *last
= strchr (o_buf_pos
, '*');
16755 if (last
== NULL
) last
= input_buf
+ input_len
;
16757 uint32_t o_buf_len
= last
- o_buf_pos
;
16761 const int V
= atoi (V_pos
);
16762 const int R
= atoi (R_pos
);
16766 if ((V
== 5) && (R
== 5)) vr_ok
= 1;
16767 if ((V
== 5) && (R
== 6)) vr_ok
= 1;
16769 if (vr_ok
== 0) return (PARSER_SALT_VALUE
);
16771 const int bits
= atoi (bits_pos
);
16773 if (bits
!= 256) return (PARSER_SALT_VALUE
);
16775 int enc_md
= atoi (enc_md_pos
);
16777 if (enc_md
!= 1) return (PARSER_SALT_VALUE
);
16779 const uint id_len
= atoi (id_len_pos
);
16780 const uint u_len
= atoi (u_len_pos
);
16781 const uint o_len
= atoi (o_len_pos
);
16783 if (V_len
> 6) return (PARSER_SALT_LENGTH
);
16784 if (R_len
> 6) return (PARSER_SALT_LENGTH
);
16785 if (P_len
> 6) return (PARSER_SALT_LENGTH
);
16786 if (id_len_len
> 6) return (PARSER_SALT_LENGTH
);
16787 if (u_len_len
> 6) return (PARSER_SALT_LENGTH
);
16788 if (o_len_len
> 6) return (PARSER_SALT_LENGTH
);
16789 if (bits_len
> 6) return (PARSER_SALT_LENGTH
);
16790 if (enc_md_len
> 6) return (PARSER_SALT_LENGTH
);
16792 if ((id_len
* 2) != id_buf_len
) return (PARSER_SALT_VALUE
);
16793 if ((u_len
* 2) != u_buf_len
) return (PARSER_SALT_VALUE
);
16794 if ((o_len
* 2) != o_buf_len
) return (PARSER_SALT_VALUE
);
16796 // copy data to esalt
16798 if (u_len
< 40) return (PARSER_SALT_VALUE
);
16800 for (int i
= 0, j
= 0; i
< 8 + 2; i
+= 1, j
+= 8)
16802 pdf
->u_buf
[i
] = hex_to_uint (&u_buf_pos
[j
]);
16805 salt
->salt_buf
[0] = pdf
->u_buf
[8];
16806 salt
->salt_buf
[1] = pdf
->u_buf
[9];
16808 salt
->salt_buf
[0] = byte_swap_32 (salt
->salt_buf
[0]);
16809 salt
->salt_buf
[1] = byte_swap_32 (salt
->salt_buf
[1]);
16811 salt
->salt_len
= 8;
16812 salt
->salt_iter
= ROUNDS_PDF17L8
;
16814 digest
[0] = pdf
->u_buf
[0];
16815 digest
[1] = pdf
->u_buf
[1];
16816 digest
[2] = pdf
->u_buf
[2];
16817 digest
[3] = pdf
->u_buf
[3];
16818 digest
[4] = pdf
->u_buf
[4];
16819 digest
[5] = pdf
->u_buf
[5];
16820 digest
[6] = pdf
->u_buf
[6];
16821 digest
[7] = pdf
->u_buf
[7];
16823 return (PARSER_OK
);
16826 int pbkdf2_sha256_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
16828 if ((input_len
< DISPLAY_LEN_MIN_10900
) || (input_len
> DISPLAY_LEN_MAX_10900
)) return (PARSER_GLOBAL_LENGTH
);
16830 if (memcmp (SIGNATURE_PBKDF2_SHA256
, input_buf
, 7)) return (PARSER_SIGNATURE_UNMATCHED
);
16832 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
16834 salt_t
*salt
= hash_buf
->salt
;
16836 pbkdf2_sha256_t
*pbkdf2_sha256
= (pbkdf2_sha256_t
*) hash_buf
->esalt
;
16844 char *iter_pos
= input_buf
+ 7;
16846 uint32_t iter
= atoi (iter_pos
);
16848 if (iter
< 1) return (PARSER_SALT_ITERATION
);
16849 if (iter
> 999999) return (PARSER_SALT_ITERATION
);
16851 // first is *raw* salt
16853 char *salt_pos
= strchr (iter_pos
, ':');
16855 if (salt_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
16859 char *hash_pos
= strchr (salt_pos
, ':');
16861 if (hash_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
16863 uint32_t salt_len
= hash_pos
- salt_pos
;
16865 if (salt_len
> 64) return (PARSER_SALT_LENGTH
);
16869 uint32_t hash_b64_len
= input_len
- (hash_pos
- input_buf
);
16871 if (hash_b64_len
> 88) return (PARSER_HASH_LENGTH
);
16875 char *salt_buf_ptr
= (char *) pbkdf2_sha256
->salt_buf
;
16877 salt_len
= parse_and_store_salt (salt_buf_ptr
, salt_pos
, salt_len
);
16879 if (salt_len
== UINT_MAX
) return (PARSER_SALT_LENGTH
);
16881 salt_buf_ptr
[salt_len
+ 3] = 0x01;
16882 salt_buf_ptr
[salt_len
+ 4] = 0x80;
16884 salt
->salt_len
= salt_len
;
16885 salt
->salt_iter
= iter
- 1;
16891 memset (tmp_buf
, 0, sizeof (tmp_buf
));
16893 int hash_len
= base64_decode (base64_to_int
, hash_pos
, hash_b64_len
, tmp_buf
);
16895 if (hash_len
< 16) return (PARSER_HASH_LENGTH
);
16897 memcpy (digest
, tmp_buf
, 16);
16899 digest
[0] = byte_swap_32 (digest
[0]);
16900 digest
[1] = byte_swap_32 (digest
[1]);
16901 digest
[2] = byte_swap_32 (digest
[2]);
16902 digest
[3] = byte_swap_32 (digest
[3]);
16904 // add some stuff to normal salt to make sorted happy
16906 salt
->salt_buf
[0] = pbkdf2_sha256
->salt_buf
[0];
16907 salt
->salt_buf
[1] = pbkdf2_sha256
->salt_buf
[1];
16908 salt
->salt_buf
[2] = pbkdf2_sha256
->salt_buf
[2];
16909 salt
->salt_buf
[3] = pbkdf2_sha256
->salt_buf
[3];
16910 salt
->salt_buf
[4] = salt
->salt_iter
;
16912 return (PARSER_OK
);
16915 int prestashop_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
16917 if ((input_len
< DISPLAY_LEN_MIN_11000
) || (input_len
> DISPLAY_LEN_MAX_11000
)) return (PARSER_GLOBAL_LENGTH
);
16919 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
16921 salt_t
*salt
= hash_buf
->salt
;
16923 digest
[0] = hex_to_uint (&input_buf
[ 0]);
16924 digest
[1] = hex_to_uint (&input_buf
[ 8]);
16925 digest
[2] = hex_to_uint (&input_buf
[16]);
16926 digest
[3] = hex_to_uint (&input_buf
[24]);
16928 digest
[0] = byte_swap_32 (digest
[0]);
16929 digest
[1] = byte_swap_32 (digest
[1]);
16930 digest
[2] = byte_swap_32 (digest
[2]);
16931 digest
[3] = byte_swap_32 (digest
[3]);
16933 if (input_buf
[32] != data
.separator
) return (PARSER_SEPARATOR_UNMATCHED
);
16935 uint salt_len
= input_len
- 32 - 1;
16937 char *salt_buf
= input_buf
+ 32 + 1;
16939 char *salt_buf_ptr
= (char *) salt
->salt_buf
;
16941 salt_len
= parse_and_store_salt (salt_buf_ptr
, salt_buf
, salt_len
);
16943 if (salt_len
== UINT_MAX
) return (PARSER_SALT_LENGTH
);
16945 salt
->salt_len
= salt_len
;
16947 return (PARSER_OK
);
16950 int postgresql_auth_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
16952 if ((input_len
< DISPLAY_LEN_MIN_11100
) || (input_len
> DISPLAY_LEN_MAX_11100
)) return (PARSER_GLOBAL_LENGTH
);
16954 if (memcmp (SIGNATURE_POSTGRESQL_AUTH
, input_buf
, 10)) return (PARSER_SIGNATURE_UNMATCHED
);
16956 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
16958 salt_t
*salt
= hash_buf
->salt
;
16960 char *user_pos
= input_buf
+ 10;
16962 char *salt_pos
= strchr (user_pos
, '*');
16964 if (salt_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
16968 char *hash_pos
= strchr (salt_pos
, '*');
16972 uint hash_len
= input_len
- (hash_pos
- input_buf
);
16974 if (hash_len
!= 32) return (PARSER_HASH_LENGTH
);
16976 uint user_len
= salt_pos
- user_pos
- 1;
16978 uint salt_len
= hash_pos
- salt_pos
- 1;
16980 if (salt_len
!= 8) return (PARSER_SALT_LENGTH
);
16986 digest
[0] = hex_to_uint (&hash_pos
[ 0]);
16987 digest
[1] = hex_to_uint (&hash_pos
[ 8]);
16988 digest
[2] = hex_to_uint (&hash_pos
[16]);
16989 digest
[3] = hex_to_uint (&hash_pos
[24]);
16991 digest
[0] = byte_swap_32 (digest
[0]);
16992 digest
[1] = byte_swap_32 (digest
[1]);
16993 digest
[2] = byte_swap_32 (digest
[2]);
16994 digest
[3] = byte_swap_32 (digest
[3]);
16996 digest
[0] -= MD5M_A
;
16997 digest
[1] -= MD5M_B
;
16998 digest
[2] -= MD5M_C
;
16999 digest
[3] -= MD5M_D
;
17005 char *salt_buf_ptr
= (char *) salt
->salt_buf
;
17007 // first 4 bytes are the "challenge"
17009 salt_buf_ptr
[0] = hex_to_char (&salt_pos
[0]);
17010 salt_buf_ptr
[1] = hex_to_char (&salt_pos
[2]);
17011 salt_buf_ptr
[2] = hex_to_char (&salt_pos
[4]);
17012 salt_buf_ptr
[3] = hex_to_char (&salt_pos
[6]);
17014 // append the user name
17016 user_len
= parse_and_store_salt (salt_buf_ptr
+ 4, user_pos
, user_len
);
17018 salt
->salt_len
= 4 + user_len
;
17020 return (PARSER_OK
);
17023 int mysql_auth_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
17025 if ((input_len
< DISPLAY_LEN_MIN_11200
) || (input_len
> DISPLAY_LEN_MAX_11200
)) return (PARSER_GLOBAL_LENGTH
);
17027 if (memcmp (SIGNATURE_MYSQL_AUTH
, input_buf
, 9)) return (PARSER_SIGNATURE_UNMATCHED
);
17029 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
17031 salt_t
*salt
= hash_buf
->salt
;
17033 char *salt_pos
= input_buf
+ 9;
17035 char *hash_pos
= strchr (salt_pos
, '*');
17037 if (hash_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
17041 uint hash_len
= input_len
- (hash_pos
- input_buf
);
17043 if (hash_len
!= 40) return (PARSER_HASH_LENGTH
);
17045 uint salt_len
= hash_pos
- salt_pos
- 1;
17047 if (salt_len
!= 40) return (PARSER_SALT_LENGTH
);
17053 digest
[0] = hex_to_uint (&hash_pos
[ 0]);
17054 digest
[1] = hex_to_uint (&hash_pos
[ 8]);
17055 digest
[2] = hex_to_uint (&hash_pos
[16]);
17056 digest
[3] = hex_to_uint (&hash_pos
[24]);
17057 digest
[4] = hex_to_uint (&hash_pos
[32]);
17063 char *salt_buf_ptr
= (char *) salt
->salt_buf
;
17065 salt_len
= parse_and_store_salt (salt_buf_ptr
, salt_pos
, salt_len
);
17067 salt
->salt_len
= salt_len
;
17069 return (PARSER_OK
);
17072 int bitcoin_wallet_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
17074 if ((input_len
< DISPLAY_LEN_MIN_11300
) || (input_len
> DISPLAY_LEN_MAX_11300
)) return (PARSER_GLOBAL_LENGTH
);
17076 if (memcmp (SIGNATURE_BITCOIN_WALLET
, input_buf
, 9)) return (PARSER_SIGNATURE_UNMATCHED
);
17078 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
17080 salt_t
*salt
= hash_buf
->salt
;
17082 bitcoin_wallet_t
*bitcoin_wallet
= (bitcoin_wallet_t
*) hash_buf
->esalt
;
17088 char *cry_master_len_pos
= input_buf
+ 9;
17090 char *cry_master_buf_pos
= strchr (cry_master_len_pos
, '$');
17092 if (cry_master_buf_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
17094 uint32_t cry_master_len_len
= cry_master_buf_pos
- cry_master_len_pos
;
17096 cry_master_buf_pos
++;
17098 char *cry_salt_len_pos
= strchr (cry_master_buf_pos
, '$');
17100 if (cry_salt_len_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
17102 uint32_t cry_master_buf_len
= cry_salt_len_pos
- cry_master_buf_pos
;
17104 cry_salt_len_pos
++;
17106 char *cry_salt_buf_pos
= strchr (cry_salt_len_pos
, '$');
17108 if (cry_salt_buf_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
17110 uint32_t cry_salt_len_len
= cry_salt_buf_pos
- cry_salt_len_pos
;
17112 cry_salt_buf_pos
++;
17114 char *cry_rounds_pos
= strchr (cry_salt_buf_pos
, '$');
17116 if (cry_rounds_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
17118 uint32_t cry_salt_buf_len
= cry_rounds_pos
- cry_salt_buf_pos
;
17122 char *ckey_len_pos
= strchr (cry_rounds_pos
, '$');
17124 if (ckey_len_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
17126 uint32_t cry_rounds_len
= ckey_len_pos
- cry_rounds_pos
;
17130 char *ckey_buf_pos
= strchr (ckey_len_pos
, '$');
17132 if (ckey_buf_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
17134 uint32_t ckey_len_len
= ckey_buf_pos
- ckey_len_pos
;
17138 char *public_key_len_pos
= strchr (ckey_buf_pos
, '$');
17140 if (public_key_len_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
17142 uint32_t ckey_buf_len
= public_key_len_pos
- ckey_buf_pos
;
17144 public_key_len_pos
++;
17146 char *public_key_buf_pos
= strchr (public_key_len_pos
, '$');
17148 if (public_key_buf_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
17150 uint32_t public_key_len_len
= public_key_buf_pos
- public_key_len_pos
;
17152 public_key_buf_pos
++;
17154 uint32_t public_key_buf_len
= input_len
- 1 - 7 - 1 - cry_master_len_len
- 1 - cry_master_buf_len
- 1 - cry_salt_len_len
- 1 - cry_salt_buf_len
- 1 - cry_rounds_len
- 1 - ckey_len_len
- 1 - ckey_buf_len
- 1 - public_key_len_len
- 1;
17156 const uint cry_master_len
= atoi (cry_master_len_pos
);
17157 const uint cry_salt_len
= atoi (cry_salt_len_pos
);
17158 const uint ckey_len
= atoi (ckey_len_pos
);
17159 const uint public_key_len
= atoi (public_key_len_pos
);
17161 if (cry_master_buf_len
!= cry_master_len
) return (PARSER_SALT_VALUE
);
17162 if (cry_salt_buf_len
!= cry_salt_len
) return (PARSER_SALT_VALUE
);
17163 if (ckey_buf_len
!= ckey_len
) return (PARSER_SALT_VALUE
);
17164 if (public_key_buf_len
!= public_key_len
) return (PARSER_SALT_VALUE
);
17166 for (uint i
= 0, j
= 0; i
< cry_master_len
; i
+= 1, j
+= 8)
17168 bitcoin_wallet
->cry_master_buf
[i
] = hex_to_uint (&cry_master_buf_pos
[j
]);
17170 bitcoin_wallet
->cry_master_buf
[i
] = byte_swap_32 (bitcoin_wallet
->cry_master_buf
[i
]);
17173 for (uint i
= 0, j
= 0; i
< ckey_len
; i
+= 1, j
+= 8)
17175 bitcoin_wallet
->ckey_buf
[i
] = hex_to_uint (&ckey_buf_pos
[j
]);
17177 bitcoin_wallet
->ckey_buf
[i
] = byte_swap_32 (bitcoin_wallet
->ckey_buf
[i
]);
17180 for (uint i
= 0, j
= 0; i
< public_key_len
; i
+= 1, j
+= 8)
17182 bitcoin_wallet
->public_key_buf
[i
] = hex_to_uint (&public_key_buf_pos
[j
]);
17184 bitcoin_wallet
->public_key_buf
[i
] = byte_swap_32 (bitcoin_wallet
->public_key_buf
[i
]);
17187 bitcoin_wallet
->cry_master_len
= cry_master_len
/ 2;
17188 bitcoin_wallet
->ckey_len
= ckey_len
/ 2;
17189 bitcoin_wallet
->public_key_len
= public_key_len
/ 2;
17192 * store digest (should be unique enought, hopefully)
17195 digest
[0] = bitcoin_wallet
->cry_master_buf
[0];
17196 digest
[1] = bitcoin_wallet
->cry_master_buf
[1];
17197 digest
[2] = bitcoin_wallet
->cry_master_buf
[2];
17198 digest
[3] = bitcoin_wallet
->cry_master_buf
[3];
17204 if (cry_rounds_len
>= 7) return (PARSER_SALT_VALUE
);
17206 const uint cry_rounds
= atoi (cry_rounds_pos
);
17208 salt
->salt_iter
= cry_rounds
- 1;
17210 char *salt_buf_ptr
= (char *) salt
->salt_buf
;
17212 const uint salt_len
= parse_and_store_salt (salt_buf_ptr
, cry_salt_buf_pos
, cry_salt_buf_len
);
17214 salt
->salt_len
= salt_len
;
17216 return (PARSER_OK
);
17219 int sip_auth_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
17221 if ((input_len
< DISPLAY_LEN_MIN_11400
) || (input_len
> DISPLAY_LEN_MAX_11400
)) return (PARSER_GLOBAL_LENGTH
);
17223 if (memcmp (SIGNATURE_SIP_AUTH
, input_buf
, 6)) return (PARSER_SIGNATURE_UNMATCHED
);
17225 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
17227 salt_t
*salt
= hash_buf
->salt
;
17229 sip_t
*sip
= (sip_t
*) hash_buf
->esalt
;
17231 // work with a temporary copy of input_buf (s.t. we can manipulate it directly)
17233 char temp_input_buf
[input_len
+ 1];
17235 memset (temp_input_buf
, 0, sizeof (temp_input_buf
));
17236 memcpy (temp_input_buf
, input_buf
, input_len
);
17240 char *URI_server_pos
= temp_input_buf
+ 6;
17242 char *URI_client_pos
= strchr (URI_server_pos
, '*');
17244 if (URI_client_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
17246 URI_client_pos
[0] = 0;
17249 uint URI_server_len
= strlen (URI_server_pos
);
17251 if (URI_server_len
> 512) return (PARSER_SALT_LENGTH
);
17255 char *user_pos
= strchr (URI_client_pos
, '*');
17257 if (user_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
17262 uint URI_client_len
= strlen (URI_client_pos
);
17264 if (URI_client_len
> 512) return (PARSER_SALT_LENGTH
);
17268 char *realm_pos
= strchr (user_pos
, '*');
17270 if (realm_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
17275 uint user_len
= strlen (user_pos
);
17277 if (user_len
> 116) return (PARSER_SALT_LENGTH
);
17281 char *method_pos
= strchr (realm_pos
, '*');
17283 if (method_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
17288 uint realm_len
= strlen (realm_pos
);
17290 if (realm_len
> 116) return (PARSER_SALT_LENGTH
);
17294 char *URI_prefix_pos
= strchr (method_pos
, '*');
17296 if (URI_prefix_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
17298 URI_prefix_pos
[0] = 0;
17301 uint method_len
= strlen (method_pos
);
17303 if (method_len
> 246) return (PARSER_SALT_LENGTH
);
17307 char *URI_resource_pos
= strchr (URI_prefix_pos
, '*');
17309 if (URI_resource_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
17311 URI_resource_pos
[0] = 0;
17312 URI_resource_pos
++;
17314 uint URI_prefix_len
= strlen (URI_prefix_pos
);
17316 if (URI_prefix_len
> 245) return (PARSER_SALT_LENGTH
);
17320 char *URI_suffix_pos
= strchr (URI_resource_pos
, '*');
17322 if (URI_suffix_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
17324 URI_suffix_pos
[0] = 0;
17327 uint URI_resource_len
= strlen (URI_resource_pos
);
17329 if (URI_resource_len
< 1) return (PARSER_SALT_LENGTH
);
17330 if (URI_resource_len
> 246) return (PARSER_SALT_LENGTH
);
17334 char *nonce_pos
= strchr (URI_suffix_pos
, '*');
17336 if (nonce_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
17341 uint URI_suffix_len
= strlen (URI_suffix_pos
);
17343 if (URI_suffix_len
> 245) return (PARSER_SALT_LENGTH
);
17347 char *nonce_client_pos
= strchr (nonce_pos
, '*');
17349 if (nonce_client_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
17351 nonce_client_pos
[0] = 0;
17352 nonce_client_pos
++;
17354 uint nonce_len
= strlen (nonce_pos
);
17356 if (nonce_len
< 1) return (PARSER_SALT_LENGTH
);
17357 if (nonce_len
> 50) return (PARSER_SALT_LENGTH
);
17361 char *nonce_count_pos
= strchr (nonce_client_pos
, '*');
17363 if (nonce_count_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
17365 nonce_count_pos
[0] = 0;
17368 uint nonce_client_len
= strlen (nonce_client_pos
);
17370 if (nonce_client_len
> 50) return (PARSER_SALT_LENGTH
);
17374 char *qop_pos
= strchr (nonce_count_pos
, '*');
17376 if (qop_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
17381 uint nonce_count_len
= strlen (nonce_count_pos
);
17383 if (nonce_count_len
> 50) return (PARSER_SALT_LENGTH
);
17387 char *directive_pos
= strchr (qop_pos
, '*');
17389 if (directive_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
17391 directive_pos
[0] = 0;
17394 uint qop_len
= strlen (qop_pos
);
17396 if (qop_len
> 50) return (PARSER_SALT_LENGTH
);
17400 char *digest_pos
= strchr (directive_pos
, '*');
17402 if (digest_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
17407 uint directive_len
= strlen (directive_pos
);
17409 if (directive_len
!= 3) return (PARSER_SALT_LENGTH
);
17411 if (memcmp (directive_pos
, "MD5", 3))
17413 log_info ("ERROR: only the MD5 directive is currently supported\n");
17415 return (PARSER_SIP_AUTH_DIRECTIVE
);
17419 * first (pre-)compute: HA2 = md5 ($method . ":" . $uri)
17424 uint md5_max_len
= 4 * 64;
17426 uint md5_remaining_len
= md5_max_len
;
17428 uint tmp_md5_buf
[md5_max_len
/ 4];
17430 memset (tmp_md5_buf
, 0, sizeof (tmp_md5_buf
));
17432 char *tmp_md5_ptr
= (char *) tmp_md5_buf
;
17434 snprintf (tmp_md5_ptr
, md5_remaining_len
, "%s:", method_pos
);
17436 md5_len
+= method_len
+ 1;
17437 tmp_md5_ptr
+= method_len
+ 1;
17439 if (URI_prefix_len
> 0)
17441 md5_remaining_len
= md5_max_len
- md5_len
;
17443 snprintf (tmp_md5_ptr
, md5_remaining_len
+ 1, "%s:", URI_prefix_pos
);
17445 md5_len
+= URI_prefix_len
+ 1;
17446 tmp_md5_ptr
+= URI_prefix_len
+ 1;
17449 md5_remaining_len
= md5_max_len
- md5_len
;
17451 snprintf (tmp_md5_ptr
, md5_remaining_len
+ 1, "%s", URI_resource_pos
);
17453 md5_len
+= URI_resource_len
;
17454 tmp_md5_ptr
+= URI_resource_len
;
17456 if (URI_suffix_len
> 0)
17458 md5_remaining_len
= md5_max_len
- md5_len
;
17460 snprintf (tmp_md5_ptr
, md5_remaining_len
+ 1, ":%s", URI_suffix_pos
);
17462 md5_len
+= 1 + URI_suffix_len
;
17465 uint tmp_digest
[4];
17467 md5_complete_no_limit (tmp_digest
, tmp_md5_buf
, md5_len
);
17469 tmp_digest
[0] = byte_swap_32 (tmp_digest
[0]);
17470 tmp_digest
[1] = byte_swap_32 (tmp_digest
[1]);
17471 tmp_digest
[2] = byte_swap_32 (tmp_digest
[2]);
17472 tmp_digest
[3] = byte_swap_32 (tmp_digest
[3]);
17478 char *esalt_buf_ptr
= (char *) sip
->esalt_buf
;
17480 uint esalt_len
= 0;
17482 uint max_esalt_len
= sizeof (sip
->esalt_buf
); // 151 = (64 + 64 + 55) - 32, where 32 is the hexadecimal MD5 HA1 hash
17484 // there are 2 possibilities for the esalt:
17486 if ((strcmp (qop_pos
, "auth") == 0) || (strcmp (qop_pos
, "auth-int") == 0))
17488 esalt_len
= 1 + nonce_len
+ 1 + nonce_count_len
+ 1 + nonce_client_len
+ 1 + qop_len
+ 1 + 32;
17490 if (esalt_len
> max_esalt_len
) return (PARSER_SALT_LENGTH
);
17492 snprintf (esalt_buf_ptr
, max_esalt_len
, ":%s:%s:%s:%s:%08x%08x%08x%08x",
17504 esalt_len
= 1 + nonce_len
+ 1 + 32;
17506 if (esalt_len
> max_esalt_len
) return (PARSER_SALT_LENGTH
);
17508 snprintf (esalt_buf_ptr
, max_esalt_len
, ":%s:%08x%08x%08x%08x",
17516 // add 0x80 to esalt
17518 esalt_buf_ptr
[esalt_len
] = 0x80;
17520 sip
->esalt_len
= esalt_len
;
17526 char *sip_salt_ptr
= (char *) sip
->salt_buf
;
17528 uint salt_len
= user_len
+ 1 + realm_len
+ 1;
17530 uint max_salt_len
= 119;
17532 if (salt_len
> max_salt_len
) return (PARSER_SALT_LENGTH
);
17534 snprintf (sip_salt_ptr
, max_salt_len
+ 1, "%s:%s:", user_pos
, realm_pos
);
17536 sip
->salt_len
= salt_len
;
17539 * fake salt (for sorting)
17542 char *salt_buf_ptr
= (char *) salt
->salt_buf
;
17546 uint fake_salt_len
= salt_len
;
17548 if (fake_salt_len
> max_salt_len
)
17550 fake_salt_len
= max_salt_len
;
17553 snprintf (salt_buf_ptr
, max_salt_len
+ 1, "%s:%s:", user_pos
, realm_pos
);
17555 salt
->salt_len
= fake_salt_len
;
17561 digest
[0] = hex_to_uint (&digest_pos
[ 0]);
17562 digest
[1] = hex_to_uint (&digest_pos
[ 8]);
17563 digest
[2] = hex_to_uint (&digest_pos
[16]);
17564 digest
[3] = hex_to_uint (&digest_pos
[24]);
17566 digest
[0] = byte_swap_32 (digest
[0]);
17567 digest
[1] = byte_swap_32 (digest
[1]);
17568 digest
[2] = byte_swap_32 (digest
[2]);
17569 digest
[3] = byte_swap_32 (digest
[3]);
17571 return (PARSER_OK
);
17574 int crc32_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
17576 if ((input_len
< DISPLAY_LEN_MIN_11500
) || (input_len
> DISPLAY_LEN_MAX_11500
)) return (PARSER_GLOBAL_LENGTH
);
17578 if (input_buf
[8] != data
.separator
) return (PARSER_SEPARATOR_UNMATCHED
);
17580 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
17582 salt_t
*salt
= hash_buf
->salt
;
17586 char *digest_pos
= input_buf
;
17588 digest
[0] = hex_to_uint (&digest_pos
[0]);
17595 char *salt_buf
= input_buf
+ 8 + 1;
17599 char *salt_buf_ptr
= (char *) salt
->salt_buf
;
17601 salt_len
= parse_and_store_salt (salt_buf_ptr
, salt_buf
, salt_len
);
17603 if (salt_len
== UINT_MAX
) return (PARSER_SALT_LENGTH
);
17605 salt
->salt_len
= salt_len
;
17607 return (PARSER_OK
);
17610 int seven_zip_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
17612 if ((input_len
< DISPLAY_LEN_MIN_11600
) || (input_len
> DISPLAY_LEN_MAX_11600
)) return (PARSER_GLOBAL_LENGTH
);
17614 if (memcmp (SIGNATURE_SEVEN_ZIP
, input_buf
, 4)) return (PARSER_SIGNATURE_UNMATCHED
);
17616 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
17618 salt_t
*salt
= hash_buf
->salt
;
17620 seven_zip_t
*seven_zip
= (seven_zip_t
*) hash_buf
->esalt
;
17626 char *p_buf_pos
= input_buf
+ 4;
17628 char *NumCyclesPower_pos
= strchr (p_buf_pos
, '$');
17630 if (NumCyclesPower_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
17632 uint32_t p_buf_len
= NumCyclesPower_pos
- p_buf_pos
;
17634 NumCyclesPower_pos
++;
17636 char *salt_len_pos
= strchr (NumCyclesPower_pos
, '$');
17638 if (salt_len_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
17640 uint32_t NumCyclesPower_len
= salt_len_pos
- NumCyclesPower_pos
;
17644 char *salt_buf_pos
= strchr (salt_len_pos
, '$');
17646 if (salt_buf_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
17648 uint32_t salt_len_len
= salt_buf_pos
- salt_len_pos
;
17652 char *iv_len_pos
= strchr (salt_buf_pos
, '$');
17654 if (iv_len_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
17656 uint32_t salt_buf_len
= iv_len_pos
- salt_buf_pos
;
17660 char *iv_buf_pos
= strchr (iv_len_pos
, '$');
17662 if (iv_buf_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
17664 uint32_t iv_len_len
= iv_buf_pos
- iv_len_pos
;
17668 char *crc_buf_pos
= strchr (iv_buf_pos
, '$');
17670 if (crc_buf_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
17672 uint32_t iv_buf_len
= crc_buf_pos
- iv_buf_pos
;
17676 char *data_len_pos
= strchr (crc_buf_pos
, '$');
17678 if (data_len_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
17680 uint32_t crc_buf_len
= data_len_pos
- crc_buf_pos
;
17684 char *unpack_size_pos
= strchr (data_len_pos
, '$');
17686 if (unpack_size_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
17688 uint32_t data_len_len
= unpack_size_pos
- data_len_pos
;
17692 char *data_buf_pos
= strchr (unpack_size_pos
, '$');
17694 if (data_buf_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
17696 uint32_t unpack_size_len
= data_buf_pos
- unpack_size_pos
;
17700 uint32_t data_buf_len
= input_len
- 1 - 2 - 1 - p_buf_len
- 1 - NumCyclesPower_len
- 1 - salt_len_len
- 1 - salt_buf_len
- 1 - iv_len_len
- 1 - iv_buf_len
- 1 - crc_buf_len
- 1 - data_len_len
- 1 - unpack_size_len
- 1;
17702 const uint iter
= atoi (NumCyclesPower_pos
);
17703 const uint crc
= atoi (crc_buf_pos
);
17704 const uint p_buf
= atoi (p_buf_pos
);
17705 const uint salt_len
= atoi (salt_len_pos
);
17706 const uint iv_len
= atoi (iv_len_pos
);
17707 const uint unpack_size
= atoi (unpack_size_pos
);
17708 const uint data_len
= atoi (data_len_pos
);
17714 if (p_buf
!= 0) return (PARSER_SALT_VALUE
);
17715 if (salt_len
!= 0) return (PARSER_SALT_VALUE
);
17717 if ((data_len
* 2) != data_buf_len
) return (PARSER_SALT_VALUE
);
17719 if (data_len
> 384) return (PARSER_SALT_VALUE
);
17721 if (unpack_size
> data_len
) return (PARSER_SALT_VALUE
);
17727 seven_zip
->iv_buf
[0] = hex_to_uint (&iv_buf_pos
[ 0]);
17728 seven_zip
->iv_buf
[1] = hex_to_uint (&iv_buf_pos
[ 8]);
17729 seven_zip
->iv_buf
[2] = hex_to_uint (&iv_buf_pos
[16]);
17730 seven_zip
->iv_buf
[3] = hex_to_uint (&iv_buf_pos
[24]);
17732 seven_zip
->iv_len
= iv_len
;
17734 memcpy (seven_zip
->salt_buf
, salt_buf_pos
, salt_buf_len
); // we just need that for later ascii_digest()
17736 seven_zip
->salt_len
= 0;
17738 seven_zip
->crc
= crc
;
17740 for (uint i
= 0, j
= 0; j
< data_buf_len
; i
+= 1, j
+= 8)
17742 seven_zip
->data_buf
[i
] = hex_to_uint (&data_buf_pos
[j
]);
17744 seven_zip
->data_buf
[i
] = byte_swap_32 (seven_zip
->data_buf
[i
]);
17747 seven_zip
->data_len
= data_len
;
17749 seven_zip
->unpack_size
= unpack_size
;
17753 salt
->salt_buf
[0] = seven_zip
->data_buf
[0];
17754 salt
->salt_buf
[1] = seven_zip
->data_buf
[1];
17755 salt
->salt_buf
[2] = seven_zip
->data_buf
[2];
17756 salt
->salt_buf
[3] = seven_zip
->data_buf
[3];
17758 salt
->salt_len
= 16;
17760 salt
->salt_sign
[0] = iter
;
17762 salt
->salt_iter
= 1 << iter
;
17773 return (PARSER_OK
);
17776 int gost2012sbog_256_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
17778 if ((input_len
< DISPLAY_LEN_MIN_11700
) || (input_len
> DISPLAY_LEN_MAX_11700
)) return (PARSER_GLOBAL_LENGTH
);
17780 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
17782 digest
[0] = hex_to_uint (&input_buf
[ 0]);
17783 digest
[1] = hex_to_uint (&input_buf
[ 8]);
17784 digest
[2] = hex_to_uint (&input_buf
[16]);
17785 digest
[3] = hex_to_uint (&input_buf
[24]);
17786 digest
[4] = hex_to_uint (&input_buf
[32]);
17787 digest
[5] = hex_to_uint (&input_buf
[40]);
17788 digest
[6] = hex_to_uint (&input_buf
[48]);
17789 digest
[7] = hex_to_uint (&input_buf
[56]);
17791 digest
[0] = byte_swap_32 (digest
[0]);
17792 digest
[1] = byte_swap_32 (digest
[1]);
17793 digest
[2] = byte_swap_32 (digest
[2]);
17794 digest
[3] = byte_swap_32 (digest
[3]);
17795 digest
[4] = byte_swap_32 (digest
[4]);
17796 digest
[5] = byte_swap_32 (digest
[5]);
17797 digest
[6] = byte_swap_32 (digest
[6]);
17798 digest
[7] = byte_swap_32 (digest
[7]);
17800 return (PARSER_OK
);
17803 int gost2012sbog_512_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
17805 if ((input_len
< DISPLAY_LEN_MIN_11800
) || (input_len
> DISPLAY_LEN_MAX_11800
)) return (PARSER_GLOBAL_LENGTH
);
17807 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
17809 digest
[ 0] = hex_to_uint (&input_buf
[ 0]);
17810 digest
[ 1] = hex_to_uint (&input_buf
[ 8]);
17811 digest
[ 2] = hex_to_uint (&input_buf
[ 16]);
17812 digest
[ 3] = hex_to_uint (&input_buf
[ 24]);
17813 digest
[ 4] = hex_to_uint (&input_buf
[ 32]);
17814 digest
[ 5] = hex_to_uint (&input_buf
[ 40]);
17815 digest
[ 6] = hex_to_uint (&input_buf
[ 48]);
17816 digest
[ 7] = hex_to_uint (&input_buf
[ 56]);
17817 digest
[ 8] = hex_to_uint (&input_buf
[ 64]);
17818 digest
[ 9] = hex_to_uint (&input_buf
[ 72]);
17819 digest
[10] = hex_to_uint (&input_buf
[ 80]);
17820 digest
[11] = hex_to_uint (&input_buf
[ 88]);
17821 digest
[12] = hex_to_uint (&input_buf
[ 96]);
17822 digest
[13] = hex_to_uint (&input_buf
[104]);
17823 digest
[14] = hex_to_uint (&input_buf
[112]);
17824 digest
[15] = hex_to_uint (&input_buf
[120]);
17826 digest
[ 0] = byte_swap_32 (digest
[ 0]);
17827 digest
[ 1] = byte_swap_32 (digest
[ 1]);
17828 digest
[ 2] = byte_swap_32 (digest
[ 2]);
17829 digest
[ 3] = byte_swap_32 (digest
[ 3]);
17830 digest
[ 4] = byte_swap_32 (digest
[ 4]);
17831 digest
[ 5] = byte_swap_32 (digest
[ 5]);
17832 digest
[ 6] = byte_swap_32 (digest
[ 6]);
17833 digest
[ 7] = byte_swap_32 (digest
[ 7]);
17834 digest
[ 8] = byte_swap_32 (digest
[ 8]);
17835 digest
[ 9] = byte_swap_32 (digest
[ 9]);
17836 digest
[10] = byte_swap_32 (digest
[10]);
17837 digest
[11] = byte_swap_32 (digest
[11]);
17838 digest
[12] = byte_swap_32 (digest
[12]);
17839 digest
[13] = byte_swap_32 (digest
[13]);
17840 digest
[14] = byte_swap_32 (digest
[14]);
17841 digest
[15] = byte_swap_32 (digest
[15]);
17843 return (PARSER_OK
);
17846 int pbkdf2_md5_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
17848 if ((input_len
< DISPLAY_LEN_MIN_11900
) || (input_len
> DISPLAY_LEN_MAX_11900
)) return (PARSER_GLOBAL_LENGTH
);
17850 if (memcmp (SIGNATURE_PBKDF2_MD5
, input_buf
, 4)) return (PARSER_SIGNATURE_UNMATCHED
);
17852 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
17854 salt_t
*salt
= hash_buf
->salt
;
17856 pbkdf2_md5_t
*pbkdf2_md5
= (pbkdf2_md5_t
*) hash_buf
->esalt
;
17864 char *iter_pos
= input_buf
+ 4;
17866 uint32_t iter
= atoi (iter_pos
);
17868 if (iter
< 1) return (PARSER_SALT_ITERATION
);
17869 if (iter
> 999999) return (PARSER_SALT_ITERATION
);
17871 // first is *raw* salt
17873 char *salt_pos
= strchr (iter_pos
, ':');
17875 if (salt_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
17879 char *hash_pos
= strchr (salt_pos
, ':');
17881 if (hash_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
17883 uint32_t salt_len
= hash_pos
- salt_pos
;
17885 if (salt_len
> 64) return (PARSER_SALT_LENGTH
);
17889 uint32_t hash_b64_len
= input_len
- (hash_pos
- input_buf
);
17891 if (hash_b64_len
> 88) return (PARSER_HASH_LENGTH
);
17895 char *salt_buf_ptr
= (char *) pbkdf2_md5
->salt_buf
;
17897 salt_len
= parse_and_store_salt (salt_buf_ptr
, salt_pos
, salt_len
);
17899 if (salt_len
== UINT_MAX
) return (PARSER_SALT_LENGTH
);
17901 salt_buf_ptr
[salt_len
+ 3] = 0x01;
17902 salt_buf_ptr
[salt_len
+ 4] = 0x80;
17904 salt
->salt_len
= salt_len
;
17905 salt
->salt_iter
= iter
- 1;
17911 memset (tmp_buf
, 0, sizeof (tmp_buf
));
17913 int hash_len
= base64_decode (base64_to_int
, hash_pos
, hash_b64_len
, tmp_buf
);
17915 if (hash_len
< 16) return (PARSER_HASH_LENGTH
);
17917 memcpy (digest
, tmp_buf
, 16);
17919 // add some stuff to normal salt to make sorted happy
17921 salt
->salt_buf
[0] = pbkdf2_md5
->salt_buf
[0];
17922 salt
->salt_buf
[1] = pbkdf2_md5
->salt_buf
[1];
17923 salt
->salt_buf
[2] = pbkdf2_md5
->salt_buf
[2];
17924 salt
->salt_buf
[3] = pbkdf2_md5
->salt_buf
[3];
17925 salt
->salt_buf
[4] = salt
->salt_iter
;
17927 return (PARSER_OK
);
17930 int pbkdf2_sha1_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
17932 if ((input_len
< DISPLAY_LEN_MIN_12000
) || (input_len
> DISPLAY_LEN_MAX_12000
)) return (PARSER_GLOBAL_LENGTH
);
17934 if (memcmp (SIGNATURE_PBKDF2_SHA1
, input_buf
, 5)) return (PARSER_SIGNATURE_UNMATCHED
);
17936 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
17938 salt_t
*salt
= hash_buf
->salt
;
17940 pbkdf2_sha1_t
*pbkdf2_sha1
= (pbkdf2_sha1_t
*) hash_buf
->esalt
;
17948 char *iter_pos
= input_buf
+ 5;
17950 uint32_t iter
= atoi (iter_pos
);
17952 if (iter
< 1) return (PARSER_SALT_ITERATION
);
17953 if (iter
> 999999) return (PARSER_SALT_ITERATION
);
17955 // first is *raw* salt
17957 char *salt_pos
= strchr (iter_pos
, ':');
17959 if (salt_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
17963 char *hash_pos
= strchr (salt_pos
, ':');
17965 if (hash_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
17967 uint32_t salt_len
= hash_pos
- salt_pos
;
17969 if (salt_len
> 64) return (PARSER_SALT_LENGTH
);
17973 uint32_t hash_b64_len
= input_len
- (hash_pos
- input_buf
);
17975 if (hash_b64_len
> 88) return (PARSER_HASH_LENGTH
);
17979 char *salt_buf_ptr
= (char *) pbkdf2_sha1
->salt_buf
;
17981 salt_len
= parse_and_store_salt (salt_buf_ptr
, salt_pos
, salt_len
);
17983 if (salt_len
== UINT_MAX
) return (PARSER_SALT_LENGTH
);
17985 salt_buf_ptr
[salt_len
+ 3] = 0x01;
17986 salt_buf_ptr
[salt_len
+ 4] = 0x80;
17988 salt
->salt_len
= salt_len
;
17989 salt
->salt_iter
= iter
- 1;
17995 memset (tmp_buf
, 0, sizeof (tmp_buf
));
17997 int hash_len
= base64_decode (base64_to_int
, hash_pos
, hash_b64_len
, tmp_buf
);
17999 if (hash_len
< 16) return (PARSER_HASH_LENGTH
);
18001 memcpy (digest
, tmp_buf
, 16);
18003 digest
[0] = byte_swap_32 (digest
[0]);
18004 digest
[1] = byte_swap_32 (digest
[1]);
18005 digest
[2] = byte_swap_32 (digest
[2]);
18006 digest
[3] = byte_swap_32 (digest
[3]);
18008 // add some stuff to normal salt to make sorted happy
18010 salt
->salt_buf
[0] = pbkdf2_sha1
->salt_buf
[0];
18011 salt
->salt_buf
[1] = pbkdf2_sha1
->salt_buf
[1];
18012 salt
->salt_buf
[2] = pbkdf2_sha1
->salt_buf
[2];
18013 salt
->salt_buf
[3] = pbkdf2_sha1
->salt_buf
[3];
18014 salt
->salt_buf
[4] = salt
->salt_iter
;
18016 return (PARSER_OK
);
18019 int pbkdf2_sha512_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
18021 if ((input_len
< DISPLAY_LEN_MIN_12100
) || (input_len
> DISPLAY_LEN_MAX_12100
)) return (PARSER_GLOBAL_LENGTH
);
18023 if (memcmp (SIGNATURE_PBKDF2_SHA512
, input_buf
, 7)) return (PARSER_SIGNATURE_UNMATCHED
);
18025 uint64_t *digest
= (uint64_t *) hash_buf
->digest
;
18027 salt_t
*salt
= hash_buf
->salt
;
18029 pbkdf2_sha512_t
*pbkdf2_sha512
= (pbkdf2_sha512_t
*) hash_buf
->esalt
;
18037 char *iter_pos
= input_buf
+ 7;
18039 uint32_t iter
= atoi (iter_pos
);
18041 if (iter
< 1) return (PARSER_SALT_ITERATION
);
18042 if (iter
> 999999) return (PARSER_SALT_ITERATION
);
18044 // first is *raw* salt
18046 char *salt_pos
= strchr (iter_pos
, ':');
18048 if (salt_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
18052 char *hash_pos
= strchr (salt_pos
, ':');
18054 if (hash_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
18056 uint32_t salt_len
= hash_pos
- salt_pos
;
18058 if (salt_len
> 64) return (PARSER_SALT_LENGTH
);
18062 uint32_t hash_b64_len
= input_len
- (hash_pos
- input_buf
);
18064 if (hash_b64_len
> 88) return (PARSER_HASH_LENGTH
);
18068 char *salt_buf_ptr
= (char *) pbkdf2_sha512
->salt_buf
;
18070 salt_len
= parse_and_store_salt (salt_buf_ptr
, salt_pos
, salt_len
);
18072 if (salt_len
== UINT_MAX
) return (PARSER_SALT_LENGTH
);
18074 salt_buf_ptr
[salt_len
+ 3] = 0x01;
18075 salt_buf_ptr
[salt_len
+ 4] = 0x80;
18077 salt
->salt_len
= salt_len
;
18078 salt
->salt_iter
= iter
- 1;
18084 memset (tmp_buf
, 0, sizeof (tmp_buf
));
18086 int hash_len
= base64_decode (base64_to_int
, hash_pos
, hash_b64_len
, tmp_buf
);
18088 if (hash_len
< 16) return (PARSER_HASH_LENGTH
);
18090 memcpy (digest
, tmp_buf
, 64);
18092 digest
[0] = byte_swap_64 (digest
[0]);
18093 digest
[1] = byte_swap_64 (digest
[1]);
18094 digest
[2] = byte_swap_64 (digest
[2]);
18095 digest
[3] = byte_swap_64 (digest
[3]);
18096 digest
[4] = byte_swap_64 (digest
[4]);
18097 digest
[5] = byte_swap_64 (digest
[5]);
18098 digest
[6] = byte_swap_64 (digest
[6]);
18099 digest
[7] = byte_swap_64 (digest
[7]);
18101 // add some stuff to normal salt to make sorted happy
18103 salt
->salt_buf
[0] = pbkdf2_sha512
->salt_buf
[0];
18104 salt
->salt_buf
[1] = pbkdf2_sha512
->salt_buf
[1];
18105 salt
->salt_buf
[2] = pbkdf2_sha512
->salt_buf
[2];
18106 salt
->salt_buf
[3] = pbkdf2_sha512
->salt_buf
[3];
18107 salt
->salt_buf
[4] = salt
->salt_iter
;
18109 return (PARSER_OK
);
18112 int ecryptfs_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
18114 if ((input_len
< DISPLAY_LEN_MIN_12200
) || (input_len
> DISPLAY_LEN_MAX_12200
)) return (PARSER_GLOBAL_LENGTH
);
18116 if (memcmp (SIGNATURE_ECRYPTFS
, input_buf
, 10)) return (PARSER_SIGNATURE_UNMATCHED
);
18118 uint
*digest
= (uint
*) hash_buf
->digest
;
18120 salt_t
*salt
= hash_buf
->salt
;
18126 char *salt_pos
= input_buf
+ 10 + 2 + 2; // skip over "0$" and "1$"
18128 char *hash_pos
= strchr (salt_pos
, '$');
18130 if (hash_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
18132 uint32_t salt_len
= hash_pos
- salt_pos
;
18134 if (salt_len
!= 16) return (PARSER_SALT_LENGTH
);
18138 uint32_t hash_len
= input_len
- 10 - 2 - 2 - salt_len
- 1;
18140 if (hash_len
!= 16) return (PARSER_HASH_LENGTH
);
18144 digest
[ 0] = hex_to_uint (&hash_pos
[0]);
18145 digest
[ 1] = hex_to_uint (&hash_pos
[8]);
18163 salt
->salt_buf
[0] = hex_to_uint (&salt_pos
[0]);
18164 salt
->salt_buf
[1] = hex_to_uint (&salt_pos
[8]);
18166 salt
->salt_iter
= ROUNDS_ECRYPTFS
;
18167 salt
->salt_len
= 8;
18169 return (PARSER_OK
);
18172 int bsdicrypt_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
18174 if ((input_len
< DISPLAY_LEN_MIN_12400
) || (input_len
> DISPLAY_LEN_MAX_12400
)) return (PARSER_GLOBAL_LENGTH
);
18176 if (memcmp (SIGNATURE_BSDICRYPT
, input_buf
, 1)) return (PARSER_SIGNATURE_UNMATCHED
);
18178 unsigned char c19
= itoa64_to_int (input_buf
[19]);
18180 if (c19
& 3) return (PARSER_HASH_VALUE
);
18182 salt_t
*salt
= hash_buf
->salt
;
18184 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
18188 salt
->salt_iter
= itoa64_to_int (input_buf
[1])
18189 | itoa64_to_int (input_buf
[2]) << 6
18190 | itoa64_to_int (input_buf
[3]) << 12
18191 | itoa64_to_int (input_buf
[4]) << 18;
18195 salt
->salt_buf
[0] = itoa64_to_int (input_buf
[5])
18196 | itoa64_to_int (input_buf
[6]) << 6
18197 | itoa64_to_int (input_buf
[7]) << 12
18198 | itoa64_to_int (input_buf
[8]) << 18;
18200 salt
->salt_len
= 4;
18204 memset (tmp_buf
, 0, sizeof (tmp_buf
));
18206 base64_decode (itoa64_to_int
, input_buf
+ 9, 11, tmp_buf
);
18208 memcpy (digest
, tmp_buf
, 8);
18212 IP (digest
[0], digest
[1], tt
);
18214 digest
[0] = ROTATE_RIGHT (digest
[0], 31);
18215 digest
[1] = ROTATE_RIGHT (digest
[1], 31);
18219 return (PARSER_OK
);
18222 int rar3hp_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
18224 if ((input_len
< DISPLAY_LEN_MIN_12500
) || (input_len
> DISPLAY_LEN_MAX_12500
)) return (PARSER_GLOBAL_LENGTH
);
18226 if (memcmp (SIGNATURE_RAR3
, input_buf
, 6)) return (PARSER_SIGNATURE_UNMATCHED
);
18228 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
18230 salt_t
*salt
= hash_buf
->salt
;
18236 char *type_pos
= input_buf
+ 6 + 1;
18238 char *salt_pos
= strchr (type_pos
, '*');
18240 if (salt_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
18242 uint32_t type_len
= salt_pos
- type_pos
;
18244 if (type_len
!= 1) return (PARSER_SALT_LENGTH
);
18248 char *crypted_pos
= strchr (salt_pos
, '*');
18250 if (crypted_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
18252 uint32_t salt_len
= crypted_pos
- salt_pos
;
18254 if (salt_len
!= 16) return (PARSER_SALT_LENGTH
);
18258 uint32_t crypted_len
= input_len
- 6 - 1 - type_len
- 1 - salt_len
- 1;
18260 if (crypted_len
!= 32) return (PARSER_SALT_LENGTH
);
18266 salt
->salt_buf
[0] = hex_to_uint (&salt_pos
[0]);
18267 salt
->salt_buf
[1] = hex_to_uint (&salt_pos
[8]);
18269 salt
->salt_buf
[0] = byte_swap_32 (salt
->salt_buf
[0]);
18270 salt
->salt_buf
[1] = byte_swap_32 (salt
->salt_buf
[1]);
18272 salt
->salt_buf
[2] = hex_to_uint (&crypted_pos
[ 0]);
18273 salt
->salt_buf
[3] = hex_to_uint (&crypted_pos
[ 8]);
18274 salt
->salt_buf
[4] = hex_to_uint (&crypted_pos
[16]);
18275 salt
->salt_buf
[5] = hex_to_uint (&crypted_pos
[24]);
18277 salt
->salt_len
= 24;
18278 salt
->salt_iter
= ROUNDS_RAR3
;
18280 // there's no hash for rar3. the data which is in crypted_pos is some encrypted data and
18281 // if it matches the value \xc4\x3d\x7b\x00\x40\x07\x00 after decrypt we know that we successfully cracked it.
18283 digest
[0] = 0xc43d7b00;
18284 digest
[1] = 0x40070000;
18288 return (PARSER_OK
);
18291 int cf10_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
18293 if ((input_len
< DISPLAY_LEN_MIN_12600
) || (input_len
> DISPLAY_LEN_MAX_12600
)) return (PARSER_GLOBAL_LENGTH
);
18295 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
18297 salt_t
*salt
= hash_buf
->salt
;
18299 digest
[0] = hex_to_uint (&input_buf
[ 0]);
18300 digest
[1] = hex_to_uint (&input_buf
[ 8]);
18301 digest
[2] = hex_to_uint (&input_buf
[16]);
18302 digest
[3] = hex_to_uint (&input_buf
[24]);
18303 digest
[4] = hex_to_uint (&input_buf
[32]);
18304 digest
[5] = hex_to_uint (&input_buf
[40]);
18305 digest
[6] = hex_to_uint (&input_buf
[48]);
18306 digest
[7] = hex_to_uint (&input_buf
[56]);
18308 if (input_buf
[64] != data
.separator
) return (PARSER_SEPARATOR_UNMATCHED
);
18310 uint salt_len
= input_len
- 64 - 1;
18312 char *salt_buf
= input_buf
+ 64 + 1;
18314 char *salt_buf_ptr
= (char *) salt
->salt_buf
;
18316 salt_len
= parse_and_store_salt (salt_buf_ptr
, salt_buf
, salt_len
);
18318 if (salt_len
== UINT_MAX
) return (PARSER_SALT_LENGTH
);
18320 salt
->salt_len
= salt_len
;
18323 * we can precompute the first sha256 transform
18328 w
[ 0] = byte_swap_32 (salt
->salt_buf
[ 0]);
18329 w
[ 1] = byte_swap_32 (salt
->salt_buf
[ 1]);
18330 w
[ 2] = byte_swap_32 (salt
->salt_buf
[ 2]);
18331 w
[ 3] = byte_swap_32 (salt
->salt_buf
[ 3]);
18332 w
[ 4] = byte_swap_32 (salt
->salt_buf
[ 4]);
18333 w
[ 5] = byte_swap_32 (salt
->salt_buf
[ 5]);
18334 w
[ 6] = byte_swap_32 (salt
->salt_buf
[ 6]);
18335 w
[ 7] = byte_swap_32 (salt
->salt_buf
[ 7]);
18336 w
[ 8] = byte_swap_32 (salt
->salt_buf
[ 8]);
18337 w
[ 9] = byte_swap_32 (salt
->salt_buf
[ 9]);
18338 w
[10] = byte_swap_32 (salt
->salt_buf
[10]);
18339 w
[11] = byte_swap_32 (salt
->salt_buf
[11]);
18340 w
[12] = byte_swap_32 (salt
->salt_buf
[12]);
18341 w
[13] = byte_swap_32 (salt
->salt_buf
[13]);
18342 w
[14] = byte_swap_32 (salt
->salt_buf
[14]);
18343 w
[15] = byte_swap_32 (salt
->salt_buf
[15]);
18347 pc256
[0] = SHA256M_A
;
18348 pc256
[1] = SHA256M_B
;
18349 pc256
[2] = SHA256M_C
;
18350 pc256
[3] = SHA256M_D
;
18351 pc256
[4] = SHA256M_E
;
18352 pc256
[5] = SHA256M_F
;
18353 pc256
[6] = SHA256M_G
;
18354 pc256
[7] = SHA256M_H
;
18356 sha256_64 (w
, pc256
);
18358 salt
->salt_buf_pc
[0] = pc256
[0];
18359 salt
->salt_buf_pc
[1] = pc256
[1];
18360 salt
->salt_buf_pc
[2] = pc256
[2];
18361 salt
->salt_buf_pc
[3] = pc256
[3];
18362 salt
->salt_buf_pc
[4] = pc256
[4];
18363 salt
->salt_buf_pc
[5] = pc256
[5];
18364 salt
->salt_buf_pc
[6] = pc256
[6];
18365 salt
->salt_buf_pc
[7] = pc256
[7];
18367 digest
[0] -= pc256
[0];
18368 digest
[1] -= pc256
[1];
18369 digest
[2] -= pc256
[2];
18370 digest
[3] -= pc256
[3];
18371 digest
[4] -= pc256
[4];
18372 digest
[5] -= pc256
[5];
18373 digest
[6] -= pc256
[6];
18374 digest
[7] -= pc256
[7];
18376 return (PARSER_OK
);
18379 int mywallet_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
18381 if ((input_len
< DISPLAY_LEN_MIN_12700
) || (input_len
> DISPLAY_LEN_MAX_12700
)) return (PARSER_GLOBAL_LENGTH
);
18383 if (memcmp (SIGNATURE_MYWALLET
, input_buf
, 12)) return (PARSER_SIGNATURE_UNMATCHED
);
18385 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
18387 salt_t
*salt
= hash_buf
->salt
;
18393 char *data_len_pos
= input_buf
+ 1 + 10 + 1;
18395 char *data_buf_pos
= strchr (data_len_pos
, '$');
18397 if (data_buf_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
18399 uint32_t data_len_len
= data_buf_pos
- data_len_pos
;
18401 if (data_len_len
< 1) return (PARSER_SALT_LENGTH
);
18402 if (data_len_len
> 5) return (PARSER_SALT_LENGTH
);
18406 uint32_t data_buf_len
= input_len
- 1 - 10 - 1 - data_len_len
- 1;
18408 if (data_buf_len
< 64) return (PARSER_HASH_LENGTH
);
18410 if (data_buf_len
% 16) return (PARSER_HASH_LENGTH
);
18412 uint32_t data_len
= atoi (data_len_pos
);
18414 if ((data_len
* 2) != data_buf_len
) return (PARSER_HASH_LENGTH
);
18420 char *salt_pos
= data_buf_pos
;
18422 salt
->salt_buf
[0] = hex_to_uint (&salt_pos
[ 0]);
18423 salt
->salt_buf
[1] = hex_to_uint (&salt_pos
[ 8]);
18424 salt
->salt_buf
[2] = hex_to_uint (&salt_pos
[16]);
18425 salt
->salt_buf
[3] = hex_to_uint (&salt_pos
[24]);
18427 // this is actually the CT, which is also the hash later (if matched)
18429 salt
->salt_buf
[4] = hex_to_uint (&salt_pos
[32]);
18430 salt
->salt_buf
[5] = hex_to_uint (&salt_pos
[40]);
18431 salt
->salt_buf
[6] = hex_to_uint (&salt_pos
[48]);
18432 salt
->salt_buf
[7] = hex_to_uint (&salt_pos
[56]);
18434 salt
->salt_len
= 32; // note we need to fix this to 16 in kernel
18436 salt
->salt_iter
= 10 - 1;
18442 digest
[0] = salt
->salt_buf
[4];
18443 digest
[1] = salt
->salt_buf
[5];
18444 digest
[2] = salt
->salt_buf
[6];
18445 digest
[3] = salt
->salt_buf
[7];
18447 return (PARSER_OK
);
18450 int ms_drsr_parse_hash (char *input_buf
, uint input_len
, hash_t
*hash_buf
)
18452 if ((input_len
< DISPLAY_LEN_MIN_12800
) || (input_len
> DISPLAY_LEN_MAX_12800
)) return (PARSER_GLOBAL_LENGTH
);
18454 if (memcmp (SIGNATURE_MS_DRSR
, input_buf
, 11)) return (PARSER_SIGNATURE_UNMATCHED
);
18456 uint32_t *digest
= (uint32_t *) hash_buf
->digest
;
18458 salt_t
*salt
= hash_buf
->salt
;
18464 char *salt_pos
= input_buf
+ 11 + 1;
18466 char *iter_pos
= strchr (salt_pos
, ',');
18468 if (iter_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
18470 uint32_t salt_len
= iter_pos
- salt_pos
;
18472 if (salt_len
!= 20) return (PARSER_SALT_LENGTH
);
18476 char *hash_pos
= strchr (iter_pos
, ',');
18478 if (hash_pos
== NULL
) return (PARSER_SEPARATOR_UNMATCHED
);
18480 uint32_t iter_len
= hash_pos
- iter_pos
;
18482 if (iter_len
> 5) return (PARSER_SALT_LENGTH
);
18486 uint32_t hash_len
= input_len
- 11 - 1 - salt_len
- 1 - iter_len
- 1;
18488 if (hash_len
!= 64) return (PARSER_HASH_LENGTH
);
18494 salt
->salt_buf
[0] = hex_to_uint (&salt_pos
[ 0]);
18495 salt
->salt_buf
[1] = hex_to_uint (&salt_pos
[ 8]);
18496 salt
->salt_buf
[2] = hex_to_uint (&salt_pos
[16]) & 0xffff0000;
18497 salt
->salt_buf
[3] = 0x00018000;
18499 salt
->salt_buf
[0] = byte_swap_32 (salt
->salt_buf
[0]);
18500 salt
->salt_buf
[1] = byte_swap_32 (salt
->salt_buf
[1]);
18501 salt
->salt_buf
[2] = byte_swap_32 (salt
->salt_buf
[2]);
18502 salt
->salt_buf
[3] = byte_swap_32 (salt
->salt_buf
[3]);
18504 salt
->salt_len
= salt_len
/ 2;
18506 salt
->salt_iter
= atoi (iter_pos
) - 1;
18512 digest
[0] = hex_to_uint (&hash_pos
[ 0]);
18513 digest
[1] = hex_to_uint (&hash_pos
[ 8]);
18514 digest
[2] = hex_to_uint (&hash_pos
[16]);
18515 digest
[3] = hex_to_uint (&hash_pos
[24]);
18516 digest
[4] = hex_to_uint (&hash_pos
[32]);
18517 digest
[5] = hex_to_uint (&hash_pos
[40]);
18518 digest
[6] = hex_to_uint (&hash_pos
[48]);
18519 digest
[7] = hex_to_uint (&hash_pos
[56]);
18521 return (PARSER_OK
);
18525 * parallel running threads
18530 BOOL WINAPI
sigHandler_default (DWORD sig
)
18534 case CTRL_CLOSE_EVENT
:
18537 * special case see: https://stackoverflow.com/questions/3640633/c-setconsolectrlhandler-routine-issue/5610042#5610042
18538 * if the user interacts w/ the user-interface (GUI/cmd), we need to do the finalization job within this signal handler
18539 * function otherwise it is to late (e.g. after returning from this function)
18544 SetConsoleCtrlHandler (NULL
, TRUE
);
18551 case CTRL_LOGOFF_EVENT
:
18552 case CTRL_SHUTDOWN_EVENT
:
18556 SetConsoleCtrlHandler (NULL
, TRUE
);
18564 BOOL WINAPI
sigHandler_benchmark (DWORD sig
)
18568 case CTRL_CLOSE_EVENT
:
18572 SetConsoleCtrlHandler (NULL
, TRUE
);
18579 case CTRL_LOGOFF_EVENT
:
18580 case CTRL_SHUTDOWN_EVENT
:
18584 SetConsoleCtrlHandler (NULL
, TRUE
);
18592 void hc_signal (BOOL
WINAPI (callback
) (DWORD
))
18594 if (callback
== NULL
)
18596 SetConsoleCtrlHandler ((PHANDLER_ROUTINE
) callback
, FALSE
);
18600 SetConsoleCtrlHandler ((PHANDLER_ROUTINE
) callback
, TRUE
);
18606 void sigHandler_default (int sig
)
18610 signal (sig
, NULL
);
18613 void sigHandler_benchmark (int sig
)
18617 signal (sig
, NULL
);
18620 void hc_signal (void (callback
) (int))
18622 if (callback
== NULL
) callback
= SIG_DFL
;
18624 signal (SIGINT
, callback
);
18625 signal (SIGTERM
, callback
);
18626 signal (SIGABRT
, callback
);
18631 void status_display ();
18633 void *thread_keypress (void *p
)
18635 int benchmark
= *((int *) p
);
18637 uint quiet
= data
.quiet
;
18641 while ((data
.devices_status
!= STATUS_EXHAUSTED
) && (data
.devices_status
!= STATUS_CRACKED
) && (data
.devices_status
!= STATUS_ABORTED
) && (data
.devices_status
!= STATUS_QUIT
))
18643 int ch
= tty_getchar();
18645 if (ch
== -1) break;
18647 if (ch
== 0) continue;
18653 hc_thread_mutex_lock (mux_display
);
18668 if (quiet
== 0) fprintf (stdout
, "%s", PROMPT
);
18669 if (quiet
== 0) fflush (stdout
);
18681 if (quiet
== 0) fprintf (stdout
, "%s", PROMPT
);
18682 if (quiet
== 0) fflush (stdout
);
18694 if (quiet
== 0) fprintf (stdout
, "%s", PROMPT
);
18695 if (quiet
== 0) fflush (stdout
);
18707 if (quiet
== 0) fprintf (stdout
, "%s", PROMPT
);
18708 if (quiet
== 0) fflush (stdout
);
18716 if (benchmark
== 1) break;
18718 stop_at_checkpoint ();
18722 if (quiet
== 0) fprintf (stdout
, "%s", PROMPT
);
18723 if (quiet
== 0) fflush (stdout
);
18731 if (benchmark
== 1)
18743 hc_thread_mutex_unlock (mux_display
);
18755 bool class_num (char c
)
18757 return ((c
>= '0') && (c
<= '9'));
18760 bool class_lower (char c
)
18762 return ((c
>= 'a') && (c
<= 'z'));
18765 bool class_upper (char c
)
18767 return ((c
>= 'A') && (c
<= 'Z'));
18770 bool class_alpha (char c
)
18772 return (class_lower (c
) || class_upper (c
));
18775 char conv_ctoi (char c
)
18781 else if (class_upper (c
))
18783 return c
- 'A' + (char) 10;
18786 return (char) (-1);
18789 char conv_itoc (char c
)
18797 return c
+ 'A' - (char) 10;
18800 return (char) (-1);
18807 #define INCR_POS if (++rule_pos == rule_len) return (-1)
18808 #define SET_NAME(rule,val) (rule)->cmds[rule_cnt] = ((val) & 0xff) << 0
18809 #define SET_P0(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 8
18810 #define SET_P1(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 16
18811 #define MAX_GPU_RULES 14
18812 #define GET_NAME(rule) rule_cmd = (((rule)->cmds[rule_cnt] >> 0) & 0xff)
18813 #define GET_P0(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 8) & 0xff)
18814 #define GET_P1(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 16) & 0xff)
18816 #define SET_P0_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 8
18817 #define SET_P1_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 16
18818 #define GET_P0_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 8) & 0xff)
18819 #define GET_P1_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 16) & 0xff)
18821 int cpu_rule_to_gpu_rule (char rule_buf
[BUFSIZ
], uint rule_len
, gpu_rule_t
*rule
)
18826 for (rule_pos
= 0, rule_cnt
= 0; rule_pos
< rule_len
&& rule_cnt
< MAX_GPU_RULES
; rule_pos
++, rule_cnt
++)
18828 switch (rule_buf
[rule_pos
])
18834 case RULE_OP_MANGLE_NOOP
:
18835 SET_NAME (rule
, rule_buf
[rule_pos
]);
18838 case RULE_OP_MANGLE_LREST
:
18839 SET_NAME (rule
, rule_buf
[rule_pos
]);
18842 case RULE_OP_MANGLE_UREST
:
18843 SET_NAME (rule
, rule_buf
[rule_pos
]);
18846 case RULE_OP_MANGLE_LREST_UFIRST
:
18847 SET_NAME (rule
, rule_buf
[rule_pos
]);
18850 case RULE_OP_MANGLE_UREST_LFIRST
:
18851 SET_NAME (rule
, rule_buf
[rule_pos
]);
18854 case RULE_OP_MANGLE_TREST
:
18855 SET_NAME (rule
, rule_buf
[rule_pos
]);
18858 case RULE_OP_MANGLE_TOGGLE_AT
:
18859 SET_NAME (rule
, rule_buf
[rule_pos
]);
18860 SET_P0_CONV (rule
, rule_buf
[rule_pos
]);
18863 case RULE_OP_MANGLE_REVERSE
:
18864 SET_NAME (rule
, rule_buf
[rule_pos
]);
18867 case RULE_OP_MANGLE_DUPEWORD
:
18868 SET_NAME (rule
, rule_buf
[rule_pos
]);
18871 case RULE_OP_MANGLE_DUPEWORD_TIMES
:
18872 SET_NAME (rule
, rule_buf
[rule_pos
]);
18873 SET_P0_CONV (rule
, rule_buf
[rule_pos
]);
18876 case RULE_OP_MANGLE_REFLECT
:
18877 SET_NAME (rule
, rule_buf
[rule_pos
]);
18880 case RULE_OP_MANGLE_ROTATE_LEFT
:
18881 SET_NAME (rule
, rule_buf
[rule_pos
]);
18884 case RULE_OP_MANGLE_ROTATE_RIGHT
:
18885 SET_NAME (rule
, rule_buf
[rule_pos
]);
18888 case RULE_OP_MANGLE_APPEND
:
18889 SET_NAME (rule
, rule_buf
[rule_pos
]);
18890 SET_P0 (rule
, rule_buf
[rule_pos
]);
18893 case RULE_OP_MANGLE_PREPEND
:
18894 SET_NAME (rule
, rule_buf
[rule_pos
]);
18895 SET_P0 (rule
, rule_buf
[rule_pos
]);
18898 case RULE_OP_MANGLE_DELETE_FIRST
:
18899 SET_NAME (rule
, rule_buf
[rule_pos
]);
18902 case RULE_OP_MANGLE_DELETE_LAST
:
18903 SET_NAME (rule
, rule_buf
[rule_pos
]);
18906 case RULE_OP_MANGLE_DELETE_AT
:
18907 SET_NAME (rule
, rule_buf
[rule_pos
]);
18908 SET_P0_CONV (rule
, rule_buf
[rule_pos
]);
18911 case RULE_OP_MANGLE_EXTRACT
:
18912 SET_NAME (rule
, rule_buf
[rule_pos
]);
18913 SET_P0_CONV (rule
, rule_buf
[rule_pos
]);
18914 SET_P1_CONV (rule
, rule_buf
[rule_pos
]);
18917 case RULE_OP_MANGLE_OMIT
:
18918 SET_NAME (rule
, rule_buf
[rule_pos
]);
18919 SET_P0_CONV (rule
, rule_buf
[rule_pos
]);
18920 SET_P1_CONV (rule
, rule_buf
[rule_pos
]);
18923 case RULE_OP_MANGLE_INSERT
:
18924 SET_NAME (rule
, rule_buf
[rule_pos
]);
18925 SET_P0_CONV (rule
, rule_buf
[rule_pos
]);
18926 SET_P1 (rule
, rule_buf
[rule_pos
]);
18929 case RULE_OP_MANGLE_OVERSTRIKE
:
18930 SET_NAME (rule
, rule_buf
[rule_pos
]);
18931 SET_P0_CONV (rule
, rule_buf
[rule_pos
]);
18932 SET_P1 (rule
, rule_buf
[rule_pos
]);
18935 case RULE_OP_MANGLE_TRUNCATE_AT
:
18936 SET_NAME (rule
, rule_buf
[rule_pos
]);
18937 SET_P0_CONV (rule
, rule_buf
[rule_pos
]);
18940 case RULE_OP_MANGLE_REPLACE
:
18941 SET_NAME (rule
, rule_buf
[rule_pos
]);
18942 SET_P0 (rule
, rule_buf
[rule_pos
]);
18943 SET_P1 (rule
, rule_buf
[rule_pos
]);
18946 case RULE_OP_MANGLE_PURGECHAR
:
18950 case RULE_OP_MANGLE_TOGGLECASE_REC
:
18954 case RULE_OP_MANGLE_DUPECHAR_FIRST
:
18955 SET_NAME (rule
, rule_buf
[rule_pos
]);
18956 SET_P0_CONV (rule
, rule_buf
[rule_pos
]);
18959 case RULE_OP_MANGLE_DUPECHAR_LAST
:
18960 SET_NAME (rule
, rule_buf
[rule_pos
]);
18961 SET_P0_CONV (rule
, rule_buf
[rule_pos
]);
18964 case RULE_OP_MANGLE_DUPECHAR_ALL
:
18965 SET_NAME (rule
, rule_buf
[rule_pos
]);
18968 case RULE_OP_MANGLE_SWITCH_FIRST
:
18969 SET_NAME (rule
, rule_buf
[rule_pos
]);
18972 case RULE_OP_MANGLE_SWITCH_LAST
:
18973 SET_NAME (rule
, rule_buf
[rule_pos
]);
18976 case RULE_OP_MANGLE_SWITCH_AT
:
18977 SET_NAME (rule
, rule_buf
[rule_pos
]);
18978 SET_P0_CONV (rule
, rule_buf
[rule_pos
]);
18979 SET_P1_CONV (rule
, rule_buf
[rule_pos
]);
18982 case RULE_OP_MANGLE_CHR_SHIFTL
:
18983 SET_NAME (rule
, rule_buf
[rule_pos
]);
18984 SET_P0_CONV (rule
, rule_buf
[rule_pos
]);
18987 case RULE_OP_MANGLE_CHR_SHIFTR
:
18988 SET_NAME (rule
, rule_buf
[rule_pos
]);
18989 SET_P0_CONV (rule
, rule_buf
[rule_pos
]);
18992 case RULE_OP_MANGLE_CHR_INCR
:
18993 SET_NAME (rule
, rule_buf
[rule_pos
]);
18994 SET_P0_CONV (rule
, rule_buf
[rule_pos
]);
18997 case RULE_OP_MANGLE_CHR_DECR
:
18998 SET_NAME (rule
, rule_buf
[rule_pos
]);
18999 SET_P0_CONV (rule
, rule_buf
[rule_pos
]);
19002 case RULE_OP_MANGLE_REPLACE_NP1
:
19003 SET_NAME (rule
, rule_buf
[rule_pos
]);
19004 SET_P0_CONV (rule
, rule_buf
[rule_pos
]);
19007 case RULE_OP_MANGLE_REPLACE_NM1
:
19008 SET_NAME (rule
, rule_buf
[rule_pos
]);
19009 SET_P0_CONV (rule
, rule_buf
[rule_pos
]);
19012 case RULE_OP_MANGLE_DUPEBLOCK_FIRST
:
19013 SET_NAME (rule
, rule_buf
[rule_pos
]);
19014 SET_P0_CONV (rule
, rule_buf
[rule_pos
]);
19017 case RULE_OP_MANGLE_DUPEBLOCK_LAST
:
19018 SET_NAME (rule
, rule_buf
[rule_pos
]);
19019 SET_P0_CONV (rule
, rule_buf
[rule_pos
]);
19022 case RULE_OP_MANGLE_TITLE
:
19023 SET_NAME (rule
, rule_buf
[rule_pos
]);
19032 if (rule_pos
< rule_len
) return (-1);
19037 int gpu_rule_to_cpu_rule (char rule_buf
[BUFSIZ
], gpu_rule_t
*rule
)
19041 uint rule_len
= BUFSIZ
- 1; // maximum possible len
19045 for (rule_cnt
= 0, rule_pos
= 0; rule_pos
< rule_len
&& rule_cnt
< MAX_GPU_RULES
; rule_pos
++, rule_cnt
++)
19049 if (rule_cnt
> 0) rule_buf
[rule_pos
++] = ' ';
19053 case RULE_OP_MANGLE_NOOP
:
19054 rule_buf
[rule_pos
] = rule_cmd
;
19057 case RULE_OP_MANGLE_LREST
:
19058 rule_buf
[rule_pos
] = rule_cmd
;
19061 case RULE_OP_MANGLE_UREST
:
19062 rule_buf
[rule_pos
] = rule_cmd
;
19065 case RULE_OP_MANGLE_LREST_UFIRST
:
19066 rule_buf
[rule_pos
] = rule_cmd
;
19069 case RULE_OP_MANGLE_UREST_LFIRST
:
19070 rule_buf
[rule_pos
] = rule_cmd
;
19073 case RULE_OP_MANGLE_TREST
:
19074 rule_buf
[rule_pos
] = rule_cmd
;
19077 case RULE_OP_MANGLE_TOGGLE_AT
:
19078 rule_buf
[rule_pos
] = rule_cmd
;
19079 GET_P0_CONV (rule
);
19082 case RULE_OP_MANGLE_REVERSE
:
19083 rule_buf
[rule_pos
] = rule_cmd
;
19086 case RULE_OP_MANGLE_DUPEWORD
:
19087 rule_buf
[rule_pos
] = rule_cmd
;
19090 case RULE_OP_MANGLE_DUPEWORD_TIMES
:
19091 rule_buf
[rule_pos
] = rule_cmd
;
19092 GET_P0_CONV (rule
);
19095 case RULE_OP_MANGLE_REFLECT
:
19096 rule_buf
[rule_pos
] = rule_cmd
;
19099 case RULE_OP_MANGLE_ROTATE_LEFT
:
19100 rule_buf
[rule_pos
] = rule_cmd
;
19103 case RULE_OP_MANGLE_ROTATE_RIGHT
:
19104 rule_buf
[rule_pos
] = rule_cmd
;
19107 case RULE_OP_MANGLE_APPEND
:
19108 rule_buf
[rule_pos
] = rule_cmd
;
19112 case RULE_OP_MANGLE_PREPEND
:
19113 rule_buf
[rule_pos
] = rule_cmd
;
19117 case RULE_OP_MANGLE_DELETE_FIRST
:
19118 rule_buf
[rule_pos
] = rule_cmd
;
19121 case RULE_OP_MANGLE_DELETE_LAST
:
19122 rule_buf
[rule_pos
] = rule_cmd
;
19125 case RULE_OP_MANGLE_DELETE_AT
:
19126 rule_buf
[rule_pos
] = rule_cmd
;
19127 GET_P0_CONV (rule
);
19130 case RULE_OP_MANGLE_EXTRACT
:
19131 rule_buf
[rule_pos
] = rule_cmd
;
19132 GET_P0_CONV (rule
);
19133 GET_P1_CONV (rule
);
19136 case RULE_OP_MANGLE_OMIT
:
19137 rule_buf
[rule_pos
] = rule_cmd
;
19138 GET_P0_CONV (rule
);
19139 GET_P1_CONV (rule
);
19142 case RULE_OP_MANGLE_INSERT
:
19143 rule_buf
[rule_pos
] = rule_cmd
;
19144 GET_P0_CONV (rule
);
19148 case RULE_OP_MANGLE_OVERSTRIKE
:
19149 rule_buf
[rule_pos
] = rule_cmd
;
19150 GET_P0_CONV (rule
);
19154 case RULE_OP_MANGLE_TRUNCATE_AT
:
19155 rule_buf
[rule_pos
] = rule_cmd
;
19156 GET_P0_CONV (rule
);
19159 case RULE_OP_MANGLE_REPLACE
:
19160 rule_buf
[rule_pos
] = rule_cmd
;
19165 case RULE_OP_MANGLE_PURGECHAR
:
19169 case RULE_OP_MANGLE_TOGGLECASE_REC
:
19173 case RULE_OP_MANGLE_DUPECHAR_FIRST
:
19174 rule_buf
[rule_pos
] = rule_cmd
;
19175 GET_P0_CONV (rule
);
19178 case RULE_OP_MANGLE_DUPECHAR_LAST
:
19179 rule_buf
[rule_pos
] = rule_cmd
;
19180 GET_P0_CONV (rule
);
19183 case RULE_OP_MANGLE_DUPECHAR_ALL
:
19184 rule_buf
[rule_pos
] = rule_cmd
;
19187 case RULE_OP_MANGLE_SWITCH_FIRST
:
19188 rule_buf
[rule_pos
] = rule_cmd
;
19191 case RULE_OP_MANGLE_SWITCH_LAST
:
19192 rule_buf
[rule_pos
] = rule_cmd
;
19195 case RULE_OP_MANGLE_SWITCH_AT
:
19196 rule_buf
[rule_pos
] = rule_cmd
;
19197 GET_P0_CONV (rule
);
19198 GET_P1_CONV (rule
);
19201 case RULE_OP_MANGLE_CHR_SHIFTL
:
19202 rule_buf
[rule_pos
] = rule_cmd
;
19203 GET_P0_CONV (rule
);
19206 case RULE_OP_MANGLE_CHR_SHIFTR
:
19207 rule_buf
[rule_pos
] = rule_cmd
;
19208 GET_P0_CONV (rule
);
19211 case RULE_OP_MANGLE_CHR_INCR
:
19212 rule_buf
[rule_pos
] = rule_cmd
;
19213 GET_P0_CONV (rule
);
19216 case RULE_OP_MANGLE_CHR_DECR
:
19217 rule_buf
[rule_pos
] = rule_cmd
;
19218 GET_P0_CONV (rule
);
19221 case RULE_OP_MANGLE_REPLACE_NP1
:
19222 rule_buf
[rule_pos
] = rule_cmd
;
19223 GET_P0_CONV (rule
);
19226 case RULE_OP_MANGLE_REPLACE_NM1
:
19227 rule_buf
[rule_pos
] = rule_cmd
;
19228 GET_P0_CONV (rule
);
19231 case RULE_OP_MANGLE_DUPEBLOCK_FIRST
:
19232 rule_buf
[rule_pos
] = rule_cmd
;
19233 GET_P0_CONV (rule
);
19236 case RULE_OP_MANGLE_DUPEBLOCK_LAST
:
19237 rule_buf
[rule_pos
] = rule_cmd
;
19238 GET_P0_CONV (rule
);
19241 case RULE_OP_MANGLE_TITLE
:
19242 rule_buf
[rule_pos
] = rule_cmd
;
19246 return rule_pos
- 1;
19264 * CPU rules : this is from hashcat sources, cpu based rules
19267 #define NEXT_RULEPOS(rp) if (++(rp) == rule_len) return (RULE_RC_SYNTAX_ERROR)
19268 #define NEXT_RPTOI(r,rp,up) if (((up) = conv_ctoi ((r)[(rp)])) == -1) return (RULE_RC_SYNTAX_ERROR)
19270 #define MANGLE_TOGGLE_AT(a,p) if (class_alpha ((a)[(p)])) (a)[(p)] ^= 0x20
19271 #define MANGLE_LOWER_AT(a,p) if (class_upper ((a)[(p)])) (a)[(p)] ^= 0x20
19272 #define MANGLE_UPPER_AT(a,p) if (class_lower ((a)[(p)])) (a)[(p)] ^= 0x20
19274 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); arr[(r)] = arr[(l)]; arr[(l)] = c; } */
19275 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); (a)[(r)] = (a)[(l)]; (a)[(l)] = c; } */
19276 #define MANGLE_SWITCH(a,l,r) { char c = (a)[(r)]; (a)[(r)] = (a)[(l)]; (a)[(l)] = c; }
19278 int mangle_lrest (char arr
[BLOCK_SIZE
], int arr_len
)
19282 for (pos
= 0; pos
< arr_len
; pos
++) MANGLE_LOWER_AT (arr
, pos
);
19287 int mangle_urest (char arr
[BLOCK_SIZE
], int arr_len
)
19291 for (pos
= 0; pos
< arr_len
; pos
++) MANGLE_UPPER_AT (arr
, pos
);
19296 int mangle_trest (char arr
[BLOCK_SIZE
], int arr_len
)
19300 for (pos
= 0; pos
< arr_len
; pos
++) MANGLE_TOGGLE_AT (arr
, pos
);
19305 int mangle_reverse (char arr
[BLOCK_SIZE
], int arr_len
)
19310 for (l
= 0; l
< arr_len
; l
++)
19312 r
= arr_len
- 1 - l
;
19316 MANGLE_SWITCH (arr
, l
, r
);
19322 int mangle_double (char arr
[BLOCK_SIZE
], int arr_len
)
19324 if ((arr_len
* 2) >= BLOCK_SIZE
) return (arr_len
);
19326 memcpy (&arr
[arr_len
], arr
, (size_t) arr_len
);
19328 return (arr_len
* 2);
19331 int mangle_double_times (char arr
[BLOCK_SIZE
], int arr_len
, int times
)
19333 if (((arr_len
* times
) + arr_len
) >= BLOCK_SIZE
) return (arr_len
);
19335 int orig_len
= arr_len
;
19339 for (i
= 0; i
< times
; i
++)
19341 memcpy (&arr
[arr_len
], arr
, orig_len
);
19343 arr_len
+= orig_len
;
19349 int mangle_reflect (char arr
[BLOCK_SIZE
], int arr_len
)
19351 if ((arr_len
* 2) >= BLOCK_SIZE
) return (arr_len
);
19353 mangle_double (arr
, arr_len
);
19355 mangle_reverse (arr
+ arr_len
, arr_len
);
19357 return (arr_len
* 2);
19360 int mangle_rotate_left (char arr
[BLOCK_SIZE
], int arr_len
)
19365 for (l
= 0, r
= arr_len
- 1; r
> 0; r
--)
19367 MANGLE_SWITCH (arr
, l
, r
);
19373 int mangle_rotate_right (char arr
[BLOCK_SIZE
], int arr_len
)
19378 for (l
= 0, r
= arr_len
- 1; l
< r
; l
++)
19380 MANGLE_SWITCH (arr
, l
, r
);
19386 int mangle_append (char arr
[BLOCK_SIZE
], int arr_len
, char c
)
19388 if ((arr_len
+ 1) >= BLOCK_SIZE
) return (arr_len
);
19392 return (arr_len
+ 1);
19395 int mangle_prepend (char arr
[BLOCK_SIZE
], int arr_len
, char c
)
19397 if ((arr_len
+ 1) >= BLOCK_SIZE
) return (arr_len
);
19401 for (arr_pos
= arr_len
- 1; arr_pos
> -1; arr_pos
--)
19403 arr
[arr_pos
+ 1] = arr
[arr_pos
];
19408 return (arr_len
+ 1);
19411 int mangle_delete_at (char arr
[BLOCK_SIZE
], int arr_len
, int upos
)
19413 if (upos
>= arr_len
) return (arr_len
);
19417 for (arr_pos
= upos
; arr_pos
< arr_len
- 1; arr_pos
++)
19419 arr
[arr_pos
] = arr
[arr_pos
+ 1];
19422 return (arr_len
- 1);
19425 int mangle_extract (char arr
[BLOCK_SIZE
], int arr_len
, int upos
, int ulen
)
19427 if (upos
>= arr_len
) return (arr_len
);
19429 if ((upos
+ ulen
) > arr_len
) return (arr_len
);
19433 for (arr_pos
= 0; arr_pos
< ulen
; arr_pos
++)
19435 arr
[arr_pos
] = arr
[upos
+ arr_pos
];
19441 int mangle_omit (char arr
[BLOCK_SIZE
], int arr_len
, int upos
, int ulen
)
19443 if (upos
>= arr_len
) return (arr_len
);
19445 if ((upos
+ ulen
) >= arr_len
) return (arr_len
);
19449 for (arr_pos
= upos
; arr_pos
< arr_len
- ulen
; arr_pos
++)
19451 arr
[arr_pos
] = arr
[arr_pos
+ ulen
];
19454 return (arr_len
- ulen
);
19457 int mangle_insert (char arr
[BLOCK_SIZE
], int arr_len
, int upos
, char c
)
19459 if (upos
>= arr_len
) return (arr_len
);
19461 if ((arr_len
+ 1) >= BLOCK_SIZE
) return (arr_len
);
19465 for (arr_pos
= arr_len
- 1; arr_pos
> upos
- 1; arr_pos
--)
19467 arr
[arr_pos
+ 1] = arr
[arr_pos
];
19472 return (arr_len
+ 1);
19475 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
)
19477 if ((arr_len
+ arr2_cpy
) > BLOCK_SIZE
) return (RULE_RC_REJECT_ERROR
);
19479 if (arr_pos
> arr_len
) return (RULE_RC_REJECT_ERROR
);
19481 if (arr2_pos
> arr2_len
) return (RULE_RC_REJECT_ERROR
);
19483 if ((arr2_pos
+ arr2_cpy
) > arr2_len
) return (RULE_RC_REJECT_ERROR
);
19485 if (arr2_cpy
< 1) return (RULE_RC_SYNTAX_ERROR
);
19487 memcpy (arr2
, arr2
+ arr2_pos
, arr2_len
- arr2_pos
);
19489 memcpy (arr2
+ arr2_cpy
, arr
+ arr_pos
, arr_len
- arr_pos
);
19491 memcpy (arr
+ arr_pos
, arr2
, arr_len
- arr_pos
+ arr2_cpy
);
19493 return (arr_len
+ arr2_cpy
);
19496 int mangle_overstrike (char arr
[BLOCK_SIZE
], int arr_len
, int upos
, char c
)
19498 if (upos
>= arr_len
) return (arr_len
);
19505 int mangle_truncate_at (char arr
[BLOCK_SIZE
], int arr_len
, int upos
)
19507 if (upos
>= arr_len
) return (arr_len
);
19509 memset (arr
+ upos
, 0, arr_len
- upos
);
19514 int mangle_replace (char arr
[BLOCK_SIZE
], int arr_len
, char oldc
, char newc
)
19518 for (arr_pos
= 0; arr_pos
< arr_len
; arr_pos
++)
19520 if (arr
[arr_pos
] != oldc
) continue;
19522 arr
[arr_pos
] = newc
;
19528 int mangle_purgechar (char arr
[BLOCK_SIZE
], int arr_len
, char c
)
19534 for (ret_len
= 0, arr_pos
= 0; arr_pos
< arr_len
; arr_pos
++)
19536 if (arr
[arr_pos
] == c
) continue;
19538 arr
[ret_len
] = arr
[arr_pos
];
19546 int mangle_dupeblock_prepend (char arr
[BLOCK_SIZE
], int arr_len
, int ulen
)
19548 if (ulen
> arr_len
) return (arr_len
);
19550 if ((arr_len
+ ulen
) >= BLOCK_SIZE
) return (arr_len
);
19554 memcpy (cs
, arr
, ulen
);
19558 for (i
= 0; i
< ulen
; i
++)
19562 arr_len
= mangle_insert (arr
, arr_len
, i
, c
);
19568 int mangle_dupeblock_append (char arr
[BLOCK_SIZE
], int arr_len
, int ulen
)
19570 if (ulen
> arr_len
) return (arr_len
);
19572 if ((arr_len
+ ulen
) >= BLOCK_SIZE
) return (arr_len
);
19574 int upos
= arr_len
- ulen
;
19578 for (i
= 0; i
< ulen
; i
++)
19580 char c
= arr
[upos
+ i
];
19582 arr_len
= mangle_append (arr
, arr_len
, c
);
19588 int mangle_dupechar_at (char arr
[BLOCK_SIZE
], int arr_len
, int upos
, int ulen
)
19590 if ( arr_len
== 0) return (arr_len
);
19591 if ((arr_len
+ ulen
) >= BLOCK_SIZE
) return (arr_len
);
19593 char c
= arr
[upos
];
19597 for (i
= 0; i
< ulen
; i
++)
19599 arr_len
= mangle_insert (arr
, arr_len
, upos
, c
);
19605 int mangle_dupechar (char arr
[BLOCK_SIZE
], int arr_len
)
19607 if ( arr_len
== 0) return (arr_len
);
19608 if ((arr_len
+ arr_len
) >= BLOCK_SIZE
) return (arr_len
);
19612 for (arr_pos
= arr_len
- 1; arr_pos
> -1; arr_pos
--)
19614 int new_pos
= arr_pos
* 2;
19616 arr
[new_pos
] = arr
[arr_pos
];
19618 arr
[new_pos
+ 1] = arr
[arr_pos
];
19621 return (arr_len
* 2);
19624 int mangle_switch_at_check (char arr
[BLOCK_SIZE
], int arr_len
, int upos
, int upos2
)
19626 if (upos
>= arr_len
) return (arr_len
);
19627 if (upos2
>= arr_len
) return (arr_len
);
19629 MANGLE_SWITCH (arr
, upos
, upos2
);
19634 int mangle_switch_at (char arr
[BLOCK_SIZE
], int arr_len
, int upos
, int upos2
)
19636 MANGLE_SWITCH (arr
, upos
, upos2
);
19641 int mangle_chr_shiftl (uint8_t arr
[BLOCK_SIZE
], int arr_len
, int upos
)
19643 if (upos
>= arr_len
) return (arr_len
);
19650 int mangle_chr_shiftr (uint8_t arr
[BLOCK_SIZE
], int arr_len
, int upos
)
19652 if (upos
>= arr_len
) return (arr_len
);
19659 int mangle_chr_incr (uint8_t arr
[BLOCK_SIZE
], int arr_len
, int upos
)
19661 if (upos
>= arr_len
) return (arr_len
);
19668 int mangle_chr_decr (uint8_t arr
[BLOCK_SIZE
], int arr_len
, int upos
)
19670 if (upos
>= arr_len
) return (arr_len
);
19677 int mangle_title (char arr
[BLOCK_SIZE
], int arr_len
)
19679 int upper_next
= 1;
19683 for (pos
= 0; pos
< arr_len
; pos
++)
19685 if (arr
[pos
] == ' ')
19696 MANGLE_UPPER_AT (arr
, pos
);
19700 MANGLE_LOWER_AT (arr
, pos
);
19707 int generate_random_rule (char rule_buf
[RP_RULE_BUFSIZ
], uint32_t rp_gen_func_min
, uint32_t rp_gen_func_max
)
19709 uint32_t rp_gen_num
= get_random_num (rp_gen_func_min
, rp_gen_func_max
);
19713 uint32_t rule_pos
= 0;
19715 for (j
= 0; j
< rp_gen_num
; j
++)
19722 switch ((char) get_random_num (0, 9))
19725 r
= get_random_num (0, sizeof (grp_op_nop
));
19726 rule_buf
[rule_pos
++] = grp_op_nop
[r
];
19730 r
= get_random_num (0, sizeof (grp_op_pos_p0
));
19731 rule_buf
[rule_pos
++] = grp_op_pos_p0
[r
];
19732 p1
= get_random_num (0, sizeof (grp_pos
));
19733 rule_buf
[rule_pos
++] = grp_pos
[p1
];
19737 r
= get_random_num (0, sizeof (grp_op_pos_p1
));
19738 rule_buf
[rule_pos
++] = grp_op_pos_p1
[r
];
19739 p1
= get_random_num (1, 6);
19740 rule_buf
[rule_pos
++] = grp_pos
[p1
];
19744 r
= get_random_num (0, sizeof (grp_op_chr
));
19745 rule_buf
[rule_pos
++] = grp_op_chr
[r
];
19746 p1
= get_random_num (0x20, 0x7e);
19747 rule_buf
[rule_pos
++] = (char) p1
;
19751 r
= get_random_num (0, sizeof (grp_op_chr_chr
));
19752 rule_buf
[rule_pos
++] = grp_op_chr_chr
[r
];
19753 p1
= get_random_num (0x20, 0x7e);
19754 rule_buf
[rule_pos
++] = (char) p1
;
19755 p2
= get_random_num (0x20, 0x7e);
19757 p2
= get_random_num (0x20, 0x7e);
19758 rule_buf
[rule_pos
++] = (char) p2
;
19762 r
= get_random_num (0, sizeof (grp_op_pos_chr
));
19763 rule_buf
[rule_pos
++] = grp_op_pos_chr
[r
];
19764 p1
= get_random_num (0, sizeof (grp_pos
));
19765 rule_buf
[rule_pos
++] = grp_pos
[p1
];
19766 p2
= get_random_num (0x20, 0x7e);
19767 rule_buf
[rule_pos
++] = (char) p2
;
19771 r
= get_random_num (0, sizeof (grp_op_pos_pos0
));
19772 rule_buf
[rule_pos
++] = grp_op_pos_pos0
[r
];
19773 p1
= get_random_num (0, sizeof (grp_pos
));
19774 rule_buf
[rule_pos
++] = grp_pos
[p1
];
19775 p2
= get_random_num (0, sizeof (grp_pos
));
19777 p2
= get_random_num (0, sizeof (grp_pos
));
19778 rule_buf
[rule_pos
++] = grp_pos
[p2
];
19782 r
= get_random_num (0, sizeof (grp_op_pos_pos1
));
19783 rule_buf
[rule_pos
++] = grp_op_pos_pos1
[r
];
19784 p1
= get_random_num (0, sizeof (grp_pos
));
19785 rule_buf
[rule_pos
++] = grp_pos
[p1
];
19786 p2
= get_random_num (1, sizeof (grp_pos
));
19788 p2
= get_random_num (1, sizeof (grp_pos
));
19789 rule_buf
[rule_pos
++] = grp_pos
[p2
];
19793 r
= get_random_num (0, sizeof (grp_op_pos1_pos2_pos3
));
19794 rule_buf
[rule_pos
++] = grp_op_pos1_pos2_pos3
[r
];
19795 p1
= get_random_num (0, sizeof (grp_pos
));
19796 rule_buf
[rule_pos
++] = grp_pos
[p1
];
19797 p2
= get_random_num (1, sizeof (grp_pos
));
19798 rule_buf
[rule_pos
++] = grp_pos
[p1
];
19799 p3
= get_random_num (0, sizeof (grp_pos
));
19800 rule_buf
[rule_pos
++] = grp_pos
[p3
];
19808 int _old_apply_rule (char *rule
, int rule_len
, char in
[BLOCK_SIZE
], int in_len
, char out
[BLOCK_SIZE
])
19810 char mem
[BLOCK_SIZE
];
19812 if (in
== NULL
) return (RULE_RC_REJECT_ERROR
);
19814 if (out
== NULL
) return (RULE_RC_REJECT_ERROR
);
19816 if (in_len
< 1) return (RULE_RC_REJECT_ERROR
);
19818 if (rule_len
< 1) return (RULE_RC_REJECT_ERROR
);
19820 int out_len
= in_len
;
19821 int mem_len
= in_len
;
19823 memcpy (out
, in
, out_len
);
19827 for (rule_pos
= 0; rule_pos
< rule_len
; rule_pos
++)
19829 int upos
; int upos2
;
19832 switch (rule
[rule_pos
])
19837 case RULE_OP_MANGLE_NOOP
:
19840 case RULE_OP_MANGLE_LREST
:
19841 out_len
= mangle_lrest (out
, out_len
);
19844 case RULE_OP_MANGLE_UREST
:
19845 out_len
= mangle_urest (out
, out_len
);
19848 case RULE_OP_MANGLE_LREST_UFIRST
:
19849 out_len
= mangle_lrest (out
, out_len
);
19850 if (out_len
) MANGLE_UPPER_AT (out
, 0);
19853 case RULE_OP_MANGLE_UREST_LFIRST
:
19854 out_len
= mangle_urest (out
, out_len
);
19855 if (out_len
) MANGLE_LOWER_AT (out
, 0);
19858 case RULE_OP_MANGLE_TREST
:
19859 out_len
= mangle_trest (out
, out_len
);
19862 case RULE_OP_MANGLE_TOGGLE_AT
:
19863 NEXT_RULEPOS (rule_pos
);
19864 NEXT_RPTOI (rule
, rule_pos
, upos
);
19865 if (upos
< out_len
) MANGLE_TOGGLE_AT (out
, upos
);
19868 case RULE_OP_MANGLE_REVERSE
:
19869 out_len
= mangle_reverse (out
, out_len
);
19872 case RULE_OP_MANGLE_DUPEWORD
:
19873 out_len
= mangle_double (out
, out_len
);
19876 case RULE_OP_MANGLE_DUPEWORD_TIMES
:
19877 NEXT_RULEPOS (rule_pos
);
19878 NEXT_RPTOI (rule
, rule_pos
, ulen
);
19879 out_len
= mangle_double_times (out
, out_len
, ulen
);
19882 case RULE_OP_MANGLE_REFLECT
:
19883 out_len
= mangle_reflect (out
, out_len
);
19886 case RULE_OP_MANGLE_ROTATE_LEFT
:
19887 mangle_rotate_left (out
, out_len
);
19890 case RULE_OP_MANGLE_ROTATE_RIGHT
:
19891 mangle_rotate_right (out
, out_len
);
19894 case RULE_OP_MANGLE_APPEND
:
19895 NEXT_RULEPOS (rule_pos
);
19896 out_len
= mangle_append (out
, out_len
, rule
[rule_pos
]);
19899 case RULE_OP_MANGLE_PREPEND
:
19900 NEXT_RULEPOS (rule_pos
);
19901 out_len
= mangle_prepend (out
, out_len
, rule
[rule_pos
]);
19904 case RULE_OP_MANGLE_DELETE_FIRST
:
19905 out_len
= mangle_delete_at (out
, out_len
, 0);
19908 case RULE_OP_MANGLE_DELETE_LAST
:
19909 out_len
= mangle_delete_at (out
, out_len
, (out_len
) ? out_len
- 1 : 0);
19912 case RULE_OP_MANGLE_DELETE_AT
:
19913 NEXT_RULEPOS (rule_pos
);
19914 NEXT_RPTOI (rule
, rule_pos
, upos
);
19915 out_len
= mangle_delete_at (out
, out_len
, upos
);
19918 case RULE_OP_MANGLE_EXTRACT
:
19919 NEXT_RULEPOS (rule_pos
);
19920 NEXT_RPTOI (rule
, rule_pos
, upos
);
19921 NEXT_RULEPOS (rule_pos
);
19922 NEXT_RPTOI (rule
, rule_pos
, ulen
);
19923 out_len
= mangle_extract (out
, out_len
, upos
, ulen
);
19926 case RULE_OP_MANGLE_OMIT
:
19927 NEXT_RULEPOS (rule_pos
);
19928 NEXT_RPTOI (rule
, rule_pos
, upos
);
19929 NEXT_RULEPOS (rule_pos
);
19930 NEXT_RPTOI (rule
, rule_pos
, ulen
);
19931 out_len
= mangle_omit (out
, out_len
, upos
, ulen
);
19934 case RULE_OP_MANGLE_INSERT
:
19935 NEXT_RULEPOS (rule_pos
);
19936 NEXT_RPTOI (rule
, rule_pos
, upos
);
19937 NEXT_RULEPOS (rule_pos
);
19938 out_len
= mangle_insert (out
, out_len
, upos
, rule
[rule_pos
]);
19941 case RULE_OP_MANGLE_OVERSTRIKE
:
19942 NEXT_RULEPOS (rule_pos
);
19943 NEXT_RPTOI (rule
, rule_pos
, upos
);
19944 NEXT_RULEPOS (rule_pos
);
19945 out_len
= mangle_overstrike (out
, out_len
, upos
, rule
[rule_pos
]);
19948 case RULE_OP_MANGLE_TRUNCATE_AT
:
19949 NEXT_RULEPOS (rule_pos
);
19950 NEXT_RPTOI (rule
, rule_pos
, upos
);
19951 out_len
= mangle_truncate_at (out
, out_len
, upos
);
19954 case RULE_OP_MANGLE_REPLACE
:
19955 NEXT_RULEPOS (rule_pos
);
19956 NEXT_RULEPOS (rule_pos
);
19957 out_len
= mangle_replace (out
, out_len
, rule
[rule_pos
- 1], rule
[rule_pos
]);
19960 case RULE_OP_MANGLE_PURGECHAR
:
19961 NEXT_RULEPOS (rule_pos
);
19962 out_len
= mangle_purgechar (out
, out_len
, rule
[rule_pos
]);
19965 case RULE_OP_MANGLE_TOGGLECASE_REC
:
19969 case RULE_OP_MANGLE_DUPECHAR_FIRST
:
19970 NEXT_RULEPOS (rule_pos
);
19971 NEXT_RPTOI (rule
, rule_pos
, ulen
);
19972 out_len
= mangle_dupechar_at (out
, out_len
, 0, ulen
);
19975 case RULE_OP_MANGLE_DUPECHAR_LAST
:
19976 NEXT_RULEPOS (rule_pos
);
19977 NEXT_RPTOI (rule
, rule_pos
, ulen
);
19978 out_len
= mangle_dupechar_at (out
, out_len
, out_len
- 1, ulen
);
19981 case RULE_OP_MANGLE_DUPECHAR_ALL
:
19982 out_len
= mangle_dupechar (out
, out_len
);
19985 case RULE_OP_MANGLE_DUPEBLOCK_FIRST
:
19986 NEXT_RULEPOS (rule_pos
);
19987 NEXT_RPTOI (rule
, rule_pos
, ulen
);
19988 out_len
= mangle_dupeblock_prepend (out
, out_len
, ulen
);
19991 case RULE_OP_MANGLE_DUPEBLOCK_LAST
:
19992 NEXT_RULEPOS (rule_pos
);
19993 NEXT_RPTOI (rule
, rule_pos
, ulen
);
19994 out_len
= mangle_dupeblock_append (out
, out_len
, ulen
);
19997 case RULE_OP_MANGLE_SWITCH_FIRST
:
19998 if (out_len
>= 2) mangle_switch_at (out
, out_len
, 0, 1);
20001 case RULE_OP_MANGLE_SWITCH_LAST
:
20002 if (out_len
>= 2) mangle_switch_at (out
, out_len
, out_len
- 1, out_len
- 2);
20005 case RULE_OP_MANGLE_SWITCH_AT
:
20006 NEXT_RULEPOS (rule_pos
);
20007 NEXT_RPTOI (rule
, rule_pos
, upos
);
20008 NEXT_RULEPOS (rule_pos
);
20009 NEXT_RPTOI (rule
, rule_pos
, upos2
);
20010 out_len
= mangle_switch_at_check (out
, out_len
, upos
, upos2
);
20013 case RULE_OP_MANGLE_CHR_SHIFTL
:
20014 NEXT_RULEPOS (rule_pos
);
20015 NEXT_RPTOI (rule
, rule_pos
, upos
);
20016 mangle_chr_shiftl ((uint8_t *) out
, out_len
, upos
);
20019 case RULE_OP_MANGLE_CHR_SHIFTR
:
20020 NEXT_RULEPOS (rule_pos
);
20021 NEXT_RPTOI (rule
, rule_pos
, upos
);
20022 mangle_chr_shiftr ((uint8_t *) out
, out_len
, upos
);
20025 case RULE_OP_MANGLE_CHR_INCR
:
20026 NEXT_RULEPOS (rule_pos
);
20027 NEXT_RPTOI (rule
, rule_pos
, upos
);
20028 mangle_chr_incr ((uint8_t *) out
, out_len
, upos
);
20031 case RULE_OP_MANGLE_CHR_DECR
:
20032 NEXT_RULEPOS (rule_pos
);
20033 NEXT_RPTOI (rule
, rule_pos
, upos
);
20034 mangle_chr_decr ((uint8_t *) out
, out_len
, upos
);
20037 case RULE_OP_MANGLE_REPLACE_NP1
:
20038 NEXT_RULEPOS (rule_pos
);
20039 NEXT_RPTOI (rule
, rule_pos
, upos
);
20040 if ((upos
>= 0) && ((upos
+ 1) < out_len
)) mangle_overstrike (out
, out_len
, upos
, out
[upos
+ 1]);
20043 case RULE_OP_MANGLE_REPLACE_NM1
:
20044 NEXT_RULEPOS (rule_pos
);
20045 NEXT_RPTOI (rule
, rule_pos
, upos
);
20046 if ((upos
>= 1) && ((upos
+ 0) < out_len
)) mangle_overstrike (out
, out_len
, upos
, out
[upos
- 1]);
20049 case RULE_OP_MANGLE_TITLE
:
20050 out_len
= mangle_title (out
, out_len
);
20053 case RULE_OP_MANGLE_EXTRACT_MEMORY
:
20054 if (mem_len
< 1) return (RULE_RC_REJECT_ERROR
);
20055 NEXT_RULEPOS (rule_pos
);
20056 NEXT_RPTOI (rule
, rule_pos
, upos
);
20057 NEXT_RULEPOS (rule_pos
);
20058 NEXT_RPTOI (rule
, rule_pos
, ulen
);
20059 NEXT_RULEPOS (rule_pos
);
20060 NEXT_RPTOI (rule
, rule_pos
, upos2
);
20061 if ((out_len
= mangle_insert_multi (out
, out_len
, upos2
, mem
, mem_len
, upos
, ulen
)) < 1) return (out_len
);
20064 case RULE_OP_MANGLE_APPEND_MEMORY
:
20065 if (mem_len
< 1) return (RULE_RC_REJECT_ERROR
);
20066 if ((out_len
+ mem_len
) > BLOCK_SIZE
) return (RULE_RC_REJECT_ERROR
);
20067 memcpy (out
+ out_len
, mem
, mem_len
);
20068 out_len
+= mem_len
;
20071 case RULE_OP_MANGLE_PREPEND_MEMORY
:
20072 if (mem_len
< 1) return (RULE_RC_REJECT_ERROR
);
20073 if ((mem_len
+ out_len
) > BLOCK_SIZE
) return (RULE_RC_REJECT_ERROR
);
20074 memcpy (mem
+ mem_len
, out
, out_len
);
20075 out_len
+= mem_len
;
20076 memcpy (out
, mem
, out_len
);
20079 case RULE_OP_MEMORIZE_WORD
:
20080 memcpy (mem
, out
, out_len
);
20084 case RULE_OP_REJECT_LESS
:
20085 NEXT_RULEPOS (rule_pos
);
20086 NEXT_RPTOI (rule
, rule_pos
, upos
);
20087 if (out_len
> upos
) return (RULE_RC_REJECT_ERROR
);
20090 case RULE_OP_REJECT_GREATER
:
20091 NEXT_RULEPOS (rule_pos
);
20092 NEXT_RPTOI (rule
, rule_pos
, upos
);
20093 if (out_len
< upos
) return (RULE_RC_REJECT_ERROR
);
20096 case RULE_OP_REJECT_CONTAIN
:
20097 NEXT_RULEPOS (rule_pos
);
20098 if (strchr (out
, rule
[rule_pos
]) != NULL
) return (RULE_RC_REJECT_ERROR
);
20101 case RULE_OP_REJECT_NOT_CONTAIN
:
20102 NEXT_RULEPOS (rule_pos
);
20103 if (strchr (out
, rule
[rule_pos
]) == NULL
) return (RULE_RC_REJECT_ERROR
);
20106 case RULE_OP_REJECT_EQUAL_FIRST
:
20107 NEXT_RULEPOS (rule_pos
);
20108 if (out
[0] != rule
[rule_pos
]) return (RULE_RC_REJECT_ERROR
);
20111 case RULE_OP_REJECT_EQUAL_LAST
:
20112 NEXT_RULEPOS (rule_pos
);
20113 if (out
[out_len
- 1] != rule
[rule_pos
]) return (RULE_RC_REJECT_ERROR
);
20116 case RULE_OP_REJECT_EQUAL_AT
:
20117 NEXT_RULEPOS (rule_pos
);
20118 NEXT_RPTOI (rule
, rule_pos
, upos
);
20119 if ((upos
+ 1) > out_len
) return (RULE_RC_REJECT_ERROR
);
20120 NEXT_RULEPOS (rule_pos
);
20121 if (out
[upos
] != rule
[rule_pos
]) return (RULE_RC_REJECT_ERROR
);
20124 case RULE_OP_REJECT_CONTAINS
:
20125 NEXT_RULEPOS (rule_pos
);
20126 NEXT_RPTOI (rule
, rule_pos
, upos
);
20127 if ((upos
+ 1) > out_len
) return (RULE_RC_REJECT_ERROR
);
20128 NEXT_RULEPOS (rule_pos
);
20129 int c
; int cnt
; for (c
= 0, cnt
= 0; c
< out_len
; c
++) if (out
[c
] == rule
[rule_pos
]) cnt
++;
20130 if (cnt
< upos
) return (RULE_RC_REJECT_ERROR
);
20133 case RULE_OP_REJECT_MEMORY
:
20134 if ((out_len
== mem_len
) && (memcmp (out
, mem
, out_len
) == 0)) return (RULE_RC_REJECT_ERROR
);
20138 return (RULE_RC_SYNTAX_ERROR
);
20143 memset (out
+ out_len
, 0, BLOCK_SIZE
- out_len
);