From Code to Community: Sponsoring The Perl and Raku Conference 2025 Learn more

#!./perl
BEGIN {
chdir 't' if -d 't';
@INC = '../lib';
require "./test.pl";
eval 'use Errno';
die $@ if $@ and !is_miniperl();
}
my @bad_salts =
(
[ '', 'zero-length' ],
[ 'a', 'length 1' ],
[ '!a', 'bad first character' ],
[ 'a!', 'bad second character' ],
[ '@a', 'fencepost before A' ],
[ '[a', 'fencepost after Z' ],
[ '`a', 'fencepost before a' ],
[ '{a', 'fencepost after z' ],
[ '-a', 'fencepost before .' ],
[ ':a', 'fencepost after 9' ],
);
my @good_salts = qw(aa zz AA ZZ .. 99);
plan tests => 2 * @bad_salts + 1 + @good_salts;
for my $bad_salt (@bad_salts) {
my ($salt, $what) = @$bad_salt;
$! = 0;
is(crypt("abc", $salt), undef, "bad salt ($what)");
is(0+$!, &Errno::EINVAL, "check errno ($what)");
}
is(crypt("abcdef", "ab"), "abDMWw5NL.afs", "sanity check result");
# just to check we're not rejecting any good salts
for my $good_salt (@good_salts) {
isnt(crypt("abcdef", $good_salt), undef, "good salt $good_salt");
}