1
0
mirror of https://github.com/phpbb/phpbb.git synced 2025-07-31 14:00:31 +02:00

[feature/passwords] Move files after namespacing changes

PHPBB3-11610
This commit is contained in:
Marc Alexander
2013-07-19 20:49:24 +02:00
parent 2e453eb2cb
commit 9b24fda5cd
10 changed files with 5 additions and 5 deletions

View File

@@ -0,0 +1,47 @@
<?php
/**
*
* @package phpBB3
* @copyright (c) 2013 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
/**
* @ignore
*/
if (!defined('IN_PHPBB'))
{
exit;
}
/**
* @package crypto
*/
abstract class phpbb_crypto_driver_base implements phpbb_crypto_driver_interface
{
/** @var phpbb_config */
protected $config;
/** @var phpbb_crypto_driver_helper */
protected $helper;
/**
* Constructor of crypto driver object
*
* @return string Hash prefix
*/
public function __construct(phpbb_config $config)
{
$this->config = $config;
$this->helper = new phpbb_crypto_driver_helper($this);
}
/**
* @inheritdoc
*/
public function is_supported()
{
return true;
}
}

View File

@@ -0,0 +1,108 @@
<?php
/**
*
* @package phpBB3
* @copyright (c) 2013 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
/**
* @ignore
*/
if (!defined('IN_PHPBB'))
{
exit;
}
/**
* @package crypto
*/
class phpbb_crypto_driver_bcrypt extends phpbb_crypto_driver_base
{
const PREFIX = '$2a$';
/**
* @inheritdoc
*/
public function get_prefix()
{
return self::PREFIX;
}
/**
* @inheritdoc
*/
public function get_type()
{
return get_class($this);
}
/**
* @inheritdoc
*/
public function hash($password, $salt = '')
{
// The 2x and 2y prefixes of bcrypt might not be supported
// Revert to 2a if this is the case
$prefix = (!$this->is_supported()) ? '$2a$' : $this->get_prefix();
if ($salt == '')
{
$salt = $prefix . '10$' . $this->get_random_salt();
}
$hash = crypt($password, $salt);
if (strlen($hash) < 60)
{
return false;
}
return $hash;
}
/**
* @inheritdoc
*/
public function check($password, $hash)
{
$salt = substr($hash, 0, 29);
if (strlen($salt) != 29)
{
return false;
}
if ($hash == $this->hash($password, $salt))
{
return true;
}
return false;
}
/**
* Get a random salt value with a length of 22 characters
*
* @return string Salt for password hashing
*/
protected function get_random_salt()
{
return $this->helper->hash_encode64($this->helper->get_random_salt(22), 22);
}
/**
* @inheritdoc
*/
public function get_settings_only($hash, $full = false)
{
if ($full)
{
$pos = stripos($hash, '$', 1) + 1;
$length = 22 + (strripos($hash, '$') + 1 - $pos);
}
else
{
$pos = strripos($hash, '$') + 1;
$length = 22;
}
return substr($hash, $pos, $length);
}
}

View File

@@ -0,0 +1,48 @@
<?php
/**
*
* @package phpBB3
* @copyright (c) 2013 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
/**
* @ignore
*/
if (!defined('IN_PHPBB'))
{
exit;
}
/**
* @package crypto
*/
class phpbb_crypto_driver_bcrypt_2y extends phpbb_crypto_driver_bcrypt
{
const PREFIX = '$2y$';
/**
* @inheritdoc
*/
public function get_prefix()
{
return self::PREFIX;
}
/**
* @inheritdoc
*/
public function get_type()
{
return get_class($this);
}
/**
* @inheritdoc
*/
public function is_supported()
{
return (version_compare(PHP_VERSION, '5.3.7', '<')) ? false : true;
}
}

View File

@@ -0,0 +1,143 @@
<?php
/**
*
* @package phpBB3
* @copyright (c) 2013 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
/**
* @ignore
*/
if (!defined('IN_PHPBB'))
{
exit;
}
/**
* @package crypto
*/
class phpbb_crypto_driver_helper
{
/** @var phpbb_config */
protected $driver;
/**
* base64 alphabet
* @var string
*/
public $itoa64 = './0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
/**
* Constructor of crypto driver helper object
*/
public function __construct($driver)
{
$this->driver = $driver;
}
/**
* Base64 encode hash
*
* @param string $input Input string
* @param int $count Input string length
*
* @return string base64 encoded string
*/
public function hash_encode64($input, $count)
{
$output = '';
$i = 0;
do
{
$value = ord($input[$i++]);
$output .= $this->itoa64[$value & 0x3f];
if ($i < $count)
{
$value |= ord($input[$i]) << 8;
}
$output .= $this->itoa64[($value >> 6) & 0x3f];
if ($i++ >= $count)
{
break;
}
if ($i < $count)
{
$value |= ord($input[$i]) << 16;
}
$output .= $this->itoa64[($value >> 12) & 0x3f];
if ($i++ >= $count)
{
break;
}
$output .= $this->itoa64[($value >> 18) & 0x3f];
}
while ($i < $count);
return $output;
}
/**
* Return unique id
* @param string $extra additional entropy
*
* @return string Unique id
*/
public function unique_id($extra = 'c')
{
static $dss_seeded = false;
global $config;
$val = $config['rand_seed'] . microtime();
$val = md5($val);
$config['rand_seed'] = md5($config['rand_seed'] . $val . $extra);
if ($dss_seeded !== true && ($config['rand_seed_last_update'] < time() - rand(1,10)))
{
set_config('rand_seed_last_update', time(), true);
set_config('rand_seed', $config['rand_seed'], true);
$dss_seeded = true;
}
return substr($val, 4, 16);
}
/**
* Get random salt with specified length
*
* @param int $length Salt length
*/
public function get_random_salt($length)
{
$random = '';
if (($fh = @fopen('/dev/urandom', 'rb')))
{
$random = fread($fh, $length);
fclose($fh);
}
if (strlen($random) < $length)
{
$random = '';
$random_state = $this->unique_id();
for ($i = 0; $i < $length; $i += 16)
{
$random_state = md5($this->unique_id() . $random_state);
$random .= pack('H*', md5($random_state));
}
$random = substr($random, 0, $length);
}
return $random;
}
}

View File

@@ -0,0 +1,68 @@
<?php
/**
*
* @package phpBB3
* @copyright (c) 2013 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
/**
* @ignore
*/
if (!defined('IN_PHPBB'))
{
exit;
}
/**
* @package crypto
*/
interface phpbb_crypto_driver_interface
{
/**
* Check if hash type is supported
*
* @return bool True if supported, false if not
*/
public function is_supported();
/**
* Returns the hash prefix
*
* @return string Hash prefix
*/
public function get_prefix();
/**
* Returns the name of the hash type
*
* @return string Hash type of driver
*/
public function get_type();
/**
* Hash the password
*
* @return string Password hash
*/
public function hash($password);
/**
* Check the password against the supplied hash
*
* @param string $password The password to check
* @param string $hash The password hash to check against
* @return bool True if password is correct, else false
*/
public function check($password, $hash);
/**
* Get only the settings of the specified hash
*
* @param string $hash Password hash
* @param bool $full Return full settings or only settings
* related to the salt
* @return string String containing the hash settings
*/
public function get_settings_only($hash, $full = false);
}

View File

@@ -0,0 +1,40 @@
<?php
/**
*
* @package phpBB3
* @copyright (c) 2013 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
/**
* @ignore
*/
if (!defined('IN_PHPBB'))
{
exit;
}
/**
* @package crypto
*/
class phpbb_crypto_driver_phpass extends phpbb_crypto_driver_salted_md5
{
const PREFIX = '$P$';
/**
* @inheritdoc
*/
public function get_prefix()
{
return self::PREFIX;
}
/**
* @inheritdoc
*/
public function get_type()
{
return get_class($this);
}
}

View File

@@ -0,0 +1,152 @@
<?php
/**
*
* @package phpBB3
* @copyright (c) 2013 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
/**
* @ignore
*/
if (!defined('IN_PHPBB'))
{
exit;
}
/**
* @package crypto
*/
class phpbb_crypto_driver_salted_md5 extends phpbb_crypto_driver_base
{
const PREFIX = '$H$';
/**
* @inheritdoc
*/
public function get_prefix()
{
return self::PREFIX;
}
/**
* @inheritdoc
*/
public function get_type()
{
return get_class($this);
}
/**
* @inheritdoc
*/
public function hash($password, $setting = '')
{
if ($setting != '')
{
if (($settings = $this->get_hash_settings($setting)) === false)
{
return false;
}
}
else
{
if (($settings = $this->get_hash_settings($this->generate_salt())) === false)
{
return false;
}
}
$hash = md5($settings['salt'] . $password, true);
do
{
$hash = md5($hash . $password, true);
}
while (--$settings['count']);
$output = $settings['full'];
$output .= $this->helper->hash_encode64($hash, 16);
if (strlen($output) == 34)
{
return $output;
}
// Should we really just return the md5 of the password? O.o
return md5($password);
}
/**
* @inheritdoc
*/
public function check($password, $hash)
{
if (strlen($hash) !== 34)
{
return (md5($password) === $hash) ? true : false;
}
// No need to check prefix, already did that in manage
if ($hash === $this->hash($password, $hash))
{
return true;
}
return false;
}
/**
* Generate salt for hashing method
*
* @return string Salt for hashing method
*/
protected function generate_salt()
{
$salt = '';
$random = '';
$count = 6;
$random = $this->helper->get_random_salt($count);
$salt = $this->get_prefix();
$salt .= $this->helper->itoa64[min($count + 5, 30)];
$salt .= $this->helper->hash_encode64($random, $count);
return $salt;
}
/**
* Get hash settings
*
* @return array Array containing the count_log2, salt, and full hash
* settings string
*/
public function get_hash_settings($hash)
{
if (empty($hash))
{
return false;
}
$count_log2 = strpos($this->helper->itoa64, $hash[3]);
$salt = substr($hash, 4, 8);
if ($count_log2 < 7 || $count_log2 > 30 || strlen($salt) != 8)
{
return false;
}
return array(
'count' => 1 << $count_log2,
'salt' => $salt,
'full' => substr($hash, 0, 12),
);
}
/**
* @inheritdoc
*/
public function get_settings_only($hash, $full = false)
{
return substr($hash, 3, 9);
}
}