diff --git a/libraries/src/User/UserHelper.php b/libraries/src/User/UserHelper.php index 8221f8a24979f..993a6f24acb49 100644 --- a/libraries/src/User/UserHelper.php +++ b/libraries/src/User/UserHelper.php @@ -343,6 +343,16 @@ public static function verifyPassword($password, $hash, $user_id = 0) $rehash = true; } + // Check for Argon2id hashes + elseif (strpos($hash, '$argon2id') === 0) + { + // This implementation is not supported through any existing polyfills + $match = password_verify($password, $hash); + + $rehash = password_needs_rehash($hash, PASSWORD_ARGON2ID); + + $passwordAlgorithm = PASSWORD_ARGON2ID; + } // Check for Argon2i hashes elseif (strpos($hash, '$argon2i') === 0) { diff --git a/tests/unit/suites/libraries/joomla/user/JUserHelperTest.php b/tests/unit/suites/libraries/joomla/user/JUserHelperTest.php index c95328c58bca0..bab5ed5bcc7e6 100644 --- a/tests/unit/suites/libraries/joomla/user/JUserHelperTest.php +++ b/tests/unit/suites/libraries/joomla/user/JUserHelperTest.php @@ -349,6 +349,29 @@ public function testHashPasswordArgon2i() ); } + /** + * Testing hashPassword() for argon2id hashing support. + * + * @covers JUserHelper::hashPassword + * @return void + * + * @since __DEPLOY_VERSION__ + * @requires PHP 7.3 + */ + public function testHashPasswordArgon2id() + { + if (!defined('PASSWORD_ARGON2ID')) + { + $this->markTestSkipped('Argon2id algorithm not supported.'); + } + + $this->assertEquals( + strpos(JUserHelper::hashPassword('mySuperSecretPassword', PASSWORD_ARGON2ID), '$argon2id'), + 0, + 'The password is hashed using the specified hashing algorithm' + ); + } + /** * Testing verifyPassword(). *