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 133 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 == 133 || $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 == 133 || $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 == 133 || $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 == 133)
4011 $hash_buf = sha1
(encode
("UTF-16LE", $word_buf));
4013 $hash_buf = encode_base64
($hash_buf);
4014 $hash_buf =~ s/[\r\n]//g;
4016 $tmp_hash = sprintf ("%s", $hash_buf);
4018 elsif ($mode == 140)
4020 $hash_buf = sha1_hex
($salt_buf . encode
("UTF-16LE", $word_buf));
4022 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
4024 elsif ($mode == 141)
4026 $hash_buf = sha1
($salt_buf . encode
("UTF-16LE", $word_buf));
4028 my $base64_salt_buf = encode_base64
($salt_buf);
4030 chomp ($base64_salt_buf);
4032 my $base64_hash_buf = encode_base64
($hash_buf);
4034 $base64_hash_buf = substr ($base64_hash_buf, 0, 27);
4036 $tmp_hash = sprintf ("\$episerver\$*0*%s*%s", $base64_salt_buf, $base64_hash_buf);
4038 elsif ($mode == 150)
4040 $hash_buf = hmac_hex
($salt_buf, $word_buf, \
&sha1
, 64);
4042 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
4044 elsif ($mode == 160)
4046 $hash_buf = hmac_hex
($word_buf, $salt_buf, \
&sha1
, 64);
4048 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
4050 elsif ($mode == 190)
4052 $hash_buf = sha1_hex
($word_buf);
4054 my $variant = int (rand (2));
4056 if (defined ($additional_param))
4058 $variant = $additional_param;
4063 substr ($hash_buf, 0, 5) = "00000";
4066 $tmp_hash = sprintf ("%s", $hash_buf);
4068 elsif ($mode == 200)
4070 my $ppr = Authen
::Passphrase
::MySQL323
->new (passphrase
=> $word_buf);
4072 $hash_buf = $ppr->hash_hex;
4074 $tmp_hash = sprintf ("%s", $hash_buf);
4076 elsif ($mode == 300)
4078 $hash_buf = substr (password41
($word_buf), 1);
4080 $hash_buf = lc ($hash_buf); # useful for 'not matched' check only
4082 $tmp_hash = sprintf ("%s", $hash_buf);
4084 elsif ($mode == 400)
4093 my $ppr = Authen
::Passphrase
::PHPass
->new
4097 passphrase
=> $word_buf,
4100 $hash_buf = $ppr->as_rfc2307;
4102 $tmp_hash = sprintf ("%s", substr ($hash_buf, 7));
4104 elsif ($mode == 500)
4106 my $iterations = 1000;
4108 if (defined ($iter))
4112 $iterations = int ($iter);
4116 $hash_buf = md5_crypt
('$1$', $iterations, $word_buf, $salt_buf);
4118 $tmp_hash = sprintf ("%s", $hash_buf);
4120 elsif ($mode == 900)
4122 $hash_buf = md4_hex
($word_buf);
4124 $tmp_hash = sprintf ("%s", $hash_buf);
4126 elsif ($mode == 1000)
4128 $hash_buf = md4_hex
(encode
("UTF-16LE", $word_buf));
4130 $tmp_hash = sprintf ("%s", $hash_buf);
4132 elsif ($mode == 1100)
4134 $hash_buf = md4_hex
(md4
(encode
("UTF-16LE", $word_buf)) . encode
("UTF-16LE", lc ($salt_buf)));
4136 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
4138 elsif ($mode == 1400)
4140 $hash_buf = sha256_hex
($word_buf);
4142 $tmp_hash = sprintf ("%s", $hash_buf);
4144 elsif ($mode == 1410)
4146 $hash_buf = sha256_hex
($word_buf . $salt_buf);
4148 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
4150 elsif ($mode == 1420)
4152 $hash_buf = sha256_hex
($salt_buf . $word_buf);
4154 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
4156 elsif ($mode == 1430)
4158 $hash_buf = sha256_hex
(encode
("UTF-16LE", $word_buf) . $salt_buf);
4160 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
4162 elsif ($mode == 1440)
4164 $hash_buf = sha256_hex
($salt_buf . encode
("UTF-16LE", $word_buf));
4166 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
4168 elsif ($mode == 1441)
4170 $hash_buf = sha256
($salt_buf . encode
("UTF-16LE", $word_buf));
4172 my $base64_salt_buf = encode_base64
($salt_buf);
4174 chomp ($base64_salt_buf);
4176 my $base64_hash_buf = encode_base64
($hash_buf);
4178 chomp ($base64_hash_buf);
4180 $base64_hash_buf = substr ($base64_hash_buf, 0, 43);
4182 $tmp_hash = sprintf ("\$episerver\$*1*%s*%s", $base64_salt_buf, $base64_hash_buf);
4184 elsif ($mode == 1450)
4186 $hash_buf = hmac_hex
($salt_buf, $word_buf, \
&sha256
, 64);
4188 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
4190 elsif ($mode == 1460)
4192 $hash_buf = hmac_hex
($word_buf, $salt_buf, \
&sha256
, 64);
4194 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
4196 elsif ($mode == 1500)
4198 $hash_buf = crypt ($word_buf, $salt_buf);
4200 $tmp_hash = sprintf ("%s", $hash_buf);
4202 elsif ($mode == 1600)
4204 my $iterations = 1000;
4206 if (defined ($iter))
4210 $iterations = int ($iter);
4214 $hash_buf = md5_crypt
('$apr1$', $iterations, $word_buf, $salt_buf);
4216 $tmp_hash = sprintf ("%s", $hash_buf);
4218 elsif ($mode == 1700)
4220 $hash_buf = sha512_hex
($word_buf);
4222 $tmp_hash = sprintf ("%s", $hash_buf);
4224 elsif ($mode == 1710)
4226 $hash_buf = sha512_hex
($word_buf . $salt_buf);
4228 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
4230 elsif ($mode == 1711)
4232 $hash_buf = sha512_hex
($word_buf . $salt_buf);
4234 my $base64_buf = encode_base64
(pack ("H*", $hash_buf) . $salt_buf);
4236 $base64_buf =~ s/[ \n]//g;
4238 $tmp_hash = sprintf ("{SSHA512}%s", $base64_buf);
4240 elsif ($mode == 1720)
4242 $hash_buf = sha512_hex
($salt_buf . $word_buf);
4244 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
4246 elsif ($mode == 1730)
4248 $hash_buf = sha512_hex
(encode
("UTF-16LE", $word_buf) . $salt_buf);
4250 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
4252 elsif ($mode == 1740)
4254 $hash_buf = sha512_hex
($salt_buf . encode
("UTF-16LE", $word_buf));
4256 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
4258 elsif ($mode == 1722)
4260 my $salt_buf_bin = pack ("H*", $salt_buf);
4262 $hash_buf = sha512_hex
($salt_buf_bin . $word_buf);
4264 $tmp_hash = sprintf ("%s%s", $salt_buf, $hash_buf);
4266 elsif ($mode == 1731)
4268 my $salt_buf_bin = pack ("H*", $salt_buf);
4270 $hash_buf = sha512_hex
(encode
("UTF-16LE", $word_buf) . $salt_buf_bin);
4272 $tmp_hash = sprintf ("0x0200%s%s", $salt_buf, $hash_buf);
4274 elsif ($mode == 1750)
4276 $hash_buf = hmac_hex
($salt_buf, $word_buf, \
&sha512
, 128);
4278 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
4280 elsif ($mode == 1760)
4282 $hash_buf = hmac_hex
($word_buf, $salt_buf, \
&sha512
, 128);
4284 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
4286 elsif ($mode == 1800)
4288 my $iterations = 5000;
4290 if (defined ($iter))
4294 $iterations = int ($iter);
4298 $hash_buf = sha512_crypt
($iterations, $word_buf, $salt_buf);
4300 $tmp_hash = sprintf ("%s", $hash_buf);
4302 elsif ($mode == 2100)
4304 my $iterations = 10240;
4308 $iterations = int ($iter);
4311 my $salt = encode
("UTF-16LE", lc ($salt_buf));
4313 my $pbkdf2 = Crypt
::PBKDF2
->new
4315 hash_class
=> 'HMACSHA1',
4316 iterations
=> $iterations,
4318 salt_len
=> length ($salt),
4321 $hash_buf = unpack ("H*", $pbkdf2->PBKDF2 ($salt, md4
(md4
(encode
("UTF-16LE", $word_buf)) . $salt)));
4323 $tmp_hash = sprintf ("\$DCC2\$%i#%s#%s", $iterations, $salt_buf, $hash_buf);
4325 elsif ($mode == 2400)
4327 $tmp_hash = sprintf ("%s", pseudo_base64
(Digest
::MD5
::md5
($word_buf . "\0" x
(16 - length ($word_buf)))));
4329 elsif ($mode == 2410)
4331 my $salt_len = length ($salt_buf);
4333 my $salt_len_max4 = ($salt_len < 4) ?
$salt_len : 4;
4335 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)));
4337 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
4339 elsif ($mode == 2500)
4341 my ($bssid, $stmac, $snonce, $anonce, $eapol, $keyver, $eapol_size);
4343 if (! defined ($additional_param))
4347 $bssid = randbytes
(6);
4348 $stmac = randbytes
(6);
4349 $snonce = randbytes
(32);
4350 $anonce = randbytes
(32);
4352 $keyver = get_random_num
(1, 3); # 1 or 2
4355 # should be "validly" generated, but in theory could be anything for us also:
4356 # $eapol = "\x00" x 121; # works too, but let's generate it correctly
4358 $eapol = gen_random_wpa_eapol
($keyver, $snonce);
4362 $bssid = $additional_param;
4363 $stmac = $additional_param2;
4364 $snonce = $additional_param3;
4365 $anonce = $additional_param4;
4366 $keyver = $additional_param5;
4367 $eapol = $additional_param6;
4370 $eapol_size = length ($eapol);
4374 my $iterations = 4096;
4380 # generate the Pairwise Master Key (PMK)
4382 my $pbkdf2 = Crypt
::PBKDF2
->new
4384 hash_class
=> 'HMACSHA1',
4385 iterations
=> $iterations,
4389 my $pmk = $pbkdf2->PBKDF2 ($salt_buf, $word_buf);
4391 # Pairwise Transient Key (PTK) transformation
4393 my $ptk = wpa_prf_512
($pmk, $stmac, $bssid, $snonce, $anonce);
4395 # generate the Message Integrity Code (MIC)
4399 if ($keyver == 1) # WPA1 => MD5
4401 $mic = hmac
($eapol, $ptk, \
&md5
);
4405 $mic = hmac
($eapol, $ptk, \
&sha1
);
4408 $mic = substr ($mic, 0, 16);
4411 # format the binary output
4416 # first the essid (NULL-padded up to the first 36 bytes)
4418 $hash_buf .= $salt_buf;
4419 $hash_buf .= "\x00" x
(36 - length ($salt_buf));
4421 # the 2 MAC addresses
4423 $hash_buf .= $bssid;
4424 $hash_buf .= $stmac;
4428 $hash_buf .= $snonce;
4429 $hash_buf .= $anonce;
4433 $hash_buf .= $eapol;
4434 $hash_buf .= "\x00" x
(256 - $eapol_size);
4438 $hash_buf .= pack ("L*", $eapol_size);
4442 $hash_buf .= pack ("L*", $keyver);
4444 # and finally: the key mic
4448 # base64 encode the output
4450 $tmp_hash = encode_base64
($hash_buf, '');
4452 elsif ($mode == 2600)
4454 $hash_buf = md5_hex
(md5_hex
($word_buf));
4456 $tmp_hash = sprintf ("%s", $hash_buf);
4458 elsif ($mode == 2611)
4460 $hash_buf = md5_hex
(md5_hex
($word_buf) . $salt_buf);
4462 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
4464 elsif ($mode == 2612)
4466 my $salt_buf_hex = unpack ("H*", $salt_buf);
4468 $hash_buf = md5_hex
(md5_hex
($word_buf) . $salt_buf);
4470 $tmp_hash = sprintf ("\$PHPS\$%s\$%s", $salt_buf_hex, $hash_buf);
4472 elsif ($mode == 2711)
4474 $hash_buf = md5_hex
(md5_hex
($word_buf) . $salt_buf);
4476 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
4478 elsif ($mode == 2811)
4480 $hash_buf = md5_hex
(md5_hex
($salt_buf) . md5_hex
($word_buf));
4482 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
4484 elsif ($mode == 3000)
4486 my $ppr = Authen
::Passphrase
::LANManager
->new ("passphrase" => $word_buf);
4488 $hash_buf = $ppr->hash_hex;
4490 $tmp_hash = sprintf ("%s", substr ($hash_buf, 0, 16));
4492 elsif ($mode == 3100)
4494 $hash_buf = oracle_hash
($salt_buf, $word_buf);
4496 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
4498 elsif ($mode == 3200)
4507 $tmp_hash = bcrypt
($word_buf, sprintf ('$2a$%s$%s$', $cost, en_base64
($salt_buf)));
4509 elsif ($mode == 3300)
4511 my $iterations = 904;
4515 $iterations = int ($iter);
4520 if (defined ($additional_param))
4522 $variant = $additional_param;
4525 my $prefix = sprintf ("\$md5%srounds=%i\$%s", $variant, $iterations, $salt_buf);
4527 $iterations += 4096;
4529 $hash_buf = sun_md5
($word_buf, $prefix, $iterations);
4531 $tmp_hash = sprintf ("%s\$%s", $prefix, $hash_buf);
4533 elsif ($mode == 3500)
4535 $hash_buf = md5_hex
(md5_hex
(md5_hex
($word_buf)));
4537 $tmp_hash = sprintf ("%s", $hash_buf);
4539 elsif ($mode == 3610)
4541 $hash_buf = md5_hex
(md5_hex
($salt_buf) . $word_buf);
4543 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
4545 elsif ($mode == 3710)
4547 $hash_buf = md5_hex
($salt_buf . md5_hex
($word_buf));
4549 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
4551 elsif ($mode == 3711)
4553 $hash_buf = md5_hex
($salt_buf . "-" . md5_hex
($word_buf));
4555 $tmp_hash = sprintf ("\$B\$%s\$%s", $salt_buf, $hash_buf);
4557 elsif ($mode == 3720)
4559 $hash_buf = md5_hex
($word_buf . md5_hex
($salt_buf));
4561 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
4563 elsif ($mode == 3800)
4565 $hash_buf = md5_hex
($salt_buf . $word_buf . $salt_buf);
4567 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
4569 elsif ($mode == 3910)
4571 $hash_buf = md5_hex
(md5_hex
($word_buf) . md5_hex
($salt_buf));
4573 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
4575 elsif ($mode == 4010)
4577 $hash_buf = md5_hex
($salt_buf . md5_hex
($salt_buf . $word_buf));
4579 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
4581 elsif ($mode == 4110)
4583 $hash_buf = md5_hex
($salt_buf . md5_hex
($word_buf . $salt_buf));
4585 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
4587 elsif ($mode == 4210)
4589 $hash_buf = md5_hex
($salt_buf . "\x00" . $word_buf);
4591 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
4593 elsif ($mode == 4300)
4595 $hash_buf = md5_hex
(uc (md5_hex
($word_buf)));
4597 $tmp_hash = sprintf ("%s", $hash_buf);
4599 elsif ($mode == 4400)
4601 $hash_buf = md5_hex
(sha1_hex
($word_buf));
4603 $tmp_hash = sprintf ("%s", $hash_buf);
4605 elsif ($mode == 4500)
4607 $hash_buf = sha1_hex
(sha1_hex
($word_buf));
4609 $tmp_hash = sprintf ("%s", $hash_buf);
4611 elsif ($mode == 4600)
4613 $hash_buf = sha1_hex
(sha1_hex
(sha1_hex
($word_buf)));
4615 $tmp_hash = sprintf ("%s", $hash_buf);
4617 elsif ($mode == 4700)
4619 $hash_buf = sha1_hex
(md5_hex
($word_buf));
4621 $tmp_hash = sprintf ("%s", $hash_buf);
4623 elsif ($mode == 4800)
4625 my $index = rindex ($salt_buf, ":");
4627 my $salt = substr ($salt_buf, 0, $index);
4628 my $salt_bin = pack ("H*", $salt);
4629 my $chap_sign = substr ($salt_buf, $index + 1);
4630 my $chap_sign_bin = pack ("H*", $chap_sign);
4632 $hash_buf = md5_hex
($chap_sign_bin . $word_buf . $salt_bin);
4634 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
4636 elsif ($mode == 4900)
4638 $hash_buf = sha1_hex
($salt_buf . $word_buf . $salt_buf);
4640 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
4642 elsif ($mode == 5000)
4644 $hash_buf = keccak_256_hex
($word_buf);
4646 $tmp_hash = sprintf ("%s", $hash_buf);
4648 elsif ($mode == 5100)
4652 if (! defined ($additional_param))
4658 $pos = $additional_param * 8 unless ($additional_param > 2);
4661 $hash_buf = md5_hex
($word_buf);
4663 $tmp_hash = sprintf ("%s", substr ($hash_buf, $pos, 16));
4665 elsif ($mode == 5300)
4667 my @salt_arr = split (":", $salt_buf);
4669 my $msg_buf = pack ("H*", $salt_arr[0] . $salt_arr[1] . $salt_arr[2] . $salt_arr[3] . $salt_arr[4] . $salt_arr[5]);
4670 my $nr_buf = pack ("H*", $salt_arr[6] . $salt_arr[7]);
4672 my $hash_buf = hmac
($nr_buf , $word_buf, \
&md5
, 64);
4673 $hash_buf = hmac_hex
($msg_buf, $hash_buf, \
&md5
, 64);
4675 $tmp_hash = sprintf ("%s:%s", $salt_buf, $hash_buf);
4677 elsif ($mode == 5400)
4679 my @salt_arr = split (":", $salt_buf);
4681 my $msg_buf = pack ("H*", $salt_arr[0] . $salt_arr[1] . $salt_arr[2] . $salt_arr[3] . $salt_arr[4] . $salt_arr[5]);
4682 my $nr_buf = pack ("H*", $salt_arr[6] . $salt_arr[7]);
4684 my $hash_buf = hmac
($nr_buf , $word_buf, \
&sha1
, 64);
4685 $hash_buf = hmac_hex
($msg_buf, $hash_buf, \
&sha1
, 64);
4687 $tmp_hash = sprintf ("%s:%s", $salt_buf, $hash_buf);
4689 elsif ($mode == 5500)
4691 my $index1 = index ($salt_buf, "::");
4692 my $user = substr ($salt_buf, 0, $index1);
4694 my $index2 = index ($salt_buf, ":", $index1 + 2);
4695 my $domain = substr ($salt_buf, $index1 + 2, $index2 - $index1 - 2);
4697 my $len = length (substr ($salt_buf, $index2 + 1));
4699 my $c_challenge_hex;
4703 $c_challenge_hex = substr ($salt_buf, $index2 + 1, 48);
4708 $c_challenge_hex = substr ($salt_buf, $index2 + 1, 16);
4709 $c_challenge_hex .= 00 x
32;
4712 my $c_challenge = pack ("H*", substr ($c_challenge_hex, 0, 16));
4713 my $s_challenge_hex = substr ($salt_buf, $index2 + 17, 16);
4714 my $s_challenge = pack ("H*", $s_challenge_hex);
4716 my $challenge = substr (md5
($s_challenge . $c_challenge), 0, 8);
4720 my $nthash = Authen
::Passphrase
::NTHash
->new (passphrase
=> $word_buf)->hash . "\x00" x
5;
4722 $ntresp .= Crypt
::ECB
::encrypt
(setup_des_key
(substr ($nthash, 0, 7)), "DES", $challenge, PADDING_NONE
);
4723 $ntresp .= Crypt
::ECB
::encrypt
(setup_des_key
(substr ($nthash, 7, 7)), "DES", $challenge, PADDING_NONE
);
4724 $ntresp .= Crypt
::ECB
::encrypt
(setup_des_key
(substr ($nthash, 14, 7)), "DES", $challenge, PADDING_NONE
);
4726 $tmp_hash = sprintf ("%s::%s:%s:%s:%s", $user, $domain, $c_challenge_hex, unpack ("H*", $ntresp), $s_challenge_hex);
4728 elsif ($mode == 5600)
4730 my $index1 = index ($salt_buf, "::");
4731 my $user = substr ($salt_buf, 0, $index1);
4733 my $index2 = index ($salt_buf, ":", $index1 + 2);
4734 my $domain = substr ($salt_buf, $index1 + 2, $index2 - $index1 - 2);
4736 my $s_challenge_hex = substr ($salt_buf, $index2 + 1, 16);
4737 my $s_challenge = pack ("H*", $s_challenge_hex);
4739 my $temp_hex = substr ($salt_buf, $index2 + 17);
4740 my $temp = pack ("H*", $temp_hex);
4742 my $nthash = Authen
::Passphrase
::NTHash
->new (passphrase
=> $word_buf)->hash;
4743 my $identity = Encode
::encode
("UTF-16LE", uc ($user) . $domain);
4745 $hash_buf = hmac_hex
($s_challenge . $temp, hmac
($identity, $nthash, \
&md5
, 64), \
&md5
, 64);
4747 $tmp_hash = sprintf ("%s::%s:%s:%s:%s", $user, $domain, $s_challenge_hex, $hash_buf, $temp_hex);
4749 elsif ($mode == 5700)
4751 $hash_buf = sha256
($word_buf);
4753 my $base64_buf = encode_base64
($hash_buf);
4757 for (my $i = 0; $i < 43; $i++)
4759 $tmp_hash .= $CISCO_BASE64_MAPPING->{substr ($base64_buf, $i, 1)};
4762 elsif ($mode == 5800)
4764 $hash_buf = androidpin_hash
($word_buf, $salt_buf);
4766 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
4768 elsif ($mode == 6000)
4770 $hash_buf = ripemd160_hex
($word_buf);
4772 $tmp_hash = sprintf ("%s", $hash_buf);
4774 elsif ($mode == 6100)
4776 $hash_buf = whirlpool_hex
($word_buf);
4778 $tmp_hash = sprintf ("%s", $hash_buf);
4780 elsif ($mode == 6300)
4782 my $iterations = 1000; # hard coded by the AIX format
4784 $hash_buf = md5_crypt
('', $iterations, $word_buf, $salt_buf);
4786 $tmp_hash = sprintf ("{smd5}%s", $hash_buf);
4788 elsif ($mode == 6400)
4790 my $iterations = 64;
4794 $iterations = 1 << int ($iter);
4797 $hash_buf = aix_ssha256_pbkdf2
($word_buf, $salt_buf, $iterations);
4799 $tmp_hash = sprintf ("{ssha256}%02i\$%s\$%s", log ($iterations) / log (2), $salt_buf, $hash_buf);
4801 elsif ($mode == 6500)
4803 my $iterations = 64;
4807 $iterations = 1 << int ($iter);
4810 $hash_buf = aix_ssha512_pbkdf2
($word_buf, $salt_buf, $iterations);
4812 $tmp_hash = sprintf ("{ssha512}%02i\$%s\$%s", log ($iterations) / log (2), $salt_buf, $hash_buf);
4814 elsif ($mode == 6600)
4816 my $iterations = 1000;
4820 $iterations = int ($iter);
4823 my $salt_hex = substr ($salt_buf, 0, 16);
4824 my $salt = pack ("H*", $salt_hex);
4826 my $prefix = substr ($salt_buf, 16, 2016);
4828 my $iv_hex = substr ($salt_buf, 2032);
4829 my $iv = pack ("H*", $iv_hex);
4831 my $data = pack ("H*", "10101010101010101010101010101010");
4833 my $hasher = Crypt
::PBKDF2
->hasher_from_algorithm ('HMACSHA1');
4835 my $pbkdf2 = Crypt
::PBKDF2
->new (
4837 iterations
=> $iterations,
4841 my $key = $pbkdf2->PBKDF2 ($salt, $word_buf);
4843 my $cipher = Crypt
::CBC
->new ({
4845 cipher
=> "Crypt::Rijndael",
4852 my $encrypted = unpack ("H*", $cipher->encrypt ($data));
4854 $hash_buf = substr ($encrypted, 0, 32);
4856 $tmp_hash = sprintf ("%i:%s:%s%s%s", $iterations, $salt_hex, $prefix, $iv_hex, $hash_buf);
4858 elsif ($mode == 6700)
4860 my $iterations = 64;
4864 $iterations = 1 << int ($iter);
4867 $hash_buf = aix_ssha1_pbkdf2
($word_buf, $salt_buf, $iterations);
4869 $tmp_hash = sprintf ("{ssha1}%02i\$%s\$%s", log ($iterations) / log (2), $salt_buf, $hash_buf);
4871 elsif ($mode == 6800)
4873 my $variant = $additional_param;
4875 if (! defined ($variant))
4877 $variant = int (rand (2));
4880 my $iterations = 500;
4884 $iterations = int ($iter);
4887 my $iv = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00";
4889 my $hasher = Crypt
::PBKDF2
->hasher_from_algorithm ('HMACSHA2', 256);
4891 my $pbkdf2 = Crypt
::PBKDF2
->new (
4893 iterations
=> $iterations,
4897 my $key = $pbkdf2->PBKDF2 ($salt_buf, $word_buf);
4899 my $cipher = Crypt
::CBC
->new ({
4901 cipher
=> "Crypt::Rijndael",
4910 my $encrypt = $cipher->encrypt (substr ($salt_buf, 0, 16));
4912 $hash_buf = substr (unpack ("H*", $encrypt), 0, 32);
4916 my $verifier = "lastpass rocks\x02\x02";
4918 $hash_buf = unpack ("H*", substr ($cipher->encrypt ($verifier), 0, 16));
4921 $tmp_hash = sprintf ("%s:%i:%s", $hash_buf, $iterations, $salt_buf);
4923 elsif ($mode == 6900)
4925 $hash_buf = gost_hex
($word_buf);
4927 $tmp_hash = sprintf ("%s", $hash_buf);
4929 elsif ($mode == 7100)
4931 my $iterations = 1024;
4935 $iterations = int ($iter);
4938 my $pbkdf2 = Crypt
::PBKDF2
->new
4940 hasher
=> Crypt
::PBKDF2
->hasher_from_algorithm ('HMACSHA2', 512),
4941 iterations
=> $iterations
4944 $hash_buf = unpack ("H*", $pbkdf2->PBKDF2 (pack ("H*", $salt_buf), $word_buf));
4946 $tmp_hash = sprintf ("\$ml\$%i\$%s\$%0128s", $iterations, $salt_buf, $hash_buf);
4948 elsif ($mode == 7200)
4950 my $iterations = 1024;
4954 $iterations = int ($iter);
4957 my $pbkdf2 = Crypt
::PBKDF2
->new (
4958 hasher
=> Crypt
::PBKDF2
->hasher_from_algorithm ('HMACSHA2', 512),
4959 iterations
=> $iterations
4962 $hash_buf = unpack ("H*", $pbkdf2->PBKDF2 (pack ("H*", $salt_buf), $word_buf));
4964 $tmp_hash = sprintf ("grub.pbkdf2.sha512.%i.%s.%0128s", $iterations, $salt_buf, $hash_buf);
4966 elsif ($mode == 7300)
4968 $hash_buf = hmac_hex
($salt_buf, $word_buf, \
&sha1
);
4970 $tmp_hash = sprintf ("%s:%s", unpack ("H*", $salt_buf), $hash_buf);
4972 elsif ($mode == 7400)
4974 my $iterations = 5000;
4976 if (defined ($iter))
4980 $iterations = int ($iter);
4984 $hash_buf = sha256_crypt
($iterations, $word_buf, $salt_buf);
4986 $tmp_hash = sprintf ("%s", $hash_buf);
4988 elsif ($mode == 7500)
4990 my @salt_arr = split ("\\\$", $salt_buf);
4992 my $user = $salt_arr[0];
4994 my $realm = $salt_arr[1];
4996 my $salt = $salt_arr[2];
4998 my $hmac_salt = $salt_arr[3];
4999 my $hmac_salt_bin = pack ("H*", $hmac_salt);
5001 my $clear_data = $salt_arr[4];
5003 my $k = md4
(encode
("UTF-16LE", $word_buf));
5005 my $k1 = hmac_md5
("\x01\x00\x00\x00", $k);
5007 my $k3 = hmac_md5
($hmac_salt_bin, $k1);
5009 if (length ($clear_data) > 1)
5011 my $clear_data_bin = pack ("H*", $clear_data);
5013 $hash_buf = RC4
($k3, $clear_data_bin);
5017 my $hash = $salt_arr[5];
5019 my $hash_bin = pack ("H*", $hash);
5021 my $clear_data = RC4
($k3, $hash_bin);
5023 my $timestamp = substr ($clear_data, 14, 14);
5028 if ($timestamp !~ /^[[:digit:]]{14}$/)
5035 $hash_buf = "\x00" x
36;
5037 if ($hash_buf eq $hash_bin)
5039 $hash_buf = "\x01" x
36;
5044 $hash_buf = $hash_bin;
5048 $tmp_hash = sprintf ("\$krb5pa\$23\$%s\$%s\$%s\$%s%s", $user, $realm, $salt, unpack ("H*", $hash_buf), $hmac_salt);
5050 elsif ($mode == 7600)
5052 $hash_buf = sha1_hex
($salt_buf . sha1_hex
($word_buf));
5054 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
5056 elsif ($mode == 7700)
5058 $word_buf = uc $word_buf;
5059 $salt_buf = uc $salt_buf;
5061 my $word_buf_t = sapb_transcode
($word_buf);
5062 my $salt_buf_t = sapb_transcode
($salt_buf);
5064 my $digest1 = md5
($word_buf_t . $salt_buf_t);
5066 my $data = sapb_waldorf
($digest1, $word_buf_t, $salt_buf_t);
5068 my $digest2 = md5
($data);
5070 my ($a, $b, $c, $d) = unpack ("N4", $digest2);
5075 $tmp_hash = sprintf ("%s\$%08X%08X", $salt_buf, $a, $b);
5077 elsif ($mode == 7800)
5079 my $theMagicArray_s =
5080 "\x91\xac\x51\x14\x9f\x67\x54\x43\x24\xe7\x3b\xe0\x28\x74\x7b\xc2" .
5081 "\x86\x33\x13\xeb\x5a\x4f\xcb\x5c\x08\x0a\x73\x37\x0e\x5d\x1c\x2f" .
5082 "\x33\x8f\xe6\xe5\xf8\x9b\xae\xdd\x16\xf2\x4b\x8d\x2c\xe1\xd4\xdc" .
5083 "\xb0\xcb\xdf\x9d\xd4\x70\x6d\x17\xf9\x4d\x42\x3f\x9b\x1b\x11\x94" .
5084 "\x9f\x5b\xc1\x9b\x06\x05\x9d\x03\x9d\x5e\x13\x8a\x1e\x9a\x6a\xe8" .
5085 "\xd9\x7c\x14\x17\x58\xc7\x2a\xf6\xa1\x99\x63\x0a\xd7\xfd\x70\xc3" .
5086 "\xf6\x5e\x74\x13\x03\xc9\x0b\x04\x26\x98\xf7\x26\x8a\x92\x93\x25" .
5087 "\xb0\xa2\x0d\x23\xed\x63\x79\x6d\x13\x32\xfa\x3c\x35\x02\x9a\xa3" .
5088 "\xb3\xdd\x8e\x0a\x24\xbf\x51\xc3\x7c\xcd\x55\x9f\x37\xaf\x94\x4c" .
5089 "\x29\x08\x52\x82\xb2\x3b\x4e\x37\x9f\x17\x07\x91\x11\x3b\xfd\xcd";
5091 $salt_buf = uc $salt_buf;
5093 my $digest = sha1
($word_buf . $salt_buf);
5095 my ($a, $b, $c, $d, $e) = unpack ("I*", $digest);
5097 my $lengthMagicArray = 0x20;
5098 my $offsetMagicArray = 0;
5100 $lengthMagicArray += (($a >> 0) & 0xff) % 6;
5101 $lengthMagicArray += (($a >> 8) & 0xff) % 6;
5102 $lengthMagicArray += (($a >> 16) & 0xff) % 6;
5103 $lengthMagicArray += (($a >> 24) & 0xff) % 6;
5104 $lengthMagicArray += (($b >> 0) & 0xff) % 6;
5105 $lengthMagicArray += (($b >> 8) & 0xff) % 6;
5106 $lengthMagicArray += (($b >> 16) & 0xff) % 6;
5107 $lengthMagicArray += (($b >> 24) & 0xff) % 6;
5108 $lengthMagicArray += (($c >> 0) & 0xff) % 6;
5109 $lengthMagicArray += (($c >> 8) & 0xff) % 6;
5110 $offsetMagicArray += (($c >> 16) & 0xff) % 8;
5111 $offsetMagicArray += (($c >> 24) & 0xff) % 8;
5112 $offsetMagicArray += (($d >> 0) & 0xff) % 8;
5113 $offsetMagicArray += (($d >> 8) & 0xff) % 8;
5114 $offsetMagicArray += (($d >> 16) & 0xff) % 8;
5115 $offsetMagicArray += (($d >> 24) & 0xff) % 8;
5116 $offsetMagicArray += (($e >> 0) & 0xff) % 8;
5117 $offsetMagicArray += (($e >> 8) & 0xff) % 8;
5118 $offsetMagicArray += (($e >> 16) & 0xff) % 8;
5119 $offsetMagicArray += (($e >> 24) & 0xff) % 8;
5121 my $hash_buf = sha1_hex
($word_buf . substr ($theMagicArray_s, $offsetMagicArray, $lengthMagicArray) . $salt_buf);
5123 $tmp_hash = sprintf ("%s\$%s", $salt_buf, uc $hash_buf);
5125 elsif ($mode == 7900)
5134 my $phpass_it = 1 << $cost;
5136 $hash_buf = sha512
($salt_buf . $word_buf);
5138 for (my $i = 0; $i < $phpass_it; $i++)
5140 $hash_buf = sha512
($hash_buf . $word_buf);
5143 my $base64_buf = substr (Authen
::Passphrase
::PHPass
::_en_base64
($hash_buf), 0, 43);
5145 my $base64_digits = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
5147 my $cost_str = substr ($base64_digits , $cost, 1);
5149 $tmp_hash = sprintf ('$S$%s%s%s', $cost_str, $salt_buf, $base64_buf);
5151 elsif ($mode == 8000)
5153 my $salt_buf_bin = pack ("H*", $salt_buf);
5155 my $word_buf_utf = encode
("UTF-16BE", $word_buf);
5157 $hash_buf = sha256_hex
($word_buf_utf . "\x00" x
(510 - (length ($word_buf) * 2)) . $salt_buf_bin);
5159 $tmp_hash = sprintf ("0xc007%s%s", $salt_buf, $hash_buf);
5161 elsif ($mode == 8100)
5163 $hash_buf = sha1_hex
($salt_buf . $word_buf . "\x00");
5165 $tmp_hash = sprintf ("1%s%s", $salt_buf, $hash_buf);
5167 elsif ($mode == 8200)
5169 my $iterations = 40000;
5171 if (defined ($iter))
5173 $iterations = $iter;
5176 my $salt_hex = substr ($salt_buf, 0, 32);
5177 my $salt = pack ("H*", $salt_hex);
5179 my $data_hex = substr ($salt_buf, 32);
5180 my $data = pack ("H*", $data_hex);
5182 my $pbkdf2 = Crypt
::PBKDF2
->new
5184 hasher
=> Crypt
::PBKDF2
->hasher_from_algorithm ('HMACSHA2', 512),
5185 iterations
=> int $iterations
5188 my $key = $pbkdf2->PBKDF2 ($salt, $word_buf);
5190 $hash_buf = hmac_hex
($data, substr ($key, 32, 32), \
&sha256
, 64);
5192 $tmp_hash = sprintf ("%s:%s:%d:%s", $hash_buf, $salt_hex, $iterations, $data_hex);
5194 elsif ($mode == 8300)
5196 my ($domain, $salt_hex) = split (":", $salt_buf);
5198 my $hashalg = Net
::DNS
::SEC
->digtype ("SHA1");
5200 my $salt = pack ("H*", $salt_hex);
5204 if (defined ($iter))
5206 $iterations = $iter;
5209 my $name = lc ($word_buf . $domain);
5211 my $hash_buf = Net
::DNS
::RR
::NSEC3
::name2hash
($hashalg, $name, $iterations, $salt);
5213 $tmp_hash = sprintf ("%s:%s:%s:%d", $hash_buf, $domain, $salt_hex, $iterations);
5215 elsif ($mode == 8400)
5217 $hash_buf = sha1_hex
($salt_buf . sha1_hex
($salt_buf . sha1_hex
($word_buf)));
5219 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
5221 elsif ($mode == 8500)
5223 $hash_buf = racf_hash
(uc $salt_buf, $word_buf);
5225 $tmp_hash = sprintf ('$racf$*%s*%s', uc $salt_buf, uc $hash_buf);
5227 elsif ($mode == 8600)
5229 my @saved_key = map { ord $_; } split "", $word_buf;
5231 my $len = scalar @saved_key;
5233 my @state = domino_big_md
(\
@saved_key, $len);
5235 $tmp_hash = sprintf ('%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x',
5254 elsif ($mode == 8700)
5256 my $domino_char = undef;
5258 if (defined ($additional_param))
5260 $domino_char = $additional_param;
5263 my @saved_key = map { ord $_; } split "", $word_buf;
5265 my $len = scalar @saved_key;
5267 my @state = domino_big_md
(\
@saved_key, $len);
5269 my $str = "(" . unpack ("H*", join ("", (map { chr $_; } @state))) . ")";
5271 @saved_key = map { ord $_; } split "", $salt_buf . uc $str;
5273 @state = domino_big_md
(\
@saved_key, 34);
5275 $hash_buf = join ("", (map { chr $_; } @state));
5277 $tmp_hash = sprintf ('(G%s)', domino_encode
($salt_buf . $hash_buf, $domino_char));
5279 elsif ($mode == 8900)
5285 if (defined ($additional_param))
5287 $N = $additional_param;
5288 $r = $additional_param2;
5289 $p = $additional_param3;
5292 $hash_buf = scrypt_hash
($word_buf, $salt_buf, $N, $r, $p, 32);
5294 $tmp_hash = sprintf ('%s', $hash_buf);
5296 elsif ($mode == 9100)
5298 my $iterations = 5000;
5300 if (defined ($iter))
5302 $iterations = $iter;
5305 my $domino_char = undef;
5307 # domino 5 hash - SEC_pwddigest_V1 - -m 8600
5309 my @saved_key = map { ord $_; } split "", $word_buf;
5311 my $len = scalar @saved_key;
5313 my @state = domino_big_md
(\
@saved_key, $len);
5316 # domino 6 hash - SEC_pwddigest_V2 - -m 8700
5318 my $salt_part = substr ($salt_buf, 0, 5);
5320 my $str = "(" . unpack ("H*", join ("", (map { chr $_; } @state))) . ")";
5322 @saved_key = map { ord $_; } split "", $salt_part . uc $str;
5324 @state = domino_big_md
(\
@saved_key, 34);
5326 $hash_buf = join ("", (map { chr $_; } @state));
5328 $tmp_hash = sprintf ('(G%s)', domino_encode
($salt_part . $hash_buf, $domino_char));
5331 # domino 8(.5.x) hash - SEC_pwddigest_V3 - -m 9100
5333 my $pbkdf2 = Crypt
::PBKDF2
->new
5335 hash_class
=> 'HMACSHA1',
5336 iterations
=> $iterations,
5343 if (defined ($additional_param))
5345 $chars = $additional_param;
5348 my $digest_new = $pbkdf2->PBKDF2 ($salt_buf, $tmp_hash);
5350 my $iteration_str = "" . $iterations;
5352 for (my $i = length ($iterations); $i < 10; $i++)
5354 $iterations = "0" . $iterations;
5357 $tmp_hash = sprintf ('(H%s)', domino_85x_encode
($salt_buf . $iterations . $chars . $digest_new, $domino_char));
5359 elsif ($mode == 9200)
5361 my $iterations = 20000;
5363 my $pbkdf2 = Crypt
::PBKDF2
->new
5365 hasher
=> Crypt
::PBKDF2
->hasher_from_algorithm ('HMACSHA2', 256),
5366 iterations
=> $iterations
5369 $hash_buf = encode_base64
($pbkdf2->PBKDF2 ($salt_buf, $word_buf));
5373 for (my $i = 0; $i < 43; $i++)
5375 $tmp_hash .= $CISCO_BASE64_MAPPING->{substr ($hash_buf, $i, 1)};
5378 $tmp_hash = sprintf ("\$8\$%s\$%s", $salt_buf, $tmp_hash);
5380 elsif ($mode == 9300)
5386 $hash_buf = scrypt_b64
($word_buf, $salt_buf, $N, $r, $p, 32);
5390 for (my $i = 0; $i < 43; $i++)
5392 $tmp_hash .= $CISCO_BASE64_MAPPING->{substr ($hash_buf, $i, 1)};
5395 $tmp_hash = sprintf ('$9$%s$%s', $salt_buf, $tmp_hash);
5397 elsif ($mode == 9400)
5399 my $iterations = 50000;
5403 $iterations = int ($iter);
5406 my $aes_key_size = 128; # or 256
5408 if (defined ($additional_param2))
5410 $aes_key_size = $additional_param2;
5413 $salt_buf = pack ("H*", $salt_buf);
5415 my $tmp = sha1
($salt_buf . encode
("UTF-16LE", $word_buf));
5417 for (my $i = 0; $i < $iterations; $i++)
5419 my $num32 = pack ("L", $i);
5421 $tmp = sha1
($num32 . $tmp);
5424 my $zero32 = pack ("L", 0x00);
5426 my $derivation_array1 = pack ("C", 0x36) x
64;
5427 my $derivation_array2 = pack ("C", 0x5C) x
64;
5429 $tmp = sha1
($tmp . $zero32);
5431 my $tmp2 = sha1
($derivation_array1 ^ $tmp);
5432 my $tmp3 = sha1
($derivation_array2 ^ $tmp);
5434 my $key = substr ($tmp2 . $tmp3, 0, $aes_key_size / 8);
5436 my $m = Crypt
::Mode
::ECB
->new ('AES', 0);
5440 if (defined $additional_param)
5442 $encdata = $m->decrypt (pack ("H*", $additional_param), $key);
5446 $encdata = "A" x
16; ## can be anything
5449 my $data1_buf = $encdata;
5450 my $data2_buf = sha1
(substr ($data1_buf, 0, 16));
5452 $data1_buf = substr ($data1_buf . ("\x00" x
16), 0, 16);
5453 $data2_buf = substr ($data2_buf . ("\x00" x
16), 0, 32);
5455 my $encrypted1 = unpack ("H*", $m->encrypt ($data1_buf, $key));
5456 my $encrypted2 = unpack ("H*", $m->encrypt ($data2_buf, $key));
5458 $encrypted1 = substr ($encrypted1, 0, 32);
5459 $encrypted2 = substr ($encrypted2, 0, 40);
5461 $tmp_hash = sprintf ("\$office\$*%d*%d*%d*%d*%s*%s*%s", 2007, 20, $aes_key_size, 16, unpack ("H*", $salt_buf), $encrypted1, $encrypted2);
5463 elsif ($mode == 9500)
5465 my $iterations = 100000;
5469 $iterations = int ($iter);
5472 $salt_buf = pack ("H*", $salt_buf);
5474 my $tmp = sha1
($salt_buf . encode
("UTF-16LE", $word_buf));
5476 for (my $i = 0; $i < $iterations; $i++)
5478 my $num32 = pack ("L", $i);
5480 $tmp = sha1
($num32 . $tmp);
5483 my $encryptedVerifierHashInputBlockKey = "\xfe\xa7\xd2\x76\x3b\x4b\x9e\x79";
5484 my $encryptedVerifierHashValueBlockKey = "\xd7\xaa\x0f\x6d\x30\x61\x34\x4e";
5486 my $final1 = sha1
($tmp . $encryptedVerifierHashInputBlockKey);
5487 my $final2 = sha1
($tmp . $encryptedVerifierHashValueBlockKey);
5489 my $key1 = substr ($final1, 0, 16);
5490 my $key2 = substr ($final2, 0, 16);
5492 my $cipher1 = Crypt
::CBC
->new ({
5494 cipher
=> "Crypt::Rijndael",
5502 my $cipher2 = Crypt
::CBC
->new ({
5504 cipher
=> "Crypt::Rijndael",
5514 if (defined $additional_param)
5516 $encdata = $cipher1->decrypt (pack ("H*", $additional_param));
5520 $encdata = "A" x
16; ## can be anything
5523 my $data1_buf = $encdata;
5524 my $data2_buf = sha1
(substr ($data1_buf, 0, 16));
5526 my $encrypted1 = unpack ("H*", $cipher1->encrypt ($data1_buf));
5527 my $encrypted2 = unpack ("H*", $cipher2->encrypt ($data2_buf));
5529 $encrypted2 = substr ($encrypted2, 0, 64);
5531 $tmp_hash = sprintf ("\$office\$*%d*%d*%d*%d*%s*%s*%s", 2010, 100000, 128, 16, unpack ("H*", $salt_buf), $encrypted1, $encrypted2);
5533 elsif ($mode == 9600)
5535 my $iterations = 100000;
5539 $iterations = int ($iter);
5542 $salt_buf = pack ("H*", $salt_buf);
5544 my $tmp = sha512
($salt_buf . encode
("UTF-16LE", $word_buf));
5546 for (my $i = 0; $i < $iterations; $i++)
5548 my $num32 = pack ("L", $i);
5550 $tmp = sha512
($num32 . $tmp);
5553 my $encryptedVerifierHashInputBlockKey = "\xfe\xa7\xd2\x76\x3b\x4b\x9e\x79";
5554 my $encryptedVerifierHashValueBlockKey = "\xd7\xaa\x0f\x6d\x30\x61\x34\x4e";
5556 my $final1 = sha512
($tmp . $encryptedVerifierHashInputBlockKey);
5557 my $final2 = sha512
($tmp . $encryptedVerifierHashValueBlockKey);
5559 my $key1 = substr ($final1, 0, 32);
5560 my $key2 = substr ($final2, 0, 32);
5562 my $cipher1 = Crypt
::CBC
->new ({
5564 cipher
=> "Crypt::Rijndael",
5572 my $cipher2 = Crypt
::CBC
->new ({
5574 cipher
=> "Crypt::Rijndael",
5584 if (defined $additional_param)
5586 $encdata = $cipher1->decrypt (pack ("H*", $additional_param));
5590 $encdata = "A" x
16; ## can be anything
5593 my $data1_buf = $encdata;
5594 my $data2_buf = sha512
(substr ($data1_buf, 0, 16));
5596 my $encrypted1 = unpack ("H*", $cipher1->encrypt ($data1_buf));
5597 my $encrypted2 = unpack ("H*", $cipher2->encrypt ($data2_buf));
5599 $encrypted2 = substr ($encrypted2, 0, 64);
5601 $tmp_hash = sprintf ("\$office\$*%d*%d*%d*%d*%s*%s*%s", 2013, 100000, 256, 16, unpack ("H*", $salt_buf), $encrypted1, $encrypted2);
5603 elsif ($mode == 9700)
5605 $salt_buf = pack ("H*", $salt_buf);
5607 my $tmp = md5
(encode
("UTF-16LE", $word_buf));
5609 $tmp = substr ($tmp, 0, 5);
5613 for (my $i = 0; $i < 16; $i++)
5621 $tmp = substr ($tmp, 0, 5);
5625 if (defined $additional_param2)
5627 $version = $additional_param2;
5631 $version = (unpack ("L", $tmp) & 1) ?
0 : 1;
5634 my $rc4_key = md5
($tmp . "\x00\x00\x00\x00");
5636 my $m = Crypt
::RC4
->new (substr ($rc4_key, 0, 16));
5640 if (defined $additional_param)
5642 $encdata = $m->RC4 (pack ("H*", $additional_param));
5646 $encdata = "A" x
16; ## can be anything
5649 my $data1_buf = $encdata;
5650 my $data2_buf = md5
(substr ($data1_buf, 0, 16));
5652 $m = Crypt
::RC4
->new (substr ($rc4_key, 0, 16));
5654 my $encrypted1 = $m->RC4 ($data1_buf);
5655 my $encrypted2 = $m->RC4 ($data2_buf);
5657 $tmp_hash = sprintf ("\$oldoffice\$%d*%s*%s*%s", $version, unpack ("H*", $salt_buf), unpack ("H*", $encrypted1), unpack ("H*", $encrypted2));
5659 elsif ($mode == 9800)
5661 $salt_buf = pack ("H*", $salt_buf);
5663 my $tmp = sha1
($salt_buf. encode
("UTF-16LE", $word_buf));
5667 if (defined $additional_param2)
5669 $version = $additional_param2;
5673 $version = (unpack ("L", $tmp) & 1) ?
3 : 4;
5676 my $rc4_key = sha1
($tmp . "\x00\x00\x00\x00");
5680 $rc4_key = substr ($rc4_key, 0, 5) . "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00";
5683 my $m = Crypt
::RC4
->new (substr ($rc4_key, 0, 16));
5687 if (defined $additional_param)
5689 $encdata = $m->RC4 (pack ("H*", $additional_param));
5693 $encdata = "A" x
16; ## can be anything
5696 my $data1_buf = $encdata;
5697 my $data2_buf = sha1
(substr ($data1_buf, 0, 16));
5699 $m = Crypt
::RC4
->new (substr ($rc4_key, 0, 16));
5701 my $encrypted1 = $m->RC4 ($data1_buf);
5702 my $encrypted2 = $m->RC4 ($data2_buf);
5704 $tmp_hash = sprintf ("\$oldoffice\$%d*%s*%s*%s", $version, unpack ("H*", $salt_buf), unpack ("H*", $encrypted1), unpack ("H*", $encrypted2));
5706 elsif ($mode == 9900)
5708 $tmp_hash = sprintf ("%s", md5_hex
($word_buf . "\0" x
(100 - length ($word_buf))));
5710 elsif ($mode == 10000)
5712 my $iterations = 10000;
5716 $iterations = int ($iter);
5719 my $pbkdf2 = Crypt
::PBKDF2
->new
5721 hasher
=> Crypt
::PBKDF2
->hasher_from_algorithm ('HMACSHA2', 256),
5722 iterations
=> $iterations
5725 $hash_buf = encode_base64
($pbkdf2->PBKDF2 ($salt_buf, $word_buf));
5726 $hash_buf =~ s/[\r\n]//g;
5728 $tmp_hash = sprintf ("pbkdf2_sha256\$%i\$%s\$%s", $iterations, $salt_buf, $hash_buf);
5730 elsif ($mode == 10100)
5732 my $seed = pack ("H*", $salt_buf);
5734 my ($hi, $lo) = siphash
($word_buf, $seed);
5736 my $hi_s = sprintf ("%08x", $hi);
5737 my $lo_s = sprintf ("%08x", $lo);
5739 $hi_s =~ s/^(..)(..)(..)(..)$/$4$3$2$1/;
5740 $lo_s =~ s/^(..)(..)(..)(..)$/$4$3$2$1/;
5742 $tmp_hash = sprintf ("%s%s:2:4:%s", $hi_s, $lo_s, $salt_buf);
5744 elsif ($mode == 10200)
5746 my $challengeb64 = encode_base64
($salt_buf);
5747 $challengeb64 =~ s/[\r\n]//g;
5751 if (defined $additional_param)
5753 $username = $additional_param;
5760 $hash_buf = hmac_hex
($salt_buf, $word_buf, \
&md5
);
5762 my $responseb64 = encode_base64
($username . " " . $hash_buf);
5763 $responseb64 =~ s/[\r\n]//g;
5765 $tmp_hash = sprintf ('$cram_md5$%s$%s', $challengeb64, $responseb64);
5767 elsif ($mode == 10300)
5769 my $iterations = 1024;
5773 $iterations = int ($iter);
5776 my $hash_buf = $salt_buf;
5778 for (my $pos = 0; $pos < $iterations; $pos++)
5780 $hash_buf = sha1
($word_buf . $hash_buf);
5783 $hash_buf = encode_base64
($hash_buf . $salt_buf);
5784 $hash_buf =~ s/[\r\n]//g;
5786 $tmp_hash = sprintf ("{x-issha, %i}%s", $iterations, $hash_buf);
5788 elsif ($mode == 10400)
5791 my $u = $additional_param;
5792 my $o = $additional_param2;
5793 my $P = $additional_param3;
5795 if (defined $u == 0)
5800 if (defined $o == 0)
5805 if (defined $P == 0)
5812 for (my $i = 0; $i < 32; $i++)
5814 $padding .= pack ("C", $pdf_padding[$i]);
5817 my $res = pdf_compute_encryption_key
($word_buf, $padding, $id, $u, $o, $P, 1, 2, 0);
5819 my $m = Crypt
::RC4
->new (substr ($res, 0, 5));
5821 $u = $m->RC4 ($padding);
5823 $tmp_hash = sprintf ('$pdf$%d*%d*40*%d*%d*16*%s*32*%s*32*%s', 1, 2, $P, 0, $id, unpack ("H*", $u), $o);
5825 elsif ($mode == 10500)
5828 my $u = $additional_param;
5829 my $o = $additional_param2;
5830 my $P = $additional_param3;
5831 my $V = $additional_param4;
5832 my $R = $additional_param5;
5833 my $enc = $additional_param6;
5835 if (defined $u == 0)
5842 if (defined $o == 0)
5847 if (defined $R == 0)
5849 $R = get_random_num
(3, 5);
5852 if (defined $V == 0)
5854 $V = ($R == 3) ?
2 : 4;
5857 if (defined $P == 0)
5859 $P = ($R == 3) ?
-4 : -1028;
5862 if (defined $enc == 0)
5864 $enc = ($R == 3) ?
1 : get_random_num
(0, 2);
5869 for (my $i = 0; $i < 32; $i++)
5871 $padding .= pack ("C", $pdf_padding[$i]);
5874 my $res = pdf_compute_encryption_key
($word_buf, $padding, $id, $u, $o, $P, $V, $R, $enc);
5876 my $digest = md5
($padding . pack ("H*", $id));
5878 my $m = Crypt
::RC4
->new ($res);
5880 $u = $m->RC4 ($digest);
5882 my @ress = split "", $res;
5884 for (my $x = 1; $x <= 19; $x++)
5888 for (my $i = 0; $i < 16; $i++)
5890 $xor[$i] = chr (ord ($ress[$i]) ^ $x);
5893 my $s = join ("", @xor);
5895 my $m2 = Crypt
::RC4
->new ($s);
5900 $u .= substr (pack ("H*", $u_save), 16, 16);
5902 $tmp_hash = sprintf ('$pdf$%d*%d*128*%d*%d*16*%s*32*%s*32*%s', $V, $R, $P, $enc, $id, unpack ("H*", $u), $o);
5904 elsif ($mode == 10600)
5907 my $rest = $additional_param;
5909 if (defined $id == 0)
5914 if (defined $rest == 0)
5920 $rest .= "*127*00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000*32*0000000000000000000000000000000000000000000000000000000000000000*32*0000000000000000000000000000000000000000000000000000000000000000";
5923 my @data = split /\*/, $rest;
5925 my $u = pack ("H*", $data[1]);
5927 my $h = sha256
($word_buf . substr ($u, 32, 8));
5929 $data[1] = unpack ("H*", $h . substr ($u, 32));
5931 $rest = join ("*", @data);
5933 $tmp_hash = sprintf ('$pdf$5*5*256*-1028*1*16*%s*%s', $id, $rest);
5935 elsif ($mode == 10700)
5938 my $rest = $additional_param;
5940 if (defined $id == 0)
5945 if (defined $rest == 0)
5951 $rest .= "*127*00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000*32*0000000000000000000000000000000000000000000000000000000000000000*32*0000000000000000000000000000000000000000000000000000000000000000";
5954 my @datax = split /\*/, $rest;
5956 my $u = pack ("H*", $datax[1]);
5958 my $block = sha256
($word_buf . substr ($u, 32, 8));
5960 my $block_size = 32;
5962 my $data = 0x00 x
64;
5968 for (my $i = 0; $i < 64 || $i < $data63 + 32; $i++)
5970 $data = $word_buf . $block;
5972 $data_len = length ($data);
5974 for (my $k = 1; $k < 64; $k++)
5976 $data .= $word_buf . $block;
5979 my $aes = Crypt
::CBC
->new ({
5980 key
=> substr ($block, 0, 16),
5981 cipher
=> "Crypt::Rijndael",
5982 iv
=> substr ($block, 16, 16),
5989 my $data = $aes->encrypt ($data);
5993 for (my $j = 0; $j < 16; $j++)
5995 $sum += ord (substr ($data, $j, 1));
5998 $block_size = 32 + ($sum % 3) * 16;
6000 if ($block_size == 32)
6002 $block = sha256
(substr ($data, 0, $data_len * 64));
6004 elsif ($block_size == 48)
6006 $block = sha384
(substr ($data, 0, $data_len * 64));
6008 elsif ($block_size == 64)
6010 $block = sha512
(substr ($data, 0, $data_len * 64));
6013 $data63 = ord (substr ($data, $data_len * 64 - 1, 1));
6016 $datax[1] = unpack ("H*", substr ($block, 0, 32) . substr ($u, 32));
6018 $rest = join ("*", @datax);
6020 $tmp_hash = sprintf ('$pdf$5*6*256*-1028*1*16*%s*%s', $id, $rest);
6022 elsif ($mode == 10800)
6024 $hash_buf = sha384_hex
($word_buf);
6026 $tmp_hash = sprintf ("%s", $hash_buf);
6028 elsif ($mode == 10900)
6030 my $iterations = 1000;
6034 $iterations = int ($iter);
6039 if (defined $additional_param)
6041 $out_len = $additional_param;
6044 my $pbkdf2 = Crypt
::PBKDF2
->new
6046 hasher
=> Crypt
::PBKDF2
->hasher_from_algorithm ('HMACSHA2', 256),
6047 iterations
=> $iterations,
6048 output_len
=> $out_len
6051 $hash_buf = encode_base64
($pbkdf2->PBKDF2 ($salt_buf, $word_buf));
6052 $hash_buf =~ s/[\r\n]//g;
6054 my $base64_salt_buf = encode_base64
($salt_buf);
6056 chomp ($base64_salt_buf);
6058 $tmp_hash = sprintf ("sha256:%i:%s:%s", $iterations, $base64_salt_buf, $hash_buf);
6060 elsif ($mode == 11000)
6062 $hash_buf = md5_hex
($salt_buf . $word_buf);
6064 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
6066 elsif ($mode == 11100)
6068 my $user = "postgres";
6070 if (defined $additional_param)
6072 $user = $additional_param;
6075 $hash_buf = md5_hex
(md5_hex
($word_buf . $user) . pack ("H*", $salt_buf));
6077 $tmp_hash = sprintf ("\$postgres\$%s*%s*%s", $user, $salt_buf, $hash_buf);
6079 elsif ($mode == 11200)
6081 my $sha1_pass = sha1
($word_buf);
6082 my $double_sha1 = sha1
($sha1_pass);
6084 my $xor_part1 = $sha1_pass;
6085 my $xor_part2 = sha1
(pack ("H*", $salt_buf) . $double_sha1);
6089 for (my $i = 0; $i < 20; $i++)
6091 my $first_byte = substr ($xor_part1, $i, 1);
6092 my $second_byte = substr ($xor_part2, $i, 1);
6094 my $xor_result = $first_byte ^ $second_byte;
6096 $hash_buf .= unpack ("H*", $xor_result);
6099 $tmp_hash = sprintf ("\$mysqlna\$%s*%s", $salt_buf, $hash_buf);
6101 elsif ($mode == 11300)
6103 my $ckey_buf = get_random_string
(96);
6105 if (length ($additional_param))
6107 $ckey_buf = $additional_param;
6110 my $public_key_buf = get_random_string
(66);
6112 if (length ($additional_param2))
6114 $public_key_buf = $additional_param2;
6117 my $salt_iter = get_random_num
(150000, 250000);
6121 $salt_iter = int ($iter);
6124 my $hash_buf = sha512
($word_buf . pack ("H*", $salt_buf));
6126 for (my $i = 1; $i < $salt_iter; $i++)
6128 $hash_buf = sha512
($hash_buf);
6131 my $data = get_random_string
(32);
6133 my $aes = Crypt
::CBC
->new ({
6134 key
=> substr ($hash_buf, 0, 32),
6135 cipher
=> "Crypt::Rijndael",
6136 iv
=> substr ($hash_buf, 32, 16),
6140 padding
=> "standard",
6143 my $cry_master_buf = (unpack ("H*", $aes->encrypt ($data)));
6145 $tmp_hash = sprintf ('$bitcoin$%d$%s$%d$%s$%d$%d$%s$%d$%s',
6146 length ($cry_master_buf),
6153 length ($public_key_buf),
6156 elsif ($mode == 11400)
6158 my ($directive, $URI_server, $URI_client, $user, $realm, $nonce, $nonce_count, $nonce_client, $qop, $method, $URI, $URI_prefix, $URI_resource, $URI_suffix);
6160 $directive = "MD5"; # only directive currently supported
6162 if (defined ($additional_param))
6164 $user = $additional_param;
6165 $realm = $additional_param2;
6167 $nonce_count = $additional_param3;
6168 $nonce_client = $additional_param4;
6169 $qop = $additional_param5;
6170 $method = $additional_param6;
6172 $URI_prefix = $additional_param7;
6173 $URI_resource = $additional_param8;
6174 $URI_suffix = $additional_param9;
6176 # not needed information
6178 $URI_server = $additional_param10;
6179 $URI_client = $additional_param11;
6183 $user = get_random_string
(get_random_num
(0, 12 + 1));
6185 # special limit: (user_len + 1 + realm_len + 1 + word_buf_len) < 56
6186 my $realm_max_len = 55 - length ($user) - 1 - length ($word_buf) - 1;
6188 if ($realm_max_len < 1) # should never happen
6193 $realm_max_len = min
(20, $realm_max_len);
6195 $realm = get_random_string
(get_random_num
(0, $realm_max_len + 1));
6199 if (get_random_num
(0, 1 + 1) == 1)
6203 $nonce_count = get_random_string
(get_random_num
(0, 10 + 1));
6204 $nonce_client = get_random_string
(get_random_num
(0, 12 + 1));
6214 $method = get_random_string
(get_random_num
(0, 24 + 1));
6216 $URI_prefix = get_random_string
(get_random_num
(0, 10 + 1));
6217 $URI_resource = get_random_string
(get_random_num
(1, 32 + 1));
6218 $URI_suffix = get_random_string
(get_random_num
(0, 32 + 1));
6220 # not needed information
6222 $URI_server = get_random_string
(get_random_num
(0, 32 + 1));
6223 $URI_client = $URI_resource; # simplification
6230 if (length ($URI_prefix) > 0)
6232 $URI = $URI_prefix . ":";
6235 $URI .= $URI_resource;
6237 if (length ($URI_suffix) > 0)
6239 $URI .= ":" . $URI_suffix;
6242 my $HA2 = md5_hex
($method . ":" . $URI);
6244 my $HA1 = md5_hex
($user . ":" . $realm . ":" . $word_buf);
6248 if (($qop eq "auth") || ($qop eq "auth-int"))
6250 $tmp_buf = $nonce . ":" . $nonce_count . ":" . $nonce_client . ":" . $qop;
6257 my $hash_buf = md5_hex
($HA1 . ":" . $tmp_buf . ":" . $HA2);
6259 $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);
6261 elsif ($mode == 11500)
6263 $hash_buf = crc32
($word_buf);
6265 $tmp_hash = sprintf ("%08x:00000000", $hash_buf);
6267 elsif ($mode == 11600)
6269 my ($p, $num_cycle_power, $seven_zip_salt_len, $seven_zip_salt_buf, $salt_len, $data_len, $unpack_size, $data_buf);
6273 my $validation_only = 0;
6275 $validation_only = 1 if (defined ($additional_param));
6277 if ($validation_only == 1)
6279 $num_cycle_power = int ($iter);
6280 $seven_zip_salt_len = $additional_param;
6281 $seven_zip_salt_buf = $additional_param2;
6282 $salt_len = $additional_param3;
6283 # $salt_buf set in parser
6284 # $hash_buf (resulting crc)
6285 $data_len = $additional_param4;
6286 $unpack_size = $additional_param5;
6287 $data_buf = $additional_param6;
6291 $num_cycle_power = 14; # by default it is 19
6292 $seven_zip_salt_len = 0;
6293 $seven_zip_salt_buf = "";
6294 $salt_len = length ($salt_buf);
6295 # $salt_buf set automatically
6296 # $hash_buf (resulting crc)
6297 # $data_len will be set when encrypting
6298 $unpack_size = get_random_num
(1, 32 + 1);
6299 $data_buf = get_random_string
($unpack_size);
6303 # 2 ^ NumCyclesPower "iterations" of SHA256 (only one final SHA256)
6306 $word_buf = encode
("UTF-16LE", $word_buf);
6308 my $rounds = 1 << $num_cycle_power;
6312 for (my $i = 0; $i < $rounds; $i++)
6316 $num_buf .= pack ("V", $i);
6317 $num_buf .= "\x00" x
4;
6319 # this would be better but only works on 64-bit systems:
6320 # $num_buf = pack ("q", $i);
6322 $pass_buf .= sprintf ("%s%s", $word_buf, $num_buf);
6325 my $key = sha256
($pass_buf);
6327 # the salt_buf is our IV for AES CBC
6330 my $salt_buf_len = length ($salt_buf);
6331 my $salt_padding_len = 0;
6333 if ($salt_buf_len < 16)
6335 $salt_padding_len = 16 - $salt_buf_len;
6338 $salt_buf .= "\x00" x
$salt_padding_len;
6340 my $aes = Crypt
::CBC
->new ({
6341 cipher
=> "Crypt::Rijndael",
6349 if ($validation_only == 1)
6353 my $decrypted_data = $aes->decrypt ($data_buf);
6355 $decrypted_data = substr ($decrypted_data, 0, $unpack_size);
6357 $hash_buf = crc32
($decrypted_data);
6363 $hash_buf = crc32
($data_buf);
6365 $data_buf = $aes->encrypt ($data_buf);
6367 $data_len = length ($data_buf);
6370 $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));
6372 elsif ($mode == 11900)
6374 my $iterations = 1000;
6378 $iterations = int ($iter);
6383 if (defined $additional_param)
6385 $out_len = $additional_param;
6389 # call PHP here - WTF
6392 # sanitize $word_buf and $salt_buf:
6394 my $word_buf_base64 = encode_base64
($word_buf);
6395 $word_buf_base64 =~ s/[\r\n]//g;
6397 my $salt_buf_base64 = encode_base64
($salt_buf);
6398 $salt_buf_base64 =~ s/[\r\n]//g;
6402 $out_len = int ($out_len);
6404 # output is in hex encoding, otherwise it could be screwed (but shouldn't)
6406 my $php_code = <<'END_CODE';
6408 function pbkdf2 ($algorithm, $password, $salt, $count, $key_length, $raw_output = false)
6410 $algorithm = strtolower ($algorithm);
6412 if (! in_array ($algorithm, hash_algos (), true))
6414 trigger_error ("PBKDF2 ERROR: Invalid hash algorithm.", E_USER_ERROR);
6417 if ($count <= 0 || $key_length <= 0)
6419 trigger_error ("PBKDF2 ERROR: Invalid parameters.", E_USER_ERROR);
6422 if (function_exists ("hash_pbkdf2"))
6426 $key_length = $key_length * 2;
6429 return hash_pbkdf2 ($algorithm, $password, $salt, $count, $key_length, $raw_output);
6432 $hash_length = strlen (hash ($algorithm, "", true));
6433 $block_count = ceil ($key_length / $hash_length);
6437 for ($i = 1; $i <= $block_count; $i++)
6439 $last = $salt . pack ("N", $i);
6441 $last = $xorsum = hash_hmac ($algorithm, $last, $password, true);
6443 for ($j = 1; $j < $count; $j++)
6445 $xorsum ^= ($last = hash_hmac ($algorithm, $last, $password, true));
6453 return substr ($output, 0, $key_length);
6457 return bin2hex (substr ($output, 0, $key_length));
6461 print pbkdf2 ("md5", base64_decode ("$word_buf_base64"), base64_decode ("$salt_buf_base64"), $iterations, $out_len, False);
6465 # replace with these command line arguments
6467 $php_code =~ s/\$word_buf_base64/$word_buf_base64/;
6468 $php_code =~ s/\$salt_buf_base64/$salt_buf_base64/;
6469 $php_code =~ s/\$iterations/$iterations/;
6470 $php_code =~ s/\$out_len/$out_len/;
6472 my $php_output = `php -r '$php_code'`;
6474 $hash_buf = pack ("H*", $php_output);
6476 $hash_buf = encode_base64 ($hash_buf);
6477 $hash_buf =~ s/[\r\n]//g;
6479 my $base64_salt_buf = encode_base64 ($salt_buf);
6481 chomp ($base64_salt_buf);
6483 $tmp_hash = sprintf ("md5:%i:%s:%s", $iterations, $base64_salt_buf, $hash_buf);
6485 elsif ($mode == 12000)
6487 my $iterations = 1000;
6491 $iterations = int ($iter);
6496 if (defined $additional_param)
6498 $out_len = $additional_param;
6501 my $pbkdf2 = Crypt::PBKDF2->new
6503 hasher => Crypt::PBKDF2->hasher_from_algorithm ('HMACSHA1'),
6504 iterations => $iterations,
6505 output_len => $out_len
6508 $hash_buf = encode_base64 ($pbkdf2->PBKDF2 ($salt_buf, $word_buf));
6509 $hash_buf =~ s/[\r\n]//g;
6511 my $base64_salt_buf = encode_base64 ($salt_buf);
6513 chomp ($base64_salt_buf);
6515 $tmp_hash = sprintf ("sha1:%i:%s:%s", $iterations, $base64_salt_buf, $hash_buf);
6517 elsif ($mode == 12100)
6519 my $iterations = 1000;
6523 $iterations = int ($iter);
6528 if (defined $additional_param)
6530 $out_len = $additional_param;
6533 my $pbkdf2 = Crypt::PBKDF2->new
6535 hasher => Crypt::PBKDF2->hasher_from_algorithm ('HMACSHA2', 512),
6536 iterations => $iterations,
6537 output_len => $out_len
6540 $hash_buf = encode_base64 ($pbkdf2->PBKDF2 ($salt_buf, $word_buf));
6541 $hash_buf =~ s/[\r\n]//g;
6543 my $base64_salt_buf = encode_base64 ($salt_buf);
6545 chomp ($base64_salt_buf);
6547 $tmp_hash = sprintf ("sha512:%i:%s:%s", $iterations, $base64_salt_buf, $hash_buf);
6549 elsif ($mode == 12200)
6551 my $iterations = 65536;
6553 my $default_salt = 0;
6555 if (defined $additional_param)
6557 $default_salt = int ($additional_param);
6560 if ($default_salt == 1)
6562 $salt_buf = "0011223344556677";
6565 $hash_buf = sha512 (pack ("H*", $salt_buf) . $word_buf);
6567 for (my $i = 0; $i < $iterations; $i++)
6569 $hash_buf = sha512 ($hash_buf);
6572 $hash_buf = unpack ("H*", $hash_buf);
6573 $hash_buf = substr ($hash_buf, 0, 16);
6575 if ($default_salt == 0)
6577 $tmp_hash = sprintf ("\$ecryptfs\$0\$1\$%s\$%s", $salt_buf, $hash_buf);
6581 $tmp_hash = sprintf ("\$ecryptfs\$0\$%s", $hash_buf);
6584 elsif ($mode == 12300)
6586 my $iterations = 4096;
6588 my $hasher = Crypt::PBKDF2->hasher_from_algorithm ('HMACSHA2', 512);
6590 my $pbkdf2 = Crypt::PBKDF2->new (
6592 iterations => $iterations,
6596 my $salt_bin = pack ("H*", $salt_buf);
6598 my $key = $pbkdf2->PBKDF2 ($salt_bin. "AUTH_PBKDF2_SPEEDY_KEY", $word_buf);
6600 $hash_buf = sha512_hex ($key . $salt_bin);
6602 $tmp_hash = sprintf ("%s%s", uc ($hash_buf), uc ($salt_buf));
6604 elsif ($mode == 12400)
6610 $iterations = int ($iter);
6614 $iterations = get_random_num (1, 5001 + 1);
6617 my $key_value = fold_password ($word_buf);
6619 my $data = "\x00\x00\x00\x00\x00\x00\x00\x00";
6620 my $salt_value = base64_to_int24 ($salt_buf);
6622 $hash_buf = crypt_rounds ($key_value, $iterations, $salt_value, $data);
6624 $tmp_hash = sprintf ("_%s%s%s", int24_to_base64 ($iterations), $salt_buf, block_to_base64 ($hash_buf));
6626 elsif ($mode == 12600)
6628 $hash_buf = sha1_hex ($word_buf);
6630 $hash_buf = sha256_hex ($salt_buf . uc $hash_buf);
6632 $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf);
6634 elsif ($mode == 12700)
6636 my $iterations = 10;
6639 "guid" : "00000000-0000-0000-0000-000000000000",
6640 "sharedKey" : "00000000-0000-0000-0000-000000000000",
6641 "options" : {"pbkdf2_iterations":10,"fee_policy":0,"html5_notifications":false,"logout_time":600000,"tx_display":0,"always_keep_local_backup":false}|;
6643 my $salt_buf_bin = pack ("H*", $salt_buf);
6645 my $hasher = Crypt::PBKDF2->hasher_from_algorithm ('HMACSHA1');
6647 my $pbkdf2 = Crypt::PBKDF2->new (
6649 iterations => $iterations,
6653 my $key = $pbkdf2->PBKDF2 ($salt_buf_bin, $word_buf);
6655 my $cipher = Crypt::CBC->new ({
6657 cipher => "Crypt::Rijndael",
6658 iv => $salt_buf_bin,
6664 my $encrypted = unpack ("H*", $cipher->encrypt ($data));
6666 $tmp_hash = sprintf ("\$blockchain\$%s\$%s", length ($salt_buf . $encrypted) / 2, $salt_buf . $encrypted);
6668 elsif ($mode == 12800)
6670 my $iterations = 100;
6674 $iterations = int ($iter);
6677 my $nt = md4_hex (encode ("UTF-16LE", $word_buf));
6679 my $pbkdf2 = Crypt::PBKDF2->new
6681 hasher => Crypt::PBKDF2->hasher_from_algorithm ('HMACSHA2', 256),
6682 iterations => $iterations,
6686 my $salt_buf_bin = pack ("H*", $salt_buf);
6688 my $hash = $pbkdf2->PBKDF2 ($salt_buf_bin, uc (encode ("UTF-16LE", $nt)));
6690 $tmp_hash = sprintf ("v1;PPH1_MD4,%s,%d,%s", $salt_buf, $iterations, unpack ("H*", $hash));
6692 elsif ($mode == 12900)
6694 my $iterations = 4096;
6698 $iterations = int ($iter);
6701 my $salt2 = $salt_buf . $salt_buf;
6703 if (defined $additional_param)
6705 $salt2 = $additional_param;
6708 my $pbkdf2 = Crypt::PBKDF2->new
6710 hasher => Crypt::PBKDF2->hasher_from_algorithm ('HMACSHA2', 256),
6711 iterations => $iterations,
6715 my $salt_buf_bin = pack ("H*", $salt_buf);
6717 my $hash = $pbkdf2->PBKDF2 ($salt_buf_bin, $word_buf);
6719 my $salt2_bin = pack ("H*", $salt2);
6721 my $hash_hmac = hmac_hex ($salt2_bin, $hash, \&sha256, 64);
6723 $tmp_hash = sprintf ("%s%s%s", $salt2, $hash_hmac, $salt_buf);
6725 elsif ($mode == 13000)
6727 my $iterations = 15;
6731 $iterations = int ($iter);
6736 if (defined $additional_param)
6738 $iv = $additional_param;
6741 my $pbkdf2 = Crypt::PBKDF2->new
6743 hasher => Crypt::PBKDF2->hasher_from_algorithm ('HMACSHA2', 256),
6744 iterations => (1 << $iterations) + 32,
6748 my $salt_buf_bin = pack ("H*", $salt_buf);
6750 my $hash = $pbkdf2->PBKDF2 ($salt_buf_bin, $word_buf);
6752 my $hash_final = substr ($hash, 0, 8)
6753 ^ substr ($hash, 8, 8)
6754 ^ substr ($hash, 16, 8)
6755 ^ substr ($hash, 24, 8);
6757 $tmp_hash = sprintf ('$rar5$16$%s$%d$%s$8$%s', $salt_buf, $iterations, $iv, unpack ("H*", $hash_final));
6759 elsif ($mode == 13100)
6761 my @salt_arr = split ('\$', $salt_buf);
6763 my $user = $salt_arr[0];
6765 my $realm = $salt_arr[1];
6767 my $spn = $salt_arr[2];
6769 my $nonce = $salt_arr[3];
6771 my $cleartext_ticket = '6381b03081ada00703050050a00000a11b3019a003020117a1'.
6772 '12041058e0d77776e8b8e03991f2966939222aa2171b154d594b5242544553542e434f4e5'.
6773 '44f534f2e434f4da3133011a003020102a10a30081b067472616e6365a40b3009a0030201'.
6774 '01a1020400a511180f32303136303231353134343735305aa611180f32303136303231353'.
6775 '134343735305aa711180f32303136303231363030343735305aa811180f32303136303232'.
6778 $cleartext_ticket = $nonce . $cleartext_ticket;
6780 my $k = md4 (encode ("UTF-16LE", $word_buf));
6782 my $k1 = hmac_md5 ("\x02\x00\x00\x00", $k);
6784 my $checksum = hmac_md5 (pack ("H*", $cleartext_ticket), $k1);
6786 my $k3 = hmac_md5 ($checksum, $k1);
6788 my $cipher = Crypt::RC4->new ($k3);
6790 my $edata2 = $cipher->RC4 (pack ("H*", $cleartext_ticket));
6792 $tmp_hash = sprintf ('$krb5tgs$23$*%s$%s$%s*$%s$%s', $user, $realm, $spn, unpack ("H*", $checksum), unpack ("H*", $edata2));
6794 elsif ($mode == 13200)
6796 my @salt_arr = split ('\*', $salt_buf);
6798 my $iteration = $salt_arr[0];
6800 my $mysalt = $salt_arr[1];
6802 $mysalt = pack ("H*", $mysalt);
6804 my $DEK = randbytes (16);
6806 my $iv = "a6a6a6a6a6a6a6a6";
6808 my $KEK = sha1($word_buf);
6810 $KEK = substr ($KEK ^ $mysalt, 0, 16);
6812 my $aes = Crypt::Mode::ECB->new ('AES');
6814 my @R = ('', substr(pack ("H*",$DEK),0,8), substr(pack ("H*",$DEK),8,16));
6818 my $A = pack ("H*", $iv);
6820 for (my $j = 0; $j < $iteration; $j++)
6822 $B = $aes->encrypt ($A . $R[1], $KEK);
6824 $A = substr ($B, 0, 8) ^ pack ("q", (2 * $j + 1));
6826 $R[1] = substr ($B, 8, 16);
6828 $B = $aes->encrypt ($A . $R[2], $KEK);
6830 $A = substr ($B, 0, 8) ^ pack ("q", (2 * $j + 2));
6832 $R[2] = substr ($B, 8, 16);
6835 my $wrapped_key = unpack ("H*", $A . substr ($R[1], 0 ,8) . substr ($R[2], 0 ,8));
6837 $mysalt = unpack ("H*", $mysalt);
6839 $tmp_hash = sprintf ('$axcrypt$*1*%s*%s*%s', $iteration, $mysalt, $wrapped_key);
6841 elsif ($mode == 13300)
6843 $hash_buf = sha1_hex ($word_buf);
6845 $tmp_hash = sprintf ('$axcrypt_sha1$%s', substr ($hash_buf, 0, 32));
6855 my $word_len = shift;
6857 my $salt_len = shift;
6861 $max = 15 if ($mode == 2410);
6863 if ($is_unicode{$mode})
6865 if (! $allow_long_salt{$mode})
6867 $word_len = min ($word_len, int ($max / 2) - $salt_len);
6871 $word_len = min ($word_len, int ($max / 2));
6874 elsif ($less_fifteen{$mode})
6876 $word_len = min ($word_len, 15);
6880 $salt_len = min ($salt_len, 15 - $word_len);
6885 if (! $allow_long_salt{$mode})
6887 $word_len = min ($word_len, $max - $salt_len);
6906 for (my $i = 0; $i < $salt_len; $i++)
6908 my $c = get_random_chr (0x30, 0x39);
6910 push (@salt_arr, $c);
6913 $salt_buf = join ("", @salt_arr);
6915 $salt_buf = get_random_md5chap_salt ($salt_buf);
6917 elsif ($mode == 5300 || $mode == 5400)
6919 $salt_buf = get_random_ike_salt ();
6921 elsif ($mode == 5500)
6923 $salt_buf = get_random_netntlmv1_salt ($salt_len, $salt_len);
6925 elsif ($mode == 5600)
6927 $salt_buf = get_random_netntlmv2_salt ($salt_len, $salt_len);
6929 elsif ($mode == 6600)
6931 $salt_buf = get_random_agilekeychain_salt ();
6933 elsif ($mode == 8200)
6935 $salt_buf = get_random_cloudkeychain_salt ();
6937 elsif ($mode == 8300)
6939 $salt_buf = get_random_dnssec_salt ();
6941 elsif ($mode == 13100)
6943 $salt_buf = get_random_kerberos5_tgs_salt ();
6945 elsif ($mode == 13200)
6947 $salt_buf = get_random_axcrypt_salt ();
6953 for (my $i = 0; $i < $salt_len; $i++)
6955 my $c = get_random_chr (0x30, 0x39);
6957 push (@salt_arr, $c);
6960 $salt_buf = join ("", @salt_arr);
6964 $salt_buf = get_random_kerberos5_salt ($salt_buf);
6974 for (my $i = 0; $i < $word_len; $i++)
6976 my $c = get_random_chr (0x30, 0x39);
6978 push (@word_arr, $c);
6981 my $word_buf = join ("", @word_arr);
6987 my $tmp_hash = gen_hash ($mode, $word_buf, $salt_buf);
7000 print sprintf ("echo -n %-20s | %s \${OPTS} %s %4d '%s'\n", $word_buf, @cmd);
7012 sub get_random_string
7018 for (my $i = 0; $i < $len; $i++)
7020 my $c = get_random_chr (0x30, 0x39);
7025 my $buf = join ("", @arr);
7035 return int ((rand ($max - $min)) + $min);
7040 return chr get_random_num (@_);
7049 for (my $i = 0; $i < length ($str); $i += 4)
7051 my $num = domino_base64_decode (substr ($str, $i, 4), 4);
7053 $decoded .= chr (($num >> 16) & 0xff) . chr (($num >> 8) & 0xff) . chr ($num & 0xff);
7060 $salt = substr ($decoded, 0, 5);
7062 my $byte10 = (ord (substr ($salt, 3, 1)) - 4);
7066 $byte10 = 256 + $byte10;
7069 substr ($salt, 3, 1) = chr ($byte10);
7071 $digest = substr ($decoded, 5, 9);
7072 $char = substr ($str, 18, 1);
7074 return ($digest, $salt, $char);
7077 sub domino_85x_decode
7083 for (my $i = 0; $i < length ($str); $i += 4)
7085 my $num = domino_base64_decode (substr ($str, $i, 4), 4);
7087 $decoded .= chr (($num >> 16) & 0xff) . chr (($num >> 8) & 0xff) . chr ($num & 0xff);
7092 my $iterations = -1;
7095 $salt = substr ($decoded, 0, 16); # longer than -m 8700 (5 vs 16 <- new)
7097 my $byte10 = (ord (substr ($salt, 3, 1)) - 4);
7101 $byte10 = 256 + $byte10;
7104 substr ($salt, 3, 1) = chr ($byte10);
7106 $iterations = substr ($decoded, 16, 10);
7108 if ($iterations =~ /^?d*$/)
7112 $iterations = $iterations + 0; # hack: make sure it is an int now (atoi ())
7113 $chars = substr ($decoded, 26, 2); # in my example it is "02"
7114 $digest = substr ($decoded, 28, 8); # only of length of 8 vs 20 SHA1 bytes
7117 return ($digest, $salt, $iterations, $chars);
7120 sub domino_base64_decode
7125 my $itoa64 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/";
7133 my $idx = (index ($itoa64, substr ($v, $n - $i, 1))) & 0x3f;
7135 $ret += ($idx << (6 * ($i - 1)));
7148 my $byte10 = (ord (substr ($final, 3, 1)) + 4);
7152 $byte10 = $byte10 - 256;
7155 substr ($final, 3, 1) = chr ($byte10);
7159 $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);
7160 $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);
7161 $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);
7162 $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);
7163 $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);
7165 if (defined ($char))
7167 substr ($passwd, 18, 1) = $char;
7169 substr ($passwd, 19, 1) = "";
7174 sub domino_85x_encode
7179 my $byte10 = (ord (substr ($final, 3, 1)) + 4);
7183 $byte10 = $byte10 - 256;
7186 substr ($final, 3, 1) = chr ($byte10);
7190 $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);
7191 $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);
7192 $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);
7193 $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);
7194 $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);
7195 $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);
7196 $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);
7197 $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);
7198 $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);
7199 $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);
7200 $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);
7201 $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);
7203 if (defined ($char))
7205 substr ($passwd, 18, 1) = $char;
7211 sub domino_base64_encode
7216 my $itoa64 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/";
7220 while (($n - 1) >= 0)
7224 $ret = substr ($itoa64, $v & 0x3f, 1) . $ret;
7234 my $itoa64 = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
7239 my $v = unpack "V", substr($md5, $i*4, 4);
7241 $s64 .= substr($itoa64, $v & 0x3f, 1);
7250 my ($username, $password) = @_;
7252 $username = substr ($username . " " x 8, 0, 8);
7253 $password = substr ($password . " " x 8, 0, 8);
7255 my $username_ebc = ascii2ebcdic ($username);
7256 my $password_ebc = ascii2ebcdic ($password);
7258 my @pw = split ("", $password_ebc);
7260 for (my $i = 0; $i < 8; $i++)
7262 $pw[$i] = unpack ("C", $pw[$i]);
7265 $pw[$i] = pack ("C", $pw[$i] & 0xff);
7268 my $key = join ("", @pw);
7270 my $cipher = new Crypt::DES $key;
7272 my $ciphertext = $cipher->encrypt ($username_ebc);
7274 my $ct = unpack ("H16", $ciphertext);
7281 my ($username, $password) = @_;
7283 my $userpass = pack('n*', unpack('C*', uc($username.$password)));
7284 $userpass .= pack('C', 0) while (length($userpass) % 8);
7286 my $key = pack('H*', "0123456789ABCDEF");
7287 my $iv = pack('H*', "0000000000000000");
7289 my $c = new Crypt::CBC(
7296 my $key2 = substr($c->encrypt($userpass), length($userpass)-8, 8);
7298 my $c2 = new Crypt::CBC(
7305 my $hash = substr($c2->encrypt($userpass), length($userpass)-8, 8);
7307 return uc(unpack('H*', $hash));
7312 my $word_buf = shift;
7314 my $salt_buf = shift;
7316 my $w = sprintf ("%d%s%s", 0, $word_buf, $salt_buf);
7318 my $digest = sha1 ($w);
7320 for (my $i = 1; $i < 1024; $i++)
7322 $w = $digest . sprintf ("%d%s%s", $i, $word_buf, $salt_buf);
7324 $digest = sha1 ($w);
7327 my ($A, $B, $C, $D, $E) = unpack ("N5", $digest);
7329 return sprintf ("%08x%08x%08x%08x%08x", $A, $B, $C, $D, $E);
7337 my $itoa64 = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
7341 while (($n - 1) >= 0)
7345 $ret .= substr ($itoa64, $v & 0x3f, 1);
7361 my $hash = ""; # hash to be returned by this function
7363 my $final = md5 ($pass . $salt . $pass);
7365 $salt = substr ($salt, 0, 8);
7367 my $tmp = $pass . $magic . $salt;
7369 my $pass_len = length ($pass);
7373 for ($i = $pass_len; $i > 0; $i -= 16)
7382 $tmp .= substr ($final, 0, $len);
7395 $tmp .= substr ($pass, 0, 1);
7401 $final = md5 ($tmp);
7403 for ($i = 0; $i < $iter; $i++)
7435 $final = md5 ($tmp);
7439 # now format the output sting ("hash")
7443 $hash = to64 ((ord (substr ($final, 0, 1)) << 16) | (ord (substr ($final, 6, 1)) << 8) | (ord (substr ($final, 12, 1))), 4);
7444 $hash .= to64 ((ord (substr ($final, 1, 1)) << 16) | (ord (substr ($final, 7, 1)) << 8) | (ord (substr ($final, 13, 1))), 4);
7445 $hash .= to64 ((ord (substr ($final, 2, 1)) << 16) | (ord (substr ($final, 8, 1)) << 8) | (ord (substr ($final, 14, 1))), 4);
7446 $hash .= to64 ((ord (substr ($final, 3, 1)) << 16) | (ord (substr ($final, 9, 1)) << 8) | (ord (substr ($final, 15, 1))), 4);
7447 $hash .= to64 ((ord (substr ($final, 4, 1)) << 16) | (ord (substr ($final, 10, 1)) << 8) | (ord (substr ($final, 5, 1))), 4);
7448 $hash .= to64 (ord (substr ($final, 11, 1)), 2);
7450 if ($iter == 1000) # default
7452 $hash_buf = sprintf ("%s%s\$%s", $magic , $salt , $hash);
7456 $hash_buf = sprintf ("%srounds=%i\$%s\$%s", $magic, $iter, $salt , $hash);
7468 my $hash = ""; # hash to be returned by this function
7470 my $final = sha512 ($pass . $salt . $pass);
7472 $salt = substr ($salt, 0, 16);
7474 my $tmp = $pass . $salt;
7476 my $pass_len = length ($pass);
7477 my $salt_len = length ($salt);
7481 for ($i = $pass_len; $i > 0; $i -= 16)
7490 $tmp .= substr ($final, 0, $len);
7509 $final = sha512 ($tmp);
7515 for ($i = 0; $i < $pass_len; $i++)
7520 $p_bytes = sha512 ($p_bytes);
7521 $p_bytes = substr ($p_bytes, 0, $pass_len);
7525 my $final_first_byte = ord (substr ($final, 0, 1));
7529 for ($i = 0; $i < (16 + $final_first_byte); $i++)
7534 $s_bytes = sha512 ($s_bytes);
7535 $s_bytes = substr ($s_bytes, 0, $salt_len);
7537 for ($i = 0; $i < $iter; $i++)
7569 $final = sha512 ($tmp);
7573 # now format the output string ("hash")
7577 $hash .= to64 ((ord (substr ($final, 0, 1)) << 16) | (ord (substr ($final, 21, 1)) << 8) | (ord (substr ($final, 42, 1))), 4);
7578 $hash .= to64 ((ord (substr ($final, 22, 1)) << 16) | (ord (substr ($final, 43, 1)) << 8) | (ord (substr ($final, 1, 1))), 4);
7579 $hash .= to64 ((ord (substr ($final, 44, 1)) << 16) | (ord (substr ($final, 2, 1)) << 8) | (ord (substr ($final, 23, 1))), 4);
7580 $hash .= to64 ((ord (substr ($final, 3, 1)) << 16) | (ord (substr ($final, 24, 1)) << 8) | (ord (substr ($final, 45, 1))), 4);
7581 $hash .= to64 ((ord (substr ($final, 25, 1)) << 16) | (ord (substr ($final, 46, 1)) << 8) | (ord (substr ($final, 4, 1))), 4);
7582 $hash .= to64 ((ord (substr ($final, 47, 1)) << 16) | (ord (substr ($final, 5, 1)) << 8) | (ord (substr ($final, 26, 1))), 4);
7583 $hash .= to64 ((ord (substr ($final, 6, 1)) << 16) | (ord (substr ($final, 27, 1)) << 8) | (ord (substr ($final, 48, 1))), 4);
7584 $hash .= to64 ((ord (substr ($final, 28, 1)) << 16) | (ord (substr ($final, 49, 1)) << 8) | (ord (substr ($final, 7, 1))), 4);
7585 $hash .= to64 ((ord (substr ($final, 50, 1)) << 16) | (ord (substr ($final, 8, 1)) << 8) | (ord (substr ($final, 29, 1))), 4);
7586 $hash .= to64 ((ord (substr ($final, 9, 1)) << 16) | (ord (substr ($final, 30, 1)) << 8) | (ord (substr ($final, 51, 1))), 4);
7587 $hash .= to64 ((ord (substr ($final, 31, 1)) << 16) | (ord (substr ($final, 52, 1)) << 8) | (ord (substr ($final, 10, 1))), 4);
7588 $hash .= to64 ((ord (substr ($final, 53, 1)) << 16) | (ord (substr ($final, 11, 1)) << 8) | (ord (substr ($final, 32, 1))), 4);
7589 $hash .= to64 ((ord (substr ($final, 12, 1)) << 16) | (ord (substr ($final, 33, 1)) << 8) | (ord (substr ($final, 54, 1))), 4);
7590 $hash .= to64 ((ord (substr ($final, 34, 1)) << 16) | (ord (substr ($final, 55, 1)) << 8) | (ord (substr ($final, 13, 1))), 4);
7591 $hash .= to64 ((ord (substr ($final, 56, 1)) << 16) | (ord (substr ($final, 14, 1)) << 8) | (ord (substr ($final, 35, 1))), 4);
7592 $hash .= to64 ((ord (substr ($final, 15, 1)) << 16) | (ord (substr ($final, 36, 1)) << 8) | (ord (substr ($final, 57, 1))), 4);
7593 $hash .= to64 ((ord (substr ($final, 37, 1)) << 16) | (ord (substr ($final, 58, 1)) << 8) | (ord (substr ($final, 16, 1))), 4);
7594 $hash .= to64 ((ord (substr ($final, 59, 1)) << 16) | (ord (substr ($final, 17, 1)) << 8) | (ord (substr ($final, 38, 1))), 4);
7595 $hash .= to64 ((ord (substr ($final, 18, 1)) << 16) | (ord (substr ($final, 39, 1)) << 8) | (ord (substr ($final, 60, 1))), 4);
7596 $hash .= to64 ((ord (substr ($final, 40, 1)) << 16) | (ord (substr ($final, 61, 1)) << 8) | (ord (substr ($final, 19, 1))), 4);
7597 $hash .= to64 ((ord (substr ($final, 62, 1)) << 16) | (ord (substr ($final, 20, 1)) << 8) | (ord (substr ($final, 41, 1))), 4);
7598 $hash .= to64 (ord (substr ($final, 63, 1)), 2);
7602 if ($iter == 5000) # default
7604 $hash_buf = sprintf ("%s%s\$%s", $magic, $salt , $hash);
7608 $hash_buf = sprintf ("%srounds=%i\$%s\$%s", $magic, $iter, $salt , $hash);
7620 my $hash = ""; # hash to be returned by this function
7622 my $final = sha256 ($pass . $salt . $pass);
7624 $salt = substr ($salt, 0, 16);
7626 my $tmp = $pass . $salt;
7628 my $pass_len = length ($pass);
7629 my $salt_len = length ($salt);
7633 for ($i = $pass_len; $i > 0; $i -= 16)
7642 $tmp .= substr ($final, 0, $len);
7661 $final = sha256 ($tmp);
7667 for ($i = 0; $i < $pass_len; $i++)
7672 $p_bytes = sha256 ($p_bytes);
7673 $p_bytes = substr ($p_bytes, 0, $pass_len);
7677 my $final_first_byte = ord (substr ($final, 0, 1));
7681 for ($i = 0; $i < (16 + $final_first_byte); $i++)
7686 $s_bytes = sha256 ($s_bytes);
7687 $s_bytes = substr ($s_bytes, 0, $salt_len);
7689 for ($i = 0; $i < $iter; $i++)
7721 $final = sha256 ($tmp);
7725 # now format the output string ("hash")
7729 $hash .= to64 ((ord (substr ($final, 0, 1)) << 16) | (ord (substr ($final, 10, 1)) << 8) | (ord (substr ($final, 20, 1))), 4);
7730 $hash .= to64 ((ord (substr ($final, 21, 1)) << 16) | (ord (substr ($final, 1, 1)) << 8) | (ord (substr ($final, 11, 1))), 4);
7731 $hash .= to64 ((ord (substr ($final, 12, 1)) << 16) | (ord (substr ($final, 22, 1)) << 8) | (ord (substr ($final, 2, 1))), 4);
7732 $hash .= to64 ((ord (substr ($final, 3, 1)) << 16) | (ord (substr ($final, 13, 1)) << 8) | (ord (substr ($final, 23, 1))), 4);
7733 $hash .= to64 ((ord (substr ($final, 24, 1)) << 16) | (ord (substr ($final, 4, 1)) << 8) | (ord (substr ($final, 14, 1))), 4);
7734 $hash .= to64 ((ord (substr ($final, 15, 1)) << 16) | (ord (substr ($final, 25, 1)) << 8) | (ord (substr ($final, 5, 1))), 4);
7735 $hash .= to64 ((ord (substr ($final, 6, 1)) << 16) | (ord (substr ($final, 16, 1)) << 8) | (ord (substr ($final, 26, 1))), 4);
7736 $hash .= to64 ((ord (substr ($final, 27, 1)) << 16) | (ord (substr ($final, 7, 1)) << 8) | (ord (substr ($final, 17, 1))), 4);
7737 $hash .= to64 ((ord (substr ($final, 18, 1)) << 16) | (ord (substr ($final, 28, 1)) << 8) | (ord (substr ($final, 8, 1))), 4);
7738 $hash .= to64 ((ord (substr ($final, 9, 1)) << 16) | (ord (substr ($final, 19, 1)) << 8) | (ord (substr ($final, 29, 1))), 4);
7739 $hash .= to64 ((ord (substr ($final, 31, 1)) << 8) | (ord (substr ($final, 30, 1))), 3);
7743 if ($iter == 5000) # default
7745 $hash_buf = sprintf ("%s%s\$%s", $magic, $salt , $hash);
7749 $hash_buf = sprintf ("%srounds=%i\$%s\$%s", $magic, $iter, $salt , $hash);
7755 sub aix_ssha256_pbkdf2
7757 my $word_buf = shift;
7758 my $salt_buf = shift;
7759 my $iterations = shift;
7761 my $hasher = Crypt::PBKDF2->hasher_from_algorithm ('HMACSHA2', 256);
7763 my $pbkdf2 = Crypt::PBKDF2->new (
7765 iterations => $iterations,
7769 my $hash_buf = $pbkdf2->PBKDF2 ($salt_buf, $word_buf);
7773 $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);
7774 $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);
7775 $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);
7776 $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);
7777 $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);
7778 $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);
7779 $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);
7780 $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);
7781 $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);
7782 $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);
7783 $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 30, 1))) << 16) | (int (ord (substr ($hash_buf, 31, 1))) << 8) , 3);
7788 sub aix_ssha512_pbkdf2
7790 my $word_buf = shift;
7791 my $salt_buf = shift;
7792 my $iterations = shift;
7794 my $hasher = Crypt::PBKDF2->hasher_from_algorithm ('HMACSHA2', 512);
7796 my $pbkdf2 = Crypt::PBKDF2->new (
7798 iterations => $iterations,
7801 my $hash_buf = $pbkdf2->PBKDF2 ($salt_buf, $word_buf);
7805 $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);
7806 $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);
7807 $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);
7808 $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);
7809 $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);
7810 $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);
7811 $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);
7812 $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);
7813 $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);
7814 $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);
7815 $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);
7816 $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);
7817 $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);
7818 $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);
7819 $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);
7820 $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);
7821 $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);
7822 $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);
7823 $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);
7824 $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);
7825 $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);
7826 $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 63, 1))) << 16) , 2);
7831 sub aix_ssha1_pbkdf2
7833 my $word_buf = shift;
7834 my $salt_buf = shift;
7835 my $iterations = shift;
7837 my $hasher = Crypt::PBKDF2->hasher_from_algorithm ('HMACSHA1');
7839 my $pbkdf2 = Crypt::PBKDF2->new (
7841 iterations => $iterations,
7844 my $hash_buf = $pbkdf2->PBKDF2 ($salt_buf, $word_buf);
7848 $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);
7849 $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);
7850 $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);
7851 $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);
7852 $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);
7853 $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);
7854 $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 18, 1))) << 16) | (int (ord (substr ($hash_buf, 19, 1))) << 8) , 3);
7863 my @data = split "", $data_s;
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 "\x3f\x40\x41\x50\x43\x44\x45\x4b\x47\x48\x4d\x4e\x54\x51\x53\x46" .
7869 "\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x56\x55\x5c\x49\x5d\x4a" .
7870 "\x42\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f" .
7871 "\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x58\x5b\x59\xff\x52" .
7872 "\x4c\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f" .
7873 "\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x57\x5e\x5a\x4f\xff" .
7874 "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" .
7875 "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" .
7876 "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" .
7877 "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" .
7878 "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" .
7879 "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" .
7880 "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" .
7881 "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff";
7883 my @transTable = unpack ("C256", $transTable_s);
7887 for (my $i = 0; $i < scalar @data; $i++)
7889 $out[$i] = $transTable[int (ord ($data[$i]))];
7892 return pack ("C*", @out);
7897 my $digest_s = shift;
7902 my @w = unpack "C*", $w_s;
7903 my @s = unpack "C*", $s_s;
7906 "\x14\x77\xf3\xd4\xbb\x71\x23\xd0\x03\xff\x47\x93\x55\xaa\x66\x91" .
7907 "\xf2\x88\x6b\x99\xbf\xcb\x32\x1a\x19\xd9\xa7\x82\x22\x49\xa2\x51" .
7908 "\xe2\xb7\x33\x71\x8b\x9f\x5d\x01\x44\x70\xae\x11\xef\x28\xf0\x0d";
7910 my @bcodeTable = unpack ("C48", $bcodeTable_s);
7912 my @abcd = unpack ("C16", $digest_s);
7914 my $sum20 = ($abcd[0] & 3)
7924 for (my $i2 = 0; $i2 < $sum20; $i2++)
7929 for (my $i1 = 0, my $i2 = 0, my $i3 = 0; $i2 < $sum20; $i2++, $i2++)
7931 if ($i1 < length $w_s)
7933 if ($abcd[15 - $i1] & 1)
7935 $out[$i2] = $bcodeTable[48 - 1 - $i1];
7940 $out[$i2] = $w[$i1];
7946 if ($i3 < length $s_s)
7948 $out[$i2] = $s[$i3];
7954 $out[$i2] = $bcodeTable[$i2 - $i1 - $i3];
7957 return substr (pack ("C*", @out), 0, $sum20);
7962 my @key_56 = split (//, shift);
7968 $key .= chr(((ord($key_56[0]) << 7) | (ord($key_56[1]) >> 1)) & 255);
7969 $key .= chr(((ord($key_56[1]) << 6) | (ord($key_56[2]) >> 2)) & 255);
7970 $key .= chr(((ord($key_56[2]) << 5) | (ord($key_56[3]) >> 3)) & 255);
7971 $key .= chr(((ord($key_56[3]) << 4) | (ord($key_56[4]) >> 4)) & 255);
7972 $key .= chr(((ord($key_56[4]) << 3) | (ord($key_56[5]) >> 5)) & 255);
7973 $key .= chr(((ord($key_56[5]) << 2) | (ord($key_56[6]) >> 6)) & 255);
7974 $key .= chr(( ord($key_56[6]) << 1) & 255);
7985 for (my $i = 0; $i < $len; $i++)
7987 my $c = get_random_chr (0, 255);
7992 return join ("", @arr);
7995 sub get_random_netntlmv1_salt
7997 my $len_user = shift;
7998 my $len_domain = shift;
8004 for (my $i = 0; $i < $len_user; $i++)
8006 $type = get_random_num (1, 3);
8010 $char = get_random_chr (0x30, 0x39);
8014 $char = get_random_chr (0x41, 0x5A);
8018 $char = get_random_chr (0x61, 0x7A);
8026 for (my $i = 0; $i < $len_domain; $i++)
8028 $type = get_random_num (1, 3);
8032 $char = get_random_chr (0x30, 0x39);
8036 $char = get_random_chr (0x41, 0x5A);
8040 $char = get_random_chr (0x61, 0x7A);
8046 my $c_challenge = randbytes (8);
8047 my $s_challenge = randbytes (8);
8049 my $salt_buf = $user . "::" . $domain . ":" . unpack ("H*", $c_challenge) . unpack ("H*", $s_challenge);
8054 sub get_random_netntlmv2_salt
8056 my $len_user = shift;
8057 my $len_domain = shift;
8063 if ($len_user + $len_domain > 27)
8065 if ($len_user > $len_domain)
8067 $len_user = 27 - $len_domain;
8071 $len_domain = 27 - $len_user;
8075 for (my $i = 0; $i < $len_user; $i++)
8077 $type = get_random_num (1, 3);
8081 $char = get_random_chr (0x30, 0x39);
8085 $char = get_random_chr (0x41, 0x5A);
8089 $char = get_random_chr (0x61, 0x7A);
8097 for (my $i = 0; $i < $len_domain; $i++)
8099 $type = get_random_num (1, 3);
8103 $char = get_random_chr (0x30, 0x39);
8107 $char = get_random_chr (0x41, 0x5A);
8111 $char = get_random_chr (0x61, 0x7A);
8117 my $c_challenge = randbytes (8);
8118 my $s_challenge = randbytes (8);
8120 my $temp = "\x01\x01" .
8125 randbytes (20 * rand () + 1) .
8128 my $salt_buf = $user . "::" . $domain . ":" . unpack ("H*", $s_challenge) . unpack ("H*", $temp);
8133 sub get_random_ike_salt
8137 for (my $i = 0; $i < 40; $i++)
8139 $nr_buf .= get_random_chr (0, 0xff);
8144 for (my $i = 0; $i < 440; $i++)
8146 $msg_buf .= get_random_chr (0, 0xff);
8149 my $nr_buf_hex = unpack ("H*", $nr_buf);
8150 my $msg_buf_hex = unpack ("H*", $msg_buf);
8152 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));
8157 sub get_random_agilekeychain_salt
8161 for (my $i = 0; $i < 8; $i++)
8163 $salt_buf .= get_random_chr (0x0, 0xff);
8168 for (my $i = 0; $i < 16; $i++)
8170 $iv .= get_random_chr (0x0, 0xff);
8173 my $prefix = "\x00" x 1008;
8175 my $ret = unpack ("H*", $salt_buf . $prefix . $iv);
8180 sub get_random_cloudkeychain_salt
8184 for (my $i = 0; $i < 16; $i++)
8186 $salt_buf .= get_random_chr (0x0, 0xff);
8189 for (my $i = 0; $i < 304; $i++)
8191 $salt_buf .= get_random_chr (0x0, 0xff);
8194 my $ret = unpack ("H*", $salt_buf);
8199 sub get_random_kerberos5_salt
8201 my $custom_salt = shift;
8203 my $clear_data = randbytes (14) .
8204 strftime ("%Y%m%d%H%M%S", localtime) .
8208 my $realm = "realm";
8211 my $salt_buf = $user . "\$" . $realm . "\$" . $salt . "\$" . unpack ("H*", $custom_salt) . "\$" . unpack ("H*", $clear_data) . "\$";
8216 sub get_random_kerberos5_tgs_salt
8218 my $nonce = randbytes (8);
8221 my $realm = "realm";
8222 my $spn = "test/spn";
8224 my $salt_buf = $user . "\$" . $realm . "\$" . $spn . "\$" . unpack ("H*",$nonce);
8229 sub get_random_axcrypt_salt
8231 my $mysalt = randbytes (16);
8233 $mysalt = unpack ("H*", $mysalt);
8235 my $iteration = get_random_num (6, 100000);
8237 my $salt_buf = $iteration . '*' . $mysalt;
8242 sub get_random_md5chap_salt
8244 my $salt_buf = shift;
8246 my $salt = unpack ("H*", $salt_buf);
8250 $salt .= unpack ("H*", randbytes (1));
8255 sub get_random_dnssec_salt
8261 for (my $i = 0; $i < 8; $i++)
8263 $salt_buf .= get_random_chr (0x61, 0x7a);
8266 $salt_buf .= ".net";
8270 for (my $i = 0; $i < 8; $i++)
8272 $salt_buf .= get_random_chr (0x30, 0x39);
8285 my $byte_off = int ($bit / 8);
8286 my $bit_off = int ($bit % 8);
8288 my $char = substr ($digest, $byte_off, 1);
8289 my $num = ord ($char);
8291 return (($num & (1 << $bit_off)) ? 1 : 0);
8300 my $constant_phrase =
8301 "To be, or not to be,--that is the question:--\n" .
8302 "Whether 'tis nobler in the mind to suffer\n" .
8303 "The slings and arrows of outrageous fortune\n" .
8304 "Or to take arms against a sea of troubles,\n" .
8305 "And by opposing end them?--To die,--to sleep,--\n" .
8306 "No more; and by a sleep to say we end\n" .
8307 "The heartache, and the thousand natural shocks\n" .
8308 "That flesh is heir to,--'tis a consummation\n" .
8309 "Devoutly to be wish'd. To die,--to sleep;--\n" .
8310 "To sleep! perchance to dream:--ay, there's the rub;\n" .
8311 "For in that sleep of death what dreams may come,\n" .
8312 "When we have shuffled off this mortal coil,\n" .
8313 "Must give us pause: there's the respect\n" .
8314 "That makes calamity of so long life;\n" .
8315 "For who would bear the whips and scorns of time,\n" .
8316 "The oppressor's wrong, the proud man's contumely,\n" .
8317 "The pangs of despis'd love, the law's delay,\n" .
8318 "The insolence of office, and the spurns\n" .
8319 "That patient merit of the unworthy takes,\n" .
8320 "When he himself might his quietus make\n" .
8321 "With a bare bodkin? who would these fardels bear,\n" .
8322 "To grunt and sweat under a weary life,\n" .
8323 "But that the dread of something after death,--\n" .
8324 "The undiscover'd country, from whose bourn\n" .
8325 "No traveller returns,--puzzles the will,\n" .
8326 "And makes us rather bear those ills we have\n" .
8327 "Than fly to others that we know not of?\n" .
8328 "Thus conscience does make cowards of us all;\n" .
8329 "And thus the native hue of resolution\n" .
8330 "Is sicklied o'er with the pale cast of thought;\n" .
8331 "And enterprises of great pith and moment,\n" .
8332 "With this regard, their currents turn awry,\n" .
8333 "And lose the name of action.--Soft you now!\n" .
8334 "The fair Ophelia!--Nymph, in thy orisons\n" .
8335 "Be all my sins remember'd.\n\x00";
8337 my $constant_len = length ($constant_phrase);
8339 my $hash_buf = md5 ($pw . $salt);
8345 for (my $round = 0; $round < $iter; $round++)
8347 my $shift_a = md5bit ($hash_buf, $round + 0);
8348 my $shift_b = md5bit ($hash_buf, $round + 64);
8353 for (my $k = 0; $k < 16; $k++)
8355 my $s7shift = ord (substr ($hash_buf, $k, 1)) % 8;
8357 my $l = ($k + 3) % 16;
8359 my $num = ord (substr ($hash_buf, $l, 1));
8361 $shift_4[$k] = $num % 5;
8363 $shift_7[$k] = ($num >> $s7shift) & 1;
8368 for (my $k = 0; $k < 16; $k++)
8370 $indirect_4[$k] = (ord (substr ($hash_buf, $k, 1)) >> $shift_4[$k]) & 0xf;
8375 for (my $k = 0; $k < 16; $k++)
8377 $indirect_7[$k] = (ord (substr ($hash_buf, $indirect_4[$k], 1)) >> $shift_7[$k]) & 0x7f;
8383 for (my $k = 0; $k < 8; $k++)
8385 $indirect_a |= md5bit ($hash_buf, $indirect_7[$k + 0]) << $k;
8387 $indirect_b |= md5bit ($hash_buf, $indirect_7[$k + 8]) << $k;
8390 $indirect_a = ($indirect_a >> $shift_a) & 0x7f;
8391 $indirect_b = ($indirect_b >> $shift_b) & 0x7f;
8393 my $bit_a = md5bit ($hash_buf, $indirect_a);
8394 my $bit_b = md5bit ($hash_buf, $indirect_b);
8404 if ($bit_a ^ $bit_b)
8406 substr ($W, 16, 48) = substr ($constant_phrase, 0, 48);
8410 $to_hash .= substr ($W, 0, 64);
8414 for ($constant_off = 48; $constant_off < $constant_len - 64; $constant_off += 64)
8416 substr ($W, 0, 64) = substr ($constant_phrase, $constant_off, 64);
8420 $to_hash .= substr ($W, 0, 64);
8423 $pos = $constant_len - $constant_off;
8427 substr ($W, 0, $pos) = substr ($constant_phrase, $constant_off, $pos);
8442 my $round_div = int ($tmp / 10);
8443 my $round_mod = int ($tmp % 10);
8447 $a_buf[int ($a_len / 4)] = (($round_mod + 0x30) | ($a_buf[int ($a_len / 4)] << 8));
8457 for ($g = 0; $g < $a_len; $g++)
8459 my $remainder = $a_buf[$g];
8465 while ($remainder > 0)
8467 $sub = $remainder >> (8 * $factor);
8469 if ($started != 1 || $sub > 0)
8473 $tmp_str = chr ($sub) . $tmp_str;
8475 $remainder -= ($sub << (8 * $factor));
8483 substr ($W, $pos, $a_len) = $tmp_str;
8489 $to_hash .= substr ($W, 0, $pos);
8491 $to_hash = substr ($to_hash, 0, $total);
8493 $hash_buf = md5 ($to_hash);
8498 $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);
8499 $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);
8500 $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);
8501 $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);
8502 $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);
8503 $passwd .= to64 ((int (ord (substr ($hash_buf, 11, 1)))), 2);
8510 die ("usage: $0 single|passthrough| [mode] [len]\n" .
8512 " $0 verify [mode] [hashfile] [cracks] [outfile]\n");
8517 my $block_ref = shift;
8521 my $value = 16 - $offset;
8523 for (my $i = $offset; $i < 16; $i++)
8525 push @{$block_ref}, $value;
8535 for (my $i = 0; $i < 18; $i++)
8537 for (my $j = 0; $j < 48; $j++)
8539 $p = ($p + 48 - $j) & 0xff;
8541 my $c = $lotus_magic_table[$p];
8543 $p = $in_ref->[$j] ^ $c;
8550 sub lotus_transform_password
8553 my $out_ref = shift;
8555 my $t = $out_ref->[15];
8557 for (my $i = 0; $i < 16; $i++)
8559 $t ^= $in_ref->[$i];
8561 my $c = $lotus_magic_table[$t];
8563 $out_ref->[$i] ^= $c;
8565 $t = $out_ref->[$i];
8569 sub mdtransform_norecalc
8571 my $state_ref = shift;
8572 my $block_ref = shift;
8576 push (@x, @{$state_ref});
8577 push (@x, @{$block_ref});
8579 for (my $i = 0; $i < 16; $i++)
8581 push (@x, $x[0 + $i] ^ $x[16 + $i]);
8586 for (my $i = 0; $i < 16; $i++)
8588 $state_ref->[$i] = $x[$i];
8594 my $state_ref = shift;
8595 my $checksum_ref = shift;
8596 my $block_ref = shift;
8598 mdtransform_norecalc ($state_ref, $block_ref);
8600 lotus_transform_password ($block_ref, $checksum_ref);
8605 my $saved_key_ref = shift;
8609 @{$saved_key_ref} = splice (@{$saved_key_ref}, 0, $size);
8611 my @state = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
8617 for ($curpos = 0; $curpos + 16 < $size; $curpos += 16)
8619 my $curpos16 = $curpos + 16;
8621 my @block = splice (@{$saved_key_ref}, 0, 16);
8623 mdtransform (\@state, \@checksum, \@block);
8626 my $left = $size - $curpos;
8628 my @block = splice (@{$saved_key_ref}, 0, 16);
8630 pad16 (\@block, $left);
8632 mdtransform (\@state, \@checksum, \@block);
8634 mdtransform_norecalc (\@state, \@checksum);
8639 sub pdf_compute_encryption_key
8641 my $word_buf = shift;
8642 my $padding = shift;
8657 $data .= substr ($padding, 0, 32 - length $word_buf);
8659 $data .= pack ("H*", $o);
8661 $data .= pack ("I", $P);
8663 $data .= pack ("H*", $id);
8669 $data .= pack ("I", -1);
8673 my $res = md5 ($data);
8677 for (my $i = 0; $i < 50; $i++)
8686 sub gen_random_wpa_eapol
8695 my $version = 1; # 802.1X-2001
8697 $ret .= pack ("C*", $version);
8699 my $type = 3; # means that this EAPOL frame is used to transfer key information
8701 $ret .= pack ("C*", $type);
8703 my $length; # length of remaining data
8714 $ret .= pack ("n*", $length);
8716 my $descriptor_type;
8720 $descriptor_type = 254; # EAPOL WPA key
8724 $descriptor_type = 1; # EAPOL RSN key
8727 $ret .= pack ("C*", $descriptor_type);
8729 # key_info is a bit vector:
8730 # generated from these 13 bits: encrypted key data, request, error, secure, key mic, key ack, install, key index (2), key type, key descriptor (3)
8734 $key_info |= 1 << 8; # set key MIC
8735 $key_info |= 1 << 3; # set if it is a pairwise key
8739 $key_info |= 1 << 0; # RC4 Cipher, HMAC-MD5 MIC
8743 $key_info |= 1 << 1; # AES Cipher, HMAC-SHA1 MIC
8746 $ret .= pack ("n*", $key_info);
8759 $ret .= pack ("n*", $key_length);
8761 my $replay_counter = 1;
8763 $ret .= pack ("Q>*", $replay_counter);
8767 my $key_iv = "\x00" x 16;
8771 my $key_rsc = "\x00" x 8;
8775 my $key_id = "\x00" x 8;
8779 my $key_mic = "\x00" x 16;
8787 $key_data_len = 24; # length of the key_data (== WPA info)
8791 $key_data_len = 22; # length of the key_data (== RSN info)
8794 $ret .= pack ("n*", $key_data_len);
8804 my $vendor_specific_data = "";
8806 my $tag_number = 221; # means it is a vendor specific tag
8808 $vendor_specific_data .= pack ("C*", $tag_number);
8810 my $tag_len = 22; # length of the remaining "tag data"
8812 $vendor_specific_data .= pack ("C*", $tag_len);
8814 my $vendor_specific_oui = pack ("H*", "0050f2"); # microsoft
8816 $vendor_specific_data .= $vendor_specific_oui;
8818 my $vendor_specific_oui_type = 1; # WPA Information Element
8820 $vendor_specific_data .= pack ("C*", $vendor_specific_oui_type);
8822 my $vendor_specific_wpa_version = 1;
8824 $vendor_specific_data .= pack ("v*", $vendor_specific_wpa_version);
8828 my $vendor_specific_multicast_oui = pack ("H*", "0050f2");
8830 $vendor_specific_data .= $vendor_specific_multicast_oui;
8832 my $vendor_specific_multicast_type = 2; # TKIP
8834 $vendor_specific_data .= pack ("C*", $vendor_specific_multicast_type);
8838 my $vendor_specific_unicast_count = 1;
8840 $vendor_specific_data .= pack ("v*", $vendor_specific_unicast_count);
8842 my $vendor_specific_unicast_oui = pack ("H*", "0050f2");
8844 $vendor_specific_data .= $vendor_specific_multicast_oui;
8846 my $vendor_specific_unicast_type = 2; # TKIP
8848 $vendor_specific_data .= pack ("C*", $vendor_specific_unicast_type);
8850 # Auth Key Management (AKM)
8852 my $auth_key_management_count = 1;
8854 $vendor_specific_data .= pack ("v*", $auth_key_management_count);
8856 my $auth_key_management_oui = pack ("H*", "0050f2");
8858 $vendor_specific_data .= $auth_key_management_oui;
8860 my $auth_key_management_type = 2; # Pre-Shared Key (PSK)
8862 $vendor_specific_data .= pack ("C*", $auth_key_management_type);
8864 $wpa_info = $vendor_specific_data;
8866 $key_data = $wpa_info;
8874 my $tag_number = 48; # RSN info
8876 $rsn_info .= pack ("C*", $tag_number);
8878 my $tag_len = 20; # length of the remaining "tag_data"
8880 $rsn_info .= pack ("C*", $tag_len);
8882 my $rsn_version = 1;
8884 $rsn_info .= pack ("v*", $rsn_version);
8886 # group cipher suite
8888 my $group_cipher_suite_oui = pack ("H*", "000fac"); # Ieee8021
8890 $rsn_info .= $group_cipher_suite_oui;
8892 my $group_cipher_suite_type = 4; # AES (CCM)
8894 $rsn_info .= pack ("C*", $group_cipher_suite_type);
8896 # pairwise cipher suite
8898 my $pairwise_cipher_suite_count = 1;
8900 $rsn_info .= pack ("v*", $pairwise_cipher_suite_count);
8902 my $pairwise_cipher_suite_oui = pack ("H*", "000fac"); # Ieee8021
8904 $rsn_info .= $pairwise_cipher_suite_oui;
8906 my $pairwise_cipher_suite_type = 4; # AES (CCM)
8908 $rsn_info .= pack ("C*", $pairwise_cipher_suite_type);
8910 # Auth Key Management (AKM)
8912 my $auth_key_management_count = 1;
8914 $rsn_info .= pack ("v*", $auth_key_management_count);
8916 my $auth_key_management_oui = pack ("H*", "000fac"); # Ieee8021
8918 $rsn_info .= $auth_key_management_oui;
8920 my $auth_key_management_type = 2; # Pre-Shared Key (PSK)
8922 $rsn_info .= pack ("C*", $auth_key_management_type);
8926 # bit vector of these 9 bits: peerkey enabled, management frame protection (MFP) capable, MFP required,
8927 # RSN GTKSA Capabilities (2), RSN PTKSA Capabilities (2), no pairwise Capabilities, Pre-Auth Capabilities
8929 my $rsn_capabilities = pack ("H*", "0000");
8931 $rsn_info .= $rsn_capabilities;
8933 $key_data = $rsn_info;
8949 my $data = "Pairwise key expansion";
8954 # Min(AA, SPA) || Max(AA, SPA)
8957 # compare if greater: Min()/Max() on the MACs (6 bytes)
8959 if (memcmp ($stmac, $bssid, 6) < 0)
8971 # Min(ANonce,SNonce) || Max(ANonce,SNonce)
8974 # compare if greater: Min()/Max() on the nonces (32 bytes)
8976 if (memcmp ($snonce, $anonce, 32) < 0)
8989 my $prf_buf = hmac ($data, $pmk, \&sha1);
8991 $prf_buf = substr ($prf_buf, 0, 16);
9002 my $len_str1 = length ($str1);
9003 my $len_str2 = length ($str2);
9005 if (($len > $len_str1) || ($len > $len_str2))
9007 print "ERROR: memcmp () lengths wrong";
9012 for (my $i = 0; $i < $len; $i++)
9014 my $c_1 = ord (substr ($str1, $i, 1));
9015 my $c_2 = ord (substr ($str2, $i, 1));
9017 return -1 if ($c_1 < $c_2);
9018 return 1 if ($c_1 > $c_2);