note 109409 added to function.hash-hmac

From: 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

« previous php.notes (#189139) next »