mirror of
https://github.com/tuxis-ie/nsedit.git
synced 2025-04-19 20:09:14 +03:00
Create a hash_pbkdf2 function if it doesn't exist yet
This commit is contained in:
parent
a2315bdaa4
commit
f7cdad0b78
1 changed files with 86 additions and 0 deletions
|
@ -176,4 +176,90 @@ function user_template_names() {
|
|||
return $templatenames;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* This function was taken from https://gist.github.com/rsky/5104756 to make
|
||||
it available on older php versions. Thanks! */
|
||||
|
||||
if (!function_exists(hash_pbkdf2)) {
|
||||
function hash_pbkdf2($algo, $password, $salt, $iterations, $length = 0, $rawOutput = false) {
|
||||
// check for hashing algorithm
|
||||
if (!in_array(strtolower($algo), hash_algos())) {
|
||||
trigger_error(sprintf(
|
||||
'%s(): Unknown hashing algorithm: %s',
|
||||
__FUNCTION__, $algo
|
||||
), E_USER_WARNING);
|
||||
return false;
|
||||
}
|
||||
|
||||
// check for type of iterations and length
|
||||
foreach (array(4 => $iterations, 5 => $length) as $index => $value) {
|
||||
if (!is_numeric($value)) {
|
||||
trigger_error(sprintf(
|
||||
'%s() expects parameter %d to be long, %s given',
|
||||
__FUNCTION__, $index, gettype($value)
|
||||
), E_USER_WARNING);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
// check iterations
|
||||
$iterations = (int)$iterations;
|
||||
if ($iterations <= 0) {
|
||||
trigger_error(sprintf(
|
||||
'%s(): Iterations must be a positive integer: %d',
|
||||
__FUNCTION__, $iterations
|
||||
), E_USER_WARNING);
|
||||
return false;
|
||||
}
|
||||
|
||||
// check length
|
||||
$length = (int)$length;
|
||||
if ($length < 0) {
|
||||
trigger_error(sprintf(
|
||||
'%s(): Iterations must be greater than or equal to 0: %d',
|
||||
__FUNCTION__, $length
|
||||
), E_USER_WARNING);
|
||||
return false;
|
||||
}
|
||||
|
||||
// check salt
|
||||
if (strlen($salt) > PHP_INT_MAX - 4) {
|
||||
trigger_error(sprintf(
|
||||
'%s(): Supplied salt is too long, max of INT_MAX - 4 bytes: %d supplied',
|
||||
__FUNCTION__, strlen($salt)
|
||||
), E_USER_WARNING);
|
||||
return false;
|
||||
}
|
||||
|
||||
// initialize
|
||||
$derivedKey = '';
|
||||
$loops = 1;
|
||||
if ($length > 0) {
|
||||
$loops = (int)ceil($length / strlen(hash($algo, '', $rawOutput)));
|
||||
}
|
||||
|
||||
// hash for each blocks
|
||||
for ($i = 1; $i <= $loops; $i++) {
|
||||
$digest = hash_hmac($algo, $salt . pack('N', $i), $password, true);
|
||||
$block = $digest;
|
||||
for ($j = 1; $j < $iterations; $j++) {
|
||||
$digest = hash_hmac($algo, $digest, $password, true);
|
||||
$block ^= $digest;
|
||||
}
|
||||
$derivedKey .= $block;
|
||||
}
|
||||
|
||||
if (!$rawOutput) {
|
||||
$derivedKey = bin2hex($derivedKey);
|
||||
}
|
||||
|
||||
if ($length > 0) {
|
||||
return substr($derivedKey, 0, $length);
|
||||
}
|
||||
|
||||
return $derivedKey;
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
|
|
Loading…
Add table
Reference in a new issue