/** * Generate the new key * * @param string $hash The hash algorithm to be used by HMAC * @param string $password The source password/key * @param string $salt * @param integer $iterations The number of iterations * @param integer $length The output size * @throws Exception\InvalidArgumentException * @return string */ public static function calc($hash, $password, $salt, $iterations, $length) { if (!Hmac::isSupported($hash)) { throw new Exception\InvalidArgumentException("The hash algorithm {$hash} is not supported by " . __CLASS__); } $num = ceil($length / Hmac::getOutputSize($hash, Hmac::OUTPUT_BINARY)); $result = ''; for ($block = 1; $block <= $num; $block++) { $hmac = hash_hmac($hash, $salt . pack('N', $block), $password, Hmac::OUTPUT_BINARY); $mix = $hmac; for ($i = 1; $i < $iterations; $i++) { $hmac = hash_hmac($hash, $hmac, $password, Hmac::OUTPUT_BINARY); $mix ^= $hmac; } $result .= $mix; } return substr($result, 0, $length); }
/** * @test * * @depends createHashMustReturnAHashAccordingWithTheAlgorithm * * @uses \Lcobucci\JWT\Signer\Hmac::createHash * @uses \Lcobucci\JWT\Signer\Key * * @covers \Lcobucci\JWT\Signer\Hmac::doVerify */ public function doVerifyShouldReturnFalseWhenExpectedHashWasNotCreatedWithSameInformation($expected) { self::assertFalse($this->signer->doVerify($expected, 'test', new Key('1234'))); }
/** * @test * * @depends createHashMustReturnAHashAccordingWithTheAlgorithm * * @uses Lcobucci\JWT\Signer\Hmac::createHash * @uses Lcobucci\JWT\Signer\Key * * @covers Lcobucci\JWT\Signer\Hmac::hashEquals */ public function hashEqualsShouldReturnTrueWhenExpectedHashIsEqualsThanGenerated($expected) { $this->assertTrue($this->signer->hashEquals($expected, $this->signer->createHash('test', new Key('123')))); }