diff --git a/src/League/OAuth2/Server/Util/SecureKey.php b/src/League/OAuth2/Server/Util/SecureKey.php index 8ff762c3..cd1fffd5 100644 --- a/src/League/OAuth2/Server/Util/SecureKey.php +++ b/src/League/OAuth2/Server/Util/SecureKey.php @@ -11,11 +11,16 @@ namespace League\OAuth2\Server\Util; +use League\OAuth2\Server\Util\KeyAlgorithm\DefaultAlgorithm; +use League\OAuth2\Server\Util\KeyAlgorithm\KeyAlgorithmInterface; + /** * SecureKey class */ class SecureKey { + protected static $algorithm; + /** * Generate a new unique code * @param integer $len Length of the generated code @@ -23,18 +28,27 @@ class SecureKey */ public static function make($len = 40) { - // We generate twice as many bytes here because we want to ensure we have - // enough after we base64 encode it to get the length we need because we - // take out the "/", "+", and "=" characters. - $bytes = openssl_random_pseudo_bytes($len * 2, $strong); + return self::getAlgorithm()->make($len); + } - // We want to stop execution if the key fails because, well, that is bad. - if ($bytes === false || $strong === false) { - // @codeCoverageIgnoreStart - throw new \Exception('Error Generating Key'); - // @codeCoverageIgnoreEnd + /** + * @param KeyAlgorithmInterface $algorithm + */ + public static function setAlgorithm(KeyAlgorithmInterface $algorithm) + { + self::$algorithm = $algorithm; + } + + /** + * @return KeyAlgorithmInterface + */ + public static function getAlgorithm() + { + if (!self::$algorithm) { + + self::$algorithm = new DefaultAlgorithm(); } - return substr(str_replace(array('/', '+', '='), '', base64_encode($bytes)), 0, $len); + return self::$algorithm; } } \ No newline at end of file diff --git a/tests/util/SecureKeyTest.php b/tests/util/SecureKeyTest.php index 3d60f6db..2ce8659e 100644 --- a/tests/util/SecureKeyTest.php +++ b/tests/util/SecureKeyTest.php @@ -12,4 +12,21 @@ class Secure_Key_test extends PHPUnit_Framework_TestCase $this->assertTrue($v1 !== $v2); $this->assertEquals(50, strlen($v3)); } + + public function test_make_with_different_algorithm() + { + $algorithm = $this->getMock('League\OAuth2\Server\Util\KeyAlgorithm\KeyAlgorithmInterface'); + + $result = 'dasdsdsaads'; + $algorithm + ->expects($this->once()) + ->method('make') + ->with(11) + ->will($this->returnValue($result)) + ; + + League\OAuth2\Server\Util\SecureKey::setAlgorithm($algorithm); + $this->assertSame($algorithm, League\OAuth2\Server\Util\SecureKey::getAlgorithm()); + $this->assertEquals($result, League\OAuth2\Server\Util\SecureKey::make(11)); + } } \ No newline at end of file