diff --git a/lib/Crypto/WCF2.php b/lib/Crypto/WCF2.php new file mode 100644 index 0000000..07b1484 --- /dev/null +++ b/lib/Crypto/WCF2.php @@ -0,0 +1,63 @@ + + * @author Marcin Łojewski + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +namespace OCA\UserSQL\Crypto; + +/** + * WCF2 hashing implementation. + * + * @author Marcin Łojewski + */ +class WCF2 extends AbstractCrypt +{ + /** + * @inheritdoc + */ + public function checkPassword($password, $dbHash) + { + return hash_equals($dbHash, crypt(crypt($password, $dbHash), $dbHash)); + } + + /** + * @inheritdoc + */ + public function getPasswordHash($password) + { + $salt = $this->getSalt(); + return crypt(crypt($password, $salt), $salt); + } + + /** + * @inheritdoc + */ + protected function getSalt() + { + return "$2a$08$" . Utils::randomString(22, self::SALT_ALPHABET) . "$"; + } + + /** + * @inheritdoc + */ + protected function getAlgorithmName() + { + return "WoltLab Community Framework 2.x"; + } +} diff --git a/tests/Crypto/WCF2Test.php b/tests/Crypto/WCF2Test.php new file mode 100644 index 0000000..91faa91 --- /dev/null +++ b/tests/Crypto/WCF2Test.php @@ -0,0 +1,62 @@ + + * @author Marcin Łojewski + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +namespace Tests\UserSQL\Crypto; + +use OCA\UserSQL\Crypto\IPasswordAlgorithm; +use OCA\UserSQL\Crypto\WCF2; +use OCP\IL10N; +use Test\TestCase; + +/** + * Unit tests for class WCF2. + * + * @author Marcin Łojewski + */ +class WCF2Test extends TestCase +{ + /** + * @var IPasswordAlgorithm + */ + private $crypto; + + public function testCheckPassword() + { + $this->assertTrue( + $this->crypto->checkPassword( + "password", + "$2a$08\$XEQDKNU/Vbootwxv5Gp7gujxFX/RUFsZLvQPYM435Dd3/p17fto02" + ) + ); + } + + public function testPasswordHash() + { + $hash = $this->crypto->getPasswordHash("password"); + $this->assertTrue($this->crypto->checkPassword("password", $hash)); + } + + protected function setUp() + { + parent::setUp(); + $this->crypto = new WCF2($this->createMock(IL10N::class)); + } +}