‪TYPO3CMS  ‪main
Argon2iPasswordHashTest.php
Go to the documentation of this file.
1 <?php
2 
3 declare(strict_types=1);
4 
5 /*
6  * This file is part of the TYPO3 CMS project.
7  *
8  * It is free software; you can redistribute it and/or modify it under
9  * the terms of the GNU General Public License, either version 2
10  * of the License, or any later version.
11  *
12  * For the full copyright and license information, please read the
13  * LICENSE.txt file that was distributed with this source code.
14  *
15  * The TYPO3 project - inspiring people to share!
16  */
17 
19 
20 use PHPUnit\Framework\Attributes\Test;
22 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
23 
24 final class ‪Argon2iPasswordHashTest extends UnitTestCase
25 {
27 
31  protected function ‪setUp(): void
32  {
33  parent::setUp();
34  $options = [
35  'memory_cost' => 65536,
36  'time_cost' => 4,
37  'threads' => 1,
38  ];
39  $this->subject = new ‪Argon2iPasswordHash($options);
40  }
41 
42  #[Test]
44  {
45  $this->expectException(\InvalidArgumentException::class);
46  $this->expectExceptionCode(1533899612);
47  new ‪Argon2iPasswordHash(['memory_cost' => 1]);
48  }
49 
50  #[Test]
52  {
53  $this->expectException(\InvalidArgumentException::class);
54  $this->expectExceptionCode(1533899613);
55  new ‪Argon2iPasswordHash(['time_cost' => 1]);
56  }
57 
58  #[Test]
60  {
61  self::assertNull($this->subject->getHashedPassword(''));
62  }
63 
64  #[Test]
65  public function ‪getHashedPasswordReturnsString(): void
66  {
67  $hash = $this->subject->getHashedPassword('password');
68  self::assertNotNull($hash);
69  self::assertIsString($hash);
70  }
71 
72  #[Test]
74  {
75  $hash = $this->subject->getHashedPassword('password');
76  self::assertTrue($this->subject->isValidSaltedPW($hash));
77  }
78 
82  #[Test]
84  {
85  $password = 'aEjOtY';
86  $hash = $this->subject->getHashedPassword($password);
87  self::assertTrue($this->subject->checkPassword($password, $hash));
88  }
89 
93  #[Test]
95  {
96  $password = '01369';
97  $hash = $this->subject->getHashedPassword($password);
98  self::assertTrue($this->subject->checkPassword($password, $hash));
99  }
100 
104  #[Test]
106  {
107  $password = ' !"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~';
108  $hash = $this->subject->getHashedPassword($password);
109  self::assertTrue($this->subject->checkPassword($password, $hash));
110  }
111 
115  #[Test]
117  {
118  $password = '';
119  for ($i = 160; $i <= 191; $i++) {
120  $password .= chr($i);
121  }
122  $password .= chr(215) . chr(247);
123  $hash = $this->subject->getHashedPassword($password);
124  self::assertTrue($this->subject->checkPassword($password, $hash));
125  }
126 
130  #[Test]
132  {
133  $password = '';
134  for ($i = 192; $i <= 255; $i++) {
135  if ($i === 215 || $i === 247) {
136  // skip multiplication sign (×) and obelus (÷)
137  continue;
138  }
139  $password .= chr($i);
140  }
141  $hash = $this->subject->getHashedPassword($password);
142  self::assertTrue($this->subject->checkPassword($password, $hash));
143  }
144 
145  #[Test]
147  {
148  $password = 'password';
149  $password1 = $password . 'INVALID';
150  $hash = $this->subject->getHashedPassword($password);
151  self::assertFalse($this->subject->checkPassword($password1, $hash));
152  }
153 
154  #[Test]
156  {
157  $password = 'password';
158  $hash = $this->subject->getHashedPassword($password);
159  self::assertFalse($this->subject->isHashUpdateNeeded($hash));
160  }
161 
162  #[Test]
164  {
165  $originalOptions = [
166  'memory_cost' => 65536,
167  'time_cost' => 4,
168  'threads' => 2,
169  ];
170  ‪$subject = new ‪Argon2iPasswordHash($originalOptions);
171  $hash = ‪$subject->‪getHashedPassword('password');
172 
173  // Change $memoryCost
174  $newOptions = $originalOptions;
175  $newOptions['memory_cost'] = $newOptions['memory_cost'] + 1;
176  ‪$subject = new ‪Argon2iPasswordHash($newOptions);
177  self::assertTrue(‪$subject->‪isHashUpdateNeeded($hash));
178 
179  // Change $timeCost
180  $newOptions = $originalOptions;
181  $newOptions['time_cost'] = $newOptions['time_cost'] + 1;
182  ‪$subject = new ‪Argon2iPasswordHash($newOptions);
183  self::assertTrue(‪$subject->‪isHashUpdateNeeded($hash));
184 
185  // Change $threads
186  // Changing $threads does nothing with libsodium, so skip that.
187  if (!extension_loaded('sodium')) {
188  $newOptions = $originalOptions;
189  $newOptions['threads'] = $newOptions['threads'] + 1;
190  ‪$subject = new ‪Argon2iPasswordHash($newOptions);
191  self::assertTrue(‪$subject->‪isHashUpdateNeeded($hash));
192  }
193  }
194 }
‪TYPO3\CMS\Core\Tests\Unit\Crypto\PasswordHashing\Argon2iPasswordHashTest\constructorThrowsExceptionIfMemoryCostIsTooLow
‪constructorThrowsExceptionIfMemoryCostIsTooLow()
Definition: Argon2iPasswordHashTest.php:43
‪TYPO3\CMS\Core\Tests\Unit\Crypto\PasswordHashing\Argon2iPasswordHashTest\isHashUpdateNeededReturnsFalseForJustGeneratedHash
‪isHashUpdateNeededReturnsFalseForJustGeneratedHash()
Definition: Argon2iPasswordHashTest.php:155
‪TYPO3\CMS\Core\Crypto\PasswordHashing\AbstractArgon2PasswordHash\isHashUpdateNeeded
‪bool isHashUpdateNeeded(string $passString)
Definition: AbstractArgon2PasswordHash.php:136
‪TYPO3\CMS\Core\Tests\Unit\Crypto\PasswordHashing\Argon2iPasswordHashTest\getHashedPasswordReturnsNullOnEmptyPassword
‪getHashedPasswordReturnsNullOnEmptyPassword()
Definition: Argon2iPasswordHashTest.php:59
‪TYPO3\CMS\Core\Tests\Unit\Crypto\PasswordHashing\Argon2iPasswordHashTest\isHashUpdateNeededReturnsTrueForHashGeneratedWithOldOptions
‪isHashUpdateNeededReturnsTrueForHashGeneratedWithOldOptions()
Definition: Argon2iPasswordHashTest.php:163
‪TYPO3\CMS\Core\Tests\Unit\Crypto\PasswordHashing\Argon2iPasswordHashTest\checkPasswordReturnsTrueForHashedPasswordWithValidAlphaCharClassPassword
‪checkPasswordReturnsTrueForHashedPasswordWithValidAlphaCharClassPassword()
Definition: Argon2iPasswordHashTest.php:83
‪TYPO3\CMS\Core\Tests\Unit\Crypto\PasswordHashing\Argon2iPasswordHashTest\checkPasswordReturnsTrueForHashedPasswordWithValidLatin1SpecialCharClassPassword
‪checkPasswordReturnsTrueForHashedPasswordWithValidLatin1SpecialCharClassPassword()
Definition: Argon2iPasswordHashTest.php:116
‪TYPO3\CMS\Core\Tests\Unit\Crypto\PasswordHashing\Argon2iPasswordHashTest\checkPasswordReturnsTrueForHashedPasswordWithValidNumericCharClassPassword
‪checkPasswordReturnsTrueForHashedPasswordWithValidNumericCharClassPassword()
Definition: Argon2iPasswordHashTest.php:94
‪TYPO3\CMS\Core\Tests\Unit\Crypto\PasswordHashing\Argon2iPasswordHashTest\checkPasswordReturnsTrueForHashedPasswordWithValidLatin1UmlautCharClassPassword
‪checkPasswordReturnsTrueForHashedPasswordWithValidLatin1UmlautCharClassPassword()
Definition: Argon2iPasswordHashTest.php:131
‪TYPO3\CMS\Core\Tests\Unit\Crypto\PasswordHashing\Argon2iPasswordHashTest\checkPasswordReturnsTrueForHashedPasswordWithValidAsciiSpecialCharClassPassword
‪checkPasswordReturnsTrueForHashedPasswordWithValidAsciiSpecialCharClassPassword()
Definition: Argon2iPasswordHashTest.php:105
‪TYPO3\CMS\Core\Tests\Unit\Crypto\PasswordHashing\Argon2iPasswordHashTest
Definition: Argon2iPasswordHashTest.php:25
‪TYPO3\CMS\Core\Tests\Unit\Crypto\PasswordHashing\Argon2iPasswordHashTest\constructorThrowsExceptionIfTimeCostIsTooLow
‪constructorThrowsExceptionIfTimeCostIsTooLow()
Definition: Argon2iPasswordHashTest.php:51
‪TYPO3\CMS\Core\Tests\Unit\Crypto\PasswordHashing\Argon2iPasswordHashTest\isValidSaltedPwValidatesHastCreatedByGetHashedPassword
‪isValidSaltedPwValidatesHastCreatedByGetHashedPassword()
Definition: Argon2iPasswordHashTest.php:73
‪TYPO3\CMS\Core\Tests\Unit\Crypto\PasswordHashing\Argon2iPasswordHashTest\getHashedPasswordReturnsString
‪getHashedPasswordReturnsString()
Definition: Argon2iPasswordHashTest.php:65
‪TYPO3\CMS\Core\Crypto\PasswordHashing\AbstractArgon2PasswordHash\getHashedPassword
‪getHashedPassword(string $password)
Definition: AbstractArgon2PasswordHash.php:117
‪TYPO3\CMS\Core\Crypto\PasswordHashing\Argon2iPasswordHash
Definition: Argon2iPasswordHash.php:31
‪TYPO3\CMS\Core\Tests\Unit\Crypto\PasswordHashing\Argon2iPasswordHashTest\checkPasswordReturnsTrueForHashedPasswordWithNonValidPassword
‪checkPasswordReturnsTrueForHashedPasswordWithNonValidPassword()
Definition: Argon2iPasswordHashTest.php:146
‪TYPO3\CMS\Core\Tests\Unit\Crypto\PasswordHashing\Argon2iPasswordHashTest\setUp
‪setUp()
Definition: Argon2iPasswordHashTest.php:31
‪TYPO3\CMS\Core\Tests\Unit\Crypto\PasswordHashing
Definition: Argon2idPasswordHashTest.php:18
‪TYPO3\CMS\Core\Tests\Unit\Crypto\PasswordHashing\Argon2iPasswordHashTest\$subject
‪Argon2iPasswordHash $subject
Definition: Argon2iPasswordHashTest.php:26