4 ## Author......: Jens Steube <jens.steube@gmail.com>
10 use Digest
::MD4 qw
(md4 md4_hex
);
11 use Digest
::MD5 qw
(md5 md5_hex
);
12 use Digest
::SHA qw
(sha1 sha256 sha384 sha512 sha1_hex sha256_hex sha384_hex sha512_hex
);
13 use Digest
::HMAC qw
(hmac hmac_hex
);
14 use Digest
::Keccak qw
(keccak_256_hex
);
15 use Crypt
::MySQL qw
(password41
);
16 use Digest
::GOST qw
(gost gost_hex
);
17 use Digest
::HMAC_MD5 qw
(hmac_md5
);
18 use Digest
::CRC qw
(crc32
);
21 use Crypt
::ECB qw
(encrypt PADDING_AUTO PADDING_NONE
);
23 use Crypt
::Eksblowfish
::Bcrypt qw
(bcrypt en_base64
);
24 use Crypt
::Digest
::RIPEMD160 qw
(ripemd160_hex
);
25 use Crypt
::Digest
::Whirlpool qw
(whirlpool_hex
);
27 use Crypt
::ScryptKDF qw
(scrypt_hash scrypt_b64
);
30 use Crypt
::UnixCrypt_XS qw
(crypt_rounds fold_password base64_to_int24 block_to_base64 int24_to_base64
);
32 use Authen
::Passphrase
::NTHash
;
33 use Authen
::Passphrase
::MySQL323
;
34 use Authen
::Passphrase
::PHPass
;
35 use Authen
::Passphrase
::LANManager
;
37 use POSIX qw
(strftime
);
39 use Net
::DNS
::RR
::NSEC3
;
40 use Convert
::EBCDIC qw
(ascii2ebcdic
);
41 use Digest
::SipHash qw
/siphash/;
43 my $hashcat = "./oclHashcat";
47 my @modes = (0, 10, 11, 12, 20, 21, 22, 23, 30, 40, 50, 60, 100, 101, 110, 111, 112, 120, 121, 122, 130, 131, 132, 140, 141, 150, 160, 190, 200, 300, 400, 500, 900, 1000, 1100, 1400, 1410, 1420, 1430, 1440, 1441, 1450, 1460, 1500, 1600, 1700, 1710, 1711, 1720, 1730, 1740, 1722, 1731, 1750, 1760, 1800, 2100, 2400, 2410, 2500, 2600, 2611, 2612, 2711, 2811, 3000, 3100, 3200, 3710, 3711, 3300, 3500, 3610, 3720, 3800, 3910, 4010, 4110, 4210, 4300, 4400, 4500, 4600, 4700, 4800, 4900, 5000, 5100, 5300, 5400, 5500, 5600, 5700, 5800, 6000, 6100, 6300, 6400, 6500, 6600, 6700, 6800, 6900, 7100, 7200, 7300, 7400, 7500, 7600, 7700, 7800, 7900, 8000, 8100, 8200, 8300, 8400, 8500, 8600, 8700, 8900, 9100, 9200, 9300, 9400, 9500, 9600, 9700, 9800, 9900, 10000, 10100, 10200, 10300, 10400, 10500, 10600, 10700, 10800, 10900, 11000, 11100, 11200, 11300, 11400, 11500, 11600, 11900, 12000, 12100, 12200, 12300, 12400, 12600, 12700, 12800, 12900, 13000, 13100, 13200, 13300);
49 my %is_unicode = map { $_ => 1 } qw(30 40 130 131 132 140 141 1000 1100 1430 1440 1441 1730 1740 1731 5500 5600 8000 9400 9500 9600 9700 9800);
50 my %less_fifteen = map { $_ => 1 } qw(500 1600 1800 2400 2410 3200 6300 7400 10500 10700);
51 my %allow_long_salt = map { $_ => 1 } qw(2500 5500 5600 7100 7200 7300 9400 9500 9600 9700 9800 10400 10500 10600 10700 1100 11000 11200 11300 11400 11600 12600);
53 my @lotus_magic_table =
55 0xbd, 0x56, 0xea, 0xf2, 0xa2, 0xf1, 0xac, 0x2a,
56 0xb0, 0x93, 0xd1, 0x9c, 0x1b, 0x33, 0xfd, 0xd0,
57 0x30, 0x04, 0xb6, 0xdc, 0x7d, 0xdf, 0x32, 0x4b,
58 0xf7, 0xcb, 0x45, 0x9b, 0x31, 0xbb, 0x21, 0x5a,
59 0x41, 0x9f, 0xe1, 0xd9, 0x4a, 0x4d, 0x9e, 0xda,
60 0xa0, 0x68, 0x2c, 0xc3, 0x27, 0x5f, 0x80, 0x36,
61 0x3e, 0xee, 0xfb, 0x95, 0x1a, 0xfe, 0xce, 0xa8,
62 0x34, 0xa9, 0x13, 0xf0, 0xa6, 0x3f, 0xd8, 0x0c,
63 0x78, 0x24, 0xaf, 0x23, 0x52, 0xc1, 0x67, 0x17,
64 0xf5, 0x66, 0x90, 0xe7, 0xe8, 0x07, 0xb8, 0x60,
65 0x48, 0xe6, 0x1e, 0x53, 0xf3, 0x92, 0xa4, 0x72,
66 0x8c, 0x08, 0x15, 0x6e, 0x86, 0x00, 0x84, 0xfa,
67 0xf4, 0x7f, 0x8a, 0x42, 0x19, 0xf6, 0xdb, 0xcd,
68 0x14, 0x8d, 0x50, 0x12, 0xba, 0x3c, 0x06, 0x4e,
69 0xec, 0xb3, 0x35, 0x11, 0xa1, 0x88, 0x8e, 0x2b,
70 0x94, 0x99, 0xb7, 0x71, 0x74, 0xd3, 0xe4, 0xbf,
71 0x3a, 0xde, 0x96, 0x0e, 0xbc, 0x0a, 0xed, 0x77,
72 0xfc, 0x37, 0x6b, 0x03, 0x79, 0x89, 0x62, 0xc6,
73 0xd7, 0xc0, 0xd2, 0x7c, 0x6a, 0x8b, 0x22, 0xa3,
74 0x5b, 0x05, 0x5d, 0x02, 0x75, 0xd5, 0x61, 0xe3,
75 0x18, 0x8f, 0x55, 0x51, 0xad, 0x1f, 0x0b, 0x5e,
76 0x85, 0xe5, 0xc2, 0x57, 0x63, 0xca, 0x3d, 0x6c,
77 0xb4, 0xc5, 0xcc, 0x70, 0xb2, 0x91, 0x59, 0x0d,
78 0x47, 0x20, 0xc8, 0x4f, 0x58, 0xe0, 0x01, 0xe2,
79 0x16, 0x38, 0xc4, 0x6f, 0x3b, 0x0f, 0x65, 0x46,
80 0xbe, 0x7e, 0x2d, 0x7b, 0x82, 0xf9, 0x40, 0xb5,
81 0x1d, 0x73, 0xf8, 0xeb, 0x26, 0xc7, 0x87, 0x97,
82 0x25, 0x54, 0xb1, 0x28, 0xaa, 0x98, 0x9d, 0xa5,
83 0x64, 0x6d, 0x7a, 0xd4, 0x10, 0x81, 0x44, 0xef,
84 0x49, 0xd6, 0xae, 0x2e, 0xdd, 0x76, 0x5c, 0x2f,
85 0xa7, 0x1c, 0xc9, 0x09, 0x69, 0x9a, 0x83, 0xcf,
86 0x29, 0x39, 0xb9, 0xe9, 0x4c, 0xff, 0x43, 0xab
91 0x28, 0xbf, 0x4e, 0x5e, 0x4e, 0x75, 0x8a, 0x41,
92 0x64, 0x00, 0x4e, 0x56, 0xff, 0xfa, 0x01, 0x08,
93 0x2e, 0x2e, 0x00, 0xb6, 0xd0, 0x68, 0x3e, 0x80,
94 0x2f, 0x0c, 0xa9, 0xfe, 0x64, 0x53, 0x69, 0x7a
97 my $CISCO_BASE64_MAPPING = {'A', '.', 'B', '/', 'C', '0', 'D', '1', 'E', '2', 'F', '3', 'G', '4', 'H', '5', 'I', '6', 'J', '7', 'K', '8', 'L', '9', 'M', 'A', 'N', 'B', 'O', 'C', 'P', 'D', 'Q', 'E', 'R', 'F', 'S', 'G', 'T', 'H', 'U', 'I', 'V', 'J', 'W', 'K', 'X', 'L', 'Y', 'M', 'Z', 'N', 'a', 'O', 'b', 'P', 'c', 'Q', 'd', 'R', 'e', 'S', 'f', 'T', 'g', 'U', 'h', 'V', 'i', 'W', 'j', 'X', 'k', 'Y', 'l', 'Z', 'm', 'a', 'n', 'b', 'o', 'c', 'p', 'd', 'q', 'e', 'r', 'f', 's', 'g', 't', 'h', 'u', 'i', 'v', 'j', 'w', 'k', 'x', 'l', 'y', 'm', 'z', 'n', '0', 'o', '1', 'p', '2', 'q', '3', 'r', '4', 's', '5', 't', '6', 'u', '7', 'v', '8', 'w', '9', 'x', '+', 'y', '/', 'z'};
110 if ($type ne "verify")
112 if (scalar @ARGV > 1)
117 elsif (scalar @ARGV == 1)
127 if ($type eq "single")
131 elsif ($type eq "passthrough")
142 if (scalar @ARGV != 4)
147 my $mode = shift @ARGV;
148 my $hash_file = shift @ARGV;
149 my $in_file = shift @ARGV;
150 my $out_file = shift @ARGV;
154 open (IN
, "<", $hash_file) or die ("$hash_file: $!\n");
156 # clever ? the resulting database could be huge
157 # but we need some way to map lines in hashfile w/ cracks
158 # maybe rli2 way would be more clever (needs sorted input)
160 while (my $line = <IN
>)
162 $line =~ s/[\n\r]*$//;
164 $db->{$line} = undef;
169 verify
($mode, $db, $in_file, $out_file);
177 my $out_file = shift;
196 open (IN
, "<", $in_file) or die ("$in_file: $!\n");
197 open (OUT
, ">", $out_file) or die ("$out_file: $!\n");
201 my $base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
202 my $itoa64_1 = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
203 my $itoa64_2 = "./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
205 while (my $line = <IN
>)
212 # remember always do "exists ($db->{$hash_in})" checks as soon as possible and don't forget it
215 if ($mode == 0 || $mode == 100 || $mode == 101 || $mode == 190 || $mode == 200 || $mode == 300 || $mode == 900 || $mode == 1000 || $mode == 1400 || $mode == 1700 || $mode == 2400 || $mode == 2600 || $mode == 3000 || $mode == 3500 || $mode == 4300 || $mode == 4400 || $mode == 4500 || $mode == 4600 || $mode == 4700 || $mode == 5000 || $mode == 5100 || $mode == 5700 || $mode == 6000 || $mode == 6100 || $mode == 6900 || $mode == 8600 || $mode == 9900 || $mode == 10800 || $mode == 11500)
217 my $index = index ($line, ":");
221 $hash_in = substr ($line, 0, $index);
223 next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in})));
225 $word = substr ($line, $index + 1);
228 elsif ($mode == 10 || $mode == 11 || $mode == 12 || $mode == 20 || $mode == 21 || $mode == 22 || $mode == 23 || $mode == 30 || $mode == 40 || $mode == 50 || $mode == 60 || $mode == 110 || $mode == 112 || $mode == 120 || $mode == 121 || $mode == 130 || $mode == 140 || $mode == 150 || $mode == 160 || $mode == 1100 || $mode == 1410 || $mode == 1420 || $mode == 1430 || $mode == 1440 || $mode == 1450 || $mode == 1460 || $mode == 1710 || $mode == 1720 || $mode == 1730 || $mode == 1740 || $mode == 1750 || $mode == 1760 || $mode == 2410 || $mode == 2611 || $mode == 2711 || $mode == 2811 || $mode == 3100 || $mode == 3610 || $mode == 3710 || $mode == 3720 || $mode == 3800 || $mode == 3910 || $mode == 4010 || $mode == 4110 || $mode == 4210 || $mode == 4900 || $mode == 5800 || $mode == 7600 || $mode == 8400 || $mode == 11000 || $mode == 12600)
231 my $index1 = index ($line, ":");
235 $hash_in = substr ($line, 0, $index1);
237 # identify lenghts of both salt and plain
239 my $salt_plain = substr ($line, $index1 + 1);
241 my $num_cols = () = $salt_plain =~ /:/g;
250 foreach (my $i = 0; $i < $num_cols; $i++)
252 $index2 = index ($salt_plain, ":", $start);
256 $start = $index2 + 1;
258 $salt = substr ($salt_plain, 0, $index2);
259 $word = substr ($salt_plain, $index2 + 1);
261 # can't be true w/ wrong $hash:$salt, otherwise the
262 # algo must have many collisions
264 if (exists ($db->{$hash_in . ":" . $salt}))
266 $hash_in = $hash_in . ":" . $salt;
272 next unless ($matched); # therefore: true == exists ($db->{$hash_in}
273 next unless (! defined ($db->{$hash_in}));
276 elsif ($mode == 2100)
279 my $index1 = index ($line, "\$DCC2\$");
281 next if $index1 != 0;
284 my $index2 = index ($line, "#", $index1 + 1);
288 $iter = substr ($line, $index1 + 6, $index2 - $index1 - 6);
291 $index1 = index ($line, "#");
295 $hash_in = substr ($line, 0, $index1 + 1);
297 # identify lenghts of both salt and plain
299 my $salt_plain = substr ($line, $index2 + 1);
301 my $num_cols = () = $salt_plain =~ /:/g;
311 foreach (my $i = 0; $i < $num_cols; $i++)
313 $index2 = index ($salt_plain, ":", $start);
317 $start = $index2 + 1;
319 $index3 = rindex ($salt_plain, "#", $index2);
321 $raw_hash = substr ($salt_plain, $index3 + 1, $index2 - $index3 - 1);
322 $salt = substr ($salt_plain, 0, $index3);
323 $word = substr ($salt_plain, $index2 + 1);
325 if (exists ($db->{$hash_in . $salt . "#" .$raw_hash}))
327 $hash_in = $hash_in . $salt . "#" . $raw_hash;
333 next unless ($matched); # therefore: true == exists ($db->{$hash_in}
334 next unless (! defined ($db->{$hash_in}));
336 # salt:hash guaranteed only : because of hex salt
337 elsif ($mode == 7300)
339 # split hash and plain
340 my $index1 = index ($line, ":");
344 $salt = substr ($line, 0, $index1);
346 $salt = pack ("H*", $salt);
348 my $rest = substr ($line, $index1 + 1);
350 my $index2 = index ($rest, ":");
354 $hash_in = substr ($rest, 0, $index2);
356 $word = substr ($rest, $index2 + 1);
358 next unless (exists ($db->{$salt . ":" . $hash_in}) and (! defined ($db->{$hash_in})));
361 elsif ($mode == 8100)
363 # split hash and plain
364 $salt = substr ($line, 1, 8);
366 my $rest = substr ($line, 1 + 8);
368 my $index2 = index ($rest, ":");
372 $hash_in = substr ($rest, 0, $index2);
374 $word = substr ($rest, $index2 + 1);
376 next unless (exists ($db->{"1" . $salt . $hash_in}) and (! defined ($db->{$hash_in})));
378 # base64 and salt embedded SSHA1, salt length = total lenght - 20
381 # split hash and plain
382 my $index = index ($line, ":");
386 $hash_in = substr ($line, 0, $index);
387 $word = substr ($line, $index + 1);
389 next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in})));
392 my $plain_base64 = substr ($hash_in, 6);
394 # base64 decode to extract salt
395 my $decoded = decode_base64
($plain_base64);
397 $salt = substr ($decoded, 20);
399 # base64 and salt embedded SSHA512, salt length = total length - 64
400 elsif ($mode == 1711)
402 # split hash and plain
403 my $index = index ($line, ":");
407 $hash_in = substr ($line, 0, $index);
408 $word = substr ($line, $index + 1);
410 next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in})));
413 my $plain_base64 = substr ($hash_in, 9);
415 # base64 decode to extract salt
416 my $decoded = decode_base64
($plain_base64);
418 $salt = substr ($decoded, 64);
420 # OSX (first 8 hex chars is salt)
421 elsif ($mode == 122 || $mode == 1722)
423 my $index = index ($line, ":");
427 $hash_in = substr ($line, 0, $index);
428 $word = substr ($line, $index + 1);
430 next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in})));
432 $salt = substr ($hash_in, 0, 8);
434 # MSSQL (2000, 2005 AND 2012), salt after version number
435 elsif ($mode == 131 || $mode == 132 || $mode == 1731)
437 my $index = index ($line, ":");
441 $hash_in = substr ($line, 0, $index);
442 $word = substr ($line, $index + 1);
444 next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in})));
446 $salt = substr ($hash_in, 6, 8);
449 elsif ($mode == 8000)
451 my $index = index ($line, ":");
455 $hash_in = substr ($line, 0, $index);
456 $word = substr ($line, $index + 1);
458 next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in})));
460 $salt = substr ($hash_in, 6, 16);
463 elsif ($mode == 141 || $mode == 1441)
465 my $index1 = index ($line, ":");
469 $hash_in = substr ($line, 0, $index1);
470 $word = substr ($line, $index1 + 1);
472 next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in})));
474 my $index2 = index ($line, "*", 14);
476 #extract salt from base64
477 my $plain_base64 = substr ($hash_in, 14, $index2 - 14);
479 $salt = decode_base64
($plain_base64);
481 # phpass (first 8 after $P$/$H$ -- or $S$ with drupal7)
482 elsif ($mode == 400 || $mode == 7900)
484 my $index = index ($line, ":");
488 $hash_in = substr ($line, 0, $index);
489 $word = substr ($line, $index + 1);
491 next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in})));
493 $salt = substr ($hash_in, 4, 8);
495 # iterations = 2 ^ cost (where cost == $iter)
496 $iter = index ($itoa64_1, substr ($hash_in, 3, 1));
498 # $something$[rounds=iter$]salt$ (get last $, then check iter)
499 elsif ($mode == 500 || $mode == 1600 || $mode == 1800 || $mode == 3300 || $mode == 7400)
501 my $index1 = index ($line, ":", 30);
505 $hash_in = substr ($line, 0, $index1);
506 $word = substr ($line, $index1 + 1);
508 next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in})));
510 $index1 = index ($hash_in, ",", 1);
511 my $index2 = index ($hash_in, "\$", 1);
515 if ($index1 < $index2)
521 $param = substr ($hash_in, $index2, 1);
525 # rounds= if available
528 if (substr ($hash_in, $index2, 7) eq "rounds=")
530 my $old_index = $index2;
532 $index2 = index ($hash_in, "\$", $index2 + 1);
536 $iter = substr ($hash_in, $old_index + 7, $index2 - $old_index - 7);
542 my $index3 = rindex ($hash_in, "\$");
546 $salt = substr ($hash_in, $index2, $index3 - $index2);
548 # descrypt (salt in first 2 char)
549 elsif ($mode == 1500)
551 my $index = index ($line, ":");
555 $hash_in = substr ($line, 0, $index);
556 $word = substr ($line, $index + 1);
558 next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in})));
560 $salt = substr ($hash_in, 0, 2);
562 # bcrypt $something$something$salt.hash
563 elsif ($mode == 3200)
565 my $index1 = index ($line, ":", 33);
569 $hash_in = substr ($line, 0, $index1);
570 $word = substr ($line, $index1 + 1);
572 next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in})));
574 my $index2 = index ($hash_in, "\$", 4);
576 $iter = substr ($hash_in, 4, $index2 - 4);
578 my $plain_base64 = substr ($hash_in, $index2 + 1, 22);
583 for (my $i = 0; $i < length ($plain_base64); $i++)
585 my $char = substr ($plain_base64, $i, 1);
586 $encoded .= substr ($base64, index ($itoa64_2, $char), 1);
589 $salt = decode_base64
($encoded);
592 elsif ($mode == 4800)
594 my $index1 = index ($line, ":");
598 my $index2 = index ($line, ":", $index1 + 1);
602 my $index3 = index ($line, ":", $index2 + 1);
606 $salt = substr ($line, $index1 + 1, $index3 - $index1 - 1);
608 $word = substr ($line, $index3 + 1);
610 $hash_in = substr ($line, 0, $index3);
613 elsif ($mode == 5300 || $mode == 5400)
615 my $num_cols = () = $line =~ /:/g;
617 next unless ($num_cols >= 9);
622 for (my $j = 0; $j < 9; $j++)
624 $index1 = index ($line, ":", $index1 + 1);
635 $word = substr ($line, $index1 + 1);
637 $hash_in = substr ($line, 0, $index1);
639 next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in})));
641 my $index2 = rindex ($line, ":", $index1 - 1);
643 $salt = substr ($line, 0, $index2);
646 elsif ($mode == 5500)
648 my $index1 = index ($line, "::");
652 my $index2 = index ($line, ":", $index1 + 2);
656 $index2 = index ($line, ":", $index2 + 1);
660 $salt = substr ($line, 0, $index2);
662 $index2 = index ($line, ":", $index2 + 1);
666 $salt .= substr ($line, $index2 + 1, 16);
668 $index2 = index ($line, ":", $index2 + 1);
672 $hash_in = substr ($line, 0, $index2);
674 next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in})));
676 $word = substr ($line, $index2 + 1);
679 elsif ($mode == 5600)
681 my $index1 = index ($line, "::");
685 my $index2 = index ($line, ":", $index1 + 2);
689 $index2 = index ($line, ":", $index2 + 1);
693 $salt = substr ($line, 0, $index2);
695 $index1 = index ($line, ":", $index2 + 1);
699 $index2 = index ($line, ":", $index1 + 1);
703 $salt .= substr ($line, $index1 + 1, $index2 - $index1 - 1);
705 $hash_in = substr ($line, 0, $index2);
707 # do it later on for this hash mode:
708 # next unless ((exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))) or (exists ($db->{$mod}) and (! defined ($db->{$mod}))));
710 $word = substr ($line, $index2 + 1);
712 # AIX smd5 something BRACE salt$
713 elsif ($mode == 6300)
715 my $index1 = index ($line, ":");
719 $hash_in = substr ($line, 0, $index1);
720 $word = substr ($line, $index1 + 1);
722 next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in})));
724 my $index2 = index ($hash_in, "}");
725 my $index3 = rindex ($hash_in, "\$");
727 $salt = substr ($hash_in, $index2 + 1, $index3 - $index2 - 1);
729 # AIX: something$salt$ (no $ at position 1)
730 elsif ($mode == 6400 || $mode == 6500 || $mode == 6700)
732 my $index1 = index ($line, ":");
736 $hash_in = substr ($line, 0, $index1);
737 $word = substr ($line, $index1 + 1);
739 next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in})));
741 my $index2 = index ($hash_in, "}");
742 my $index3 = index ($hash_in, "\$");
743 my $index4 = rindex ($hash_in, "\$");
745 $salt = substr ($hash_in, $index3 + 1, $index4 - $index3 - 1);
747 $iter = substr ($hash_in, $index2 + 1, $index3 - $index2 - 1);
749 # 1Password, agilekeychain
750 elsif ($mode == 6600)
752 my $num_cols = () = $line =~ /:/g;
754 next unless ($num_cols > 2);
756 my $index1 = index ($line, ":");
760 $iter = substr ($line, 0, $index1);
762 my $index2 = index ($line, ":", $index1 + 1);
766 $salt = substr ($line, $index1 + 1, $index2 - $index1 - 1);
768 $index1 = index ($line, ":", $index2 + 1);
772 $salt .= substr ($line, $index2 + 1, $index1 - $index2 - 33);
774 $hash_in = substr ($line, 0, $index1);
776 next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in})));
778 $word = substr ($line, $index1 + 1);
780 # 1Password, cloudkeychain
781 elsif ($mode == 8200)
783 my @datas = split (":", $line);
785 next if scalar @datas < 4;
787 my $hash = shift @datas;
788 $salt = shift @datas;
789 $iter = shift @datas;
790 my $data = shift @datas;
792 $hash_in = $hash . ":" . $salt . ":" . $iter . ":" . $data;
796 $word = join (":", @datas);
798 next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in})));
800 # lastpass (hash:iter:salt)
801 elsif ($mode == 6800)
803 my $index1 = index ($line, ":", 34);
807 $hash_in = substr ($line, 0, $index1);
809 # identify lenghts of both salt and plain
811 my $salt_plain = substr ($line, $index1 + 1);
813 my $num_cols = () = $salt_plain =~ /:/g;
822 foreach (my $i = 0; $i < $num_cols; $i++)
824 $index2 = index ($salt_plain, ":", $start);
828 $start = $index2 + 1;
830 $salt = substr ($salt_plain, 0, $index2);
831 $word = substr ($salt_plain, $index2 + 1);
833 # can't be true w/ wrong $hash:$salt, otherwise the
834 # algo must have many collisions
836 if (exists ($db->{$hash_in . ":" . $salt}))
838 $hash_in = $hash_in . ":" . $salt;
844 next unless ($matched); # therefore: true == exists ($db->{$hash_in}
845 next unless (! defined ($db->{$hash_in}));
847 $index1 = index ($hash_in, ":");
848 $index2 = index ($hash_in, ":", $index1 + 1);
850 $iter = substr ($hash_in, $index1 + 1, $index2 - $index1 - 1);
851 $salt = substr ($hash_in, $index2 + 1);
853 # OSX 10.* : $something$iter$salt$
854 elsif ($mode == 7100)
856 my $index1 = index ($line, ":");
860 $hash_in = substr ($line, 0, $index1);
861 $word = substr ($line, $index1 + 1);
863 next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in})));
865 my $index2 = index ($hash_in, "\$", 5);
869 my $index3 = index ($hash_in, "\$", $index2 + 1);
871 $salt = substr ($hash_in, $index2 + 1, $index3 - $index2 - 1);
873 $iter = substr ($hash_in, 4, $index2 - 4);
875 next if (int ($iter) < 1);
877 # grub: something1.something2.something3.iter.salt.
878 elsif ($mode == 7200)
880 my $index1 = index ($line, ":");
884 $hash_in = substr ($line, 0, $index1);
885 $word = substr ($line, $index1 + 1);
887 next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in})));
889 my $index2 = index ($hash_in, ".", 19);
893 my $index3 = index ($hash_in, ".", $index2 + 1);
895 $salt = substr ($hash_in, $index2 + 1, $index3 - $index2 - 1);
897 $iter = substr ($hash_in, 19, $index2 - 19);
899 next if (int ($iter) < 1);
901 # $something1$something2$something3$something4$salt$
902 elsif ($mode == 7500 )
904 my $index1 = index ($line, "\$", 11);
908 my $index2 = index ($line, "\$", $index1 + 1);
912 my $index3 = index ($line, "\$", $index2 + 1);
916 $index2 = index ($line, ":", $index3 + 1);
920 $hash_in = substr ($line, 0, $index2);
921 $word = substr ($line, $index2 + 1);
923 next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in})));
925 $salt = substr ($hash_in, 11, $index3 - 10);
926 $salt .= substr ($hash_in, $index2 - 32) . "\$\$";
927 $salt .= substr ($hash_in, $index3 + 1, $index2 - $index3 - 32 - 1);
930 elsif ($mode == 7700 || $mode == 7800)
932 my $index1 = index ($line, ":");
936 my @split1 = split (":", $line);
938 my @split2 = split ('\$', $split1[0]);
940 next unless scalar @split2 == 2;
942 $hash_in = $split1[0];
944 if (scalar @split1 > 1)
953 next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in})));
958 elsif ($mode == 8300)
960 my @datas = split (":", $line);
962 next if scalar @datas != 5;
967 ($hash, $domain, $salt, $iter, $word) = @datas;
969 $hash_in = $hash . ":" . $domain . ":" . $salt . ":" . $iter;
971 next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in})));
973 $salt = $domain . ":" . $salt;
976 elsif ($mode == 8500)
978 my @line_elements = split (":", $line);
980 next if scalar @line_elements < 2;
984 $hash_in = shift @line_elements;
986 $word = join (":", @line_elements);
990 my @hash_elements = split ('\*', $hash_in);
992 next unless ($hash_elements[0] eq '$racf$');
994 $salt = $hash_elements[1];
996 next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in})));
999 elsif ($mode == 8700)
1001 # split hash and plain
1002 my $index = index ($line, ":");
1006 $hash_in = substr ($line, 0, $index);
1007 $word = substr ($line, $index + 1);
1009 next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in})));
1011 my $plain_base64 = substr ($hash_in, 2, -1);
1013 ($_, $salt, $param) = domino_decode
($plain_base64);
1016 elsif ($mode == 2612)
1018 next unless (substr ($line, 0, 6) eq '$PHPS$');
1021 my $index1 = index ($line, "\$", 6);
1023 next if $index1 < 1;
1025 $salt = substr ($line, 6, $index1 - 6);
1027 $salt = pack ("H*", $salt);
1029 my $index2 = index ($line, "\:", $index1 + 1);
1031 next if $index2 < 1;
1033 $word = substr ($line, $index2 + 1);
1035 $hash_in = substr ($line, 0, $index2);
1037 next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in})));
1040 elsif ($mode == 3711)
1042 next unless (substr ($line, 0, 3) eq '$B$');
1045 my $index1 = index ($line, "\$", 3);
1047 next if $index1 < 1;
1049 $salt = substr ($line, 3, $index1 - 3);
1051 my $index2 = index ($line, ":", $index1 + 1);
1053 next if $index2 < 1;
1055 $word = substr ($line, $index2 + 1);
1057 $hash_in = substr ($line, 0, $index2);
1059 next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in})));
1062 elsif ($mode == 8900)
1064 next unless (substr ($line, 0, 7) eq 'SCRYPT:');
1067 my $index1 = index ($line, ":", 7);
1069 next if $index1 < 1;
1072 my $N = substr ($line, 7, $index1 - 7);
1074 my $index2 = index ($line, ":", $index1 + 1);
1076 next if $index2 < 1;
1079 my $r = substr ($line, $index1 + 1, $index2 - $index1 - 1);
1081 $index1 = index ($line, ":", $index2 + 1);
1083 next if $index1 < 1;
1086 my $p = substr ($line, $index2 + 1, $index1 - $index2 - 1);
1092 $index2 = index ($line, ":", $index1 + 1);
1094 next if $index2 < 1;
1097 $salt = substr ($line, $index1 + 1, $index2 - $index1 - 1);
1099 $salt = decode_base64
($salt);
1101 $index1 = index ($line, ":", $index2 + 1);
1103 next if $index1 < 1;
1107 $word = substr ($line, $index1 + 1);
1108 $hash_in = substr ($line, 0, $index1);
1110 next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in})));
1113 elsif ($mode == 9100)
1115 # split hash and plain
1116 my $index = index ($line, ":");
1120 $hash_in = substr ($line, 0, $index);
1121 $word = substr ($line, $index + 1);
1123 next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in})));
1125 my $base64_part = substr ($hash_in, 2, -1);
1127 ($_, $salt, $iter, $param) = domino_85x_decode
($base64_part);
1129 next if ($iter < 1);
1131 # Cisco $8$ - PBKDF2-HMAC-SHA256
1132 elsif ($mode == 9200)
1134 next unless (substr ($line, 0, 3) eq '$8$');
1137 my $index1 = index ($line, "\$", 3);
1139 next if $index1 != 17;
1141 my $index2 = index ($line, "\$", $index1 + 1);
1144 $salt = substr ($line, 3, $index1 - 3);
1146 $index1 = index ($line, ":", $index1 + 1);
1148 next if $index1 < 1;
1152 $word = substr ($line, $index1 + 1);
1153 $hash_in = substr ($line, 0, $index1);
1155 next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in})));
1157 # Cisco $9$ - scrypt
1158 elsif ($mode == 9300)
1160 next unless (substr ($line, 0, 3) eq '$9$');
1163 my $index1 = index ($line, "\$", 3);
1165 next if $index1 != 17;
1167 my $index2 = index ($line, "\$", $index1 + 1);
1170 $salt = substr ($line, 3, $index1 - 3);
1172 $index1 = index ($line, ":", $index1 + 1);
1174 next if $index1 < 1;
1178 $word = substr ($line, $index1 + 1);
1179 $hash_in = substr ($line, 0, $index1);
1181 next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in})));
1184 elsif ($mode == 9400)
1186 ($hash_in, $word) = split ":", $line;
1188 next unless defined $hash_in;
1189 next unless defined $word;
1191 my @data = split /\*/, $hash_in;
1193 next unless scalar @data == 8;
1195 next unless (shift @data eq '$office$');
1196 next unless (shift @data eq '2007');
1197 next unless (shift @data eq '20');
1199 my $aes_key_size = shift @data;
1201 next unless (($aes_key_size eq '128') || ($aes_key_size eq '256'));
1202 next unless (shift @data eq '16');
1204 next unless (length $data[0] == 32);
1205 next unless (length $data[1] == 32);
1206 next unless (length $data[2] == 40);
1208 $salt = shift @data;
1209 $param = shift @data;
1210 $param2 = $aes_key_size;
1212 next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in})));
1215 elsif ($mode == 9500)
1217 ($hash_in, $word) = split ":", $line;
1219 next unless defined $hash_in;
1220 next unless defined $word;
1222 my @data = split /\*/, $hash_in;
1224 next unless scalar @data == 8;
1226 next unless (shift @data eq '$office$');
1227 next unless (shift @data eq '2010');
1228 next unless (shift @data eq '100000');
1229 next unless (shift @data eq '128');
1230 next unless (shift @data eq '16');
1232 next unless (length $data[0] == 32);
1233 next unless (length $data[1] == 32);
1234 next unless (length $data[2] == 64);
1236 $salt = shift @data;
1237 $param = shift @data;
1239 next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in})));
1242 elsif ($mode == 9600)
1244 ($hash_in, $word) = split ":", $line;
1246 next unless defined $hash_in;
1247 next unless defined $word;
1249 my @data = split /\*/, $hash_in;
1251 next unless scalar @data == 8;
1253 next unless (shift @data eq '$office$');
1254 next unless (shift @data eq '2013');
1255 next unless (shift @data eq '100000');
1256 next unless (shift @data eq '256');
1257 next unless (shift @data eq '16');
1259 next unless (length $data[0] == 32);
1260 next unless (length $data[1] == 32);
1261 next unless (length $data[2] == 64);
1263 $salt = shift @data;
1264 $param = shift @data;
1266 next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in})));
1269 elsif ($mode == 9700)
1271 ($hash_in, $word) = split ":", $line;
1273 next unless defined $hash_in;
1274 next unless defined $word;
1276 my @data = split /\*/, $hash_in;
1278 next unless scalar @data == 4;
1280 my $signature = shift @data;
1282 next unless (($signature eq '$oldoffice$0') || ($signature eq '$oldoffice$1'));
1284 next unless (length $data[0] == 32);
1285 next unless (length $data[1] == 32);
1286 next unless (length $data[2] == 32);
1288 $salt = shift @data;
1289 $param = shift @data;
1290 $param2 = substr ($signature, 11, 1);
1292 next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in})));
1295 elsif ($mode == 9800)
1297 ($hash_in, $word) = split ":", $line;
1299 next unless defined $hash_in;
1300 next unless defined $word;
1302 my @data = split /\*/, $hash_in;
1304 next unless scalar @data == 4;
1306 my $signature = shift @data;
1308 next unless (($signature eq '$oldoffice$3') || ($signature eq '$oldoffice$4'));
1310 next unless (length $data[0] == 32);
1311 next unless (length $data[1] == 32);
1312 next unless (length $data[2] == 40);
1314 $salt = shift @data;
1315 $param = shift @data;
1316 $param2 = substr ($signature, 11, 1);
1318 next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in})));
1320 # Django (PBKDF2-SHA256)
1321 elsif ($mode == 10000)
1323 next unless (substr ($line, 0, 14) eq 'pbkdf2_sha256$');
1326 my $index1 = index ($line, "\$", 14);
1328 next if $index1 < 1;
1330 my $index2 = index ($line, "\$", $index1 + 1);
1334 $iter = substr ($line, 14, $index1 - 14);
1338 $salt = substr ($line, $index1 + 1, $index2 - $index1 - 1);
1342 $index1 = index ($line, ":", $index2 + 1);
1344 next if $index1 < 1;
1346 $word = substr ($line, $index1 + 1);
1347 $hash_in = substr ($line, 0, $index1);
1349 next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in})));
1352 elsif ($mode == 10100)
1356 ($hash, undef, undef, $salt, $word) = split ":", $line;
1358 next unless defined $hash;
1359 next unless defined $salt;
1360 next unless defined $word;
1362 next unless (length $hash == 16);
1363 next unless (length $salt == 32);
1365 my $hash_in = sprintf ("%s:2:4:%s", $hash, $salt);
1367 next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in})));
1370 elsif ($mode == 10200)
1372 next unless (substr ($line, 0, 10) eq '$cram_md5$');
1375 my $index1 = index ($line, "\$", 10);
1377 next if $index1 < 1;
1381 my $challengeb64 = substr ($line, 10, $index1 - 10);
1382 $salt = decode_base64
($challengeb64);
1386 my $index2 = index ($line, ":", $index1 + 1);
1388 next if $index2 < 1;
1390 my $responseb64 = substr ($line, $index1 + 1, $index2 - $index1 - 1);
1391 my $response = decode_base64
($responseb64);
1393 $param = substr ($response, 0, length ($response) - 32 - 1); # -1 is for space
1395 $word = substr ($line, $index2 + 1);
1396 $hash_in = substr ($line, 0, $index2);
1398 next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in})));
1400 # SAP CODVN H (PWDSALTEDHASH) iSSHA-1
1401 elsif ($mode == 10300)
1403 next unless (substr ($line, 0, 10) eq '{x-issha, ');
1407 my $index1 = index ($line, "}", 10);
1409 next if $index1 < 1;
1411 $iter = substr ($line, 10, $index1 - 10);
1413 $iter = int ($iter);
1417 my $base64_encoded = substr ($line, $index1 + 1);
1418 my $base64_decoded = decode_base64
($base64_encoded);
1420 $salt = substr ($base64_decoded, 20);
1422 my $index2 = index ($line, ":", $index1 + 1);
1424 next if $index2 < 1;
1426 $word = substr ($line, $index2 + 1);
1427 $hash_in = substr ($line, 0, $index2);
1429 next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in})));
1431 # PDF 1.1 - 1.3 (Acrobat 2 - 4)
1432 elsif ($mode == 10400)
1434 ($hash_in, $word) = split ":", $line;
1436 next unless defined $hash_in;
1437 next unless defined $word;
1439 my @data = split /\*/, $hash_in;
1441 next unless scalar @data == 11;
1443 next unless (shift @data eq '$pdf$1');
1444 next unless (shift @data eq '2');
1445 next unless (shift @data eq '40');
1446 my $P = shift @data;
1447 next unless (shift @data eq '0');
1448 next unless (shift @data eq '16');
1449 my $id = shift @data;
1450 next unless (shift @data eq '32');
1451 my $u = shift @data;
1452 next unless (shift @data eq '32');
1453 my $o = shift @data;
1460 next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in})));
1462 # PDF 1.4 - 1.6 (Acrobat 5 - 8)
1463 elsif ($mode == 10500)
1465 ($hash_in, $word) = split ":", $line;
1467 next unless defined $hash_in;
1468 next unless defined $word;
1470 my @data = split /\*/, $hash_in;
1472 next unless scalar @data == 11;
1474 my $V = shift @data; $V = substr ($V, 5, 1);
1475 my $R = shift @data;
1476 next unless (shift @data eq '128');
1477 my $P = shift @data;
1478 my $enc = shift @data;
1479 next unless (shift @data eq '16');
1480 my $id = shift @data;
1481 next unless (shift @data eq '32');
1482 my $u = shift @data;
1483 next unless (shift @data eq '32');
1484 my $o = shift @data;
1494 next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in})));
1496 # PDF 1.7 Level 3 (Acrobat 9)
1497 elsif ($mode == 10600)
1499 ($hash_in, $word) = split ":", $line;
1501 next unless defined $hash_in;
1502 next unless defined $word;
1504 my @data = split /\*/, $hash_in;
1506 next unless scalar @data >= 11;
1508 next unless (shift @data eq '$pdf$5');
1509 next unless (shift @data eq '5');
1510 next unless (shift @data eq '256');
1511 next unless (shift @data eq '-1028');
1512 next unless (shift @data eq '1');
1513 next unless (shift @data eq '16');
1514 my $id = shift @data;
1515 my $rest = join "*", @data;
1520 next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in})));
1522 # PDF 1.7 Level 8 (Acrobat 10 - 11)
1523 elsif ($mode == 10700)
1525 ($hash_in, $word) = split ":", $line;
1527 next unless defined $hash_in;
1528 next unless defined $word;
1530 my @data = split /\*/, $hash_in;
1532 next unless scalar @data >= 11;
1534 next unless (shift @data eq '$pdf$5');
1535 next unless (shift @data eq '6');
1536 next unless (shift @data eq '256');
1537 next unless (shift @data eq '-1028');
1538 next unless (shift @data eq '1');
1539 next unless (shift @data eq '16');
1540 my $id = shift @data;
1541 my $rest = join "*", @data;
1546 next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in})));
1548 # PBKDF2-HMAC-SHA256
1549 elsif ($mode == 10900)
1551 next unless (substr ($line, 0, 7) eq 'sha256:');
1554 my $index1 = index ($line, ":", 7);
1556 next if $index1 < 1;
1558 $iter = substr ($line, 7, $index1 - 7);
1562 my $index2 = index ($line, ":", $index1 + 1);
1564 next if $index2 < 1;
1566 $salt = substr ($line, $index1 + 1, $index2 - $index1 - 1);
1568 $salt = decode_base64
($salt);
1572 $index1 = index ($line, ":", $index2 + 1);
1574 next if $index1 < 1;
1576 # additional param = output len of pbkdf2
1578 my $digest64_encoded = substr ($line, $index2 + 1, $index1 - $index2 - 1);
1580 my $digest = decode_base64
($digest64_encoded);
1582 $param = length ($digest);
1586 $word = substr ($line, $index1 + 1);
1587 $hash_in = substr ($line, 0, $index1);
1589 next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in})));
1591 # PostgreSQL MD5 Authentication
1592 elsif ($mode == 11100)
1594 next unless (substr ($line, 0, 10) eq '$postgres$');
1596 my $index1 = index ($line, "*", 10);
1598 next if $index1 < 1;
1602 $param = substr ($line, 10, $index1 - 10);
1604 # get the 4 byte salt
1606 my $index2 = index ($line, "*", $index1 + 1);
1608 next if $index2 < 1;
1610 $salt = substr ($line, $index1 + 1, $index2 - $index1 - 1);
1614 $index1 = index ($line, ":", $index2 + 1);
1616 next if $index1 < 1;
1618 $word = substr ($line, $index1 + 1);
1619 $hash_in = substr ($line, 0, $index1);
1621 next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in})));
1623 # MySQL MD5 Authentication
1624 elsif ($mode == 11200)
1626 next unless (substr ($line, 0, 9) eq '$mysqlna$');
1628 my $index1 = index ($line, "*", 9);
1630 next if $index1 < 1;
1634 $salt = substr ($line, 9, $index1 - 9);
1638 $index1 = index ($line, ":", $index1 + 1);
1640 next if $index1 < 1;
1642 $word = substr ($line, $index1 + 1);
1643 $hash_in = substr ($line, 0, $index1);
1645 next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in})));
1648 elsif ($mode == 2500)
1650 print "ERROR: verify currently not supported for WPA/WPA2 (because of oclHashcat's output format)\n";
1654 # Bitcoin/Litecoin wallet.dat
1655 elsif ($mode == 11300)
1657 print "ERROR: verify currently not supported for Bitcoin/Litecoin wallet.dat because of unknown crypt data\n";
1661 # SIP digest authentication (MD5)
1662 elsif ($mode == 11400)
1664 next unless (substr ($line, 0, 6) eq '$sip$*');
1668 my $index1 = index ($line, "*", 6);
1670 next if $index1 < 0;
1672 $param10 = substr ($line, 6, $index1 - 6);
1674 next if (length ($param10) > 32);
1678 my $index2 = index ($line, "*", $index1 + 1);
1680 next if $index2 < 0;
1682 $param11 = substr ($line, $index1 + 1, $index2 - $index1 - 1);
1684 next if (length ($param11) > 32);
1688 $index1 = index ($line, "*", $index2 + 1);
1690 next if $index1 < 0;
1692 $param = substr ($line, $index2 + 1, $index1 - $index2 - 1);
1694 next if (length ($param) > 12);
1698 $index2 = index ($line, "*", $index1 + 1);
1700 next if $index2 < 0;
1702 $param2 = substr ($line, $index1 + 1, $index2 - $index1 - 1);
1704 next if (length ($param2) > 20);
1708 $index1 = index ($line, "*", $index2 + 1);
1710 next if $index1 < 0;
1712 $param6 = substr ($line, $index2 + 1, $index1 - $index2 - 1);
1714 next if (length ($param6) > 24);
1718 $index2 = index ($line, "*", $index1 + 1);
1720 next if $index2 < 0;
1722 $param7 = substr ($line, $index1 + 1, $index2 - $index1 - 1);
1724 next if (length ($param7) > 10);
1728 $index1 = index ($line, "*", $index2 + 1);
1730 next if $index1 < 0;
1732 $param8 = substr ($line, $index2 + 1, $index1 - $index2 - 1);
1734 next if (length ($param8) > 32);
1738 $index2 = index ($line, "*", $index1 + 1);
1740 next if $index2 < 0;
1742 $param9 = substr ($line, $index1 + 1, $index2 - $index1 - 1);
1744 next if (length ($param9) > 32);
1748 $index1 = index ($line, "*", $index2 + 1);
1750 next if $index1 < 0;
1752 $salt = substr ($line, $index2 + 1, $index1 - $index2 - 1);
1754 next if (length ($salt) > 34);
1758 $index2 = index ($line, "*", $index1 + 1);
1760 next if $index2 < 0;
1762 $param4 = substr ($line, $index1 + 1, $index2 - $index1 - 1);
1764 next if (length ($param4) > 12);
1768 $index1 = index ($line, "*", $index2 + 1);
1770 next if $index1 < 0;
1772 $param3 = substr ($line, $index2 + 1, $index1 - $index2 - 1);
1774 next if (length ($param3) > 10);
1778 $index2 = index ($line, "*", $index1 + 1);
1780 next if $index2 < 0;
1782 $param5 = substr ($line, $index1 + 1, $index2 - $index1 - 1);
1784 next if (length ($param5) > 8);
1788 $index1 = index ($line, "*", $index2 + 1);
1790 next if $index1 < 0;
1792 my $directive = substr ($line, $index2 + 1, $index1 - $index2 - 1);
1794 next unless ($directive eq "MD5");
1798 $index2 = index ($line, ":", $index1 + 1);
1800 next if $index2 < 0;
1802 my $hex_digest = substr ($line, $index1 + 1, $index2 - $index1 - 1);
1804 next unless (length ($hex_digest) == 32);
1806 $word = substr ($line, $index2 + 1);
1807 $hash_in = substr ($line, 0, $index2);
1809 next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in})));
1812 elsif ($mode == 11600)
1814 next unless (substr ($line, 0, 4) eq '$7z$');
1818 my $index1 = index ($line, '$', 4);
1820 next if $index1 < 0;
1822 my $p = substr ($line, 4, $index1 - 4);
1824 next unless ($p eq "0");
1828 my $index2 = index ($line, '$', $index1 + 1);
1830 next if $index2 < 0;
1832 $iter = substr ($line, $index1 + 1, $index2 - $index1 - 1);
1834 # seven zip salt length
1836 $index1 = index ($line, '$', $index2 + 1);
1838 next if $index1 < 0;
1840 $param = substr ($line, $index2 + 1, $index1 - $index2 - 1);
1844 $index2 = index ($line, '$', $index1 + 1);
1846 next if $index2 < 0;
1848 $param2 = substr ($line, $index1 + 1, $index2 - $index1 - 1);
1852 $index1 = index ($line, '$', $index2 + 1);
1854 next if $index1 < 0;
1856 $param3 = substr ($line, $index2 + 1, $index1 - $index2 - 1);
1860 $index2 = index ($line, '$', $index1 + 1);
1862 next if $index2 < 0;
1864 $salt = substr ($line, $index1 + 1, $index2 - $index1 - 1);
1866 $salt = pack ("H*", $salt);
1870 $index1 = index ($line, '$', $index2 + 1);
1872 next if $index1 < 0;
1874 my $crc = substr ($line, $index2 + 1, $index1 - $index2 - 1);
1876 # ignore this crc, we don't need to pass it to gen_hash ()
1880 $index2 = index ($line, '$', $index1 + 1);
1882 next if $index2 < 0;
1884 $param4 = substr ($line, $index1 + 1, $index2 - $index1 - 1);
1888 $index1 = index ($line, '$', $index2 + 1);
1890 next if $index1 < 0;
1892 $param5 = substr ($line, $index2 + 1, $index1 - $index2 - 1);
1896 $index2 = index ($line, ':', $index1 + 1);
1898 next if $index2 < 0;
1900 $param6 = substr ($line, $index1 + 1, $index2 - $index1 - 1);
1901 $param6 = pack ("H*", $param6);
1903 $word = substr ($line, $index2 + 1);
1904 $hash_in = substr ($line, 0, $index2);
1906 next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in})));
1909 elsif ($mode == 11900)
1911 next unless (substr ($line, 0, 4) eq 'md5:');
1914 my $index1 = index ($line, ":", 4);
1916 next if $index1 < 1;
1918 $iter = substr ($line, 4, $index1 - 4);
1922 my $index2 = index ($line, ":", $index1 + 1);
1924 next if $index2 < 1;
1926 $salt = substr ($line, $index1 + 1, $index2 - $index1 - 1);
1928 $salt = decode_base64
($salt);
1932 $index1 = index ($line, ":", $index2 + 1);
1934 next if $index1 < 1;
1936 # additional param = output len of pbkdf2
1938 my $digest64_encoded = substr ($line, $index2 + 1, $index1 - $index2 - 1);
1940 my $digest = decode_base64
($digest64_encoded);
1942 $param = length ($digest);
1946 $word = substr ($line, $index1 + 1);
1947 $hash_in = substr ($line, 0, $index1);
1949 next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in})));
1952 elsif ($mode == 12000)
1954 next unless (substr ($line, 0, 5) eq 'sha1:');
1957 my $index1 = index ($line, ":", 5);
1959 next if $index1 < 1;
1961 $iter = substr ($line, 5, $index1 - 5);
1965 my $index2 = index ($line, ":", $index1 + 1);
1967 next if $index2 < 1;
1969 $salt = substr ($line, $index1 + 1, $index2 - $index1 - 1);
1971 $salt = decode_base64
($salt);
1975 $index1 = index ($line, ":", $index2 + 1);
1977 next if $index1 < 1;
1979 # additional param = output len of pbkdf2
1981 my $digest64_encoded = substr ($line, $index2 + 1, $index1 - $index2 - 1);
1983 my $digest = decode_base64
($digest64_encoded);
1985 $param = length ($digest);
1989 $word = substr ($line, $index1 + 1);
1990 $hash_in = substr ($line, 0, $index1);
1992 next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in})));
1994 # PBKDF2-HMAC-SHA512
1995 elsif ($mode == 12100)
1997 next unless (substr ($line, 0, 7) eq 'sha512:');
2000 my $index1 = index ($line, ":", 7);
2002 next if $index1 < 1;
2004 $iter = substr ($line, 7, $index1 - 7);
2008 my $index2 = index ($line, ":", $index1 + 1);
2010 next if $index2 < 1;
2012 $salt = substr ($line, $index1 + 1, $index2 - $index1 - 1);
2014 $salt = decode_base64
($salt);
2018 $index1 = index ($line, ":", $index2 + 1);
2020 next if $index1 < 1;
2022 # additional param = output len of pbkdf2
2024 my $digest64_encoded = substr ($line, $index2 + 1, $index1 - $index2 - 1);
2026 my $digest = decode_base64
($digest64_encoded);
2028 $param = length ($digest);
2032 $word = substr ($line, $index1 + 1);
2033 $hash_in = substr ($line, 0, $index1);
2035 next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in})));
2038 elsif ($mode == 12200)
2040 next unless (substr ($line, 0, 12) eq '$ecryptfs$0$');
2042 # check if default salt
2046 $param = 0 if (substr ($line, 12, 2) eq '1$');
2054 if ($param == 0) # we need to extract the salt
2056 $index1 = index ($line, '$', $index1);
2058 next if $index1 < 1;
2060 my $index2 = index ($line, '$', $index1 + 1);
2062 next if $index2 < 1;
2064 $salt = substr ($line, $index1 + 1, $index2 - $index1 - 1);
2069 $index1 = index ($line, ':', $index1 + 1);
2071 next if $index1 < 1;
2075 $word = substr ($line, $index1 + 1);
2076 $hash_in = substr ($line, 0, $index1);
2078 next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in})));
2080 # Oracle T: Type (Oracle 12+)
2081 elsif ($mode == 12300)
2083 my $index1 = index ($line, ':');
2085 next if ($index1 != 160);
2089 $salt = substr ($line, 128, 32);
2093 $word = substr ($line, $index1 + 1);
2094 $hash_in = substr ($line, 0, $index1);
2096 next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in})));
2098 # BSDiCrypt, Extended DES
2099 elsif ($mode == 12400)
2101 next unless (substr ($line, 0, 1) eq '_');
2103 my $index1 = index ($line, ':', 20);
2105 next if ($index1 != 20);
2109 $iter = substr ($line, 1, 4);
2111 $iter = base64_to_int24
($iter);
2115 $salt = substr ($line, 5, 4);
2119 $word = substr ($line, $index1 + 1);
2120 $hash_in = substr ($line, 0, $index1);
2122 next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in})));
2124 # Blockchain, My Wallet
2125 elsif ($mode == 12700)
2127 my $index1 = index ($line, ':');
2129 next if ($index1 < 0);
2131 $hash_in = substr ($line, 0, $index1);
2132 $word = substr ($line, $index1 + 1);
2134 my (undef, $signature, $data_len, $data_buf) = split '\$', $hash_in;
2136 next unless ($signature eq "blockchain");
2138 next unless (($data_len * 2) == length $data_buf);
2140 $salt = substr ($data_buf, 0, 32);
2141 $param = substr ($data_buf, 32);
2143 next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in})));
2145 elsif ($mode == 12800)
2147 ($hash_in, $word) = split ":", $line;
2149 next unless defined $hash_in;
2150 next unless defined $word;
2152 my @data = split /\,/, $hash_in;
2154 next unless scalar @data == 4;
2156 next unless (shift @data eq 'v1;PPH1_MD4');
2158 $salt = shift @data;
2159 $iter = shift @data;
2161 next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in})));
2163 elsif ($mode == 12900)
2165 ($hash_in, $word) = split ":", $line;
2167 next unless defined $hash_in;
2168 next unless defined $word;
2170 next unless length $hash_in == 160;
2172 $param = substr ($hash_in, 0, 64);
2173 $salt = substr ($hash_in, 128, 32);
2176 next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in})));
2178 elsif ($mode == 13000)
2182 ($hash_line, $word) = split ":", $line;
2184 next unless defined $hash_line;
2185 next unless defined $word;
2187 my @data = split ('\$', $hash_line);
2189 next unless scalar @data == 8;
2193 my $signature = shift @data;
2194 my $salt_len = shift @data;
2195 my $salt_buf = shift @data;
2196 my $iterations = shift @data;
2197 my $iv = shift @data;
2198 my $pswcheck_len = shift @data;
2199 my $pswcheck = shift @data;
2201 next unless ($signature eq "rar5");
2202 next unless ($salt_len == 16);
2203 next unless ($pswcheck_len == 8);
2206 $iter = $iterations;
2207 $hash_in = $pswcheck;
2210 next unless (exists ($db->{$hash_line}) and (! defined ($db->{$hash_line})));
2212 elsif ($mode == 13100 )
2214 ($hash_in, $word) = split ":", $line;
2216 next unless defined $hash_in;
2217 next unless defined $word;
2219 my @data = split ('\$', $hash_in);
2221 next unless scalar @data == 8;
2225 my $signature = shift @data;
2226 my $algorithm = shift @data;
2227 my $user = shift @data;
2228 $user = substr ($user, 1);
2229 my $realm = shift @data;
2230 my $spn = shift @data;
2231 $spn = substr ($spn, 0, length ($spn) - 1);
2232 my $checksum = shift @data;
2233 my $edata2 = shift @data;
2235 next unless ($signature eq "krb5tgs");
2236 next unless (length ($checksum) == 32);
2237 next unless (length ($edata2) >= 64);
2239 $salt = $user . '$' . $realm . '$' . $spn . '$' . substr ($edata2, 0, 16);
2241 next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in})));
2243 elsif ($mode == 13200)
2245 ($hash_in, $word) = split ":", $line;
2247 next unless defined $hash_in;
2248 next unless defined $word;
2250 my @data = split ('\*', $hash_in);
2252 next unless scalar @data == 5;
2256 my $signature = shift @data;
2257 my $version = shift @data;
2258 my $iteration = shift @data;
2259 my $mysalt = shift @data;
2260 my $digest = shift @data;
2262 next unless ($signature eq '$axcrypt$');
2263 next unless (length ($mysalt) == 32);
2264 next unless (length ($digest) == 48);
2266 $salt = $iteration . '*' . $mysalt;
2268 next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in})));
2270 elsif ($mode == 13300)
2272 ($hash_in, $word) = split ":", $line;
2274 next unless defined $hash_in;
2275 next unless defined $word;
2277 my @data = split ('\$', $hash_in);
2279 next unless scalar @data == 2;
2283 my $signature = shift @data;
2284 my $digest = shift @data;
2286 next unless ($signature eq '$axcrypt_sha1');
2287 next unless (length ($digest) == 32 || length ($digest) == 40);
2289 next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in})));
2293 print "ERROR: hash mode is not supported\n";
2298 if ($word =~ m/^\$HEX\[[0-9a-fA-F]*\]$/)
2300 $word = pack ("H*", substr ($word, 5, -1));
2303 # finally generate the hash
2308 # check both variations
2309 $hash_out = gen_hash
($mode, $word, $salt, $iter, 1);
2311 $len = length $hash_out; # == length $alternative
2313 if (substr ($line, 0, $len) ne $hash_out)
2315 my $alternative = gen_hash
($mode, $word, $salt, $iter, 2);
2317 return unless (substr ($line, 0, $len) eq $alternative);
2320 elsif ($mode == 8700)
2322 $hash_out = gen_hash
($mode, $word, $salt, 0, $param);
2324 $len = length $hash_out;
2326 return unless (substr ($line, 0, $len) eq $hash_out);
2328 elsif ($mode == 8900)
2330 $hash_out = gen_hash
($mode, $word, $salt, 0, $param, $param2, $param3);
2332 $len = length $hash_out;
2334 return unless (substr ($line, 0, $len) eq $hash_out);
2336 elsif ($mode == 9100)
2338 $hash_out = gen_hash
($mode, $word, $salt, $iter, $param);
2340 $len = length $hash_out;
2342 return unless (substr ($line, 0, $len) eq $hash_out);
2344 elsif ($mode == 190)
2346 $hash_out = gen_hash
($mode, $word, $salt, $iter, 0);
2348 $len = length $hash_out; # == length $alternative
2350 if (substr ($line, 0, $len) ne $hash_out)
2352 my $alternative = gen_hash
($mode, $word, $salt, $iter, 1);
2354 return unless (substr ($line, 0, $len) eq $alternative);
2357 elsif ($mode == 3300)
2359 $hash_out = gen_hash
($mode, $word, $salt, $iter, $param);
2361 $len = length $hash_out;
2363 return unless (substr ($line, 0, $len) eq $hash_out);
2365 elsif ($mode == 5100)
2367 # check 3 variants (start, middle, end)
2371 $hash_out = gen_hash
($mode, $word, $salt, $iter, $idx++);
2373 $len = length $hash_out; # == length $alternative
2375 if (substr ($line, 0, $len) ne $hash_out)
2377 my $alternative = gen_hash
($mode, $word, $salt, $iter, $idx++);
2379 if (substr ($line, 0, $len) ne $alternative)
2381 my $alternative = gen_hash
($mode, $word, $salt, $iter, $idx++);
2383 return unless (substr ($line, 0, $len) eq $alternative);
2387 elsif ($mode == 9400)
2389 $hash_out = gen_hash
($mode, $word, $salt, 50000, $param, $param2);
2391 $len = length $hash_out;
2393 return unless (substr ($line, 0, $len) eq $hash_out);
2395 elsif ($mode == 9500)
2397 $hash_out = gen_hash
($mode, $word, $salt, 100000, $param);
2399 $len = length $hash_out;
2401 return unless (substr ($line, 0, $len) eq $hash_out);
2403 elsif ($mode == 9600)
2405 $hash_out = gen_hash
($mode, $word, $salt, 100000, $param);
2407 $len = length $hash_out;
2409 return unless (substr ($line, 0, $len) eq $hash_out);
2411 elsif ($mode == 9700)
2413 $hash_out = gen_hash
($mode, $word, $salt, 0, $param, $param2);
2415 $len = length $hash_out;
2417 return unless (substr ($line, 0, $len) eq $hash_out);
2419 elsif ($mode == 9800)
2421 $hash_out = gen_hash
($mode, $word, $salt, 0, $param, $param2);
2423 $len = length $hash_out;
2425 return unless (substr ($line, 0, $len) eq $hash_out);
2427 elsif ($mode == 10400)
2429 $hash_out = gen_hash
($mode, $word, $salt, 0, $param, $param2, $param3);
2431 $len = length $hash_out;
2433 return unless (substr ($line, 0, $len) eq $hash_out);
2435 elsif ($mode == 10500)
2437 $hash_out = gen_hash
($mode, $word, $salt, 0, $param, $param2, $param3, $param4, $param5, $param6);
2439 $len = length $hash_out;
2441 return unless (substr ($line, 0, $len) eq $hash_out);
2443 elsif ($mode == 10600)
2445 $hash_out = gen_hash
($mode, $word, $salt, 0, $param);
2447 $len = length $hash_out;
2449 return unless (substr ($line, 0, $len) eq $hash_out);
2451 elsif ($mode == 10700)
2453 $hash_out = gen_hash
($mode, $word, $salt, 0, $param);
2455 $len = length $hash_out;
2457 return unless (substr ($line, 0, $len) eq $hash_out);
2459 elsif ($mode == 10900)
2461 $hash_out = gen_hash
($mode, $word, $salt, $iter, $param);
2463 $len = length $hash_out;
2465 return unless (substr ($line, 0, $len) eq $hash_out);
2467 elsif ($mode == 11100)
2469 $hash_out = gen_hash
($mode, $word, $salt, $iter, $param);
2471 $len = length $hash_out;
2473 return unless (substr ($line, 0, $len) eq $hash_out);
2475 elsif ($mode == 11400)
2477 $hash_out = gen_hash
($mode, $word, $salt, $iter, $param, $param2, $param3, $param4, $param5, $param6, $param7, $param8, $param9, $param10, $param11);
2479 $len = length $hash_out;
2481 return unless (substr ($line, 0, $len) eq $hash_out);
2483 elsif ($mode == 11600)
2485 $hash_out = gen_hash
($mode, $word, $salt, $iter, $param, $param2, $param3, $param4, $param5, $param6);
2487 $len = length $hash_out;
2489 return unless (substr ($line, 0, $len) eq $hash_out);
2491 elsif ($mode == 11900)
2493 $hash_out = gen_hash
($mode, $word, $salt, $iter, $param);
2495 $len = length $hash_out;
2497 return unless (substr ($line, 0, $len) eq $hash_out);
2499 elsif ($mode == 12000)
2501 $hash_out = gen_hash
($mode, $word, $salt, $iter, $param);
2503 $len = length $hash_out;
2505 return unless (substr ($line, 0, $len) eq $hash_out);
2507 elsif ($mode == 12100)
2509 $hash_out = gen_hash
($mode, $word, $salt, $iter, $param);
2511 $len = length $hash_out;
2513 return unless (substr ($line, 0, $len) eq $hash_out);
2515 elsif ($mode == 12200)
2517 $hash_out = gen_hash
($mode, $word, $salt, $iter, $param);
2519 $len = length $hash_out;
2521 return unless (substr ($line, 0, $len) eq $hash_out);
2523 elsif ($mode == 12700)
2525 # this is very special, we can't call gen_hash () because the param part is not always the same
2526 # we only know that it should contain the letters "guid" at the beginning of the decryted string
2528 my $pbkdf2 = Crypt
::PBKDF2
->new (
2529 hash_class
=> 'HMACSHA1',
2534 my $salt_bin = pack ("H*", $salt);
2536 my $key = $pbkdf2->PBKDF2 ($salt_bin, $word);
2538 my $cipher = Crypt
::CBC
->new ({
2540 cipher
=> "Crypt::Rijndael",
2547 my $param_bin = pack ("H*", $param);
2549 my $decrypted = $cipher->decrypt ($param_bin);
2551 my $decrypted_part = substr ($decrypted, 1, 16);
2553 return unless ($decrypted_part =~ /"guid"/);
2555 $hash_out = $hash_in;
2557 elsif ($mode == 12900)
2559 $hash_out = gen_hash
($mode, $word, $salt, $iter, $param);
2561 $len = length $hash_out;
2563 return unless (substr ($line, 0, $len) eq $hash_out);
2565 elsif ($mode == 13000)
2567 $hash_out = gen_hash
($mode, $word, $salt, $iter, $param);
2569 $len = length $hash_out;
2571 return unless (substr ($line, 0, $len) eq $hash_out);
2573 elsif ($mode == 13100)
2575 $hash_out = gen_hash
($mode, $word, $salt);
2577 $len = length $hash_out;
2579 return unless (substr ($line, 0, $len) eq $hash_out);
2581 elsif ($mode == 13200)
2583 $hash_out = gen_hash
($mode, $word, $salt);
2585 $len = length $hash_out;
2587 return unless (substr ($line, 0, $len) eq $hash_out);
2591 $hash_out = gen_hash
($mode, $word, $salt, $iter);
2593 $len = length $hash_out;
2598 # allow $P$ and $H$ for -m 400
2599 next unless (substr ($line, 3, $len - 3) eq substr ($hash_out, 3));
2601 elsif ($mode == 5600)
2603 # oclHashcat outputs the user name always upper-case, we need
2604 next unless (substr ($line, 0, $len) eq $hash_out);
2608 my $hash_out_lower = lc ($hash_out);
2610 for my $key (keys %{$db})
2612 if (lc ($key) eq $hash_out_lower)
2624 next unless (substr ($line, 0, $len) eq $hash_out);
2628 # do not forget "exists ($db->$hash_out)" should be done above!
2629 $db->{$hash_out} = $word;
2630 print OUT
$line . "\n";
2639 my $mode = shift || 0;
2641 while (my $word_buf = <>)
2645 next if length ($word_buf) > 31;
2653 for (my $i = 0; $i < 256; $i++)
2655 my $c = get_random_chr
(0x30, 0x39);
2657 push (@salt_arr, $c);
2660 my $salt_buf = join ("", @salt_arr);
2668 if ($mode == 0 || $mode == 100 || $mode == 101 || $mode == 190 || $mode == 200 || $mode == 300 || $mode == 600 || $mode == 900 || $mode == 1000 || $mode == 1400 || $mode == 1700 || $mode == 2400 || $mode == 2600 || $mode == 3500 || $mode == 4300 || $mode == 4400 || $mode == 4500 || $mode == 4600 || $mode == 4700 || $mode == 5000 || $mode == 5100 || $mode == 6000 || $mode == 6100 || $mode == 6900 || $mode == 5700 || $mode == 9900 || $mode == 10800 || $mode == 11500 || $mode == 13300)
2670 $tmp_hash = gen_hash
($mode, $word_buf, "");
2672 elsif ($mode == 10 || $mode == 20 || $mode == 23 || $mode == 30 || $mode == 40 || $mode == 50 || $mode == 60 || $mode == 110 || $mode == 120 || $mode == 130 || $mode == 140 || $mode == 150 || $mode == 160 || $mode == 1410 || $mode == 1420 || $mode == 1430 || $mode == 1440 || $mode == 1450 || $mode == 1460 || $mode == 1710 || $mode == 1711 || $mode == 1720 || $mode == 1730 || $mode == 1740 || $mode == 1750 || $mode == 1760 || $mode == 3610 || $mode == 3710 || $mode == 3711 || $mode == 3720 || $mode == 3800 || $mode == 3910 || $mode == 4010 || $mode == 4110 || $mode == 4210 || $mode == 4900 || $mode == 8900 || $mode == 10000 || $mode == 10200 || $mode == 10900 || $mode == 11900 || $mode == 12000 || $mode == 12100)
2674 my $salt_len = get_random_num
(1, 15);
2676 $tmp_hash = gen_hash
($mode, $word_buf, substr ($salt_buf, 0, $salt_len));
2678 elsif ($mode == 11 || $mode == 12 || $mode == 7600 || $mode == 12300)
2680 $tmp_hash = gen_hash
($mode, $word_buf, substr ($salt_buf, 0, 32));
2684 $tmp_hash = gen_hash
($mode, $word_buf, substr ($salt_buf, 0, 2));
2688 my $salt_len = get_random_num
(1, 11);
2690 $tmp_hash = gen_hash
($mode, $word_buf, substr ($salt_buf, 0, $salt_len));
2692 elsif ($mode == 111 || $mode == 122 || $mode == 131 || $mode == 132 || $mode == 400 || $mode == 500 || $mode == 1600 || $mode == 1722 || $mode == 1731 || $mode == 1800 || $mode == 6300 || $mode == 7900 || $mode == 8100 || $mode == 11100)
2694 $tmp_hash = gen_hash
($mode, $word_buf, substr ($salt_buf, 0, 8));
2696 elsif ($mode == 112)
2698 $tmp_hash = gen_hash
($mode, $word_buf, substr ($salt_buf, 0, 20));
2700 elsif ($mode == 121)
2702 my $salt_len = get_random_num
(1, 9);
2704 $tmp_hash = gen_hash
($mode, $word_buf, substr ($salt_buf, 0, $salt_len));
2706 elsif ($mode == 141 || $mode == 1441)
2708 my $salt_len = get_random_num
(1, 15);
2710 $tmp_hash = gen_hash
($mode, $word_buf, substr ($salt_buf, 0, $salt_len));
2712 elsif ($mode == 1100)
2714 my $salt_len = get_random_num
(1, 19);
2716 $tmp_hash = gen_hash
($mode, $word_buf, substr ($salt_buf, 0, $salt_len));
2718 elsif ($mode == 1500)
2720 next if length ($word_buf) > 8;
2722 $tmp_hash = gen_hash
($mode, $word_buf, substr ($salt_buf, 0, 2));
2724 elsif ($mode == 2100)
2726 next if length ($word_buf) > 13;
2728 my $salt_len = get_random_num
(1, 19);
2730 $tmp_hash = gen_hash
($mode, $word_buf, substr ($salt_buf, 0, $salt_len));
2732 elsif ($mode == 2410)
2734 next if length ($word_buf) > 15;
2736 my $salt_len = get_random_num
(1, 15);
2738 my $word_len = length ($word_buf);
2740 $salt_len = min
($salt_len, 15 - $word_len);
2742 $tmp_hash = gen_hash
($mode, $word_buf, substr ($salt_buf, 0, $salt_len));
2744 elsif ($mode == 2500)
2746 next if length ($word_buf) < 8;
2748 my $salt_len = get_random_num
(0, 32);
2750 $tmp_hash = gen_hash
($mode, $word_buf, substr ($salt_buf, 0, $salt_len));
2752 elsif ($mode == 2611)
2754 $tmp_hash = gen_hash
($mode, $word_buf, substr ($salt_buf, 0, 3));
2756 elsif ($mode == 2612)
2758 my $salt_len = get_random_num
(1, 22);
2760 $tmp_hash = gen_hash
($mode, $word_buf, substr ($salt_buf, 0, $salt_len));
2762 elsif ($mode == 2711)
2764 $tmp_hash = gen_hash
($mode, $word_buf, substr ($salt_buf, 0, 30));
2766 elsif ($mode == 2811)
2768 $tmp_hash = gen_hash
($mode, $word_buf, substr ($salt_buf, 0, 5));
2770 elsif ($mode == 3000)
2772 next if length ($word_buf) > 7;
2774 $tmp_hash = gen_hash
($mode, $word_buf, "");
2776 elsif ($mode == 3100)
2778 $tmp_hash = gen_hash
($mode, $word_buf, substr ($salt_buf, 0, 10));
2780 elsif ($mode == 3200 || $mode == 5800 || $mode == 6400 || $mode == 6500 || $mode == 6700 || $mode == 7400 || $mode == 3300 || $mode == 8000 || $mode == 9100 || $mode == 12200)
2782 $tmp_hash = gen_hash
($mode, $word_buf, substr ($salt_buf, 0, 16));
2784 elsif ($mode == 3800 || $mode == 4900)
2786 my $salt_len = get_random_num
(1, 11);
2788 $tmp_hash = gen_hash
($mode, $word_buf, substr ($salt_buf, 0, $salt_len));
2790 elsif ($mode == 4800)
2792 $salt_buf = get_random_md5chap_salt
(substr ($salt_buf, 0, 16));
2794 $tmp_hash = gen_hash
($mode, $word_buf, $salt_buf);
2796 elsif ($mode == 5300 || $mode == 5400)
2798 $salt_buf = get_random_ike_salt
();
2800 $tmp_hash = gen_hash
($mode, $word_buf, $salt_buf);
2802 elsif ($mode == 5500)
2804 my $user_len = get_random_num
(0, 15);
2805 my $domain_len = get_random_num
(0, 15);
2807 $salt_buf = get_random_netntlmv1_salt
($user_len, $domain_len);
2809 $tmp_hash = gen_hash
($mode, $word_buf, $salt_buf);
2811 elsif ($mode == 5600)
2813 my $user_len = get_random_num
(0, 15);
2814 my $domain_len = get_random_num
(0, 15);
2816 $salt_buf = get_random_netntlmv2_salt
($user_len, $domain_len);
2818 $tmp_hash = gen_hash
($mode, $word_buf, $salt_buf);
2820 elsif ($mode == 6600)
2822 $salt_buf = get_random_agilekeychain_salt
();
2824 $tmp_hash = gen_hash
($mode, $word_buf, $salt_buf);
2826 elsif ($mode == 6800)
2828 my $email_len = get_random_num
(1, 15);
2832 for (my $i = 0; $i < $email_len; $i++)
2834 $email .= get_random_chr
(0x61, 0x7a);
2837 $email .= '@trash-mail.com';
2839 $tmp_hash = gen_hash
($mode, $word_buf, $email);
2841 elsif ($mode == 7100)
2843 $tmp_hash = gen_hash
($mode, $word_buf, substr ($salt_buf, 0, 64));
2845 elsif ($mode == 7200)
2847 $tmp_hash = gen_hash
($mode, $word_buf, substr ($salt_buf, 0, 128));
2849 elsif ($mode == 7300)
2851 my $salt_len = get_random_num
(32, 256);
2853 $tmp_hash = gen_hash
($mode, $word_buf, substr ($salt_buf, 0, $salt_len));
2855 elsif ($mode == 7500)
2857 $salt_buf = get_random_kerberos5_salt
(substr ($salt_buf, 0, 16));
2859 $tmp_hash = gen_hash
($mode, $word_buf, $salt_buf);
2861 elsif ($mode == 7700)
2863 next if length ($word_buf) > 8;
2865 $tmp_hash = gen_hash
($mode, $word_buf, substr ($salt_buf, 0, 12));
2867 elsif ($mode == 7800)
2869 $tmp_hash = gen_hash
($mode, $word_buf, substr ($salt_buf, 0, 12));
2871 elsif ($mode == 8200)
2873 $salt_buf = get_random_cloudkeychain_salt
();
2875 $tmp_hash = gen_hash
($mode, $word_buf, $salt_buf);
2877 elsif ($mode == 8300)
2879 $salt_buf = get_random_dnssec_salt
();
2881 $tmp_hash = gen_hash
($mode, $word_buf, $salt_buf);
2883 elsif ($mode == 8400 || $mode == 11200)
2885 $tmp_hash = gen_hash
($mode, $word_buf, substr ($salt_buf, 0, 40));
2887 elsif ($mode == 8500)
2889 next if length ($word_buf) > 8;
2891 my $salt_len = get_random_num
(1, 9);
2893 $tmp_hash = gen_hash
($mode, $word_buf, substr ($salt_buf, 0, $salt_len));
2895 elsif ($mode == 8600)
2897 next if length ($word_buf) > 16;
2899 $tmp_hash = gen_hash
($mode, $word_buf, "");
2901 elsif ($mode == 8700)
2903 $tmp_hash = gen_hash
($mode, $word_buf, substr ($salt_buf, 0, 5));
2905 elsif ($mode == 9200 || $mode == 9300)
2909 $tmp_hash = gen_hash
($mode, $word_buf, substr ($salt_buf, 0, $salt_len));
2911 elsif ($mode == 9400 || $mode == 9500 || $mode == 9600 || $mode == 9700 || $mode == 9800)
2913 next if length ($word_buf) > 19;
2917 $tmp_hash = gen_hash
($mode, $word_buf, substr ($salt_buf, 0, $salt_len));
2919 elsif ($mode == 10100)
2921 $tmp_hash = gen_hash
($mode, $word_buf, substr ($salt_buf, 0, 32));
2923 elsif ($mode == 10300)
2925 my $salt_len = get_random_num
(4, 15);
2927 $tmp_hash = gen_hash
($mode, $word_buf, substr ($salt_buf, 0, $salt_len));
2929 elsif ($mode == 10400)
2931 next if length ($word_buf) > 31;
2935 $tmp_hash = gen_hash
($mode, $word_buf, substr ($salt_buf, 0, $salt_len));
2937 elsif ($mode == 10500)
2939 next if length ($word_buf) > 15;
2943 $tmp_hash = gen_hash
($mode, $word_buf, substr ($salt_buf, 0, $salt_len));
2945 elsif ($mode == 10600)
2947 next if length ($word_buf) > 31;
2951 $tmp_hash = gen_hash
($mode, $word_buf, substr ($salt_buf, 0, $salt_len));
2953 elsif ($mode == 10700)
2955 next if length ($word_buf) > 15;
2959 $tmp_hash = gen_hash
($mode, $word_buf, substr ($salt_buf, 0, $salt_len));
2961 elsif ($mode == 11000)
2963 $tmp_hash = gen_hash
($mode, $word_buf, substr ($salt_buf, 0, 56));
2965 elsif ($mode == 11300)
2967 $tmp_hash = gen_hash
($mode, $word_buf, substr ($salt_buf, 0, 16));
2969 elsif ($mode == 11400)
2971 next if length ($word_buf) > 24;
2973 my $salt_len = get_random_num
(1, 15);
2975 $tmp_hash = gen_hash
($mode, $word_buf, substr ($salt_buf, 0, $salt_len));
2977 elsif ($mode == 11600)
2979 my $salt_len = get_random_num
(0, 16);
2981 $tmp_hash = gen_hash
($mode, $word_buf, substr ($salt_buf, 0, $salt_len));
2983 elsif ($mode == 12400)
2985 $tmp_hash = gen_hash
($mode, $word_buf, substr ($salt_buf, 0, 4));
2987 elsif ($mode == 12600)
2989 $tmp_hash = gen_hash
($mode, $word_buf, substr ($salt_buf, 0, 64));
2991 elsif ($mode == 12700)
2993 $tmp_hash = gen_hash
($mode, $word_buf, substr ($salt_buf, 0, 32));
2995 elsif ($mode == 12800)
2997 next if length ($word_buf) > 24;
2999 $tmp_hash = gen_hash
($mode, $word_buf, substr ($salt_buf, 0, 20));
3001 elsif ($mode == 12900)
3003 $tmp_hash = gen_hash
($mode, $word_buf, substr ($salt_buf, 0, 32));
3005 elsif ($mode == 13000)
3007 $tmp_hash = gen_hash
($mode, $word_buf, substr ($salt_buf, 0, 32));
3009 elsif ($mode == 13100)
3011 $salt_buf = get_random_kerberos5_tgs_salt
();
3013 $tmp_hash = gen_hash
($mode, $word_buf, $salt_buf);
3015 elsif ($mode == 13200)
3017 $salt_buf = get_random_axcrypt_salt
();
3019 $tmp_hash = gen_hash
($mode, $word_buf, $salt_buf);
3023 print "ERROR: Unsupported hash type\n";
3028 print $tmp_hash, "\n";
3041 for (my $j = 0; $j < scalar @modes; $j++)
3043 my $mode = $modes[$j];
3045 if ($mode == 0 || $mode == 100 || $mode == 101 || $mode == 190 || $mode == 200 || $mode == 300 || $mode == 600 || $mode == 900 || $mode == 1000 || $mode == 1400 || $mode == 1700 || $mode == 2400 || $mode == 2600 || $mode == 3500 || $mode == 4300 || $mode == 4400 || $mode == 4500 || $mode == 4600 || $mode == 4700 || $mode == 5000 || $mode == 5100 || $mode == 5300 || $mode == 5400 || $mode == 6000 || $mode == 6100 || $mode == 6600 || $mode == 6900 || $mode == 5700 || $mode == 8200 || $mode == 8300 || $mode == 9900 || $mode == 10800 || $mode == 11500 || $mode == 13300)
3047 for (my $i = 1; $i < 32; $i++)
3051 rnd
($mode, $len, 0);
3059 elsif ($mode == 10 || $mode == 20 || $mode == 23 || $mode == 30 || $mode == 40 || $mode == 50 || $mode == 60 || $mode == 110 || $mode == 120 || $mode == 121 || $mode == 130 || $mode == 140 || $mode == 150 || $mode == 160 || $mode == 1410 || $mode == 1420 || $mode == 1430 || $mode == 1440 || $mode == 1450 || $mode == 1460 || $mode == 1710 || $mode == 1711 || $mode == 1720 || $mode == 1730 || $mode == 1740 || $mode == 1750 || $mode == 1760 || $mode == 2410 || $mode == 3610 || $mode == 3710 || $mode == 3711 || $mode == 3720 || $mode == 3910 || $mode == 4010 || $mode == 4110 || $mode == 4210 || $mode == 8900 || $mode == 10000 || $mode == 10200 || $mode == 10900 || $mode == 11900 || $mode == 12000 || $mode == 12100)
3061 my $salt_len = get_random_num
(1, 15);
3063 for (my $i = 1; $i < 32; $i++)
3067 rnd
($mode, $len, $salt_len);
3071 rnd
($mode, $i, $salt_len);
3075 elsif ($mode == 11 || $mode == 12 || $mode == 7600 || $mode == 12300)
3077 for (my $i = 1; $i < 32; $i++)
3081 rnd
($mode, $len, 32);
3085 rnd
($mode, $i, 32);
3089 elsif ($mode == 21 || $mode == 22)
3091 for (my $i = 1; $i < 32; $i++)
3095 rnd
($mode, $len, 2);
3103 elsif ($mode == 111 || $mode == 122 || $mode == 131 || $mode == 132 || $mode == 400 || $mode == 500 || $mode == 1600 || $mode == 1722 || $mode == 1731 || $mode == 6300 || $mode == 7900 || $mode == 8100 || $mode == 11100)
3105 for (my $i = 1; $i < 32; $i++)
3109 rnd
($mode, $len, 8);
3117 elsif ($mode == 112)
3119 for (my $i = 1; $i < 32; $i++)
3123 rnd
($mode, $len, 20);
3127 rnd
($mode, $i, 20);
3131 elsif ($mode == 141 || $mode == 3300 || $mode == 1441 || $mode == 1800 || $mode == 3200 || $mode == 4800 || $mode == 6400 || $mode == 6500 || $mode == 6700 || $mode == 7400 || $mode == 8000 || $mode == 9100 || $mode == 12200)
3133 for (my $i = 1; $i < 32; $i++)
3137 rnd
($mode, $len, 16);
3141 rnd
($mode, $i, 16);
3147 my $salt_len = get_random_num
(1, 19);
3149 for (my $i = 1; $i < 32; $i++)
3153 rnd
($mode, $len, $salt_len);
3157 rnd
($mode, $i, $salt_len);
3161 elsif ($mode == 1500)
3163 for (my $i = 1; $i < 9; $i++)
3167 rnd
($mode, $len, 2);
3175 elsif ($mode == 2100)
3177 my $salt_len = get_random_num
(1, 19);
3179 for (my $i = 1; $i < 13; $i++)
3183 rnd
($mode, $len, $salt_len);
3187 rnd
($mode, $i, $salt_len);
3191 elsif ($mode == 2500)
3193 my $salt_len = get_random_num
(0, 32);
3195 for (my $i = 8; $i < 16; $i++)
3197 my $generate_from_len = 0;
3206 rnd
($mode, $len, $salt_len);
3210 rnd
($mode, $i, $salt_len);
3214 elsif ($mode == 2611)
3216 for (my $i = 1; $i < 32; $i++)
3220 rnd
($mode, $len, 3);
3228 elsif ($mode == 2612)
3230 my $salt_len = get_random_num
(1, 22);
3232 for (my $i = 1; $i < 32; $i++)
3236 rnd
($mode, $len, $salt_len);
3240 rnd
($mode, $i, $salt_len);
3244 elsif ($mode == 2711)
3246 for (my $i = 1; $i < 32; $i++)
3250 rnd
($mode, $len, 30);
3254 rnd
($mode, $i, 30);
3258 elsif ($mode == 2811)
3260 for (my $i = 1; $i < 32; $i++)
3264 rnd
($mode, $len, 5);
3272 elsif ($mode == 3000)
3274 for (my $i = 1; $i < 8; $i++)
3278 rnd
($mode, $len, 0);
3286 elsif ($mode == 3100)
3288 for (my $i = 1; $i < 32; $i++)
3292 rnd
($mode, $len, 10);
3296 rnd
($mode, $i, 10);
3300 elsif ($mode == 3800 || $mode == 4900)
3302 my $salt_len = get_random_num
(1, 11);
3304 for (my $i = 1; $i < 32; $i++)
3308 rnd
($mode, $len, $salt_len);
3312 rnd
($mode, $i, $salt_len);
3316 elsif ($mode == 5500 || $mode == 5600)
3320 for (my $i = 1; $i < 27; $i++)
3322 $salt_len = get_random_num
(1, 15);
3326 rnd
($mode, $len, $salt_len);
3330 rnd
($mode, $i, $salt_len);
3334 elsif ($mode == 5800)
3336 for (my $i = 1; $i < 14; $i++)
3340 rnd
($mode, $len, 16);
3344 rnd
($mode, $i, 16);
3348 elsif ($mode == 6800)
3350 my $salt_len = get_random_num
(8, 25);
3352 for (my $i = 1; $i < 32; $i++)
3356 rnd
($mode, $len, $salt_len);
3360 rnd
($mode, $i, $salt_len);
3364 elsif ($mode == 7100)
3366 for (my $i = 1; $i < 32; $i++)
3370 rnd
($mode, $len, 64);
3374 rnd
($mode, $i, 64);
3378 elsif ($mode == 7200)
3380 for (my $i = 1; $i < 32; $i++)
3384 rnd
($mode, $len, 128);
3388 rnd
($mode, $i, 128);
3392 elsif ($mode == 7300)
3394 my $salt_len = get_random_num
(32, 255);
3396 for (my $i = 1; $i < 32; $i++)
3400 rnd
($mode, $len, $salt_len);
3404 rnd
($mode, $i, $salt_len);
3408 elsif ($mode == 7500)
3410 for (my $i = 1; $i < 27; $i++)
3414 rnd
($mode, $len, 16);
3418 rnd
($mode, $i, 16);
3422 elsif ($mode == 7700)
3424 my $salt_len = get_random_num
(1, 12);
3426 for (my $i = 1; $i < 9; $i++)
3430 rnd
($mode, $len, $salt_len);
3434 rnd
($mode, $i, $salt_len);
3438 elsif ($mode == 7800)
3440 my $salt_len = get_random_num
(1, 12);
3442 for (my $i = 1; $i < 32; $i++)
3446 rnd
($mode, $len, $salt_len);
3450 rnd
($mode, $i, $salt_len);
3454 elsif ($mode == 8400 || $mode == 11200)
3456 for (my $i = 1; $i < 32; $i++)
3460 rnd
($mode, $len, 40);
3464 rnd
($mode, $i, 40);
3468 elsif ($mode == 8500)
3470 my $salt_len = get_random_num
(1, 8);
3472 for (my $i = 1; $i < 9; $i++)
3476 rnd
($mode, $len, $salt_len);
3480 rnd
($mode, $i, $salt_len);
3484 elsif ($mode == 8600)
3486 for (my $i = 1; $i < 17; $i++)
3490 rnd
($mode, $len, 0);
3498 elsif ($mode == 8700)
3500 for (my $i = 1; $i < 32; $i++)
3504 rnd
($mode, $len, 5);
3512 elsif ($mode == 9200 || $mode == 9300)
3516 for (my $i = 1; $i < 32; $i++)
3520 rnd
($mode, $len, $salt_len);
3524 rnd
($mode, $i, $salt_len);
3528 elsif ($mode == 9400 || $mode == 9500 || $mode == 9600 || $mode == 9700 || $mode == 9800)
3532 for (my $i = 1; $i < 20; $i++)
3536 rnd
($mode, $len, $salt_len);
3540 rnd
($mode, $i, $salt_len);
3544 elsif ($mode == 10100)
3546 for (my $i = 1; $i < 32; $i++)
3550 rnd
($mode, $len, 32);
3554 rnd
($mode, $i, 32);
3558 elsif ($mode == 10300)
3560 my $salt_len = get_random_num
(4, 15);
3562 for (my $i = 1; $i < 32; $i++)
3566 rnd
($mode, $len, $salt_len);
3570 rnd
($mode, $i, $salt_len);
3574 elsif ($mode == 10400 || $mode == 10600)
3578 for (my $i = 1; $i < 32; $i++)
3582 rnd
($mode, $len, $salt_len);
3586 rnd
($mode, $i, $salt_len);
3590 elsif ($mode == 10500 || $mode == 10700)
3594 for (my $i = 1; $i < 16; $i++)
3598 rnd
($mode, $len, $salt_len);
3602 rnd
($mode, $i, $salt_len);
3606 elsif ($mode == 11000)
3608 for (my $i = 1; $i < 32; $i++)
3612 rnd
($mode, $len, 56);
3616 rnd
($mode, $i, 56);
3620 elsif ($mode == 11300)
3622 for (my $i = 1; $i < 32; $i++)
3626 rnd
($mode, $len, 16);
3630 rnd
($mode, $i, 16);
3634 elsif ($mode == 11400)
3636 for (my $i = 1; $i < 24; $i++)
3640 rnd
($mode, $len, 16);
3644 rnd
($mode, $i, 16);
3648 elsif ($mode == 11600)
3650 my $salt_len = get_random_num
(0, 16);
3652 for (my $i = 1; $i < 32; $i++)
3656 rnd
($mode, $len, $salt_len);
3660 rnd
($mode, $i, $salt_len);
3664 elsif ($mode == 12400)
3666 for (my $i = 1; $i < 32; $i++)
3670 rnd
($mode, $len, 4);
3678 elsif ($mode == 12600)
3680 for (my $i = 1; $i < 32; $i++)
3684 rnd
($mode, $len, 64);
3688 rnd
($mode, $i, 64);
3692 elsif ($mode == 12700)
3694 for (my $i = 1; $i < 32; $i++)
3698 rnd
($mode, $len, 32);
3702 rnd
($mode, $i, 32);
3706 elsif ($mode == 12800)
3708 for (my $i = 1; $i < 25; $i++)
3712 rnd
($mode, $len, 20);
3716 rnd
($mode, $i, 20);
3720 elsif ($mode == 12900)
3722 for (my $i = 1; $i < 32; $i++)
3726 rnd
($mode, $len, 32);
3730 rnd
($mode, $i, 32);
3734 elsif ($mode == 13000)
3736 for (my $i = 1; $i < 32; $i++)
3740 rnd
($mode, $len, 32);
3744 rnd
($mode, $i, 32);
3748 elsif ($mode == 13100)
3750 for (my $i = 1; $i < 27; $i++)
3754 rnd
($mode, $len, 16);
3758 rnd
($mode, $i, 16);
3762 elsif ($mode == 13200)
3764 for (my $i = 1; $i < 32; $i++)
3768 rnd
($mode, $len, 32);
3772 rnd
($mode, $i, 32);
3785 my $word_buf = shift;
3787 my $salt_buf = shift;
3791 my $additional_param = shift;
3793 my $additional_param2 = shift;
3795 my $additional_param3 = shift;
3797 my $additional_param4 = shift;
3799 my $additional_param5 = shift;
3801 my $additional_param6 = shift;
3803 my $additional_param7 = shift;
3805 my $additional_param8 = shift;
3807 my $additional_param9 = shift;
3809 my $additional_param10 = shift;
3811 my $additional_param11 = shift;
3823 $hash_buf = md5_hex
($word_buf);
3825 $tmp_hash = sprintf ("%s", $hash_buf);
3829 $hash_buf = md5_hex
($word_buf . $salt_buf);
3831 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
3835 $hash_buf = md5_hex
($word_buf . $salt_buf);
3837 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
3841 $hash_buf = md5_hex
($word_buf . $salt_buf);
3843 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
3847 $hash_buf = md5_hex
($salt_buf . $word_buf);
3849 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
3853 $hash_buf = md5_hex
($salt_buf . $word_buf);
3855 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
3859 my $itoa64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
3860 my $salt_suffix = "Administration Tools";
3862 my $pass = sprintf ("%s:%s:%s", $salt_buf, $salt_suffix, $word_buf);
3864 $hash_buf = md5
($pass);
3868 for (my $pos = 0; $pos < 16; $pos += 2)
3870 my $octet1 = ord (substr ($hash_buf, $pos + 0, 1));
3871 my $octet2 = ord (substr ($hash_buf, $pos + 1, 1));
3873 my $num = ($octet1 <<8 & 0xff00) | ($octet2 & 0xff);
3875 my $idx1 = $num >> 12 & 0x0f;
3876 my $idx2 = $num >> 6 & 0x3f;
3877 my $idx3 = $num & 0x3f;
3879 $res = $res . substr ($itoa64, $idx1, 1) . substr ($itoa64, $idx2, 1) . substr ($itoa64, $idx3, 1);
3882 my $obfuscate_str = "nrcstn";
3883 my @obfuscate_pos = (0, 6, 12, 17, 23, 29);
3885 foreach my $pos (keys @obfuscate_pos)
3887 my $idx = $obfuscate_pos[$pos];
3888 my $before = substr ($res, 0, $idx);
3889 my $char = substr ($obfuscate_str, $pos, 1);
3890 my $after = substr ($res, $idx);
3892 $res = sprintf ("%s%s%s", $before, $char, $after);
3895 $tmp_hash = sprintf ("%s:%s", $res, $salt_buf);
3899 $hash_buf = md5_hex
($salt_buf . "\nskyper\n" . $word_buf);
3901 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
3905 $hash_buf = md5_hex
(encode
("UTF-16LE", $word_buf) . $salt_buf);
3907 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
3911 $hash_buf = md5_hex
($salt_buf . encode
("UTF-16LE", $word_buf));
3913 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
3917 $hash_buf = hmac_hex
($salt_buf, $word_buf, \
&md5
, 64);
3919 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
3923 $hash_buf = hmac_hex
($word_buf, $salt_buf, \
&md5
, 64);
3925 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
3927 elsif ($mode == 100)
3929 $hash_buf = sha1_hex
($word_buf);
3931 $tmp_hash = sprintf ("%s", $hash_buf);
3933 elsif ($mode == 101)
3935 $hash_buf = sha1
($word_buf);
3937 my $base64_buf = encode_base64
($hash_buf);
3939 chomp ($base64_buf);
3941 $tmp_hash = sprintf ("{SHA}%s", $base64_buf);
3943 elsif ($mode == 110)
3945 $hash_buf = sha1_hex
($word_buf . $salt_buf);
3947 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
3949 elsif ($mode == 111)
3951 $hash_buf = sha1
($word_buf . $salt_buf);
3953 my $base64_buf = encode_base64
($hash_buf . $salt_buf);
3955 chomp ($base64_buf);
3957 $tmp_hash = sprintf ("{SSHA}%s", $base64_buf);
3959 elsif ($mode == 112)
3961 my $salt_buf_bin = pack ("H*", $salt_buf);
3963 $hash_buf = sha1_hex
($word_buf . $salt_buf_bin);
3965 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
3967 elsif ($mode == 120)
3969 $hash_buf = sha1_hex
($salt_buf . $word_buf);
3971 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
3973 elsif ($mode == 121)
3975 $hash_buf = sha1_hex
(lc ($salt_buf) . $word_buf);
3977 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
3979 elsif ($mode == 122)
3981 my $salt_buf_bin = pack ("H*", $salt_buf);
3983 $hash_buf = sha1_hex
($salt_buf_bin . $word_buf);
3985 $tmp_hash = sprintf ("%s%s", $salt_buf, $hash_buf);
3987 elsif ($mode == 130)
3989 $hash_buf = sha1_hex
(encode
("UTF-16LE", $word_buf) . $salt_buf);
3991 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
3993 elsif ($mode == 131)
3995 my $salt_buf_bin = pack ("H*", $salt_buf);
3997 $hash_buf = sha1_hex
(encode
("UTF-16LE", uc ($word_buf)) . $salt_buf_bin);
3999 $tmp_hash = sprintf ("0x0100%s%s%s", $salt_buf, "0" x
40, $hash_buf);
4001 elsif ($mode == 132)
4003 my $salt_buf_bin = pack ("H*", $salt_buf);
4005 $hash_buf = sha1_hex
(encode
("UTF-16LE", $word_buf) . $salt_buf_bin);
4007 $tmp_hash = sprintf ("0x0100%s%s", $salt_buf, $hash_buf);
4009 elsif ($mode == 140)
4011 $hash_buf = sha1_hex
($salt_buf . encode
("UTF-16LE", $word_buf));
4013 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
4015 elsif ($mode == 141)
4017 $hash_buf = sha1
($salt_buf . encode
("UTF-16LE", $word_buf));
4019 my $base64_salt_buf = encode_base64
($salt_buf);
4021 chomp ($base64_salt_buf);
4023 my $base64_hash_buf = encode_base64
($hash_buf);
4025 $base64_hash_buf = substr ($base64_hash_buf, 0, 27);
4027 $tmp_hash = sprintf ("\$episerver\$*0*%s*%s", $base64_salt_buf, $base64_hash_buf);
4029 elsif ($mode == 150)
4031 $hash_buf = hmac_hex
($salt_buf, $word_buf, \
&sha1
, 64);
4033 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
4035 elsif ($mode == 160)
4037 $hash_buf = hmac_hex
($word_buf, $salt_buf, \
&sha1
, 64);
4039 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
4041 elsif ($mode == 190)
4043 $hash_buf = sha1_hex
($word_buf);
4045 my $variant = int (rand (2));
4047 if (defined ($additional_param))
4049 $variant = $additional_param;
4054 substr ($hash_buf, 0, 5) = "00000";
4057 $tmp_hash = sprintf ("%s", $hash_buf);
4059 elsif ($mode == 200)
4061 my $ppr = Authen
::Passphrase
::MySQL323
->new (passphrase
=> $word_buf);
4063 $hash_buf = $ppr->hash_hex;
4065 $tmp_hash = sprintf ("%s", $hash_buf);
4067 elsif ($mode == 300)
4069 $hash_buf = substr (password41
($word_buf), 1);
4071 $hash_buf = lc ($hash_buf); # useful for 'not matched' check only
4073 $tmp_hash = sprintf ("%s", $hash_buf);
4075 elsif ($mode == 400)
4084 my $ppr = Authen
::Passphrase
::PHPass
->new
4088 passphrase
=> $word_buf,
4091 $hash_buf = $ppr->as_rfc2307;
4093 $tmp_hash = sprintf ("%s", substr ($hash_buf, 7));
4095 elsif ($mode == 500)
4097 my $iterations = 1000;
4099 if (defined ($iter))
4103 $iterations = int ($iter);
4107 $hash_buf = md5_crypt
('$1$', $iterations, $word_buf, $salt_buf);
4109 $tmp_hash = sprintf ("%s", $hash_buf);
4111 elsif ($mode == 900)
4113 $hash_buf = md4_hex
($word_buf);
4115 $tmp_hash = sprintf ("%s", $hash_buf);
4117 elsif ($mode == 1000)
4119 $hash_buf = md4_hex
(encode
("UTF-16LE", $word_buf));
4121 $tmp_hash = sprintf ("%s", $hash_buf);
4123 elsif ($mode == 1100)
4125 $hash_buf = md4_hex
(md4
(encode
("UTF-16LE", $word_buf)) . encode
("UTF-16LE", lc ($salt_buf)));
4127 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
4129 elsif ($mode == 1400)
4131 $hash_buf = sha256_hex
($word_buf);
4133 $tmp_hash = sprintf ("%s", $hash_buf);
4135 elsif ($mode == 1410)
4137 $hash_buf = sha256_hex
($word_buf . $salt_buf);
4139 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
4141 elsif ($mode == 1420)
4143 $hash_buf = sha256_hex
($salt_buf . $word_buf);
4145 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
4147 elsif ($mode == 1430)
4149 $hash_buf = sha256_hex
(encode
("UTF-16LE", $word_buf) . $salt_buf);
4151 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
4153 elsif ($mode == 1440)
4155 $hash_buf = sha256_hex
($salt_buf . encode
("UTF-16LE", $word_buf));
4157 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
4159 elsif ($mode == 1441)
4161 $hash_buf = sha256
($salt_buf . encode
("UTF-16LE", $word_buf));
4163 my $base64_salt_buf = encode_base64
($salt_buf);
4165 chomp ($base64_salt_buf);
4167 my $base64_hash_buf = encode_base64
($hash_buf);
4169 chomp ($base64_hash_buf);
4171 $base64_hash_buf = substr ($base64_hash_buf, 0, 43);
4173 $tmp_hash = sprintf ("\$episerver\$*1*%s*%s", $base64_salt_buf, $base64_hash_buf);
4175 elsif ($mode == 1450)
4177 $hash_buf = hmac_hex
($salt_buf, $word_buf, \
&sha256
, 64);
4179 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
4181 elsif ($mode == 1460)
4183 $hash_buf = hmac_hex
($word_buf, $salt_buf, \
&sha256
, 64);
4185 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
4187 elsif ($mode == 1500)
4189 $hash_buf = crypt ($word_buf, $salt_buf);
4191 $tmp_hash = sprintf ("%s", $hash_buf);
4193 elsif ($mode == 1600)
4195 my $iterations = 1000;
4197 if (defined ($iter))
4201 $iterations = int ($iter);
4205 $hash_buf = md5_crypt
('$apr1$', $iterations, $word_buf, $salt_buf);
4207 $tmp_hash = sprintf ("%s", $hash_buf);
4209 elsif ($mode == 1700)
4211 $hash_buf = sha512_hex
($word_buf);
4213 $tmp_hash = sprintf ("%s", $hash_buf);
4215 elsif ($mode == 1710)
4217 $hash_buf = sha512_hex
($word_buf . $salt_buf);
4219 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
4221 elsif ($mode == 1711)
4223 $hash_buf = sha512_hex
($word_buf . $salt_buf);
4225 my $base64_buf = encode_base64
(pack ("H*", $hash_buf) . $salt_buf);
4227 $base64_buf =~ s/[ \n]//g;
4229 $tmp_hash = sprintf ("{SSHA512}%s", $base64_buf);
4231 elsif ($mode == 1720)
4233 $hash_buf = sha512_hex
($salt_buf . $word_buf);
4235 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
4237 elsif ($mode == 1730)
4239 $hash_buf = sha512_hex
(encode
("UTF-16LE", $word_buf) . $salt_buf);
4241 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
4243 elsif ($mode == 1740)
4245 $hash_buf = sha512_hex
($salt_buf . encode
("UTF-16LE", $word_buf));
4247 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
4249 elsif ($mode == 1722)
4251 my $salt_buf_bin = pack ("H*", $salt_buf);
4253 $hash_buf = sha512_hex
($salt_buf_bin . $word_buf);
4255 $tmp_hash = sprintf ("%s%s", $salt_buf, $hash_buf);
4257 elsif ($mode == 1731)
4259 my $salt_buf_bin = pack ("H*", $salt_buf);
4261 $hash_buf = sha512_hex
(encode
("UTF-16LE", $word_buf) . $salt_buf_bin);
4263 $tmp_hash = sprintf ("0x0200%s%s", $salt_buf, $hash_buf);
4265 elsif ($mode == 1750)
4267 $hash_buf = hmac_hex
($salt_buf, $word_buf, \
&sha512
, 128);
4269 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
4271 elsif ($mode == 1760)
4273 $hash_buf = hmac_hex
($word_buf, $salt_buf, \
&sha512
, 128);
4275 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
4277 elsif ($mode == 1800)
4279 my $iterations = 5000;
4281 if (defined ($iter))
4285 $iterations = int ($iter);
4289 $hash_buf = sha512_crypt
($iterations, $word_buf, $salt_buf);
4291 $tmp_hash = sprintf ("%s", $hash_buf);
4293 elsif ($mode == 2100)
4295 my $iterations = 10240;
4299 $iterations = int ($iter);
4302 my $salt = encode
("UTF-16LE", lc ($salt_buf));
4304 my $pbkdf2 = Crypt
::PBKDF2
->new
4306 hash_class
=> 'HMACSHA1',
4307 iterations
=> $iterations,
4309 salt_len
=> length ($salt),
4312 $hash_buf = unpack ("H*", $pbkdf2->PBKDF2 ($salt, md4
(md4
(encode
("UTF-16LE", $word_buf)) . $salt)));
4314 $tmp_hash = sprintf ("\$DCC2\$%i#%s#%s", $iterations, $salt_buf, $hash_buf);
4316 elsif ($mode == 2400)
4318 $tmp_hash = sprintf ("%s", pseudo_base64
(Digest
::MD5
::md5
($word_buf . "\0" x
(16 - length ($word_buf)))));
4320 elsif ($mode == 2410)
4322 my $salt_len = length ($salt_buf);
4324 my $salt_len_max4 = ($salt_len < 4) ?
$salt_len : 4;
4326 my $hash_buf = pseudo_base64
(Digest
::MD5
::md5
($word_buf . substr ($salt_buf, 0, $salt_len_max4) . "\0" x
(16 - length ($word_buf) - $salt_len_max4)));
4328 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
4330 elsif ($mode == 2500)
4332 my ($bssid, $stmac, $snonce, $anonce, $eapol, $keyver, $eapol_size);
4334 if (! defined ($additional_param))
4338 $bssid = randbytes
(6);
4339 $stmac = randbytes
(6);
4340 $snonce = randbytes
(32);
4341 $anonce = randbytes
(32);
4343 $keyver = get_random_num
(1, 3); # 1 or 2
4346 # should be "validly" generated, but in theory could be anything for us also:
4347 # $eapol = "\x00" x 121; # works too, but let's generate it correctly
4349 $eapol = gen_random_wpa_eapol
($keyver, $snonce);
4353 $bssid = $additional_param;
4354 $stmac = $additional_param2;
4355 $snonce = $additional_param3;
4356 $anonce = $additional_param4;
4357 $keyver = $additional_param5;
4358 $eapol = $additional_param6;
4361 $eapol_size = length ($eapol);
4365 my $iterations = 4096;
4371 # generate the Pairwise Master Key (PMK)
4373 my $pbkdf2 = Crypt
::PBKDF2
->new
4375 hash_class
=> 'HMACSHA1',
4376 iterations
=> $iterations,
4380 my $pmk = $pbkdf2->PBKDF2 ($salt_buf, $word_buf);
4382 # Pairwise Transient Key (PTK) transformation
4384 my $ptk = wpa_prf_512
($pmk, $stmac, $bssid, $snonce, $anonce);
4386 # generate the Message Integrity Code (MIC)
4390 if ($keyver == 1) # WPA1 => MD5
4392 $mic = hmac
($eapol, $ptk, \
&md5
);
4396 $mic = hmac
($eapol, $ptk, \
&sha1
);
4399 $mic = substr ($mic, 0, 16);
4402 # format the binary output
4407 # first the essid (NULL-padded up to the first 36 bytes)
4409 $hash_buf .= $salt_buf;
4410 $hash_buf .= "\x00" x
(36 - length ($salt_buf));
4412 # the 2 MAC addresses
4414 $hash_buf .= $bssid;
4415 $hash_buf .= $stmac;
4419 $hash_buf .= $snonce;
4420 $hash_buf .= $anonce;
4424 $hash_buf .= $eapol;
4425 $hash_buf .= "\x00" x
(256 - $eapol_size);
4429 $hash_buf .= pack ("L*", $eapol_size);
4433 $hash_buf .= pack ("L*", $keyver);
4435 # and finally: the key mic
4439 # base64 encode the output
4441 $tmp_hash = encode_base64
($hash_buf, '');
4443 elsif ($mode == 2600)
4445 $hash_buf = md5_hex
(md5_hex
($word_buf));
4447 $tmp_hash = sprintf ("%s", $hash_buf);
4449 elsif ($mode == 2611)
4451 $hash_buf = md5_hex
(md5_hex
($word_buf) . $salt_buf);
4453 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
4455 elsif ($mode == 2612)
4457 my $salt_buf_hex = unpack ("H*", $salt_buf);
4459 $hash_buf = md5_hex
(md5_hex
($word_buf) . $salt_buf);
4461 $tmp_hash = sprintf ("\$PHPS\$%s\$%s", $salt_buf_hex, $hash_buf);
4463 elsif ($mode == 2711)
4465 $hash_buf = md5_hex
(md5_hex
($word_buf) . $salt_buf);
4467 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
4469 elsif ($mode == 2811)
4471 $hash_buf = md5_hex
(md5_hex
($salt_buf) . md5_hex
($word_buf));
4473 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
4475 elsif ($mode == 3000)
4477 my $ppr = Authen
::Passphrase
::LANManager
->new ("passphrase" => $word_buf);
4479 $hash_buf = $ppr->hash_hex;
4481 $tmp_hash = sprintf ("%s", substr ($hash_buf, 0, 16));
4483 elsif ($mode == 3100)
4485 $hash_buf = oracle_hash
($salt_buf, $word_buf);
4487 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
4489 elsif ($mode == 3200)
4498 $tmp_hash = bcrypt
($word_buf, sprintf ('$2a$%s$%s$', $cost, en_base64
($salt_buf)));
4500 elsif ($mode == 3300)
4502 my $iterations = 904;
4506 $iterations = int ($iter);
4511 if (defined ($additional_param))
4513 $variant = $additional_param;
4516 my $prefix = sprintf ("\$md5%srounds=%i\$%s", $variant, $iterations, $salt_buf);
4518 $iterations += 4096;
4520 $hash_buf = sun_md5
($word_buf, $prefix, $iterations);
4522 $tmp_hash = sprintf ("%s\$%s", $prefix, $hash_buf);
4524 elsif ($mode == 3500)
4526 $hash_buf = md5_hex
(md5_hex
(md5_hex
($word_buf)));
4528 $tmp_hash = sprintf ("%s", $hash_buf);
4530 elsif ($mode == 3610)
4532 $hash_buf = md5_hex
(md5_hex
($salt_buf) . $word_buf);
4534 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
4536 elsif ($mode == 3710)
4538 $hash_buf = md5_hex
($salt_buf . md5_hex
($word_buf));
4540 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
4542 elsif ($mode == 3711)
4544 $hash_buf = md5_hex
($salt_buf . "-" . md5_hex
($word_buf));
4546 $tmp_hash = sprintf ("\$B\$%s\$%s", $salt_buf, $hash_buf);
4548 elsif ($mode == 3720)
4550 $hash_buf = md5_hex
($word_buf . md5_hex
($salt_buf));
4552 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
4554 elsif ($mode == 3800)
4556 $hash_buf = md5_hex
($salt_buf . $word_buf . $salt_buf);
4558 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
4560 elsif ($mode == 3910)
4562 $hash_buf = md5_hex
(md5_hex
($word_buf) . md5_hex
($salt_buf));
4564 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
4566 elsif ($mode == 4010)
4568 $hash_buf = md5_hex
($salt_buf . md5_hex
($salt_buf . $word_buf));
4570 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
4572 elsif ($mode == 4110)
4574 $hash_buf = md5_hex
($salt_buf . md5_hex
($word_buf . $salt_buf));
4576 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
4578 elsif ($mode == 4210)
4580 $hash_buf = md5_hex
($salt_buf . "\x00" . $word_buf);
4582 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
4584 elsif ($mode == 4300)
4586 $hash_buf = md5_hex
(uc (md5_hex
($word_buf)));
4588 $tmp_hash = sprintf ("%s", $hash_buf);
4590 elsif ($mode == 4400)
4592 $hash_buf = md5_hex
(sha1_hex
($word_buf));
4594 $tmp_hash = sprintf ("%s", $hash_buf);
4596 elsif ($mode == 4500)
4598 $hash_buf = sha1_hex
(sha1_hex
($word_buf));
4600 $tmp_hash = sprintf ("%s", $hash_buf);
4602 elsif ($mode == 4600)
4604 $hash_buf = sha1_hex
(sha1_hex
(sha1_hex
($word_buf)));
4606 $tmp_hash = sprintf ("%s", $hash_buf);
4608 elsif ($mode == 4700)
4610 $hash_buf = sha1_hex
(md5_hex
($word_buf));
4612 $tmp_hash = sprintf ("%s", $hash_buf);
4614 elsif ($mode == 4800)
4616 my $index = rindex ($salt_buf, ":");
4618 my $salt = substr ($salt_buf, 0, $index);
4619 my $salt_bin = pack ("H*", $salt);
4620 my $chap_sign = substr ($salt_buf, $index + 1);
4621 my $chap_sign_bin = pack ("H*", $chap_sign);
4623 $hash_buf = md5_hex
($chap_sign_bin . $word_buf . $salt_bin);
4625 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
4627 elsif ($mode == 4900)
4629 $hash_buf = sha1_hex
($salt_buf . $word_buf . $salt_buf);
4631 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
4633 elsif ($mode == 5000)
4635 $hash_buf = keccak_256_hex
($word_buf);
4637 $tmp_hash = sprintf ("%s", $hash_buf);
4639 elsif ($mode == 5100)
4643 if (! defined ($additional_param))
4649 $pos = $additional_param * 8 unless ($additional_param > 2);
4652 $hash_buf = md5_hex
($word_buf);
4654 $tmp_hash = sprintf ("%s", substr ($hash_buf, $pos, 16));
4656 elsif ($mode == 5300)
4658 my @salt_arr = split (":", $salt_buf);
4660 my $msg_buf = pack ("H*", $salt_arr[0] . $salt_arr[1] . $salt_arr[2] . $salt_arr[3] . $salt_arr[4] . $salt_arr[5]);
4661 my $nr_buf = pack ("H*", $salt_arr[6] . $salt_arr[7]);
4663 my $hash_buf = hmac
($nr_buf , $word_buf, \
&md5
, 64);
4664 $hash_buf = hmac_hex
($msg_buf, $hash_buf, \
&md5
, 64);
4666 $tmp_hash = sprintf ("%s:%s", $salt_buf, $hash_buf);
4668 elsif ($mode == 5400)
4670 my @salt_arr = split (":", $salt_buf);
4672 my $msg_buf = pack ("H*", $salt_arr[0] . $salt_arr[1] . $salt_arr[2] . $salt_arr[3] . $salt_arr[4] . $salt_arr[5]);
4673 my $nr_buf = pack ("H*", $salt_arr[6] . $salt_arr[7]);
4675 my $hash_buf = hmac
($nr_buf , $word_buf, \
&sha1
, 64);
4676 $hash_buf = hmac_hex
($msg_buf, $hash_buf, \
&sha1
, 64);
4678 $tmp_hash = sprintf ("%s:%s", $salt_buf, $hash_buf);
4680 elsif ($mode == 5500)
4682 my $index1 = index ($salt_buf, "::");
4683 my $user = substr ($salt_buf, 0, $index1);
4685 my $index2 = index ($salt_buf, ":", $index1 + 2);
4686 my $domain = substr ($salt_buf, $index1 + 2, $index2 - $index1 - 2);
4688 my $len = length (substr ($salt_buf, $index2 + 1));
4690 my $c_challenge_hex;
4694 $c_challenge_hex = substr ($salt_buf, $index2 + 1, 48);
4699 $c_challenge_hex = substr ($salt_buf, $index2 + 1, 16);
4700 $c_challenge_hex .= 00 x
32;
4703 my $c_challenge = pack ("H*", substr ($c_challenge_hex, 0, 16));
4704 my $s_challenge_hex = substr ($salt_buf, $index2 + 17, 16);
4705 my $s_challenge = pack ("H*", $s_challenge_hex);
4707 my $challenge = substr (md5
($s_challenge . $c_challenge), 0, 8);
4711 my $nthash = Authen
::Passphrase
::NTHash
->new (passphrase
=> $word_buf)->hash . "\x00" x
5;
4713 $ntresp .= Crypt
::ECB
::encrypt
(setup_des_key
(substr ($nthash, 0, 7)), "DES", $challenge, PADDING_NONE
);
4714 $ntresp .= Crypt
::ECB
::encrypt
(setup_des_key
(substr ($nthash, 7, 7)), "DES", $challenge, PADDING_NONE
);
4715 $ntresp .= Crypt
::ECB
::encrypt
(setup_des_key
(substr ($nthash, 14, 7)), "DES", $challenge, PADDING_NONE
);
4717 $tmp_hash = sprintf ("%s::%s:%s:%s:%s", $user, $domain, $c_challenge_hex, unpack ("H*", $ntresp), $s_challenge_hex);
4719 elsif ($mode == 5600)
4721 my $index1 = index ($salt_buf, "::");
4722 my $user = substr ($salt_buf, 0, $index1);
4724 my $index2 = index ($salt_buf, ":", $index1 + 2);
4725 my $domain = substr ($salt_buf, $index1 + 2, $index2 - $index1 - 2);
4727 my $s_challenge_hex = substr ($salt_buf, $index2 + 1, 16);
4728 my $s_challenge = pack ("H*", $s_challenge_hex);
4730 my $temp_hex = substr ($salt_buf, $index2 + 17);
4731 my $temp = pack ("H*", $temp_hex);
4733 my $nthash = Authen
::Passphrase
::NTHash
->new (passphrase
=> $word_buf)->hash;
4734 my $identity = Encode
::encode
("UTF-16LE", uc ($user) . $domain);
4736 $hash_buf = hmac_hex
($s_challenge . $temp, hmac
($identity, $nthash, \
&md5
, 64), \
&md5
, 64);
4738 $tmp_hash = sprintf ("%s::%s:%s:%s:%s", $user, $domain, $s_challenge_hex, $hash_buf, $temp_hex);
4740 elsif ($mode == 5700)
4742 $hash_buf = sha256
($word_buf);
4744 my $base64_buf = encode_base64
($hash_buf);
4748 for (my $i = 0; $i < 43; $i++)
4750 $tmp_hash .= $CISCO_BASE64_MAPPING->{substr ($base64_buf, $i, 1)};
4753 elsif ($mode == 5800)
4755 $hash_buf = androidpin_hash
($word_buf, $salt_buf);
4757 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
4759 elsif ($mode == 6000)
4761 $hash_buf = ripemd160_hex
($word_buf);
4763 $tmp_hash = sprintf ("%s", $hash_buf);
4765 elsif ($mode == 6100)
4767 $hash_buf = whirlpool_hex
($word_buf);
4769 $tmp_hash = sprintf ("%s", $hash_buf);
4771 elsif ($mode == 6300)
4773 my $iterations = 1000; # hard coded by the AIX format
4775 $hash_buf = md5_crypt
('', $iterations, $word_buf, $salt_buf);
4777 $tmp_hash = sprintf ("{smd5}%s", $hash_buf);
4779 elsif ($mode == 6400)
4781 my $iterations = 64;
4785 $iterations = 1 << int ($iter);
4788 $hash_buf = aix_ssha256_pbkdf2
($word_buf, $salt_buf, $iterations);
4790 $tmp_hash = sprintf ("{ssha256}%02i\$%s\$%s", log ($iterations) / log (2), $salt_buf, $hash_buf);
4792 elsif ($mode == 6500)
4794 my $iterations = 64;
4798 $iterations = 1 << int ($iter);
4801 $hash_buf = aix_ssha512_pbkdf2
($word_buf, $salt_buf, $iterations);
4803 $tmp_hash = sprintf ("{ssha512}%02i\$%s\$%s", log ($iterations) / log (2), $salt_buf, $hash_buf);
4805 elsif ($mode == 6600)
4807 my $iterations = 1000;
4811 $iterations = int ($iter);
4814 my $salt_hex = substr ($salt_buf, 0, 16);
4815 my $salt = pack ("H*", $salt_hex);
4817 my $prefix = substr ($salt_buf, 16, 2016);
4819 my $iv_hex = substr ($salt_buf, 2032);
4820 my $iv = pack ("H*", $iv_hex);
4822 my $data = pack ("H*", "10101010101010101010101010101010");
4824 my $hasher = Crypt
::PBKDF2
->hasher_from_algorithm ('HMACSHA1');
4826 my $pbkdf2 = Crypt
::PBKDF2
->new (
4828 iterations
=> $iterations,
4832 my $key = $pbkdf2->PBKDF2 ($salt, $word_buf);
4834 my $cipher = Crypt
::CBC
->new ({
4836 cipher
=> "Crypt::Rijndael",
4843 my $encrypted = unpack ("H*", $cipher->encrypt ($data));
4845 $hash_buf = substr ($encrypted, 0, 32);
4847 $tmp_hash = sprintf ("%i:%s:%s%s%s", $iterations, $salt_hex, $prefix, $iv_hex, $hash_buf);
4849 elsif ($mode == 6700)
4851 my $iterations = 64;
4855 $iterations = 1 << int ($iter);
4858 $hash_buf = aix_ssha1_pbkdf2
($word_buf, $salt_buf, $iterations);
4860 $tmp_hash = sprintf ("{ssha1}%02i\$%s\$%s", log ($iterations) / log (2), $salt_buf, $hash_buf);
4862 elsif ($mode == 6800)
4864 my $variant = $additional_param;
4866 if (! defined ($variant))
4868 $variant = int (rand (2));
4871 my $iterations = 500;
4875 $iterations = int ($iter);
4878 my $iv = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00";
4880 my $hasher = Crypt
::PBKDF2
->hasher_from_algorithm ('HMACSHA2', 256);
4882 my $pbkdf2 = Crypt
::PBKDF2
->new (
4884 iterations
=> $iterations,
4888 my $key = $pbkdf2->PBKDF2 ($salt_buf, $word_buf);
4890 my $cipher = Crypt
::CBC
->new ({
4892 cipher
=> "Crypt::Rijndael",
4901 my $encrypt = $cipher->encrypt (substr ($salt_buf, 0, 16));
4903 $hash_buf = substr (unpack ("H*", $encrypt), 0, 32);
4907 my $verifier = "lastpass rocks\x02\x02";
4909 $hash_buf = unpack ("H*", substr ($cipher->encrypt ($verifier), 0, 16));
4912 $tmp_hash = sprintf ("%s:%i:%s", $hash_buf, $iterations, $salt_buf);
4914 elsif ($mode == 6900)
4916 $hash_buf = gost_hex
($word_buf);
4918 $tmp_hash = sprintf ("%s", $hash_buf);
4920 elsif ($mode == 7100)
4922 my $iterations = 1024;
4926 $iterations = int ($iter);
4929 my $pbkdf2 = Crypt
::PBKDF2
->new
4931 hasher
=> Crypt
::PBKDF2
->hasher_from_algorithm ('HMACSHA2', 512),
4932 iterations
=> $iterations
4935 $hash_buf = unpack ("H*", $pbkdf2->PBKDF2 (pack ("H*", $salt_buf), $word_buf));
4937 $tmp_hash = sprintf ("\$ml\$%i\$%s\$%0128s", $iterations, $salt_buf, $hash_buf);
4939 elsif ($mode == 7200)
4941 my $iterations = 1024;
4945 $iterations = int ($iter);
4948 my $pbkdf2 = Crypt
::PBKDF2
->new (
4949 hasher
=> Crypt
::PBKDF2
->hasher_from_algorithm ('HMACSHA2', 512),
4950 iterations
=> $iterations
4953 $hash_buf = unpack ("H*", $pbkdf2->PBKDF2 (pack ("H*", $salt_buf), $word_buf));
4955 $tmp_hash = sprintf ("grub.pbkdf2.sha512.%i.%s.%0128s", $iterations, $salt_buf, $hash_buf);
4957 elsif ($mode == 7300)
4959 $hash_buf = hmac_hex
($salt_buf, $word_buf, \
&sha1
);
4961 $tmp_hash = sprintf ("%s:%s", unpack ("H*", $salt_buf), $hash_buf);
4963 elsif ($mode == 7400)
4965 my $iterations = 5000;
4967 if (defined ($iter))
4971 $iterations = int ($iter);
4975 $hash_buf = sha256_crypt
($iterations, $word_buf, $salt_buf);
4977 $tmp_hash = sprintf ("%s", $hash_buf);
4979 elsif ($mode == 7500)
4981 my @salt_arr = split ("\\\$", $salt_buf);
4983 my $user = $salt_arr[0];
4985 my $realm = $salt_arr[1];
4987 my $salt = $salt_arr[2];
4989 my $hmac_salt = $salt_arr[3];
4990 my $hmac_salt_bin = pack ("H*", $hmac_salt);
4992 my $clear_data = $salt_arr[4];
4994 my $k = md4
(encode
("UTF-16LE", $word_buf));
4996 my $k1 = hmac_md5
("\x01\x00\x00\x00", $k);
4998 my $k3 = hmac_md5
($hmac_salt_bin, $k1);
5000 if (length ($clear_data) > 1)
5002 my $clear_data_bin = pack ("H*", $clear_data);
5004 $hash_buf = RC4
($k3, $clear_data_bin);
5008 my $hash = $salt_arr[5];
5010 my $hash_bin = pack ("H*", $hash);
5012 my $clear_data = RC4
($k3, $hash_bin);
5014 my $timestamp = substr ($clear_data, 14, 14);
5019 if ($timestamp !~ /^[[:digit:]]{14}$/)
5026 $hash_buf = "\x00" x
36;
5028 if ($hash_buf eq $hash_bin)
5030 $hash_buf = "\x01" x
36;
5035 $hash_buf = $hash_bin;
5039 $tmp_hash = sprintf ("\$krb5pa\$23\$%s\$%s\$%s\$%s%s", $user, $realm, $salt, unpack ("H*", $hash_buf), $hmac_salt);
5041 elsif ($mode == 7600)
5043 $hash_buf = sha1_hex
($salt_buf . sha1_hex
($word_buf));
5045 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
5047 elsif ($mode == 7700)
5049 $word_buf = uc $word_buf;
5050 $salt_buf = uc $salt_buf;
5052 my $word_buf_t = sapb_transcode
($word_buf);
5053 my $salt_buf_t = sapb_transcode
($salt_buf);
5055 my $digest1 = md5
($word_buf_t . $salt_buf_t);
5057 my $data = sapb_waldorf
($digest1, $word_buf_t, $salt_buf_t);
5059 my $digest2 = md5
($data);
5061 my ($a, $b, $c, $d) = unpack ("N4", $digest2);
5066 $tmp_hash = sprintf ("%s\$%08X%08X", $salt_buf, $a, $b);
5068 elsif ($mode == 7800)
5070 my $theMagicArray_s =
5071 "\x91\xac\x51\x14\x9f\x67\x54\x43\x24\xe7\x3b\xe0\x28\x74\x7b\xc2" .
5072 "\x86\x33\x13\xeb\x5a\x4f\xcb\x5c\x08\x0a\x73\x37\x0e\x5d\x1c\x2f" .
5073 "\x33\x8f\xe6\xe5\xf8\x9b\xae\xdd\x16\xf2\x4b\x8d\x2c\xe1\xd4\xdc" .
5074 "\xb0\xcb\xdf\x9d\xd4\x70\x6d\x17\xf9\x4d\x42\x3f\x9b\x1b\x11\x94" .
5075 "\x9f\x5b\xc1\x9b\x06\x05\x9d\x03\x9d\x5e\x13\x8a\x1e\x9a\x6a\xe8" .
5076 "\xd9\x7c\x14\x17\x58\xc7\x2a\xf6\xa1\x99\x63\x0a\xd7\xfd\x70\xc3" .
5077 "\xf6\x5e\x74\x13\x03\xc9\x0b\x04\x26\x98\xf7\x26\x8a\x92\x93\x25" .
5078 "\xb0\xa2\x0d\x23\xed\x63\x79\x6d\x13\x32\xfa\x3c\x35\x02\x9a\xa3" .
5079 "\xb3\xdd\x8e\x0a\x24\xbf\x51\xc3\x7c\xcd\x55\x9f\x37\xaf\x94\x4c" .
5080 "\x29\x08\x52\x82\xb2\x3b\x4e\x37\x9f\x17\x07\x91\x11\x3b\xfd\xcd";
5082 $salt_buf = uc $salt_buf;
5084 my $digest = sha1
($word_buf . $salt_buf);
5086 my ($a, $b, $c, $d, $e) = unpack ("I*", $digest);
5088 my $lengthMagicArray = 0x20;
5089 my $offsetMagicArray = 0;
5091 $lengthMagicArray += (($a >> 0) & 0xff) % 6;
5092 $lengthMagicArray += (($a >> 8) & 0xff) % 6;
5093 $lengthMagicArray += (($a >> 16) & 0xff) % 6;
5094 $lengthMagicArray += (($a >> 24) & 0xff) % 6;
5095 $lengthMagicArray += (($b >> 0) & 0xff) % 6;
5096 $lengthMagicArray += (($b >> 8) & 0xff) % 6;
5097 $lengthMagicArray += (($b >> 16) & 0xff) % 6;
5098 $lengthMagicArray += (($b >> 24) & 0xff) % 6;
5099 $lengthMagicArray += (($c >> 0) & 0xff) % 6;
5100 $lengthMagicArray += (($c >> 8) & 0xff) % 6;
5101 $offsetMagicArray += (($c >> 16) & 0xff) % 8;
5102 $offsetMagicArray += (($c >> 24) & 0xff) % 8;
5103 $offsetMagicArray += (($d >> 0) & 0xff) % 8;
5104 $offsetMagicArray += (($d >> 8) & 0xff) % 8;
5105 $offsetMagicArray += (($d >> 16) & 0xff) % 8;
5106 $offsetMagicArray += (($d >> 24) & 0xff) % 8;
5107 $offsetMagicArray += (($e >> 0) & 0xff) % 8;
5108 $offsetMagicArray += (($e >> 8) & 0xff) % 8;
5109 $offsetMagicArray += (($e >> 16) & 0xff) % 8;
5110 $offsetMagicArray += (($e >> 24) & 0xff) % 8;
5112 my $hash_buf = sha1_hex
($word_buf . substr ($theMagicArray_s, $offsetMagicArray, $lengthMagicArray) . $salt_buf);
5114 $tmp_hash = sprintf ("%s\$%s", $salt_buf, uc $hash_buf);
5116 elsif ($mode == 7900)
5125 my $phpass_it = 1 << $cost;
5127 $hash_buf = sha512
($salt_buf . $word_buf);
5129 for (my $i = 0; $i < $phpass_it; $i++)
5131 $hash_buf = sha512
($hash_buf . $word_buf);
5134 my $base64_buf = substr (Authen
::Passphrase
::PHPass
::_en_base64
($hash_buf), 0, 43);
5136 my $base64_digits = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
5138 my $cost_str = substr ($base64_digits , $cost, 1);
5140 $tmp_hash = sprintf ('$S$%s%s%s', $cost_str, $salt_buf, $base64_buf);
5142 elsif ($mode == 8000)
5144 my $salt_buf_bin = pack ("H*", $salt_buf);
5146 my $word_buf_utf = encode
("UTF-16BE", $word_buf);
5148 $hash_buf = sha256_hex
($word_buf_utf . "\x00" x
(510 - (length ($word_buf) * 2)) . $salt_buf_bin);
5150 $tmp_hash = sprintf ("0xc007%s%s", $salt_buf, $hash_buf);
5152 elsif ($mode == 8100)
5154 $hash_buf = sha1_hex
($salt_buf . $word_buf . "\x00");
5156 $tmp_hash = sprintf ("1%s%s", $salt_buf, $hash_buf);
5158 elsif ($mode == 8200)
5160 my $iterations = 40000;
5162 if (defined ($iter))
5164 $iterations = $iter;
5167 my $salt_hex = substr ($salt_buf, 0, 32);
5168 my $salt = pack ("H*", $salt_hex);
5170 my $data_hex = substr ($salt_buf, 32);
5171 my $data = pack ("H*", $data_hex);
5173 my $pbkdf2 = Crypt
::PBKDF2
->new
5175 hasher
=> Crypt
::PBKDF2
->hasher_from_algorithm ('HMACSHA2', 512),
5176 iterations
=> int $iterations
5179 my $key = $pbkdf2->PBKDF2 ($salt, $word_buf);
5181 $hash_buf = hmac_hex
($data, substr ($key, 32, 32), \
&sha256
, 64);
5183 $tmp_hash = sprintf ("%s:%s:%d:%s", $hash_buf, $salt_hex, $iterations, $data_hex);
5185 elsif ($mode == 8300)
5187 my ($domain, $salt_hex) = split (":", $salt_buf);
5189 my $hashalg = Net
::DNS
::SEC
->digtype ("SHA1");
5191 my $salt = pack ("H*", $salt_hex);
5195 if (defined ($iter))
5197 $iterations = $iter;
5200 my $name = lc ($word_buf . $domain);
5202 my $hash_buf = Net
::DNS
::RR
::NSEC3
::name2hash
($hashalg, $name, $iterations, $salt);
5204 $tmp_hash = sprintf ("%s:%s:%s:%d", $hash_buf, $domain, $salt_hex, $iterations);
5206 elsif ($mode == 8400)
5208 $hash_buf = sha1_hex
($salt_buf . sha1_hex
($salt_buf . sha1_hex
($word_buf)));
5210 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
5212 elsif ($mode == 8500)
5214 $hash_buf = racf_hash
(uc $salt_buf, $word_buf);
5216 $tmp_hash = sprintf ('$racf$*%s*%s', uc $salt_buf, uc $hash_buf);
5218 elsif ($mode == 8600)
5220 my @saved_key = map { ord $_; } split "", $word_buf;
5222 my $len = scalar @saved_key;
5224 my @state = domino_big_md
(\
@saved_key, $len);
5226 $tmp_hash = sprintf ('%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x',
5245 elsif ($mode == 8700)
5247 my $domino_char = undef;
5249 if (defined ($additional_param))
5251 $domino_char = $additional_param;
5254 my @saved_key = map { ord $_; } split "", $word_buf;
5256 my $len = scalar @saved_key;
5258 my @state = domino_big_md
(\
@saved_key, $len);
5260 my $str = "(" . unpack ("H*", join ("", (map { chr $_; } @state))) . ")";
5262 @saved_key = map { ord $_; } split "", $salt_buf . uc $str;
5264 @state = domino_big_md
(\
@saved_key, 34);
5266 $hash_buf = join ("", (map { chr $_; } @state));
5268 $tmp_hash = sprintf ('(G%s)', domino_encode
($salt_buf . $hash_buf, $domino_char));
5270 elsif ($mode == 8900)
5276 if (defined ($additional_param))
5278 $N = $additional_param;
5279 $r = $additional_param2;
5280 $p = $additional_param3;
5283 $hash_buf = scrypt_hash
($word_buf, $salt_buf, $N, $r, $p, 32);
5285 $tmp_hash = sprintf ('%s', $hash_buf);
5287 elsif ($mode == 9100)
5289 my $iterations = 5000;
5291 if (defined ($iter))
5293 $iterations = $iter;
5296 my $domino_char = undef;
5298 # domino 5 hash - SEC_pwddigest_V1 - -m 8600
5300 my @saved_key = map { ord $_; } split "", $word_buf;
5302 my $len = scalar @saved_key;
5304 my @state = domino_big_md
(\
@saved_key, $len);
5307 # domino 6 hash - SEC_pwddigest_V2 - -m 8700
5309 my $salt_part = substr ($salt_buf, 0, 5);
5311 my $str = "(" . unpack ("H*", join ("", (map { chr $_; } @state))) . ")";
5313 @saved_key = map { ord $_; } split "", $salt_part . uc $str;
5315 @state = domino_big_md
(\
@saved_key, 34);
5317 $hash_buf = join ("", (map { chr $_; } @state));
5319 $tmp_hash = sprintf ('(G%s)', domino_encode
($salt_part . $hash_buf, $domino_char));
5322 # domino 8(.5.x) hash - SEC_pwddigest_V3 - -m 9100
5324 my $pbkdf2 = Crypt
::PBKDF2
->new
5326 hash_class
=> 'HMACSHA1',
5327 iterations
=> $iterations,
5334 if (defined ($additional_param))
5336 $chars = $additional_param;
5339 my $digest_new = $pbkdf2->PBKDF2 ($salt_buf, $tmp_hash);
5341 my $iteration_str = "" . $iterations;
5343 for (my $i = length ($iterations); $i < 10; $i++)
5345 $iterations = "0" . $iterations;
5348 $tmp_hash = sprintf ('(H%s)', domino_85x_encode
($salt_buf . $iterations . $chars . $digest_new, $domino_char));
5350 elsif ($mode == 9200)
5352 my $iterations = 20000;
5354 my $pbkdf2 = Crypt
::PBKDF2
->new
5356 hasher
=> Crypt
::PBKDF2
->hasher_from_algorithm ('HMACSHA2', 256),
5357 iterations
=> $iterations
5360 $hash_buf = encode_base64
($pbkdf2->PBKDF2 ($salt_buf, $word_buf));
5364 for (my $i = 0; $i < 43; $i++)
5366 $tmp_hash .= $CISCO_BASE64_MAPPING->{substr ($hash_buf, $i, 1)};
5369 $tmp_hash = sprintf ("\$8\$%s\$%s", $salt_buf, $tmp_hash);
5371 elsif ($mode == 9300)
5377 $hash_buf = scrypt_b64
($word_buf, $salt_buf, $N, $r, $p, 32);
5381 for (my $i = 0; $i < 43; $i++)
5383 $tmp_hash .= $CISCO_BASE64_MAPPING->{substr ($hash_buf, $i, 1)};
5386 $tmp_hash = sprintf ('$9$%s$%s', $salt_buf, $tmp_hash);
5388 elsif ($mode == 9400)
5390 my $iterations = 50000;
5394 $iterations = int ($iter);
5397 my $aes_key_size = 128; # or 256
5399 if (defined ($additional_param2))
5401 $aes_key_size = $additional_param2;
5404 $salt_buf = pack ("H*", $salt_buf);
5406 my $tmp = sha1
($salt_buf . encode
("UTF-16LE", $word_buf));
5408 for (my $i = 0; $i < $iterations; $i++)
5410 my $num32 = pack ("L", $i);
5412 $tmp = sha1
($num32 . $tmp);
5415 my $zero32 = pack ("L", 0x00);
5417 my $derivation_array1 = pack ("C", 0x36) x
64;
5418 my $derivation_array2 = pack ("C", 0x5C) x
64;
5420 $tmp = sha1
($tmp . $zero32);
5422 my $tmp2 = sha1
($derivation_array1 ^ $tmp);
5423 my $tmp3 = sha1
($derivation_array2 ^ $tmp);
5425 my $key = substr ($tmp2 . $tmp3, 0, $aes_key_size / 8);
5427 my $m = Crypt
::Mode
::ECB
->new ('AES', 0);
5431 if (defined $additional_param)
5433 $encdata = $m->decrypt (pack ("H*", $additional_param), $key);
5437 $encdata = "A" x
16; ## can be anything
5440 my $data1_buf = $encdata;
5441 my $data2_buf = sha1
(substr ($data1_buf, 0, 16));
5443 $data1_buf = substr ($data1_buf . ("\x00" x
16), 0, 16);
5444 $data2_buf = substr ($data2_buf . ("\x00" x
16), 0, 32);
5446 my $encrypted1 = unpack ("H*", $m->encrypt ($data1_buf, $key));
5447 my $encrypted2 = unpack ("H*", $m->encrypt ($data2_buf, $key));
5449 $encrypted1 = substr ($encrypted1, 0, 32);
5450 $encrypted2 = substr ($encrypted2, 0, 40);
5452 $tmp_hash = sprintf ("\$office\$*%d*%d*%d*%d*%s*%s*%s", 2007, 20, $aes_key_size, 16, unpack ("H*", $salt_buf), $encrypted1, $encrypted2);
5454 elsif ($mode == 9500)
5456 my $iterations = 100000;
5460 $iterations = int ($iter);
5463 $salt_buf = pack ("H*", $salt_buf);
5465 my $tmp = sha1
($salt_buf . encode
("UTF-16LE", $word_buf));
5467 for (my $i = 0; $i < $iterations; $i++)
5469 my $num32 = pack ("L", $i);
5471 $tmp = sha1
($num32 . $tmp);
5474 my $encryptedVerifierHashInputBlockKey = "\xfe\xa7\xd2\x76\x3b\x4b\x9e\x79";
5475 my $encryptedVerifierHashValueBlockKey = "\xd7\xaa\x0f\x6d\x30\x61\x34\x4e";
5477 my $final1 = sha1
($tmp . $encryptedVerifierHashInputBlockKey);
5478 my $final2 = sha1
($tmp . $encryptedVerifierHashValueBlockKey);
5480 my $key1 = substr ($final1, 0, 16);
5481 my $key2 = substr ($final2, 0, 16);
5483 my $cipher1 = Crypt
::CBC
->new ({
5485 cipher
=> "Crypt::Rijndael",
5493 my $cipher2 = Crypt
::CBC
->new ({
5495 cipher
=> "Crypt::Rijndael",
5505 if (defined $additional_param)
5507 $encdata = $cipher1->decrypt (pack ("H*", $additional_param));
5511 $encdata = "A" x
16; ## can be anything
5514 my $data1_buf = $encdata;
5515 my $data2_buf = sha1
(substr ($data1_buf, 0, 16));
5517 my $encrypted1 = unpack ("H*", $cipher1->encrypt ($data1_buf));
5518 my $encrypted2 = unpack ("H*", $cipher2->encrypt ($data2_buf));
5520 $encrypted2 = substr ($encrypted2, 0, 64);
5522 $tmp_hash = sprintf ("\$office\$*%d*%d*%d*%d*%s*%s*%s", 2010, 100000, 128, 16, unpack ("H*", $salt_buf), $encrypted1, $encrypted2);
5524 elsif ($mode == 9600)
5526 my $iterations = 100000;
5530 $iterations = int ($iter);
5533 $salt_buf = pack ("H*", $salt_buf);
5535 my $tmp = sha512
($salt_buf . encode
("UTF-16LE", $word_buf));
5537 for (my $i = 0; $i < $iterations; $i++)
5539 my $num32 = pack ("L", $i);
5541 $tmp = sha512
($num32 . $tmp);
5544 my $encryptedVerifierHashInputBlockKey = "\xfe\xa7\xd2\x76\x3b\x4b\x9e\x79";
5545 my $encryptedVerifierHashValueBlockKey = "\xd7\xaa\x0f\x6d\x30\x61\x34\x4e";
5547 my $final1 = sha512
($tmp . $encryptedVerifierHashInputBlockKey);
5548 my $final2 = sha512
($tmp . $encryptedVerifierHashValueBlockKey);
5550 my $key1 = substr ($final1, 0, 32);
5551 my $key2 = substr ($final2, 0, 32);
5553 my $cipher1 = Crypt
::CBC
->new ({
5555 cipher
=> "Crypt::Rijndael",
5563 my $cipher2 = Crypt
::CBC
->new ({
5565 cipher
=> "Crypt::Rijndael",
5575 if (defined $additional_param)
5577 $encdata = $cipher1->decrypt (pack ("H*", $additional_param));
5581 $encdata = "A" x
16; ## can be anything
5584 my $data1_buf = $encdata;
5585 my $data2_buf = sha512
(substr ($data1_buf, 0, 16));
5587 my $encrypted1 = unpack ("H*", $cipher1->encrypt ($data1_buf));
5588 my $encrypted2 = unpack ("H*", $cipher2->encrypt ($data2_buf));
5590 $encrypted2 = substr ($encrypted2, 0, 64);
5592 $tmp_hash = sprintf ("\$office\$*%d*%d*%d*%d*%s*%s*%s", 2013, 100000, 256, 16, unpack ("H*", $salt_buf), $encrypted1, $encrypted2);
5594 elsif ($mode == 9700)
5596 $salt_buf = pack ("H*", $salt_buf);
5598 my $tmp = md5
(encode
("UTF-16LE", $word_buf));
5600 $tmp = substr ($tmp, 0, 5);
5604 for (my $i = 0; $i < 16; $i++)
5612 $tmp = substr ($tmp, 0, 5);
5616 if (defined $additional_param2)
5618 $version = $additional_param2;
5622 $version = (unpack ("L", $tmp) & 1) ?
0 : 1;
5625 my $rc4_key = md5
($tmp . "\x00\x00\x00\x00");
5627 my $m = Crypt
::RC4
->new (substr ($rc4_key, 0, 16));
5631 if (defined $additional_param)
5633 $encdata = $m->RC4 (pack ("H*", $additional_param));
5637 $encdata = "A" x
16; ## can be anything
5640 my $data1_buf = $encdata;
5641 my $data2_buf = md5
(substr ($data1_buf, 0, 16));
5643 $m = Crypt
::RC4
->new (substr ($rc4_key, 0, 16));
5645 my $encrypted1 = $m->RC4 ($data1_buf);
5646 my $encrypted2 = $m->RC4 ($data2_buf);
5648 $tmp_hash = sprintf ("\$oldoffice\$%d*%s*%s*%s", $version, unpack ("H*", $salt_buf), unpack ("H*", $encrypted1), unpack ("H*", $encrypted2));
5650 elsif ($mode == 9800)
5652 $salt_buf = pack ("H*", $salt_buf);
5654 my $tmp = sha1
($salt_buf. encode
("UTF-16LE", $word_buf));
5658 if (defined $additional_param2)
5660 $version = $additional_param2;
5664 $version = (unpack ("L", $tmp) & 1) ?
3 : 4;
5667 my $rc4_key = sha1
($tmp . "\x00\x00\x00\x00");
5671 $rc4_key = substr ($rc4_key, 0, 5) . "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00";
5674 my $m = Crypt
::RC4
->new (substr ($rc4_key, 0, 16));
5678 if (defined $additional_param)
5680 $encdata = $m->RC4 (pack ("H*", $additional_param));
5684 $encdata = "A" x
16; ## can be anything
5687 my $data1_buf = $encdata;
5688 my $data2_buf = sha1
(substr ($data1_buf, 0, 16));
5690 $m = Crypt
::RC4
->new (substr ($rc4_key, 0, 16));
5692 my $encrypted1 = $m->RC4 ($data1_buf);
5693 my $encrypted2 = $m->RC4 ($data2_buf);
5695 $tmp_hash = sprintf ("\$oldoffice\$%d*%s*%s*%s", $version, unpack ("H*", $salt_buf), unpack ("H*", $encrypted1), unpack ("H*", $encrypted2));
5697 elsif ($mode == 9900)
5699 $tmp_hash = sprintf ("%s", md5_hex
($word_buf . "\0" x
(100 - length ($word_buf))));
5701 elsif ($mode == 10000)
5703 my $iterations = 10000;
5707 $iterations = int ($iter);
5710 my $pbkdf2 = Crypt
::PBKDF2
->new
5712 hasher
=> Crypt
::PBKDF2
->hasher_from_algorithm ('HMACSHA2', 256),
5713 iterations
=> $iterations
5716 $hash_buf = encode_base64
($pbkdf2->PBKDF2 ($salt_buf, $word_buf));
5717 $hash_buf =~ s/[\r\n]//g;
5719 $tmp_hash = sprintf ("pbkdf2_sha256\$%i\$%s\$%s", $iterations, $salt_buf, $hash_buf);
5721 elsif ($mode == 10100)
5723 my $seed = pack ("H*", $salt_buf);
5725 my ($hi, $lo) = siphash
($word_buf, $seed);
5727 my $hi_s = sprintf ("%08x", $hi);
5728 my $lo_s = sprintf ("%08x", $lo);
5730 $hi_s =~ s/^(..)(..)(..)(..)$/$4$3$2$1/;
5731 $lo_s =~ s/^(..)(..)(..)(..)$/$4$3$2$1/;
5733 $tmp_hash = sprintf ("%s%s:2:4:%s", $hi_s, $lo_s, $salt_buf);
5735 elsif ($mode == 10200)
5737 my $challengeb64 = encode_base64
($salt_buf);
5738 $challengeb64 =~ s/[\r\n]//g;
5742 if (defined $additional_param)
5744 $username = $additional_param;
5751 $hash_buf = hmac_hex
($salt_buf, $word_buf, \
&md5
);
5753 my $responseb64 = encode_base64
($username . " " . $hash_buf);
5754 $responseb64 =~ s/[\r\n]//g;
5756 $tmp_hash = sprintf ('$cram_md5$%s$%s', $challengeb64, $responseb64);
5758 elsif ($mode == 10300)
5760 my $iterations = 1024;
5764 $iterations = int ($iter);
5767 my $hash_buf = $salt_buf;
5769 for (my $pos = 0; $pos < $iterations; $pos++)
5771 $hash_buf = sha1
($word_buf . $hash_buf);
5774 $hash_buf = encode_base64
($hash_buf . $salt_buf);
5775 $hash_buf =~ s/[\r\n]//g;
5777 $tmp_hash = sprintf ("{x-issha, %i}%s", $iterations, $hash_buf);
5779 elsif ($mode == 10400)
5782 my $u = $additional_param;
5783 my $o = $additional_param2;
5784 my $P = $additional_param3;
5786 if (defined $u == 0)
5791 if (defined $o == 0)
5796 if (defined $P == 0)
5803 for (my $i = 0; $i < 32; $i++)
5805 $padding .= pack ("C", $pdf_padding[$i]);
5808 my $res = pdf_compute_encryption_key
($word_buf, $padding, $id, $u, $o, $P, 1, 2, 0);
5810 my $m = Crypt
::RC4
->new (substr ($res, 0, 5));
5812 $u = $m->RC4 ($padding);
5814 $tmp_hash = sprintf ('$pdf$%d*%d*40*%d*%d*16*%s*32*%s*32*%s', 1, 2, $P, 0, $id, unpack ("H*", $u), $o);
5816 elsif ($mode == 10500)
5819 my $u = $additional_param;
5820 my $o = $additional_param2;
5821 my $P = $additional_param3;
5822 my $V = $additional_param4;
5823 my $R = $additional_param5;
5824 my $enc = $additional_param6;
5826 if (defined $u == 0)
5833 if (defined $o == 0)
5838 if (defined $R == 0)
5840 $R = get_random_num
(3, 5);
5843 if (defined $V == 0)
5845 $V = ($R == 3) ?
2 : 4;
5848 if (defined $P == 0)
5850 $P = ($R == 3) ?
-4 : -1028;
5853 if (defined $enc == 0)
5855 $enc = ($R == 3) ?
1 : get_random_num
(0, 2);
5860 for (my $i = 0; $i < 32; $i++)
5862 $padding .= pack ("C", $pdf_padding[$i]);
5865 my $res = pdf_compute_encryption_key
($word_buf, $padding, $id, $u, $o, $P, $V, $R, $enc);
5867 my $digest = md5
($padding . pack ("H*", $id));
5869 my $m = Crypt
::RC4
->new ($res);
5871 $u = $m->RC4 ($digest);
5873 my @ress = split "", $res;
5875 for (my $x = 1; $x <= 19; $x++)
5879 for (my $i = 0; $i < 16; $i++)
5881 $xor[$i] = chr (ord ($ress[$i]) ^ $x);
5884 my $s = join ("", @xor);
5886 my $m2 = Crypt
::RC4
->new ($s);
5891 $u .= substr (pack ("H*", $u_save), 16, 16);
5893 $tmp_hash = sprintf ('$pdf$%d*%d*128*%d*%d*16*%s*32*%s*32*%s', $V, $R, $P, $enc, $id, unpack ("H*", $u), $o);
5895 elsif ($mode == 10600)
5898 my $rest = $additional_param;
5900 if (defined $id == 0)
5905 if (defined $rest == 0)
5911 $rest .= "*127*00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000*32*0000000000000000000000000000000000000000000000000000000000000000*32*0000000000000000000000000000000000000000000000000000000000000000";
5914 my @data = split /\*/, $rest;
5916 my $u = pack ("H*", $data[1]);
5918 my $h = sha256
($word_buf . substr ($u, 32, 8));
5920 $data[1] = unpack ("H*", $h . substr ($u, 32));
5922 $rest = join ("*", @data);
5924 $tmp_hash = sprintf ('$pdf$5*5*256*-1028*1*16*%s*%s', $id, $rest);
5926 elsif ($mode == 10700)
5929 my $rest = $additional_param;
5931 if (defined $id == 0)
5936 if (defined $rest == 0)
5942 $rest .= "*127*00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000*32*0000000000000000000000000000000000000000000000000000000000000000*32*0000000000000000000000000000000000000000000000000000000000000000";
5945 my @datax = split /\*/, $rest;
5947 my $u = pack ("H*", $datax[1]);
5949 my $block = sha256
($word_buf . substr ($u, 32, 8));
5951 my $block_size = 32;
5953 my $data = 0x00 x
64;
5959 for (my $i = 0; $i < 64 || $i < $data63 + 32; $i++)
5961 $data = $word_buf . $block;
5963 $data_len = length ($data);
5965 for (my $k = 1; $k < 64; $k++)
5967 $data .= $word_buf . $block;
5970 my $aes = Crypt
::CBC
->new ({
5971 key
=> substr ($block, 0, 16),
5972 cipher
=> "Crypt::Rijndael",
5973 iv
=> substr ($block, 16, 16),
5980 my $data = $aes->encrypt ($data);
5984 for (my $j = 0; $j < 16; $j++)
5986 $sum += ord (substr ($data, $j, 1));
5989 $block_size = 32 + ($sum % 3) * 16;
5991 if ($block_size == 32)
5993 $block = sha256
(substr ($data, 0, $data_len * 64));
5995 elsif ($block_size == 48)
5997 $block = sha384
(substr ($data, 0, $data_len * 64));
5999 elsif ($block_size == 64)
6001 $block = sha512
(substr ($data, 0, $data_len * 64));
6004 $data63 = ord (substr ($data, $data_len * 64 - 1, 1));
6007 $datax[1] = unpack ("H*", substr ($block, 0, 32) . substr ($u, 32));
6009 $rest = join ("*", @datax);
6011 $tmp_hash = sprintf ('$pdf$5*6*256*-1028*1*16*%s*%s', $id, $rest);
6013 elsif ($mode == 10800)
6015 $hash_buf = sha384_hex
($word_buf);
6017 $tmp_hash = sprintf ("%s", $hash_buf);
6019 elsif ($mode == 10900)
6021 my $iterations = 1000;
6025 $iterations = int ($iter);
6030 if (defined $additional_param)
6032 $out_len = $additional_param;
6035 my $pbkdf2 = Crypt
::PBKDF2
->new
6037 hasher
=> Crypt
::PBKDF2
->hasher_from_algorithm ('HMACSHA2', 256),
6038 iterations
=> $iterations,
6039 output_len
=> $out_len
6042 $hash_buf = encode_base64
($pbkdf2->PBKDF2 ($salt_buf, $word_buf));
6043 $hash_buf =~ s/[\r\n]//g;
6045 my $base64_salt_buf = encode_base64
($salt_buf);
6047 chomp ($base64_salt_buf);
6049 $tmp_hash = sprintf ("sha256:%i:%s:%s", $iterations, $base64_salt_buf, $hash_buf);
6051 elsif ($mode == 11000)
6053 $hash_buf = md5_hex
($salt_buf . $word_buf);
6055 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
6057 elsif ($mode == 11100)
6059 my $user = "postgres";
6061 if (defined $additional_param)
6063 $user = $additional_param;
6066 $hash_buf = md5_hex
(md5_hex
($word_buf . $user) . pack ("H*", $salt_buf));
6068 $tmp_hash = sprintf ("\$postgres\$%s*%s*%s", $user, $salt_buf, $hash_buf);
6070 elsif ($mode == 11200)
6072 my $sha1_pass = sha1
($word_buf);
6073 my $double_sha1 = sha1
($sha1_pass);
6075 my $xor_part1 = $sha1_pass;
6076 my $xor_part2 = sha1
(pack ("H*", $salt_buf) . $double_sha1);
6080 for (my $i = 0; $i < 20; $i++)
6082 my $first_byte = substr ($xor_part1, $i, 1);
6083 my $second_byte = substr ($xor_part2, $i, 1);
6085 my $xor_result = $first_byte ^ $second_byte;
6087 $hash_buf .= unpack ("H*", $xor_result);
6090 $tmp_hash = sprintf ("\$mysqlna\$%s*%s", $salt_buf, $hash_buf);
6092 elsif ($mode == 11300)
6094 my $ckey_buf = get_random_string
(96);
6096 if (length ($additional_param))
6098 $ckey_buf = $additional_param;
6101 my $public_key_buf = get_random_string
(66);
6103 if (length ($additional_param2))
6105 $public_key_buf = $additional_param2;
6108 my $salt_iter = get_random_num
(150000, 250000);
6112 $salt_iter = int ($iter);
6115 my $hash_buf = sha512
($word_buf . pack ("H*", $salt_buf));
6117 for (my $i = 1; $i < $salt_iter; $i++)
6119 $hash_buf = sha512
($hash_buf);
6122 my $data = get_random_string
(32);
6124 my $aes = Crypt
::CBC
->new ({
6125 key
=> substr ($hash_buf, 0, 32),
6126 cipher
=> "Crypt::Rijndael",
6127 iv
=> substr ($hash_buf, 32, 16),
6131 padding
=> "standard",
6134 my $cry_master_buf = (unpack ("H*", $aes->encrypt ($data)));
6136 $tmp_hash = sprintf ('$bitcoin$%d$%s$%d$%s$%d$%d$%s$%d$%s',
6137 length ($cry_master_buf),
6144 length ($public_key_buf),
6147 elsif ($mode == 11400)
6149 my ($directive, $URI_server, $URI_client, $user, $realm, $nonce, $nonce_count, $nonce_client, $qop, $method, $URI, $URI_prefix, $URI_resource, $URI_suffix);
6151 $directive = "MD5"; # only directive currently supported
6153 if (defined ($additional_param))
6155 $user = $additional_param;
6156 $realm = $additional_param2;
6158 $nonce_count = $additional_param3;
6159 $nonce_client = $additional_param4;
6160 $qop = $additional_param5;
6161 $method = $additional_param6;
6163 $URI_prefix = $additional_param7;
6164 $URI_resource = $additional_param8;
6165 $URI_suffix = $additional_param9;
6167 # not needed information
6169 $URI_server = $additional_param10;
6170 $URI_client = $additional_param11;
6174 $user = get_random_string
(get_random_num
(0, 12 + 1));
6176 # special limit: (user_len + 1 + realm_len + 1 + word_buf_len) < 56
6177 my $realm_max_len = 55 - length ($user) - 1 - length ($word_buf) - 1;
6179 if ($realm_max_len < 1) # should never happen
6184 $realm_max_len = min
(20, $realm_max_len);
6186 $realm = get_random_string
(get_random_num
(0, $realm_max_len + 1));
6190 if (get_random_num
(0, 1 + 1) == 1)
6194 $nonce_count = get_random_string
(get_random_num
(0, 10 + 1));
6195 $nonce_client = get_random_string
(get_random_num
(0, 12 + 1));
6205 $method = get_random_string
(get_random_num
(0, 24 + 1));
6207 $URI_prefix = get_random_string
(get_random_num
(0, 10 + 1));
6208 $URI_resource = get_random_string
(get_random_num
(1, 32 + 1));
6209 $URI_suffix = get_random_string
(get_random_num
(0, 32 + 1));
6211 # not needed information
6213 $URI_server = get_random_string
(get_random_num
(0, 32 + 1));
6214 $URI_client = $URI_resource; # simplification
6221 if (length ($URI_prefix) > 0)
6223 $URI = $URI_prefix . ":";
6226 $URI .= $URI_resource;
6228 if (length ($URI_suffix) > 0)
6230 $URI .= ":" . $URI_suffix;
6233 my $HA2 = md5_hex
($method . ":" . $URI);
6235 my $HA1 = md5_hex
($user . ":" . $realm . ":" . $word_buf);
6239 if (($qop eq "auth") || ($qop eq "auth-int"))
6241 $tmp_buf = $nonce . ":" . $nonce_count . ":" . $nonce_client . ":" . $qop;
6248 my $hash_buf = md5_hex
($HA1 . ":" . $tmp_buf . ":" . $HA2);
6250 $tmp_hash = sprintf ("\$sip\$*%s*%s*%s*%s*%s*%s*%s*%s*%s*%s*%s*%s*%s*%s", $URI_server, $URI_resource, $user, $realm, $method, $URI_prefix, $URI_resource, $URI_suffix, $nonce, $nonce_client, $nonce_count, $qop, $directive, $hash_buf);
6252 elsif ($mode == 11500)
6254 $hash_buf = crc32
($word_buf);
6256 $tmp_hash = sprintf ("%08x:00000000", $hash_buf);
6258 elsif ($mode == 11600)
6260 my ($p, $num_cycle_power, $seven_zip_salt_len, $seven_zip_salt_buf, $salt_len, $data_len, $unpack_size, $data_buf);
6264 my $validation_only = 0;
6266 $validation_only = 1 if (defined ($additional_param));
6268 if ($validation_only == 1)
6270 $num_cycle_power = int ($iter);
6271 $seven_zip_salt_len = $additional_param;
6272 $seven_zip_salt_buf = $additional_param2;
6273 $salt_len = $additional_param3;
6274 # $salt_buf set in parser
6275 # $hash_buf (resulting crc)
6276 $data_len = $additional_param4;
6277 $unpack_size = $additional_param5;
6278 $data_buf = $additional_param6;
6282 $num_cycle_power = 14; # by default it is 19
6283 $seven_zip_salt_len = 0;
6284 $seven_zip_salt_buf = "";
6285 $salt_len = length ($salt_buf);
6286 # $salt_buf set automatically
6287 # $hash_buf (resulting crc)
6288 # $data_len will be set when encrypting
6289 $unpack_size = get_random_num
(1, 32 + 1);
6290 $data_buf = get_random_string
($unpack_size);
6294 # 2 ^ NumCyclesPower "iterations" of SHA256 (only one final SHA256)
6297 $word_buf = encode
("UTF-16LE", $word_buf);
6299 my $rounds = 1 << $num_cycle_power;
6303 for (my $i = 0; $i < $rounds; $i++)
6307 $num_buf .= pack ("V", $i);
6308 $num_buf .= "\x00" x
4;
6310 # this would be better but only works on 64-bit systems:
6311 # $num_buf = pack ("q", $i);
6313 $pass_buf .= sprintf ("%s%s", $word_buf, $num_buf);
6316 my $key = sha256
($pass_buf);
6318 # the salt_buf is our IV for AES CBC
6321 my $salt_buf_len = length ($salt_buf);
6322 my $salt_padding_len = 0;
6324 if ($salt_buf_len < 16)
6326 $salt_padding_len = 16 - $salt_buf_len;
6329 $salt_buf .= "\x00" x
$salt_padding_len;
6331 my $aes = Crypt
::CBC
->new ({
6332 cipher
=> "Crypt::Rijndael",
6340 if ($validation_only == 1)
6344 my $decrypted_data = $aes->decrypt ($data_buf);
6346 $decrypted_data = substr ($decrypted_data, 0, $unpack_size);
6348 $hash_buf = crc32
($decrypted_data);
6354 $hash_buf = crc32
($data_buf);
6356 $data_buf = $aes->encrypt ($data_buf);
6358 $data_len = length ($data_buf);
6361 $tmp_hash = sprintf ("\$7z\$%i\$%i\$%i\$%s\$%i\$%08s\$%u\$%u\$%u\$%s", $p, $num_cycle_power, $seven_zip_salt_len, $seven_zip_salt_buf, $salt_len, unpack ("H*", $salt_buf), $hash_buf, $data_len, $unpack_size, unpack ("H*", $data_buf));
6363 elsif ($mode == 11900)
6365 my $iterations = 1000;
6369 $iterations = int ($iter);
6374 if (defined $additional_param)
6376 $out_len = $additional_param;
6380 # call PHP here - WTF
6383 # sanitize $word_buf and $salt_buf:
6385 my $word_buf_base64 = encode_base64
($word_buf);
6386 $word_buf_base64 =~ s/[\r\n]//g;
6388 my $salt_buf_base64 = encode_base64
($salt_buf);
6389 $salt_buf_base64 =~ s/[\r\n]//g;
6393 $out_len = int ($out_len);
6395 # output is in hex encoding, otherwise it could be screwed (but shouldn't)
6397 my $php_code = <<'END_CODE';
6399 function pbkdf2 ($algorithm, $password, $salt, $count, $key_length, $raw_output = false)
6401 $algorithm = strtolower ($algorithm);
6403 if (! in_array ($algorithm, hash_algos (), true))
6405 trigger_error ("PBKDF2 ERROR: Invalid hash algorithm.", E_USER_ERROR);
6408 if ($count <= 0 || $key_length <= 0)
6410 trigger_error ("PBKDF2 ERROR: Invalid parameters.", E_USER_ERROR);
6413 if (function_exists ("hash_pbkdf2"))
6417 $key_length = $key_length * 2;
6420 return hash_pbkdf2 ($algorithm, $password, $salt, $count, $key_length, $raw_output);
6423 $hash_length = strlen (hash ($algorithm, "", true));
6424 $block_count = ceil ($key_length / $hash_length);
6428 for ($i = 1; $i <= $block_count; $i++)
6430 $last = $salt . pack ("N", $i);
6432 $last = $xorsum = hash_hmac ($algorithm, $last, $password, true);
6434 for ($j = 1; $j < $count; $j++)
6436 $xorsum ^= ($last = hash_hmac ($algorithm, $last, $password, true));
6444 return substr ($output, 0, $key_length);
6448 return bin2hex (substr ($output, 0, $key_length));
6452 print pbkdf2 ("md5", base64_decode ("$word_buf_base64"), base64_decode ("$salt_buf_base64"), $iterations, $out_len, False);
6456 # replace with these command line arguments
6458 $php_code =~ s/\$word_buf_base64/$word_buf_base64/;
6459 $php_code =~ s/\$salt_buf_base64/$salt_buf_base64/;
6460 $php_code =~ s/\$iterations/$iterations/;
6461 $php_code =~ s/\$out_len/$out_len/;
6463 my $php_output = `php -r '$php_code'`;
6465 $hash_buf = pack ("H*", $php_output);
6467 $hash_buf = encode_base64 ($hash_buf);
6468 $hash_buf =~ s/[\r\n]//g;
6470 my $base64_salt_buf = encode_base64 ($salt_buf);
6472 chomp ($base64_salt_buf);
6474 $tmp_hash = sprintf ("md5:%i:%s:%s", $iterations, $base64_salt_buf, $hash_buf);
6476 elsif ($mode == 12000)
6478 my $iterations = 1000;
6482 $iterations = int ($iter);
6487 if (defined $additional_param)
6489 $out_len = $additional_param;
6492 my $pbkdf2 = Crypt::PBKDF2->new
6494 hasher => Crypt::PBKDF2->hasher_from_algorithm ('HMACSHA1'),
6495 iterations => $iterations,
6496 output_len => $out_len
6499 $hash_buf = encode_base64 ($pbkdf2->PBKDF2 ($salt_buf, $word_buf));
6500 $hash_buf =~ s/[\r\n]//g;
6502 my $base64_salt_buf = encode_base64 ($salt_buf);
6504 chomp ($base64_salt_buf);
6506 $tmp_hash = sprintf ("sha1:%i:%s:%s", $iterations, $base64_salt_buf, $hash_buf);
6508 elsif ($mode == 12100)
6510 my $iterations = 1000;
6514 $iterations = int ($iter);
6519 if (defined $additional_param)
6521 $out_len = $additional_param;
6524 my $pbkdf2 = Crypt::PBKDF2->new
6526 hasher => Crypt::PBKDF2->hasher_from_algorithm ('HMACSHA2', 512),
6527 iterations => $iterations,
6528 output_len => $out_len
6531 $hash_buf = encode_base64 ($pbkdf2->PBKDF2 ($salt_buf, $word_buf));
6532 $hash_buf =~ s/[\r\n]//g;
6534 my $base64_salt_buf = encode_base64 ($salt_buf);
6536 chomp ($base64_salt_buf);
6538 $tmp_hash = sprintf ("sha512:%i:%s:%s", $iterations, $base64_salt_buf, $hash_buf);
6540 elsif ($mode == 12200)
6542 my $iterations = 65536;
6544 my $default_salt = 0;
6546 if (defined $additional_param)
6548 $default_salt = int ($additional_param);
6551 if ($default_salt == 1)
6553 $salt_buf = "0011223344556677";
6556 $hash_buf = sha512 (pack ("H*", $salt_buf) . $word_buf);
6558 for (my $i = 0; $i < $iterations; $i++)
6560 $hash_buf = sha512 ($hash_buf);
6563 $hash_buf = unpack ("H*", $hash_buf);
6564 $hash_buf = substr ($hash_buf, 0, 16);
6566 if ($default_salt == 0)
6568 $tmp_hash = sprintf ("\$ecryptfs\$0\$1\$%s\$%s", $salt_buf, $hash_buf);
6572 $tmp_hash = sprintf ("\$ecryptfs\$0\$%s", $hash_buf);
6575 elsif ($mode == 12300)
6577 my $iterations = 4096;
6579 my $hasher = Crypt::PBKDF2->hasher_from_algorithm ('HMACSHA2', 512);
6581 my $pbkdf2 = Crypt::PBKDF2->new (
6583 iterations => $iterations,
6587 my $salt_bin = pack ("H*", $salt_buf);
6589 my $key = $pbkdf2->PBKDF2 ($salt_bin. "AUTH_PBKDF2_SPEEDY_KEY", $word_buf);
6591 $hash_buf = sha512_hex ($key . $salt_bin);
6593 $tmp_hash = sprintf ("%s%s", uc ($hash_buf), uc ($salt_buf));
6595 elsif ($mode == 12400)
6601 $iterations = int ($iter);
6605 $iterations = get_random_num (1, 5001 + 1);
6608 my $key_value = fold_password ($word_buf);
6610 my $data = "\x00\x00\x00\x00\x00\x00\x00\x00";
6611 my $salt_value = base64_to_int24 ($salt_buf);
6613 $hash_buf = crypt_rounds ($key_value, $iterations, $salt_value, $data);
6615 $tmp_hash = sprintf ("_%s%s%s", int24_to_base64 ($iterations), $salt_buf, block_to_base64 ($hash_buf));
6617 elsif ($mode == 12600)
6619 $hash_buf = sha1_hex ($word_buf);
6621 $hash_buf = sha256_hex ($salt_buf . uc $hash_buf);
6623 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
6625 elsif ($mode == 12700)
6627 my $iterations = 10;
6630 "guid" : "00000000-0000-0000-0000-000000000000",
6631 "sharedKey" : "00000000-0000-0000-0000-000000000000",
6632 "options" : {"pbkdf2_iterations":10,"fee_policy":0,"html5_notifications":false,"logout_time":600000,"tx_display":0,"always_keep_local_backup":false}|;
6634 my $salt_buf_bin = pack ("H*", $salt_buf);
6636 my $hasher = Crypt::PBKDF2->hasher_from_algorithm ('HMACSHA1');
6638 my $pbkdf2 = Crypt::PBKDF2->new (
6640 iterations => $iterations,
6644 my $key = $pbkdf2->PBKDF2 ($salt_buf_bin, $word_buf);
6646 my $cipher = Crypt::CBC->new ({
6648 cipher => "Crypt::Rijndael",
6649 iv => $salt_buf_bin,
6655 my $encrypted = unpack ("H*", $cipher->encrypt ($data));
6657 $tmp_hash = sprintf ("\$blockchain\$%s\$%s", length ($salt_buf . $encrypted) / 2, $salt_buf . $encrypted);
6659 elsif ($mode == 12800)
6661 my $iterations = 100;
6665 $iterations = int ($iter);
6668 my $nt = md4_hex (encode ("UTF-16LE", $word_buf));
6670 my $pbkdf2 = Crypt::PBKDF2->new
6672 hasher => Crypt::PBKDF2->hasher_from_algorithm ('HMACSHA2', 256),
6673 iterations => $iterations,
6677 my $salt_buf_bin = pack ("H*", $salt_buf);
6679 my $hash = $pbkdf2->PBKDF2 ($salt_buf_bin, uc (encode ("UTF-16LE", $nt)));
6681 $tmp_hash = sprintf ("v1;PPH1_MD4,%s,%d,%s", $salt_buf, $iterations, unpack ("H*", $hash));
6683 elsif ($mode == 12900)
6685 my $iterations = 4096;
6689 $iterations = int ($iter);
6692 my $salt2 = $salt_buf . $salt_buf;
6694 if (defined $additional_param)
6696 $salt2 = $additional_param;
6699 my $pbkdf2 = Crypt::PBKDF2->new
6701 hasher => Crypt::PBKDF2->hasher_from_algorithm ('HMACSHA2', 256),
6702 iterations => $iterations,
6706 my $salt_buf_bin = pack ("H*", $salt_buf);
6708 my $hash = $pbkdf2->PBKDF2 ($salt_buf_bin, $word_buf);
6710 my $salt2_bin = pack ("H*", $salt2);
6712 my $hash_hmac = hmac_hex ($salt2_bin, $hash, \&sha256, 64);
6714 $tmp_hash = sprintf ("%s%s%s", $salt2, $hash_hmac, $salt_buf);
6716 elsif ($mode == 13000)
6718 my $iterations = 15;
6722 $iterations = int ($iter);
6727 if (defined $additional_param)
6729 $iv = $additional_param;
6732 my $pbkdf2 = Crypt::PBKDF2->new
6734 hasher => Crypt::PBKDF2->hasher_from_algorithm ('HMACSHA2', 256),
6735 iterations => (1 << $iterations) + 32,
6739 my $salt_buf_bin = pack ("H*", $salt_buf);
6741 my $hash = $pbkdf2->PBKDF2 ($salt_buf_bin, $word_buf);
6743 my $hash_final = substr ($hash, 0, 8)
6744 ^ substr ($hash, 8, 8)
6745 ^ substr ($hash, 16, 8)
6746 ^ substr ($hash, 24, 8);
6748 $tmp_hash = sprintf ('$rar5$16$%s$%d$%s$8$%s', $salt_buf, $iterations, $iv, unpack ("H*", $hash_final));
6750 elsif ($mode == 13100)
6752 my @salt_arr = split ('\$', $salt_buf);
6754 my $user = $salt_arr[0];
6756 my $realm = $salt_arr[1];
6758 my $spn = $salt_arr[2];
6760 my $nonce = $salt_arr[3];
6762 my $cleartext_ticket = '6381b03081ada00703050050a00000a11b3019a003020117a1'.
6763 '12041058e0d77776e8b8e03991f2966939222aa2171b154d594b5242544553542e434f4e5'.
6764 '44f534f2e434f4da3133011a003020102a10a30081b067472616e6365a40b3009a0030201'.
6765 '01a1020400a511180f32303136303231353134343735305aa611180f32303136303231353'.
6766 '134343735305aa711180f32303136303231363030343735305aa811180f32303136303232'.
6769 $cleartext_ticket = $nonce . $cleartext_ticket;
6771 my $k = md4 (encode ("UTF-16LE", $word_buf));
6773 my $k1 = hmac_md5 ("\x02\x00\x00\x00", $k);
6775 my $checksum = hmac_md5 (pack ("H*", $cleartext_ticket), $k1);
6777 my $k3 = hmac_md5 ($checksum, $k1);
6779 my $cipher = Crypt::RC4->new ($k3);
6781 my $edata2 = $cipher->RC4 (pack ("H*", $cleartext_ticket));
6783 $tmp_hash = sprintf ('$krb5tgs$23$*%s$%s$%s*$%s$%s', $user, $realm, $spn, unpack ("H*", $checksum), unpack ("H*", $edata2));
6785 elsif ($mode == 13200)
6787 my @salt_arr = split ('\*', $salt_buf);
6789 my $iteration = $salt_arr[0];
6791 my $mysalt = $salt_arr[1];
6793 $mysalt = pack ("H*", $mysalt);
6795 my $DEK = randbytes (16);
6797 my $iv = "a6a6a6a6a6a6a6a6";
6799 my $KEK = sha1($word_buf);
6801 $KEK = substr ($KEK ^ $mysalt, 0, 16);
6803 my $aes = Crypt::Mode::ECB->new ('AES');
6805 my @R = ('', substr(pack ("H*",$DEK),0,8), substr(pack ("H*",$DEK),8,16));
6809 my $A = pack ("H*", $iv);
6811 for (my $j = 0; $j < $iteration; $j++)
6813 $B = $aes->encrypt ($A . $R[1], $KEK);
6815 $A = substr ($B, 0, 8) ^ pack ("q", (2 * $j + 1));
6817 $R[1] = substr ($B, 8, 16);
6819 $B = $aes->encrypt ($A . $R[2], $KEK);
6821 $A = substr ($B, 0, 8) ^ pack ("q", (2 * $j + 2));
6823 $R[2] = substr ($B, 8, 16);
6826 my $wrapped_key = unpack ("H*", $A . substr ($R[1], 0 ,8) . substr ($R[2], 0 ,8));
6828 $mysalt = unpack ("H*", $mysalt);
6830 $tmp_hash = sprintf ('$axcrypt$*1*%s*%s*%s', $iteration, $mysalt, $wrapped_key);
6832 elsif ($mode == 13300)
6834 $hash_buf = sha1_hex ($word_buf);
6836 $tmp_hash = sprintf ('$axcrypt_sha1$%s', substr ($hash_buf, 0, 32));
6846 my $word_len = shift;
6848 my $salt_len = shift;
6852 $max = 15 if ($mode == 2410);
6854 if ($is_unicode{$mode})
6856 if (! $allow_long_salt{$mode})
6858 $word_len = min ($word_len, int ($max / 2) - $salt_len);
6862 $word_len = min ($word_len, int ($max / 2));
6865 elsif ($less_fifteen{$mode})
6867 $word_len = min ($word_len, 15);
6871 $salt_len = min ($salt_len, 15 - $word_len);
6876 if (! $allow_long_salt{$mode})
6878 $word_len = min ($word_len, $max - $salt_len);
6897 for (my $i = 0; $i < $salt_len; $i++)
6899 my $c = get_random_chr (0x30, 0x39);
6901 push (@salt_arr, $c);
6904 $salt_buf = join ("", @salt_arr);
6906 $salt_buf = get_random_md5chap_salt ($salt_buf);
6908 elsif ($mode == 5300 || $mode == 5400)
6910 $salt_buf = get_random_ike_salt ();
6912 elsif ($mode == 5500)
6914 $salt_buf = get_random_netntlmv1_salt ($salt_len, $salt_len);
6916 elsif ($mode == 5600)
6918 $salt_buf = get_random_netntlmv2_salt ($salt_len, $salt_len);
6920 elsif ($mode == 6600)
6922 $salt_buf = get_random_agilekeychain_salt ();
6924 elsif ($mode == 8200)
6926 $salt_buf = get_random_cloudkeychain_salt ();
6928 elsif ($mode == 8300)
6930 $salt_buf = get_random_dnssec_salt ();
6932 elsif ($mode == 13100)
6934 $salt_buf = get_random_kerberos5_tgs_salt ();
6936 elsif ($mode == 13200)
6938 $salt_buf = get_random_axcrypt_salt ();
6944 for (my $i = 0; $i < $salt_len; $i++)
6946 my $c = get_random_chr (0x30, 0x39);
6948 push (@salt_arr, $c);
6951 $salt_buf = join ("", @salt_arr);
6955 $salt_buf = get_random_kerberos5_salt ($salt_buf);
6965 for (my $i = 0; $i < $word_len; $i++)
6967 my $c = get_random_chr (0x30, 0x39);
6969 push (@word_arr, $c);
6972 my $word_buf = join ("", @word_arr);
6978 my $tmp_hash = gen_hash ($mode, $word_buf, $salt_buf);
6991 print sprintf ("echo -n %-20s | %s \${OPTS} %s %4d '%s'\n", $word_buf, @cmd);
7003 sub get_random_string
7009 for (my $i = 0; $i < $len; $i++)
7011 my $c = get_random_chr (0x30, 0x39);
7016 my $buf = join ("", @arr);
7026 return int ((rand ($max - $min)) + $min);
7031 return chr get_random_num (@_);
7040 for (my $i = 0; $i < length ($str); $i += 4)
7042 my $num = domino_base64_decode (substr ($str, $i, 4), 4);
7044 $decoded .= chr (($num >> 16) & 0xff) . chr (($num >> 8) & 0xff) . chr ($num & 0xff);
7051 $salt = substr ($decoded, 0, 5);
7053 my $byte10 = (ord (substr ($salt, 3, 1)) - 4);
7057 $byte10 = 256 + $byte10;
7060 substr ($salt, 3, 1) = chr ($byte10);
7062 $digest = substr ($decoded, 5, 9);
7063 $char = substr ($str, 18, 1);
7065 return ($digest, $salt, $char);
7068 sub domino_85x_decode
7074 for (my $i = 0; $i < length ($str); $i += 4)
7076 my $num = domino_base64_decode (substr ($str, $i, 4), 4);
7078 $decoded .= chr (($num >> 16) & 0xff) . chr (($num >> 8) & 0xff) . chr ($num & 0xff);
7083 my $iterations = -1;
7086 $salt = substr ($decoded, 0, 16); # longer than -m 8700 (5 vs 16 <- new)
7088 my $byte10 = (ord (substr ($salt, 3, 1)) - 4);
7092 $byte10 = 256 + $byte10;
7095 substr ($salt, 3, 1) = chr ($byte10);
7097 $iterations = substr ($decoded, 16, 10);
7099 if ($iterations =~ /^?d*$/)
7103 $iterations = $iterations + 0; # hack: make sure it is an int now (atoi ())
7104 $chars = substr ($decoded, 26, 2); # in my example it is "02"
7105 $digest = substr ($decoded, 28, 8); # only of length of 8 vs 20 SHA1 bytes
7108 return ($digest, $salt, $iterations, $chars);
7111 sub domino_base64_decode
7116 my $itoa64 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/";
7124 my $idx = (index ($itoa64, substr ($v, $n - $i, 1))) & 0x3f;
7126 $ret += ($idx << (6 * ($i - 1)));
7139 my $byte10 = (ord (substr ($final, 3, 1)) + 4);
7143 $byte10 = $byte10 - 256;
7146 substr ($final, 3, 1) = chr ($byte10);
7150 $passwd .= domino_base64_encode ((int (ord (substr ($final, 0, 1))) << 16) | (int (ord (substr ($final, 1, 1))) << 8) | (int (ord (substr ($final, 2, 1)))), 4);
7151 $passwd .= domino_base64_encode ((int (ord (substr ($final, 3, 1))) << 16) | (int (ord (substr ($final, 4, 1))) << 8) | (int (ord (substr ($final, 5, 1)))), 4);
7152 $passwd .= domino_base64_encode ((int (ord (substr ($final, 6, 1))) << 16) | (int (ord (substr ($final, 7, 1))) << 8) | (int (ord (substr ($final, 8, 1)))), 4);
7153 $passwd .= domino_base64_encode ((int (ord (substr ($final, 9, 1))) << 16) | (int (ord (substr ($final, 10, 1))) << 8) | (int (ord (substr ($final, 11, 1)))), 4);
7154 $passwd .= domino_base64_encode ((int (ord (substr ($final, 12, 1))) << 16) | (int (ord (substr ($final, 13, 1))) << 8) | (int (ord (substr ($final, 14, 1)))), 4);
7156 if (defined ($char))
7158 substr ($passwd, 18, 1) = $char;
7160 substr ($passwd, 19, 1) = "";
7165 sub domino_85x_encode
7170 my $byte10 = (ord (substr ($final, 3, 1)) + 4);
7174 $byte10 = $byte10 - 256;
7177 substr ($final, 3, 1) = chr ($byte10);
7181 $passwd .= domino_base64_encode ((int (ord (substr ($final, 0, 1))) << 16) | (int (ord (substr ($final, 1, 1))) << 8) | (int (ord (substr ($final, 2, 1)))), 4);
7182 $passwd .= domino_base64_encode ((int (ord (substr ($final, 3, 1))) << 16) | (int (ord (substr ($final, 4, 1))) << 8) | (int (ord (substr ($final, 5, 1)))), 4);
7183 $passwd .= domino_base64_encode ((int (ord (substr ($final, 6, 1))) << 16) | (int (ord (substr ($final, 7, 1))) << 8) | (int (ord (substr ($final, 8, 1)))), 4);
7184 $passwd .= domino_base64_encode ((int (ord (substr ($final, 9, 1))) << 16) | (int (ord (substr ($final, 10, 1))) << 8) | (int (ord (substr ($final, 11, 1)))), 4);
7185 $passwd .= domino_base64_encode ((int (ord (substr ($final, 12, 1))) << 16) | (int (ord (substr ($final, 13, 1))) << 8) | (int (ord (substr ($final, 14, 1)))), 4);
7186 $passwd .= domino_base64_encode ((int (ord (substr ($final, 15, 1))) << 16) | (int (ord (substr ($final, 16, 1))) << 8) | (int (ord (substr ($final, 17, 1)))), 4);
7187 $passwd .= domino_base64_encode ((int (ord (substr ($final, 18, 1))) << 16) | (int (ord (substr ($final, 19, 1))) << 8) | (int (ord (substr ($final, 20, 1)))), 4);
7188 $passwd .= domino_base64_encode ((int (ord (substr ($final, 21, 1))) << 16) | (int (ord (substr ($final, 22, 1))) << 8) | (int (ord (substr ($final, 23, 1)))), 4);
7189 $passwd .= domino_base64_encode ((int (ord (substr ($final, 24, 1))) << 16) | (int (ord (substr ($final, 25, 1))) << 8) | (int (ord (substr ($final, 26, 1)))), 4);
7190 $passwd .= domino_base64_encode ((int (ord (substr ($final, 27, 1))) << 16) | (int (ord (substr ($final, 28, 1))) << 8) | (int (ord (substr ($final, 29, 1)))), 4);
7191 $passwd .= domino_base64_encode ((int (ord (substr ($final, 30, 1))) << 16) | (int (ord (substr ($final, 31, 1))) << 8) | (int (ord (substr ($final, 32, 1)))), 4);
7192 $passwd .= domino_base64_encode ((int (ord (substr ($final, 33, 1))) << 16) | (int (ord (substr ($final, 34, 1))) << 8) | (int (ord (substr ($final, 35, 1)))), 4);
7194 if (defined ($char))
7196 substr ($passwd, 18, 1) = $char;
7202 sub domino_base64_encode
7207 my $itoa64 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/";
7211 while (($n - 1) >= 0)
7215 $ret = substr ($itoa64, $v & 0x3f, 1) . $ret;
7225 my $itoa64 = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
7230 my $v = unpack "V", substr($md5, $i*4, 4);
7232 $s64 .= substr($itoa64, $v & 0x3f, 1);
7241 my ($username, $password) = @_;
7243 $username = substr ($username . " " x 8, 0, 8);
7244 $password = substr ($password . " " x 8, 0, 8);
7246 my $username_ebc = ascii2ebcdic ($username);
7247 my $password_ebc = ascii2ebcdic ($password);
7249 my @pw = split ("", $password_ebc);
7251 for (my $i = 0; $i < 8; $i++)
7253 $pw[$i] = unpack ("C", $pw[$i]);
7256 $pw[$i] = pack ("C", $pw[$i] & 0xff);
7259 my $key = join ("", @pw);
7261 my $cipher = new Crypt::DES $key;
7263 my $ciphertext = $cipher->encrypt ($username_ebc);
7265 my $ct = unpack ("H16", $ciphertext);
7272 my ($username, $password) = @_;
7274 my $userpass = pack('n*', unpack('C*', uc($username.$password)));
7275 $userpass .= pack('C', 0) while (length($userpass) % 8);
7277 my $key = pack('H*', "0123456789ABCDEF");
7278 my $iv = pack('H*', "0000000000000000");
7280 my $c = new Crypt::CBC(
7287 my $key2 = substr($c->encrypt($userpass), length($userpass)-8, 8);
7289 my $c2 = new Crypt::CBC(
7296 my $hash = substr($c2->encrypt($userpass), length($userpass)-8, 8);
7298 return uc(unpack('H*', $hash));
7303 my $word_buf = shift;
7305 my $salt_buf = shift;
7307 my $w = sprintf ("%d%s%s", 0, $word_buf, $salt_buf);
7309 my $digest = sha1 ($w);
7311 for (my $i = 1; $i < 1024; $i++)
7313 $w = $digest . sprintf ("%d%s%s", $i, $word_buf, $salt_buf);
7315 $digest = sha1 ($w);
7318 my ($A, $B, $C, $D, $E) = unpack ("N5", $digest);
7320 return sprintf ("%08x%08x%08x%08x%08x", $A, $B, $C, $D, $E);
7328 my $itoa64 = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
7332 while (($n - 1) >= 0)
7336 $ret .= substr ($itoa64, $v & 0x3f, 1);
7352 my $hash = ""; # hash to be returned by this function
7354 my $final = md5 ($pass . $salt . $pass);
7356 $salt = substr ($salt, 0, 8);
7358 my $tmp = $pass . $magic . $salt;
7360 my $pass_len = length ($pass);
7364 for ($i = $pass_len; $i > 0; $i -= 16)
7373 $tmp .= substr ($final, 0, $len);
7386 $tmp .= substr ($pass, 0, 1);
7392 $final = md5 ($tmp);
7394 for ($i = 0; $i < $iter; $i++)
7426 $final = md5 ($tmp);
7430 # now format the output sting ("hash")
7434 $hash = to64 ((ord (substr ($final, 0, 1)) << 16) | (ord (substr ($final, 6, 1)) << 8) | (ord (substr ($final, 12, 1))), 4);
7435 $hash .= to64 ((ord (substr ($final, 1, 1)) << 16) | (ord (substr ($final, 7, 1)) << 8) | (ord (substr ($final, 13, 1))), 4);
7436 $hash .= to64 ((ord (substr ($final, 2, 1)) << 16) | (ord (substr ($final, 8, 1)) << 8) | (ord (substr ($final, 14, 1))), 4);
7437 $hash .= to64 ((ord (substr ($final, 3, 1)) << 16) | (ord (substr ($final, 9, 1)) << 8) | (ord (substr ($final, 15, 1))), 4);
7438 $hash .= to64 ((ord (substr ($final, 4, 1)) << 16) | (ord (substr ($final, 10, 1)) << 8) | (ord (substr ($final, 5, 1))), 4);
7439 $hash .= to64 (ord (substr ($final, 11, 1)), 2);
7441 if ($iter == 1000) # default
7443 $hash_buf = sprintf ("%s%s\$%s", $magic , $salt , $hash);
7447 $hash_buf = sprintf ("%srounds=%i\$%s\$%s", $magic, $iter, $salt , $hash);
7459 my $hash = ""; # hash to be returned by this function
7461 my $final = sha512 ($pass . $salt . $pass);
7463 $salt = substr ($salt, 0, 16);
7465 my $tmp = $pass . $salt;
7467 my $pass_len = length ($pass);
7468 my $salt_len = length ($salt);
7472 for ($i = $pass_len; $i > 0; $i -= 16)
7481 $tmp .= substr ($final, 0, $len);
7500 $final = sha512 ($tmp);
7506 for ($i = 0; $i < $pass_len; $i++)
7511 $p_bytes = sha512 ($p_bytes);
7512 $p_bytes = substr ($p_bytes, 0, $pass_len);
7516 my $final_first_byte = ord (substr ($final, 0, 1));
7520 for ($i = 0; $i < (16 + $final_first_byte); $i++)
7525 $s_bytes = sha512 ($s_bytes);
7526 $s_bytes = substr ($s_bytes, 0, $salt_len);
7528 for ($i = 0; $i < $iter; $i++)
7560 $final = sha512 ($tmp);
7564 # now format the output string ("hash")
7568 $hash .= to64 ((ord (substr ($final, 0, 1)) << 16) | (ord (substr ($final, 21, 1)) << 8) | (ord (substr ($final, 42, 1))), 4);
7569 $hash .= to64 ((ord (substr ($final, 22, 1)) << 16) | (ord (substr ($final, 43, 1)) << 8) | (ord (substr ($final, 1, 1))), 4);
7570 $hash .= to64 ((ord (substr ($final, 44, 1)) << 16) | (ord (substr ($final, 2, 1)) << 8) | (ord (substr ($final, 23, 1))), 4);
7571 $hash .= to64 ((ord (substr ($final, 3, 1)) << 16) | (ord (substr ($final, 24, 1)) << 8) | (ord (substr ($final, 45, 1))), 4);
7572 $hash .= to64 ((ord (substr ($final, 25, 1)) << 16) | (ord (substr ($final, 46, 1)) << 8) | (ord (substr ($final, 4, 1))), 4);
7573 $hash .= to64 ((ord (substr ($final, 47, 1)) << 16) | (ord (substr ($final, 5, 1)) << 8) | (ord (substr ($final, 26, 1))), 4);
7574 $hash .= to64 ((ord (substr ($final, 6, 1)) << 16) | (ord (substr ($final, 27, 1)) << 8) | (ord (substr ($final, 48, 1))), 4);
7575 $hash .= to64 ((ord (substr ($final, 28, 1)) << 16) | (ord (substr ($final, 49, 1)) << 8) | (ord (substr ($final, 7, 1))), 4);
7576 $hash .= to64 ((ord (substr ($final, 50, 1)) << 16) | (ord (substr ($final, 8, 1)) << 8) | (ord (substr ($final, 29, 1))), 4);
7577 $hash .= to64 ((ord (substr ($final, 9, 1)) << 16) | (ord (substr ($final, 30, 1)) << 8) | (ord (substr ($final, 51, 1))), 4);
7578 $hash .= to64 ((ord (substr ($final, 31, 1)) << 16) | (ord (substr ($final, 52, 1)) << 8) | (ord (substr ($final, 10, 1))), 4);
7579 $hash .= to64 ((ord (substr ($final, 53, 1)) << 16) | (ord (substr ($final, 11, 1)) << 8) | (ord (substr ($final, 32, 1))), 4);
7580 $hash .= to64 ((ord (substr ($final, 12, 1)) << 16) | (ord (substr ($final, 33, 1)) << 8) | (ord (substr ($final, 54, 1))), 4);
7581 $hash .= to64 ((ord (substr ($final, 34, 1)) << 16) | (ord (substr ($final, 55, 1)) << 8) | (ord (substr ($final, 13, 1))), 4);
7582 $hash .= to64 ((ord (substr ($final, 56, 1)) << 16) | (ord (substr ($final, 14, 1)) << 8) | (ord (substr ($final, 35, 1))), 4);
7583 $hash .= to64 ((ord (substr ($final, 15, 1)) << 16) | (ord (substr ($final, 36, 1)) << 8) | (ord (substr ($final, 57, 1))), 4);
7584 $hash .= to64 ((ord (substr ($final, 37, 1)) << 16) | (ord (substr ($final, 58, 1)) << 8) | (ord (substr ($final, 16, 1))), 4);
7585 $hash .= to64 ((ord (substr ($final, 59, 1)) << 16) | (ord (substr ($final, 17, 1)) << 8) | (ord (substr ($final, 38, 1))), 4);
7586 $hash .= to64 ((ord (substr ($final, 18, 1)) << 16) | (ord (substr ($final, 39, 1)) << 8) | (ord (substr ($final, 60, 1))), 4);
7587 $hash .= to64 ((ord (substr ($final, 40, 1)) << 16) | (ord (substr ($final, 61, 1)) << 8) | (ord (substr ($final, 19, 1))), 4);
7588 $hash .= to64 ((ord (substr ($final, 62, 1)) << 16) | (ord (substr ($final, 20, 1)) << 8) | (ord (substr ($final, 41, 1))), 4);
7589 $hash .= to64 (ord (substr ($final, 63, 1)), 2);
7593 if ($iter == 5000) # default
7595 $hash_buf = sprintf ("%s%s\$%s", $magic, $salt , $hash);
7599 $hash_buf = sprintf ("%srounds=%i\$%s\$%s", $magic, $iter, $salt , $hash);
7611 my $hash = ""; # hash to be returned by this function
7613 my $final = sha256 ($pass . $salt . $pass);
7615 $salt = substr ($salt, 0, 16);
7617 my $tmp = $pass . $salt;
7619 my $pass_len = length ($pass);
7620 my $salt_len = length ($salt);
7624 for ($i = $pass_len; $i > 0; $i -= 16)
7633 $tmp .= substr ($final, 0, $len);
7652 $final = sha256 ($tmp);
7658 for ($i = 0; $i < $pass_len; $i++)
7663 $p_bytes = sha256 ($p_bytes);
7664 $p_bytes = substr ($p_bytes, 0, $pass_len);
7668 my $final_first_byte = ord (substr ($final, 0, 1));
7672 for ($i = 0; $i < (16 + $final_first_byte); $i++)
7677 $s_bytes = sha256 ($s_bytes);
7678 $s_bytes = substr ($s_bytes, 0, $salt_len);
7680 for ($i = 0; $i < $iter; $i++)
7712 $final = sha256 ($tmp);
7716 # now format the output string ("hash")
7720 $hash .= to64 ((ord (substr ($final, 0, 1)) << 16) | (ord (substr ($final, 10, 1)) << 8) | (ord (substr ($final, 20, 1))), 4);
7721 $hash .= to64 ((ord (substr ($final, 21, 1)) << 16) | (ord (substr ($final, 1, 1)) << 8) | (ord (substr ($final, 11, 1))), 4);
7722 $hash .= to64 ((ord (substr ($final, 12, 1)) << 16) | (ord (substr ($final, 22, 1)) << 8) | (ord (substr ($final, 2, 1))), 4);
7723 $hash .= to64 ((ord (substr ($final, 3, 1)) << 16) | (ord (substr ($final, 13, 1)) << 8) | (ord (substr ($final, 23, 1))), 4);
7724 $hash .= to64 ((ord (substr ($final, 24, 1)) << 16) | (ord (substr ($final, 4, 1)) << 8) | (ord (substr ($final, 14, 1))), 4);
7725 $hash .= to64 ((ord (substr ($final, 15, 1)) << 16) | (ord (substr ($final, 25, 1)) << 8) | (ord (substr ($final, 5, 1))), 4);
7726 $hash .= to64 ((ord (substr ($final, 6, 1)) << 16) | (ord (substr ($final, 16, 1)) << 8) | (ord (substr ($final, 26, 1))), 4);
7727 $hash .= to64 ((ord (substr ($final, 27, 1)) << 16) | (ord (substr ($final, 7, 1)) << 8) | (ord (substr ($final, 17, 1))), 4);
7728 $hash .= to64 ((ord (substr ($final, 18, 1)) << 16) | (ord (substr ($final, 28, 1)) << 8) | (ord (substr ($final, 8, 1))), 4);
7729 $hash .= to64 ((ord (substr ($final, 9, 1)) << 16) | (ord (substr ($final, 19, 1)) << 8) | (ord (substr ($final, 29, 1))), 4);
7730 $hash .= to64 ((ord (substr ($final, 31, 1)) << 8) | (ord (substr ($final, 30, 1))), 3);
7734 if ($iter == 5000) # default
7736 $hash_buf = sprintf ("%s%s\$%s", $magic, $salt , $hash);
7740 $hash_buf = sprintf ("%srounds=%i\$%s\$%s", $magic, $iter, $salt , $hash);
7746 sub aix_ssha256_pbkdf2
7748 my $word_buf = shift;
7749 my $salt_buf = shift;
7750 my $iterations = shift;
7752 my $hasher = Crypt::PBKDF2->hasher_from_algorithm ('HMACSHA2', 256);
7754 my $pbkdf2 = Crypt::PBKDF2->new (
7756 iterations => $iterations,
7760 my $hash_buf = $pbkdf2->PBKDF2 ($salt_buf, $word_buf);
7764 $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 0, 1))) << 16) | (int (ord (substr ($hash_buf, 1, 1))) << 8) | (int (ord (substr ($hash_buf, 2, 1)))), 4);
7765 $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 3, 1))) << 16) | (int (ord (substr ($hash_buf, 4, 1))) << 8) | (int (ord (substr ($hash_buf, 5, 1)))), 4);
7766 $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 6, 1))) << 16) | (int (ord (substr ($hash_buf, 7, 1))) << 8) | (int (ord (substr ($hash_buf, 8, 1)))), 4);
7767 $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 9, 1))) << 16) | (int (ord (substr ($hash_buf, 10, 1))) << 8) | (int (ord (substr ($hash_buf, 11, 1)))), 4);
7768 $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 12, 1))) << 16) | (int (ord (substr ($hash_buf, 13, 1))) << 8) | (int (ord (substr ($hash_buf, 14, 1)))), 4);
7769 $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 15, 1))) << 16) | (int (ord (substr ($hash_buf, 16, 1))) << 8) | (int (ord (substr ($hash_buf, 17, 1)))), 4);
7770 $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 18, 1))) << 16) | (int (ord (substr ($hash_buf, 19, 1))) << 8) | (int (ord (substr ($hash_buf, 20, 1)))), 4);
7771 $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 21, 1))) << 16) | (int (ord (substr ($hash_buf, 22, 1))) << 8) | (int (ord (substr ($hash_buf, 23, 1)))), 4);
7772 $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 24, 1))) << 16) | (int (ord (substr ($hash_buf, 25, 1))) << 8) | (int (ord (substr ($hash_buf, 26, 1)))), 4);
7773 $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 27, 1))) << 16) | (int (ord (substr ($hash_buf, 28, 1))) << 8) | (int (ord (substr ($hash_buf, 29, 1)))), 4);
7774 $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 30, 1))) << 16) | (int (ord (substr ($hash_buf, 31, 1))) << 8) , 3);
7779 sub aix_ssha512_pbkdf2
7781 my $word_buf = shift;
7782 my $salt_buf = shift;
7783 my $iterations = shift;
7785 my $hasher = Crypt::PBKDF2->hasher_from_algorithm ('HMACSHA2', 512);
7787 my $pbkdf2 = Crypt::PBKDF2->new (
7789 iterations => $iterations,
7792 my $hash_buf = $pbkdf2->PBKDF2 ($salt_buf, $word_buf);
7796 $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 0, 1))) << 16) | (int (ord (substr ($hash_buf, 1, 1))) << 8) | (int (ord (substr ($hash_buf, 2, 1)))), 4);
7797 $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 3, 1))) << 16) | (int (ord (substr ($hash_buf, 4, 1))) << 8) | (int (ord (substr ($hash_buf, 5, 1)))), 4);
7798 $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 6, 1))) << 16) | (int (ord (substr ($hash_buf, 7, 1))) << 8) | (int (ord (substr ($hash_buf, 8, 1)))), 4);
7799 $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 9, 1))) << 16) | (int (ord (substr ($hash_buf, 10, 1))) << 8) | (int (ord (substr ($hash_buf, 11, 1)))), 4);
7800 $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 12, 1))) << 16) | (int (ord (substr ($hash_buf, 13, 1))) << 8) | (int (ord (substr ($hash_buf, 14, 1)))), 4);
7801 $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 15, 1))) << 16) | (int (ord (substr ($hash_buf, 16, 1))) << 8) | (int (ord (substr ($hash_buf, 17, 1)))), 4);
7802 $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 18, 1))) << 16) | (int (ord (substr ($hash_buf, 19, 1))) << 8) | (int (ord (substr ($hash_buf, 20, 1)))), 4);
7803 $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 21, 1))) << 16) | (int (ord (substr ($hash_buf, 22, 1))) << 8) | (int (ord (substr ($hash_buf, 23, 1)))), 4);
7804 $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 24, 1))) << 16) | (int (ord (substr ($hash_buf, 25, 1))) << 8) | (int (ord (substr ($hash_buf, 26, 1)))), 4);
7805 $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 27, 1))) << 16) | (int (ord (substr ($hash_buf, 28, 1))) << 8) | (int (ord (substr ($hash_buf, 29, 1)))), 4);
7806 $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 30, 1))) << 16) | (int (ord (substr ($hash_buf, 31, 1))) << 8) | (int (ord (substr ($hash_buf, 32, 1)))), 4);
7807 $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 33, 1))) << 16) | (int (ord (substr ($hash_buf, 34, 1))) << 8) | (int (ord (substr ($hash_buf, 35, 1)))), 4);
7808 $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 36, 1))) << 16) | (int (ord (substr ($hash_buf, 37, 1))) << 8) | (int (ord (substr ($hash_buf, 38, 1)))), 4);
7809 $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 39, 1))) << 16) | (int (ord (substr ($hash_buf, 40, 1))) << 8) | (int (ord (substr ($hash_buf, 41, 1)))), 4);
7810 $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 42, 1))) << 16) | (int (ord (substr ($hash_buf, 43, 1))) << 8) | (int (ord (substr ($hash_buf, 44, 1)))), 4);
7811 $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 45, 1))) << 16) | (int (ord (substr ($hash_buf, 46, 1))) << 8) | (int (ord (substr ($hash_buf, 47, 1)))), 4);
7812 $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 48, 1))) << 16) | (int (ord (substr ($hash_buf, 49, 1))) << 8) | (int (ord (substr ($hash_buf, 50, 1)))), 4);
7813 $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 51, 1))) << 16) | (int (ord (substr ($hash_buf, 52, 1))) << 8) | (int (ord (substr ($hash_buf, 53, 1)))), 4);
7814 $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 54, 1))) << 16) | (int (ord (substr ($hash_buf, 55, 1))) << 8) | (int (ord (substr ($hash_buf, 56, 1)))), 4);
7815 $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 57, 1))) << 16) | (int (ord (substr ($hash_buf, 58, 1))) << 8) | (int (ord (substr ($hash_buf, 59, 1)))), 4);
7816 $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 60, 1))) << 16) | (int (ord (substr ($hash_buf, 61, 1))) << 8) | (int (ord (substr ($hash_buf, 62, 1)))), 4);
7817 $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 63, 1))) << 16) , 2);
7822 sub aix_ssha1_pbkdf2
7824 my $word_buf = shift;
7825 my $salt_buf = shift;
7826 my $iterations = shift;
7828 my $hasher = Crypt::PBKDF2->hasher_from_algorithm ('HMACSHA1');
7830 my $pbkdf2 = Crypt::PBKDF2->new (
7832 iterations => $iterations,
7835 my $hash_buf = $pbkdf2->PBKDF2 ($salt_buf, $word_buf);
7839 $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 0, 1))) << 16) | (int (ord (substr ($hash_buf, 1, 1))) << 8) | (int (ord (substr ($hash_buf, 2, 1)))), 4);
7840 $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 3, 1))) << 16) | (int (ord (substr ($hash_buf, 4, 1))) << 8) | (int (ord (substr ($hash_buf, 5, 1)))), 4);
7841 $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 6, 1))) << 16) | (int (ord (substr ($hash_buf, 7, 1))) << 8) | (int (ord (substr ($hash_buf, 8, 1)))), 4);
7842 $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 9, 1))) << 16) | (int (ord (substr ($hash_buf, 10, 1))) << 8) | (int (ord (substr ($hash_buf, 11, 1)))), 4);
7843 $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 12, 1))) << 16) | (int (ord (substr ($hash_buf, 13, 1))) << 8) | (int (ord (substr ($hash_buf, 14, 1)))), 4);
7844 $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 15, 1))) << 16) | (int (ord (substr ($hash_buf, 16, 1))) << 8) | (int (ord (substr ($hash_buf, 17, 1)))), 4);
7845 $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 18, 1))) << 16) | (int (ord (substr ($hash_buf, 19, 1))) << 8) , 3);
7854 my @data = split "", $data_s;
7857 "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" .
7858 "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" .
7859 "\x3f\x40\x41\x50\x43\x44\x45\x4b\x47\x48\x4d\x4e\x54\x51\x53\x46" .
7860 "\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x56\x55\x5c\x49\x5d\x4a" .
7861 "\x42\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f" .
7862 "\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x58\x5b\x59\xff\x52" .
7863 "\x4c\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f" .
7864 "\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x57\x5e\x5a\x4f\xff" .
7865 "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" .
7866 "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" .
7867 "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" .
7868 "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" .
7869 "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" .
7870 "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" .
7871 "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" .
7872 "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff";
7874 my @transTable = unpack ("C256", $transTable_s);
7878 for (my $i = 0; $i < scalar @data; $i++)
7880 $out[$i] = $transTable[int (ord ($data[$i]))];
7883 return pack ("C*", @out);
7888 my $digest_s = shift;
7893 my @w = unpack "C*", $w_s;
7894 my @s = unpack "C*", $s_s;
7897 "\x14\x77\xf3\xd4\xbb\x71\x23\xd0\x03\xff\x47\x93\x55\xaa\x66\x91" .
7898 "\xf2\x88\x6b\x99\xbf\xcb\x32\x1a\x19\xd9\xa7\x82\x22\x49\xa2\x51" .
7899 "\xe2\xb7\x33\x71\x8b\x9f\x5d\x01\x44\x70\xae\x11\xef\x28\xf0\x0d";
7901 my @bcodeTable = unpack ("C48", $bcodeTable_s);
7903 my @abcd = unpack ("C16", $digest_s);
7905 my $sum20 = ($abcd[0] & 3)
7915 for (my $i2 = 0; $i2 < $sum20; $i2++)
7920 for (my $i1 = 0, my $i2 = 0, my $i3 = 0; $i2 < $sum20; $i2++, $i2++)
7922 if ($i1 < length $w_s)
7924 if ($abcd[15 - $i1] & 1)
7926 $out[$i2] = $bcodeTable[48 - 1 - $i1];
7931 $out[$i2] = $w[$i1];
7937 if ($i3 < length $s_s)
7939 $out[$i2] = $s[$i3];
7945 $out[$i2] = $bcodeTable[$i2 - $i1 - $i3];
7948 return substr (pack ("C*", @out), 0, $sum20);
7953 my @key_56 = split (//, shift);
7959 $key .= chr(((ord($key_56[0]) << 7) | (ord($key_56[1]) >> 1)) & 255);
7960 $key .= chr(((ord($key_56[1]) << 6) | (ord($key_56[2]) >> 2)) & 255);
7961 $key .= chr(((ord($key_56[2]) << 5) | (ord($key_56[3]) >> 3)) & 255);
7962 $key .= chr(((ord($key_56[3]) << 4) | (ord($key_56[4]) >> 4)) & 255);
7963 $key .= chr(((ord($key_56[4]) << 3) | (ord($key_56[5]) >> 5)) & 255);
7964 $key .= chr(((ord($key_56[5]) << 2) | (ord($key_56[6]) >> 6)) & 255);
7965 $key .= chr(( ord($key_56[6]) << 1) & 255);
7976 for (my $i = 0; $i < $len; $i++)
7978 my $c = get_random_chr (0, 255);
7983 return join ("", @arr);
7986 sub get_random_netntlmv1_salt
7988 my $len_user = shift;
7989 my $len_domain = shift;
7995 for (my $i = 0; $i < $len_user; $i++)
7997 $type = get_random_num (1, 3);
8001 $char = get_random_chr (0x30, 0x39);
8005 $char = get_random_chr (0x41, 0x5A);
8009 $char = get_random_chr (0x61, 0x7A);
8017 for (my $i = 0; $i < $len_domain; $i++)
8019 $type = get_random_num (1, 3);
8023 $char = get_random_chr (0x30, 0x39);
8027 $char = get_random_chr (0x41, 0x5A);
8031 $char = get_random_chr (0x61, 0x7A);
8037 my $c_challenge = randbytes (8);
8038 my $s_challenge = randbytes (8);
8040 my $salt_buf = $user . "::" . $domain . ":" . unpack ("H*", $c_challenge) . unpack ("H*", $s_challenge);
8045 sub get_random_netntlmv2_salt
8047 my $len_user = shift;
8048 my $len_domain = shift;
8054 if ($len_user + $len_domain > 27)
8056 if ($len_user > $len_domain)
8058 $len_user = 27 - $len_domain;
8062 $len_domain = 27 - $len_user;
8066 for (my $i = 0; $i < $len_user; $i++)
8068 $type = get_random_num (1, 3);
8072 $char = get_random_chr (0x30, 0x39);
8076 $char = get_random_chr (0x41, 0x5A);
8080 $char = get_random_chr (0x61, 0x7A);
8088 for (my $i = 0; $i < $len_domain; $i++)
8090 $type = get_random_num (1, 3);
8094 $char = get_random_chr (0x30, 0x39);
8098 $char = get_random_chr (0x41, 0x5A);
8102 $char = get_random_chr (0x61, 0x7A);
8108 my $c_challenge = randbytes (8);
8109 my $s_challenge = randbytes (8);
8111 my $temp = "\x01\x01" .
8116 randbytes (20 * rand () + 1) .
8119 my $salt_buf = $user . "::" . $domain . ":" . unpack ("H*", $s_challenge) . unpack ("H*", $temp);
8124 sub get_random_ike_salt
8128 for (my $i = 0; $i < 40; $i++)
8130 $nr_buf .= get_random_chr (0, 0xff);
8135 for (my $i = 0; $i < 440; $i++)
8137 $msg_buf .= get_random_chr (0, 0xff);
8140 my $nr_buf_hex = unpack ("H*", $nr_buf);
8141 my $msg_buf_hex = unpack ("H*", $msg_buf);
8143 my $salt_buf = sprintf ("%s:%s:%s:%s:%s:%s:%s:%s", substr ($msg_buf_hex, 0, 256), substr ($msg_buf_hex, 256, 256), substr ($msg_buf_hex, 512, 16), substr ($msg_buf_hex, 528, 16), substr ($msg_buf_hex, 544, 320), substr ($msg_buf_hex, 864, 16), substr ($nr_buf_hex, 0, 40), substr ($nr_buf_hex, 40, 40));
8148 sub get_random_agilekeychain_salt
8152 for (my $i = 0; $i < 8; $i++)
8154 $salt_buf .= get_random_chr (0x0, 0xff);
8159 for (my $i = 0; $i < 16; $i++)
8161 $iv .= get_random_chr (0x0, 0xff);
8164 my $prefix = "\x00" x 1008;
8166 my $ret = unpack ("H*", $salt_buf . $prefix . $iv);
8171 sub get_random_cloudkeychain_salt
8175 for (my $i = 0; $i < 16; $i++)
8177 $salt_buf .= get_random_chr (0x0, 0xff);
8180 for (my $i = 0; $i < 304; $i++)
8182 $salt_buf .= get_random_chr (0x0, 0xff);
8185 my $ret = unpack ("H*", $salt_buf);
8190 sub get_random_kerberos5_salt
8192 my $custom_salt = shift;
8194 my $clear_data = randbytes (14) .
8195 strftime ("%Y%m%d%H%M%S", localtime) .
8199 my $realm = "realm";
8202 my $salt_buf = $user . "\$" . $realm . "\$" . $salt . "\$" . unpack ("H*", $custom_salt) . "\$" . unpack ("H*", $clear_data) . "\$";
8207 sub get_random_kerberos5_tgs_salt
8209 my $nonce = randbytes (8);
8212 my $realm = "realm";
8213 my $spn = "test/spn";
8215 my $salt_buf = $user . "\$" . $realm . "\$" . $spn . "\$" . unpack ("H*",$nonce);
8220 sub get_random_axcrypt_salt
8222 my $mysalt = randbytes (16);
8224 $mysalt = unpack ("H*", $mysalt);
8226 my $iteration = get_random_num (6, 100000);
8228 my $salt_buf = $iteration . '*' . $mysalt;
8233 sub get_random_md5chap_salt
8235 my $salt_buf = shift;
8237 my $salt = unpack ("H*", $salt_buf);
8241 $salt .= unpack ("H*", randbytes (1));
8246 sub get_random_dnssec_salt
8252 for (my $i = 0; $i < 8; $i++)
8254 $salt_buf .= get_random_chr (0x61, 0x7a);
8257 $salt_buf .= ".net";
8261 for (my $i = 0; $i < 8; $i++)
8263 $salt_buf .= get_random_chr (0x30, 0x39);
8276 my $byte_off = int ($bit / 8);
8277 my $bit_off = int ($bit % 8);
8279 my $char = substr ($digest, $byte_off, 1);
8280 my $num = ord ($char);
8282 return (($num & (1 << $bit_off)) ? 1 : 0);
8291 my $constant_phrase =
8292 "To be, or not to be,--that is the question:--\n" .
8293 "Whether 'tis nobler in the mind to suffer\n" .
8294 "The slings and arrows of outrageous fortune\n" .
8295 "Or to take arms against a sea of troubles,\n" .
8296 "And by opposing end them?--To die,--to sleep,--\n" .
8297 "No more; and by a sleep to say we end\n" .
8298 "The heartache, and the thousand natural shocks\n" .
8299 "That flesh is heir to,--'tis a consummation\n" .
8300 "Devoutly to be wish'd. To die,--to sleep;--\n" .
8301 "To sleep! perchance to dream:--ay, there's the rub;\n" .
8302 "For in that sleep of death what dreams may come,\n" .
8303 "When we have shuffled off this mortal coil,\n" .
8304 "Must give us pause: there's the respect\n" .
8305 "That makes calamity of so long life;\n" .
8306 "For who would bear the whips and scorns of time,\n" .
8307 "The oppressor's wrong, the proud man's contumely,\n" .
8308 "The pangs of despis'd love, the law's delay,\n" .
8309 "The insolence of office, and the spurns\n" .
8310 "That patient merit of the unworthy takes,\n" .
8311 "When he himself might his quietus make\n" .
8312 "With a bare bodkin? who would these fardels bear,\n" .
8313 "To grunt and sweat under a weary life,\n" .
8314 "But that the dread of something after death,--\n" .
8315 "The undiscover'd country, from whose bourn\n" .
8316 "No traveller returns,--puzzles the will,\n" .
8317 "And makes us rather bear those ills we have\n" .
8318 "Than fly to others that we know not of?\n" .
8319 "Thus conscience does make cowards of us all;\n" .
8320 "And thus the native hue of resolution\n" .
8321 "Is sicklied o'er with the pale cast of thought;\n" .
8322 "And enterprises of great pith and moment,\n" .
8323 "With this regard, their currents turn awry,\n" .
8324 "And lose the name of action.--Soft you now!\n" .
8325 "The fair Ophelia!--Nymph, in thy orisons\n" .
8326 "Be all my sins remember'd.\n\x00";
8328 my $constant_len = length ($constant_phrase);
8330 my $hash_buf = md5 ($pw . $salt);
8336 for (my $round = 0; $round < $iter; $round++)
8338 my $shift_a = md5bit ($hash_buf, $round + 0);
8339 my $shift_b = md5bit ($hash_buf, $round + 64);
8344 for (my $k = 0; $k < 16; $k++)
8346 my $s7shift = ord (substr ($hash_buf, $k, 1)) % 8;
8348 my $l = ($k + 3) % 16;
8350 my $num = ord (substr ($hash_buf, $l, 1));
8352 $shift_4[$k] = $num % 5;
8354 $shift_7[$k] = ($num >> $s7shift) & 1;
8359 for (my $k = 0; $k < 16; $k++)
8361 $indirect_4[$k] = (ord (substr ($hash_buf, $k, 1)) >> $shift_4[$k]) & 0xf;
8366 for (my $k = 0; $k < 16; $k++)
8368 $indirect_7[$k] = (ord (substr ($hash_buf, $indirect_4[$k], 1)) >> $shift_7[$k]) & 0x7f;
8374 for (my $k = 0; $k < 8; $k++)
8376 $indirect_a |= md5bit ($hash_buf, $indirect_7[$k + 0]) << $k;
8378 $indirect_b |= md5bit ($hash_buf, $indirect_7[$k + 8]) << $k;
8381 $indirect_a = ($indirect_a >> $shift_a) & 0x7f;
8382 $indirect_b = ($indirect_b >> $shift_b) & 0x7f;
8384 my $bit_a = md5bit ($hash_buf, $indirect_a);
8385 my $bit_b = md5bit ($hash_buf, $indirect_b);
8395 if ($bit_a ^ $bit_b)
8397 substr ($W, 16, 48) = substr ($constant_phrase, 0, 48);
8401 $to_hash .= substr ($W, 0, 64);
8405 for ($constant_off = 48; $constant_off < $constant_len - 64; $constant_off += 64)
8407 substr ($W, 0, 64) = substr ($constant_phrase, $constant_off, 64);
8411 $to_hash .= substr ($W, 0, 64);
8414 $pos = $constant_len - $constant_off;
8418 substr ($W, 0, $pos) = substr ($constant_phrase, $constant_off, $pos);
8433 my $round_div = int ($tmp / 10);
8434 my $round_mod = int ($tmp % 10);
8438 $a_buf[int ($a_len / 4)] = (($round_mod + 0x30) | ($a_buf[int ($a_len / 4)] << 8));
8448 for ($g = 0; $g < $a_len; $g++)
8450 my $remainder = $a_buf[$g];
8456 while ($remainder > 0)
8458 $sub = $remainder >> (8 * $factor);
8460 if ($started != 1 || $sub > 0)
8464 $tmp_str = chr ($sub) . $tmp_str;
8466 $remainder -= ($sub << (8 * $factor));
8474 substr ($W, $pos, $a_len) = $tmp_str;
8480 $to_hash .= substr ($W, 0, $pos);
8482 $to_hash = substr ($to_hash, 0, $total);
8484 $hash_buf = md5 ($to_hash);
8489 $passwd .= to64 ((int (ord (substr ($hash_buf, 0, 1))) << 16) | (int (ord (substr ($hash_buf, 6, 1))) << 8) | (int (ord (substr ($hash_buf, 12, 1)))), 4);
8490 $passwd .= to64 ((int (ord (substr ($hash_buf, 1, 1))) << 16) | (int (ord (substr ($hash_buf, 7, 1))) << 8) | (int (ord (substr ($hash_buf, 13, 1)))), 4);
8491 $passwd .= to64 ((int (ord (substr ($hash_buf, 2, 1))) << 16) | (int (ord (substr ($hash_buf, 8, 1))) << 8) | (int (ord (substr ($hash_buf, 14, 1)))), 4);
8492 $passwd .= to64 ((int (ord (substr ($hash_buf, 3, 1))) << 16) | (int (ord (substr ($hash_buf, 9, 1))) << 8) | (int (ord (substr ($hash_buf, 15, 1)))), 4);
8493 $passwd .= to64 ((int (ord (substr ($hash_buf, 4, 1))) << 16) | (int (ord (substr ($hash_buf, 10, 1))) << 8) | (int (ord (substr ($hash_buf, 5, 1)))), 4);
8494 $passwd .= to64 ((int (ord (substr ($hash_buf, 11, 1)))), 2);
8501 die ("usage: $0 single|passthrough| [mode] [len]\n" .
8503 " $0 verify [mode] [hashfile] [cracks] [outfile]\n");
8508 my $block_ref = shift;
8512 my $value = 16 - $offset;
8514 for (my $i = $offset; $i < 16; $i++)
8516 push @{$block_ref}, $value;
8526 for (my $i = 0; $i < 18; $i++)
8528 for (my $j = 0; $j < 48; $j++)
8530 $p = ($p + 48 - $j) & 0xff;
8532 my $c = $lotus_magic_table[$p];
8534 $p = $in_ref->[$j] ^ $c;
8541 sub lotus_transform_password
8544 my $out_ref = shift;
8546 my $t = $out_ref->[15];
8548 for (my $i = 0; $i < 16; $i++)
8550 $t ^= $in_ref->[$i];
8552 my $c = $lotus_magic_table[$t];
8554 $out_ref->[$i] ^= $c;
8556 $t = $out_ref->[$i];
8560 sub mdtransform_norecalc
8562 my $state_ref = shift;
8563 my $block_ref = shift;
8567 push (@x, @{$state_ref});
8568 push (@x, @{$block_ref});
8570 for (my $i = 0; $i < 16; $i++)
8572 push (@x, $x[0 + $i] ^ $x[16 + $i]);
8577 for (my $i = 0; $i < 16; $i++)
8579 $state_ref->[$i] = $x[$i];
8585 my $state_ref = shift;
8586 my $checksum_ref = shift;
8587 my $block_ref = shift;
8589 mdtransform_norecalc ($state_ref, $block_ref);
8591 lotus_transform_password ($block_ref, $checksum_ref);
8596 my $saved_key_ref = shift;
8600 @{$saved_key_ref} = splice (@{$saved_key_ref}, 0, $size);
8602 my @state = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
8608 for ($curpos = 0; $curpos + 16 < $size; $curpos += 16)
8610 my $curpos16 = $curpos + 16;
8612 my @block = splice (@{$saved_key_ref}, 0, 16);
8614 mdtransform (\@state, \@checksum, \@block);
8617 my $left = $size - $curpos;
8619 my @block = splice (@{$saved_key_ref}, 0, 16);
8621 pad16 (\@block, $left);
8623 mdtransform (\@state, \@checksum, \@block);
8625 mdtransform_norecalc (\@state, \@checksum);
8630 sub pdf_compute_encryption_key
8632 my $word_buf = shift;
8633 my $padding = shift;
8648 $data .= substr ($padding, 0, 32 - length $word_buf);
8650 $data .= pack ("H*", $o);
8652 $data .= pack ("I", $P);
8654 $data .= pack ("H*", $id);
8660 $data .= pack ("I", -1);
8664 my $res = md5 ($data);
8668 for (my $i = 0; $i < 50; $i++)
8677 sub gen_random_wpa_eapol
8686 my $version = 1; # 802.1X-2001
8688 $ret .= pack ("C*", $version);
8690 my $type = 3; # means that this EAPOL frame is used to transfer key information
8692 $ret .= pack ("C*", $type);
8694 my $length; # length of remaining data
8705 $ret .= pack ("n*", $length);
8707 my $descriptor_type;
8711 $descriptor_type = 254; # EAPOL WPA key
8715 $descriptor_type = 1; # EAPOL RSN key
8718 $ret .= pack ("C*", $descriptor_type);
8720 # key_info is a bit vector:
8721 # generated from these 13 bits: encrypted key data, request, error, secure, key mic, key ack, install, key index (2), key type, key descriptor (3)
8725 $key_info |= 1 << 8; # set key MIC
8726 $key_info |= 1 << 3; # set if it is a pairwise key
8730 $key_info |= 1 << 0; # RC4 Cipher, HMAC-MD5 MIC
8734 $key_info |= 1 << 1; # AES Cipher, HMAC-SHA1 MIC
8737 $ret .= pack ("n*", $key_info);
8750 $ret .= pack ("n*", $key_length);
8752 my $replay_counter = 1;
8754 $ret .= pack ("Q>*", $replay_counter);
8758 my $key_iv = "\x00" x 16;
8762 my $key_rsc = "\x00" x 8;
8766 my $key_id = "\x00" x 8;
8770 my $key_mic = "\x00" x 16;
8778 $key_data_len = 24; # length of the key_data (== WPA info)
8782 $key_data_len = 22; # length of the key_data (== RSN info)
8785 $ret .= pack ("n*", $key_data_len);
8795 my $vendor_specific_data = "";
8797 my $tag_number = 221; # means it is a vendor specific tag
8799 $vendor_specific_data .= pack ("C*", $tag_number);
8801 my $tag_len = 22; # length of the remaining "tag data"
8803 $vendor_specific_data .= pack ("C*", $tag_len);
8805 my $vendor_specific_oui = pack ("H*", "0050f2"); # microsoft
8807 $vendor_specific_data .= $vendor_specific_oui;
8809 my $vendor_specific_oui_type = 1; # WPA Information Element
8811 $vendor_specific_data .= pack ("C*", $vendor_specific_oui_type);
8813 my $vendor_specific_wpa_version = 1;
8815 $vendor_specific_data .= pack ("v*", $vendor_specific_wpa_version);
8819 my $vendor_specific_multicast_oui = pack ("H*", "0050f2");
8821 $vendor_specific_data .= $vendor_specific_multicast_oui;
8823 my $vendor_specific_multicast_type = 2; # TKIP
8825 $vendor_specific_data .= pack ("C*", $vendor_specific_multicast_type);
8829 my $vendor_specific_unicast_count = 1;
8831 $vendor_specific_data .= pack ("v*", $vendor_specific_unicast_count);
8833 my $vendor_specific_unicast_oui = pack ("H*", "0050f2");
8835 $vendor_specific_data .= $vendor_specific_multicast_oui;
8837 my $vendor_specific_unicast_type = 2; # TKIP
8839 $vendor_specific_data .= pack ("C*", $vendor_specific_unicast_type);
8841 # Auth Key Management (AKM)
8843 my $auth_key_management_count = 1;
8845 $vendor_specific_data .= pack ("v*", $auth_key_management_count);
8847 my $auth_key_management_oui = pack ("H*", "0050f2");
8849 $vendor_specific_data .= $auth_key_management_oui;
8851 my $auth_key_management_type = 2; # Pre-Shared Key (PSK)
8853 $vendor_specific_data .= pack ("C*", $auth_key_management_type);
8855 $wpa_info = $vendor_specific_data;
8857 $key_data = $wpa_info;
8865 my $tag_number = 48; # RSN info
8867 $rsn_info .= pack ("C*", $tag_number);
8869 my $tag_len = 20; # length of the remaining "tag_data"
8871 $rsn_info .= pack ("C*", $tag_len);
8873 my $rsn_version = 1;
8875 $rsn_info .= pack ("v*", $rsn_version);
8877 # group cipher suite
8879 my $group_cipher_suite_oui = pack ("H*", "000fac"); # Ieee8021
8881 $rsn_info .= $group_cipher_suite_oui;
8883 my $group_cipher_suite_type = 4; # AES (CCM)
8885 $rsn_info .= pack ("C*", $group_cipher_suite_type);
8887 # pairwise cipher suite
8889 my $pairwise_cipher_suite_count = 1;
8891 $rsn_info .= pack ("v*", $pairwise_cipher_suite_count);
8893 my $pairwise_cipher_suite_oui = pack ("H*", "000fac"); # Ieee8021
8895 $rsn_info .= $pairwise_cipher_suite_oui;
8897 my $pairwise_cipher_suite_type = 4; # AES (CCM)
8899 $rsn_info .= pack ("C*", $pairwise_cipher_suite_type);
8901 # Auth Key Management (AKM)
8903 my $auth_key_management_count = 1;
8905 $rsn_info .= pack ("v*", $auth_key_management_count);
8907 my $auth_key_management_oui = pack ("H*", "000fac"); # Ieee8021
8909 $rsn_info .= $auth_key_management_oui;
8911 my $auth_key_management_type = 2; # Pre-Shared Key (PSK)
8913 $rsn_info .= pack ("C*", $auth_key_management_type);
8917 # bit vector of these 9 bits: peerkey enabled, management frame protection (MFP) capable, MFP required,
8918 # RSN GTKSA Capabilities (2), RSN PTKSA Capabilities (2), no pairwise Capabilities, Pre-Auth Capabilities
8920 my $rsn_capabilities = pack ("H*", "0000");
8922 $rsn_info .= $rsn_capabilities;
8924 $key_data = $rsn_info;
8940 my $data = "Pairwise key expansion";
8945 # Min(AA, SPA) || Max(AA, SPA)
8948 # compare if greater: Min()/Max() on the MACs (6 bytes)
8950 if (memcmp ($stmac, $bssid, 6) < 0)
8962 # Min(ANonce,SNonce) || Max(ANonce,SNonce)
8965 # compare if greater: Min()/Max() on the nonces (32 bytes)
8967 if (memcmp ($snonce, $anonce, 32) < 0)
8980 my $prf_buf = hmac ($data, $pmk, \&sha1);
8982 $prf_buf = substr ($prf_buf, 0, 16);
8993 my $len_str1 = length ($str1);
8994 my $len_str2 = length ($str2);
8996 if (($len > $len_str1) || ($len > $len_str2))
8998 print "ERROR: memcmp () lengths wrong";
9003 for (my $i = 0; $i < $len; $i++)
9005 my $c_1 = ord (substr ($str1, $i, 1));
9006 my $c_2 = ord (substr ($str2, $i, 1));
9008 return -1 if ($c_1 < $c_2);
9009 return 1 if ($c_1 > $c_2);