/** * @brief Constructor * * @param String $algo The algorithm */ public function __construct($algo) { $algo = strtolower($algo); // Check for support if (extension_loaded('hash')) { // We got the hashing support, so let's check if the algorithm is // supported. if (arr::hasValue(hash_algos(), $algo)) { $this->module = self::MOD_HASH; $this->algo = $algo; return; } } if (extension_loaded('mhash')) { // No hash support but mhash support, can it handle the algorithm? $num = mhash_count(); for ($i = 0; $i <= $num; $i++) { if (mhash_get_hash_name($i) == $algo) { $this->module = self::MOD_MHASH; $this->algo = $algo; return; } } } // Fall back on legacy spport here, is the algorithm one of the // by php supported ones? if (arr::hasValue(array('md5', 'sha1', 'crc32'), $algo)) { $this->module = self::MOD_PHP; $this->algo = $algo; return; } // No support, throw exception throw new SecurityException("Request for unsupported hash algorithm"); }
/** * Since MHASH accepts an integer constant representing the hash algorithm * we need to make a small detour to get the correct integer matching our * algorithm's name. * * @param string $hashAlgorithm * @return integer */ protected static function _getMhashDefinition($hashAlgorithm) { for ($i = 0; $i <= mhash_count(); $i++) { $types[mhash_get_hash_name($i)] = $i; } return $types[strtoupper($hashAlgorithm)]; }
function mhash($hashtype, $text, $key) { #-- hash function if (!($func = mhash_get_hash_name($hashtype)) || !function_exists($func)) { return trigger_error("mhash: cannot use hash algorithm #{$hashtype}/{$func}", E_USER_ERROR); } if (!$key) { trigger_error("mhash: called without key", E_USER_WARNING); } #-- params $bsize = mhash_get_block_size($hashtype); // fixed size, 64 #-- pad key if (strlen($key) > $bsize) { // hash key, when it's too long $key = $func($key); $key = pack("H*", $key); // binarify } $key = str_pad($key, $bsize, ""); // fill up with NULs (1) #-- prepare inner and outer padding stream $ipad = str_pad("", $bsize, "6"); // %36 $opad = str_pad("", $bsize, "\\"); // %5C #-- call hash func // php can XOR strings for us $dgst = pack("H*", $func(($key ^ $ipad) . $text)); // (2,3,4) $dgst = pack("H*", $func(($key ^ $opad) . $dgst)); // (5,6,7) return $dgst; }
<?php $supported_hash_al = array("MD5" => 16, "MD4" => 16, "SHA1" => 20, "SHA256" => 32, "HAVAL256" => 32, "HAVAL192" => 24, "HAVAL224" => 28, "HAVAL160" => 20, "HAVAL128" => 16, "RIPEMD160" => 20, "GOST" => 32, "TIGER" => 24, "TIGER160" => 20, "TIGER128" => 16, "CRC32" => 4, "CRC32B" => 4, "ADLER32" => 4, "NA_XYZ" => 0); $hc = mhash_count() + 1; $known_hash_al = array(); for ($i = 0; $i < $hc; $i++) { $known_hash_al[mhash_get_hash_name($i)] = $i; } foreach ($supported_hash_al as $name => $len) { if (array_key_exists($name, $known_hash_al)) { $len = mhash_get_block_size($known_hash_al[$name]); echo "{$name} = {$len}\n"; } else { echo "{$name} ? {$len}\n"; } }
require_once FREEBEER_BASE . '/lib/Mhash.php'; echo html_header_demo('fbMhash Class (mhash() Emulation)'); $data = 'data'; $key = 'key'; echo "<pre>\n"; echo "mhash(MHASH_MD5, '{$data}', '{$key}')=", mhash(MHASH_MD5, $data, $key), "\n"; echo "bin2hex(mhash(MHASH_MD5, '{$data}', '{$key}'))= ", bin2hex(mhash(MHASH_MD5, $data, $key)), "\n"; if (class_exists('fbMhash')) { echo "fbMhash::mhashhex(MHASH_MD5, '{$data}', '{$key}')=", fbMhash::mhashhex(MHASH_MD5, $data, $key), "\n"; } if (defined('MHASH_SHA1')) { echo "mhash(MHASH_SHA1, '{$data}', '{$key}')=", mhash(MHASH_SHA1, $data, $key), "\n"; echo "bin2hex(mhash(MHASH_SHA1, '{$data}', '{$key}'))= ", bin2hex(mhash(MHASH_SHA1, $data, $key)), "\n"; if (class_exists('fbMhash')) { echo "fbMhash::mhashhex(MHASH_SHA1, '{$data}', '{$key}')=", fbMhash::mhashhex(MHASH_SHA1, $data, $key), "\n"; } } $hash_map = array(0 => 'MHASH_CRC32', 9 => 'MHASH_CRC32B', 8 => 'MHASH_GOST', 13 => 'MHASH_HAVAL128', 12 => 'MHASH_HAVAL160', 11 => 'MHASH_HAVAL192', 10 => 'MHASH_HAVAL224', 3 => 'MHASH_HAVAL256', 16 => 'MHASH_MD4', 1 => 'MHASH_MD5', 5 => 'MHASH_RIPEMD160', 2 => 'MHASH_SHA1', 17 => 'MHASH_SHA256', 7 => 'MHASH_TIGER', 14 => 'MHASH_TIGER128', 15 => 'MHASH_TIGER160'); $nr = mhash_count(); for ($i = 0; $i < $nr; $i++) { echo sprintf("The blocksize of %s is %d\n", mhash_get_hash_name($i), mhash_get_block_size($i)); } ?> </pre> <address> $CVSHeader: _freebeer/www/demo/Mhash.php,v 1.2 2004/03/07 17:51:33 ross Exp $ </address> </body> </html>