if
(
defined
(
$ENV
{
'LANG'
})) {
if
(
$ENV
{
'LANG'
} =~ /\bUTF-8\b/i) {
binmode
(STDOUT,
':utf8'
);
binmode
(STDERR,
':utf8'
);
note(
"Terminal encoding is UTF-8.\n"
);
}
else
{
note(
"Terminal encoding is not UTF-8.\n"
);
}
}
else
{
note(
"Unable to determine terminal encoding. Assuming UTF-8.\n"
);
binmode
(STDOUT,
':utf8'
);
binmode
(STDERR,
':utf8'
);
}
my
%tests_verify_good
= (
'hello'
=>
'$2a$10$O0fG6ExZRx4mEZxsRHqPKuDy9U2HW9M4UONC1hnsx84tW/bb5URFO'
,
'Test 123'
=>
'$2b$10$wOmSB/8mvcXJBAnPTJzO..tFOq4nCxP21vTfWqunrVi5Irsi3Obcy'
,
'โฌU maffia'
=>
'$2y$04$f5VgvyHCr0OiPbvjdZ8zJuPBHD6Tul6nleZSWUVkk/HSOKOC8DmFy'
,
'ใใใฏใใใใใใ่คๆฐใฎใใคใใงๆงๆใใใๆๅญใงใใๆฅๆฌ่ชใฎๆใงใใ'
=>
'$2y$10$8r90pAKtxZzcWQRsJpOKge6rXAP.1UtvQntdk38RhuAjrXXkplqr.'
,
'ใใใฏใใใใใใ่คๆฐใฎใใคใใงๆงๆใใใๆๅญใงใ'
=>
'$2y$10$8r90pAKtxZzcWQRsJpOKge6rXAP.1UtvQntdk38RhuAjrXXkplqr.'
,
'ใใใฏใใใใใใ่คๆฐใฎใใคใใงๆงๆใใใๆๅญใง'
=>
'$2y$10$8r90pAKtxZzcWQRsJpOKge6rXAP.1UtvQntdk38RhuAjrXXkplqr.'
,
'*ใใใฏใใใใใใ่คๆฐใฎใใคใใงๆงๆใใใๆๅญใงใใๆฅๆฌ่ชใฎๆใงใใ'
=>
'$2y$10$sTABy3KkqHfAFn804McWyOZ05GuCTJv/f2UftgDgt18FT1aLTWw5a'
,
'*ใใใฏใใใใใใ่คๆฐใฎใใคใใงๆงๆใใใๆๅญใง'
=>
'$2y$10$sTABy3KkqHfAFn804McWyOZ05GuCTJv/f2UftgDgt18FT1aLTWw5a'
,
'*ใใใฏใใใใใใ่คๆฐใฎใใคใใงๆงๆใใใๆๅญ'
=>
'$2y$10$d0zIWdmjJV4etRUhHmHRDeAL4OD6.i.omgK8.neAFVpqJxJiX/jTa'
,
);
if
(
$INC
{
'Crypt/Argon2.pm'
} ||
eval
{
require
Crypt::Argon2; }) {
$tests_verify_good
{
'โฌuro 123'
} =
'$argon2id$v=19$m=65536,t=4,p=1$d0pJRy83QmFtbjRoMTRMLg$LUUfxwFcaIeV/V/L6vs2ist/n41kUfuGEKKfoYFbOtY'
;
$tests_verify_good
{
'top secret'
} =
'$argon2i$v=19$m=65536,t=4,p=1$QVVILkUvbUFaNGQzOEpKTA$PuQa7RB6cJWHFRJXGxXqi0qW51N801ZS9ZE7f+gDnjI'
;
}
else
{
diag(
'Skipping some tests because the Crypt::Argon2 module is not installed'
);
}
my
%tests_verify_bad
= (
'wrong password'
=>
'$2a$10$O0fG6ExZRx4mEZxsRHqPKuDy9U2HW9M4UONC1hnsx84tW/bb5URFO'
,
'wrong again'
=>
'0fG6ExZRx4mEZxsRHqPKuDy9U2HW9M4UONC1hnsx84tsdfs'
,
'bad guess'
=>
'$2y$10$17ZzQQNFszjoSuWnSmYuH.OlgJz/sTyxWlYlmJPY/ASP/R0n/pNIq'
,
'ใใใฏใใใใใใ่คๆฐใฎใใคใใงๆงๆใใใๆๅญ'
=>
'$2y$10$8r90pAKtxZzcWQRsJpOKge6rXAP.1UtvQntdk38RhuAjrXXkplqr.'
,
'*ใใใฏใใใใใใ่คๆฐใฎใใคใใงๆงๆใใใๆๅญ'
=>
'$2y$10$sTABy3KkqHfAFn804McWyOZ05GuCTJv/f2UftgDgt18FT1aLTWw5a'
,
);
my
@methods
=
map
{
$_
,
"password_$_"
; }
qw(
verify
)
;
my
$php
;
if
(!(
$ENV
{
'HARNESS_ACTIVE'
} || ($^O eq
'MSWin32'
))) {
$php
= `which php`;
$php
=~ s/^\s+|\s+$//g;
if
(-x
$php
) {
my
$phpversion
= `php -v`;
$phpversion
=~ s/^PHP (\S+)\s.*/$1/s;
my
$too_old
;
if
(
$phpversion
=~ /^(\d{1,3}\.\d{1,6})\b/) {
if
($1 < 7.3) {
$too_old
= 1;
}
}
note(
"Found PHP executable $php with version $phpversion: "
. (
$too_old
?
'TOO OLD'
:
'OK'
) .
"\n"
);
if
(
$too_old
) {
undef
(
$php
);
}
}
else
{
undef
(
$php
);
}
}
plan
tests
=> 1 +
scalar
(
@methods
) + (
$php
? 3 : 2) * (
scalar
(
keys
(
%tests_verify_good
)) +
scalar
(
keys
(
%tests_verify_bad
)));
my
$class
=
'PHP::Functions::Password'
;
use_ok(
$class
) || BAIL_OUT(
"Failed to use $class"
);
foreach
my
$method
(
@methods
) {
can_ok(
$class
,
$method
);
if
(
$method
=~ /^password/) {
$class
->
import
(
$method
);
}
}
note(
''
);
foreach
my
$password
(
sort
keys
%tests_verify_good
) {
my
$crypted
=
$tests_verify_good
{
$password
};
note(
"Testing good password: $password"
);
my
$result
=
$class
->verify(
$password
,
$crypted
);
ok(
$result
,
"Expect success from $class->verify(\$password, \"$crypted\")"
);
$result
= password_verify(
$password
,
$crypted
);
ok(
$result
,
"Expect success from password_verify(\$password, \"$crypted\")"
);
if
(
$php
) {
my
$phpcode
=
"var_export(password_verify('"
.
$password
.
"', '"
.
$crypted
.
"'));"
;
my
$h
;
open
(
$h
,
'-|'
,
$php
,
'-r'
,
$phpcode
) ||
die
(
"Failed to execute $php: $!"
);
my
$line
= <
$h
>;
close
(
$h
);
ok(
$line
eq
'true'
,
"Expect true from PHP's password_verify(\$password, \"$crypted\")"
);
}
note(
''
);
}
foreach
my
$password
(
sort
keys
%tests_verify_bad
) {
my
$crypted
=
$tests_verify_bad
{
$password
};
note(
"Testing bad password: $password"
);
my
$result
=
$class
->verify(
$password
,
$crypted
);
ok(!
$result
,
"Expect failure from $class->verify(\$password, \"$crypted\")"
);
$result
= password_verify(
$password
,
$crypted
);
ok(!
$result
,
"Expect failure from password_verify(\$password, \"$crypted\")"
);
if
(
$php
) {
my
$phpcode
=
"var_export(password_verify('"
.
$password
.
"', '"
.
$crypted
.
"'));"
;
my
$h
;
open
(
$h
,
'-|'
,
$php
,
'-r'
,
$phpcode
) ||
die
(
"Failed to execute $php: $!"
);
my
$line
= <
$h
>;
close
(
$h
);
ok(
$line
eq
'false'
,
"Expect false from PHP's password_verify(\$password, \"$crypted\")"
);
}
note(
''
);
}