‪TYPO3CMS  11.5
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 
21 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
22 
26 class ‪Argon2iPasswordHashTest extends UnitTestCase
27 {
29 
33  protected function ‪setUp(): void
34  {
35  parent::setUp();
36  $options = [
37  'memory_cost' => 65536,
38  'time_cost' => 4,
39  'threads' => 1,
40  ];
41  $this->subject = new ‪Argon2iPasswordHash($options);
42  }
43 
48  {
49  $this->expectException(\InvalidArgumentException::class);
50  $this->expectExceptionCode(1533899612);
51  new ‪Argon2iPasswordHash(['memory_cost' => 1]);
52  }
53 
58  {
59  $this->expectException(\InvalidArgumentException::class);
60  $this->expectExceptionCode(1533899613);
61  new ‪Argon2iPasswordHash(['time_cost' => 1]);
62  }
63 
68  {
69  self::assertNull($this->subject->getHashedPassword(''));
70  }
71 
75  public function ‪getHashedPasswordReturnsString(): void
76  {
77  $hash = $this->subject->getHashedPassword('password');
78  self::assertNotNull($hash);
79  self::assertIsString($hash);
80  }
81 
86  {
87  $hash = $this->subject->getHashedPassword('password');
88  self::assertTrue($this->subject->isValidSaltedPW($hash));
89  }
90 
97  {
98  $password = 'aEjOtY';
99  $hash = $this->subject->getHashedPassword($password);
100  self::assertTrue($this->subject->checkPassword($password, $hash));
101  }
102 
109  {
110  $password = '01369';
111  $hash = $this->subject->getHashedPassword($password);
112  self::assertTrue($this->subject->checkPassword($password, $hash));
113  }
114 
121  {
122  $password = ' !"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~';
123  $hash = $this->subject->getHashedPassword($password);
124  self::assertTrue($this->subject->checkPassword($password, $hash));
125  }
126 
133  {
134  $password = '';
135  for ($i = 160; $i <= 191; $i++) {
136  $password .= chr($i);
137  }
138  $password .= chr(215) . chr(247);
139  $hash = $this->subject->getHashedPassword($password);
140  self::assertTrue($this->subject->checkPassword($password, $hash));
141  }
142 
149  {
150  $password = '';
151  for ($i = 192; $i <= 255; $i++) {
152  if ($i === 215 || $i === 247) {
153  // skip multiplication sign (×) and obelus (÷)
154  continue;
155  }
156  $password .= chr($i);
157  }
158  $hash = $this->subject->getHashedPassword($password);
159  self::assertTrue($this->subject->checkPassword($password, $hash));
160  }
161 
166  {
167  $password = 'password';
168  $password1 = $password . 'INVALID';
169  $hash = $this->subject->getHashedPassword($password);
170  self::assertFalse($this->subject->checkPassword($password1, $hash));
171  }
172 
177  {
178  $password = 'password';
179  $hash = $this->subject->getHashedPassword($password);
180  self::assertFalse($this->subject->isHashUpdateNeeded($hash));
181  }
182 
187  {
188  $originalOptions = [
189  'memory_cost' => 65536,
190  'time_cost' => 4,
191  'threads' => 2,
192  ];
193  ‪$subject = new ‪Argon2iPasswordHash($originalOptions);
194  $hash = ‪$subject->‪getHashedPassword('password');
195 
196  // Change $memoryCost
197  $newOptions = $originalOptions;
198  $newOptions['memory_cost'] = $newOptions['memory_cost'] + 1;
199  ‪$subject = new ‪Argon2iPasswordHash($newOptions);
200  self::assertTrue(‪$subject->‪isHashUpdateNeeded($hash));
201 
202  // Change $timeCost
203  $newOptions = $originalOptions;
204  $newOptions['time_cost'] = $newOptions['time_cost'] + 1;
205  ‪$subject = new ‪Argon2iPasswordHash($newOptions);
206  self::assertTrue(‪$subject->‪isHashUpdateNeeded($hash));
207 
208  // Change $threads
209  // Changing $threads does nothing with libsodium, so skip that.
210  if (!extension_loaded('sodium')) {
211  $newOptions = $originalOptions;
212  $newOptions['threads'] = $newOptions['threads'] + 1;
213  ‪$subject = new ‪Argon2iPasswordHash($newOptions);
214  self::assertTrue(‪$subject->‪isHashUpdateNeeded($hash));
215  }
216  }
217 }
‪TYPO3\CMS\Core\Tests\Unit\Crypto\PasswordHashing\Argon2iPasswordHashTest\constructorThrowsExceptionIfMemoryCostIsTooLow
‪constructorThrowsExceptionIfMemoryCostIsTooLow()
Definition: Argon2iPasswordHashTest.php:47
‪TYPO3\CMS\Core\Tests\Unit\Crypto\PasswordHashing\Argon2iPasswordHashTest\isHashUpdateNeededReturnsFalseForJustGeneratedHash
‪isHashUpdateNeededReturnsFalseForJustGeneratedHash()
Definition: Argon2iPasswordHashTest.php:176
‪TYPO3\CMS\Core\Crypto\PasswordHashing\AbstractArgon2PasswordHash\isHashUpdateNeeded
‪bool isHashUpdateNeeded(string $passString)
Definition: AbstractArgon2PasswordHash.php:145
‪TYPO3\CMS\Core\Crypto\PasswordHashing\AbstractArgon2PasswordHash\getHashedPassword
‪string null getHashedPassword(string $password)
Definition: AbstractArgon2PasswordHash.php:126
‪TYPO3\CMS\Core\Tests\Unit\Crypto\PasswordHashing\Argon2iPasswordHashTest\getHashedPasswordReturnsNullOnEmptyPassword
‪getHashedPasswordReturnsNullOnEmptyPassword()
Definition: Argon2iPasswordHashTest.php:67
‪TYPO3\CMS\Core\Tests\Unit\Crypto\PasswordHashing\Argon2iPasswordHashTest\isHashUpdateNeededReturnsTrueForHashGeneratedWithOldOptions
‪isHashUpdateNeededReturnsTrueForHashGeneratedWithOldOptions()
Definition: Argon2iPasswordHashTest.php:186
‪TYPO3\CMS\Core\Tests\Unit\Crypto\PasswordHashing\Argon2iPasswordHashTest\checkPasswordReturnsTrueForHashedPasswordWithValidAlphaCharClassPassword
‪checkPasswordReturnsTrueForHashedPasswordWithValidAlphaCharClassPassword()
Definition: Argon2iPasswordHashTest.php:96
‪TYPO3\CMS\Core\Tests\Unit\Crypto\PasswordHashing\Argon2iPasswordHashTest\checkPasswordReturnsTrueForHashedPasswordWithValidLatin1SpecialCharClassPassword
‪checkPasswordReturnsTrueForHashedPasswordWithValidLatin1SpecialCharClassPassword()
Definition: Argon2iPasswordHashTest.php:132
‪TYPO3\CMS\Core\Tests\Unit\Crypto\PasswordHashing\Argon2iPasswordHashTest\checkPasswordReturnsTrueForHashedPasswordWithValidNumericCharClassPassword
‪checkPasswordReturnsTrueForHashedPasswordWithValidNumericCharClassPassword()
Definition: Argon2iPasswordHashTest.php:108
‪TYPO3\CMS\Core\Tests\Unit\Crypto\PasswordHashing\Argon2iPasswordHashTest\checkPasswordReturnsTrueForHashedPasswordWithValidLatin1UmlautCharClassPassword
‪checkPasswordReturnsTrueForHashedPasswordWithValidLatin1UmlautCharClassPassword()
Definition: Argon2iPasswordHashTest.php:148
‪TYPO3\CMS\Core\Tests\Unit\Crypto\PasswordHashing\Argon2iPasswordHashTest\checkPasswordReturnsTrueForHashedPasswordWithValidAsciiSpecialCharClassPassword
‪checkPasswordReturnsTrueForHashedPasswordWithValidAsciiSpecialCharClassPassword()
Definition: Argon2iPasswordHashTest.php:120
‪TYPO3\CMS\Core\Tests\Unit\Crypto\PasswordHashing\Argon2iPasswordHashTest
Definition: Argon2iPasswordHashTest.php:27
‪TYPO3\CMS\Core\Tests\Unit\Crypto\PasswordHashing\Argon2iPasswordHashTest\constructorThrowsExceptionIfTimeCostIsTooLow
‪constructorThrowsExceptionIfTimeCostIsTooLow()
Definition: Argon2iPasswordHashTest.php:57
‪TYPO3\CMS\Core\Tests\Unit\Crypto\PasswordHashing\Argon2iPasswordHashTest\isValidSaltedPwValidatesHastCreatedByGetHashedPassword
‪isValidSaltedPwValidatesHastCreatedByGetHashedPassword()
Definition: Argon2iPasswordHashTest.php:85
‪TYPO3\CMS\Core\Tests\Unit\Crypto\PasswordHashing\Argon2iPasswordHashTest\getHashedPasswordReturnsString
‪getHashedPasswordReturnsString()
Definition: Argon2iPasswordHashTest.php:75
‪TYPO3\CMS\Core\Crypto\PasswordHashing\Argon2iPasswordHash
Definition: Argon2iPasswordHash.php:31
‪TYPO3\CMS\Core\Tests\Unit\Crypto\PasswordHashing\Argon2iPasswordHashTest\checkPasswordReturnsTrueForHashedPasswordWithNonValidPassword
‪checkPasswordReturnsTrueForHashedPasswordWithNonValidPassword()
Definition: Argon2iPasswordHashTest.php:165
‪TYPO3\CMS\Core\Tests\Unit\Crypto\PasswordHashing\Argon2iPasswordHashTest\setUp
‪setUp()
Definition: Argon2iPasswordHashTest.php:33
‪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:28