note 109409 added to function.hash-hmac
| From: | relevant at celsius dot ee | Date: | Sat, 14 Jul 2012 12:52:26 +0000 |
| Subject: | note 109409 added to function.hash-hmac | ||
| Groups: | php.notes | ||
| Request: | Send a blank email to php-notes+get-189139@lists.php.net to get a copy of this message | ||
<?php
/* Here is a solution for those who used hash_hmac
with Tiger algorithm in PHP 5.1 - 5.3
and want to upgrade to PHP 5.4 (or newer?).
The problem occured because the order of bytes for Tiger
was changed to big endian since PHP 5.4.0.
The two functions below assert $algo is one of Tiger algorithms,
for example tiger160,4.
*/
# replaces hash('tiger...
function hash_tiger_rev($algo, $data, $raw_output = false) {
$len = intval(substr($algo, 5, 3)); # 128, 160 or 192 bits
$times = substr($algo, 9, 1); # 3 or 4
$revhash = implode("", array_map("strrev",
str_split(hash('tiger192,'.$times, $data, true), 8)));
if ($len < 192) $revhash = substr($revhash, 0, $len >> 3);
return $raw_output? $revhash: bin2hex($revhash);
}
# replaces hash_hmac('tiger...
function hash_hmac_tiger_rev($algo, $data, $key, $raw_output = false) {
if (strlen($key) > 64) $key = hash_tiger_rev($algo, $key);
$key = str_pad($key, 64, chr(0));
$o_pad = str_repeat("\\", 64) ^ $key; # "\" = chr(0x5C)
$i_pad = str_repeat("6", 64) ^ $key; # "6" = chr(0x36)
return hash_tiger_rev($algo, $o_pad .
hash_tiger_rev($algo, $i_pad . $data, true), $raw_output);
}
# always the new version of tiger
function hash_hmac_new($algo, $data, $key, $raw_output = false) {
if (phpversion() > '5.4' || !preg_match('/^tiger(128|160|192),(3|4)$/',
$algo))
return hash_hmac($algo, $data, $key, $raw_output);
else
return hash_hmac_tiger_rev($algo, $data, $key, $raw_output);
}
# always the old version of tiger
function hash_hmac_old($algo, $data, $key, $raw_output = false) {
if (phpversion() < '5.4' || !preg_match('/^tiger(128|160|192),(3|4)$/',
$algo))
return hash_hmac($algo, $data, $key, $raw_output);
else
return hash_hmac_tiger_rev($algo, $data, $key, $raw_output);
}
# let's test it
$algo = 'tiger160,4'; $pwd = 'foo'; $key = 'bar';
echo hash_hmac($algo, $pwd, $key), "<br>";
echo hash_hmac_tiger_rev($algo, $pwd, $key), "<br>";
echo "<br>";
echo hash_hmac_old($algo, $pwd, $key), "<br>";
echo hash_hmac_new($algo, $pwd, $key), "<br>";
/* With PHP 5.4 output would be
590546d9f425188da35e5dfa53306ba3953571cc
bd6664330ed96b9b39ee063241b62e43f546a49d
bd6664330ed96b9b39ee063241b62e43f546a49d
590546d9f425188da35e5dfa53306ba3953571cc
With PHP 5.3
bd6664330ed96b9b39ee063241b62e43f546a49d
590546d9f425188da35e5dfa53306ba3953571cc
bd6664330ed96b9b39ee063241b62e43f546a49d
590546d9f425188da35e5dfa53306ba3953571cc
*/
?>
----
Server IP: 217.146.68.100
Probable Submitter: 82.131.73.54
----
Manual Page -- http://www.php.net/manual/en/function.hash-hmac.php
Edit -- https://master.php.net/note/edit/109409
Del: integrated -- https://master.php.net/note/delete/109409/integrated
Del: useless -- https://master.php.net/note/delete/109409/useless
Del: bad code -- https://master.php.net/note/delete/109409/bad+code
Del: spam -- https://master.php.net/note/delete/109409/spam
Del: non-english -- https://master.php.net/note/delete/109409/non-english
Del: in docs -- https://master.php.net/note/delete/109409/in+docs
Del: other reasons-- https://master.php.net/note/delete/109409
Reject -- https://master.php.net/note/reject/109409
Search -- https://master.php.net/manage/user-notes.php