From 6c02c665f2eb38a86b61b8bd89a96e039a023552 Mon Sep 17 00:00:00 2001 From: Craig Andrews Date: Wed, 18 Aug 2010 14:07:40 -0400 Subject: [PATCH] Use hash if available --- plugins/Msn/MsnPlugin.php | 3 - plugins/Msn/extlib/compat/mhash.php | 115 ------------------- plugins/Msn/extlib/phpmsnclass/msn.class.php | 43 +++++-- plugins/Msn/msnmanager.php | 5 +- 4 files changed, 38 insertions(+), 128 deletions(-) delete mode 100644 plugins/Msn/extlib/compat/mhash.php diff --git a/plugins/Msn/MsnPlugin.php b/plugins/Msn/MsnPlugin.php index 9e0b76d327..9db3f7763b 100644 --- a/plugins/Msn/MsnPlugin.php +++ b/plugins/Msn/MsnPlugin.php @@ -192,9 +192,6 @@ class MsnPlugin extends ImPlugin { if (!isset($this->nickname)) { throw new Exception("Must specify a nickname"); } - if (!function_exists('mhash')) { - require_once(INSTALLDIR.'/plugins/Msn/extlib/compat/mhash.php'); - } return true; } diff --git a/plugins/Msn/extlib/compat/mhash.php b/plugins/Msn/extlib/compat/mhash.php deleted file mode 100644 index 128c68ee12..0000000000 --- a/plugins/Msn/extlib/compat/mhash.php +++ /dev/null @@ -1,115 +0,0 @@ - | -// +----------------------------------------------------------------------+ -// -// $Id: mhash.php,v 1.1 2005/05/10 07:56:44 aidan Exp $ - - -if (!defined('MHASH_CRC32')) { - define('MHASH_CRC32', 0); -} - -if (!defined('MHASH_MD5')) { - define('MHASH_MD5', 1); -} - -if (!defined('MHASH_SHA1')) { - define('MHASH_SHA1', 2); -} - -if (!defined('MHASH_HAVAL256')) { - define('MHASH_HAVAL256', 3); -} - -if (!defined('MHASH_RIPEMD160')) { - define('MHASH_RIPEMD160', 5); -} - -if (!defined('MHASH_TIGER')) { - define('MHASH_TIGER', 7); -} - -if (!defined('MHASH_GOST')) { - define('MHASH_GOST', 8); -} - -if (!defined('MHASH_CRC32B')) { - define('MHASH_CRC32B', 9); -} - -if (!defined('MHASH_HAVAL192')) { - define('MHASH_HAVAL192', 11); -} - -if (!defined('MHASH_HAVAL160')) { - define('MHASH_HAVAL160', 12); -} - -if (!defined('MHASH_HAVAL128')) { - define('MHASH_HAVAL128', 13); -} - -if (!defined('MHASH_TIGER128')) { - define('MHASH_TIGER128', 14); -} - -if (!defined('MHASH_TIGER160')) { - define('MHASH_TIGER160', 15); -} - -if (!defined('MHASH_MD4')) { - define('MHASH_MD4', 16); -} - -if (!defined('MHASH_SHA256')) { - define('MHASH_SHA256', 17); -} - -if (!defined('MHASH_ADLER32')) { - define('MHASH_ADLER32', 18); -} - - -/** - * Replace mhash() - * - * @category PHP - * @package PHP_Compat - * @link http://php.net/function.mhash - * @author Aidan Lister - * @version $Revision: 1.1 $ - * @since PHP 4.1.0 - * @require PHP 4.0.0 (user_error) - */ -if (!function_exists('mhash')) { - function mhash($hashtype, $data, $key = '') - { - switch ($hashtype) { - case MHASH_MD5: - $key = str_pad((strlen($key) > 64 ? pack("H*", md5($key)) : $key), 64, chr(0x00)); - $k_opad = $key ^ (str_pad('', 64, chr(0x5c))); - $k_ipad = $key ^ (str_pad('', 64, chr(0x36))); - return pack("H*", md5($k_opad . pack("H*", md5($k_ipad . $data)))); - - default: - return false; - - break; - } - } -} - -?> diff --git a/plugins/Msn/extlib/phpmsnclass/msn.class.php b/plugins/Msn/extlib/phpmsnclass/msn.class.php index 9abdce1b61..996c5571c2 100644 --- a/plugins/Msn/extlib/phpmsnclass/msn.class.php +++ b/plugins/Msn/extlib/phpmsnclass/msn.class.php @@ -12,7 +12,7 @@ Documentation on the MSN protocol can be found at: http://msnpiki.msnfanatic.com This class uses MSNP15. In addition to PHP5, the additional php modules required are: -curl pcre mhash mcrypt bcmath +curl pcre mcrypt bcmath */ @@ -156,7 +156,6 @@ class MSN { // Check support if (!function_exists('curl_init')) throw new Exception("curl module not found!\n"); if (!function_exists('preg_match')) throw new Exception("pcre module not found!\n"); - if (!function_exists('mhash')) throw new Exception("mhash module not found!\n"); if (!function_exists('mcrypt_cbc')) throw new Exception("mcrypt module not found!\n"); if (!function_exists('bcmod')) throw new Exception("bcmath module not found!\n"); @@ -486,7 +485,7 @@ class MSN { if(!empty($message)) { $this->debug_message($message); } - $this->callHandler('ConnectFailed'); + $this->callHandler('ConnectFailed', $message); $this->NSRetryWait($this->retry_wait); } @@ -2651,10 +2650,10 @@ X-OIM-Sequence-Num: 1 */ private function derive_key($key, $magic) { - $hash1 = mhash(MHASH_SHA1, $magic, $key); - $hash2 = mhash(MHASH_SHA1, $hash1.$magic, $key); - $hash3 = mhash(MHASH_SHA1, $hash1, $key); - $hash4 = mhash(MHASH_SHA1, $hash3.$magic, $key); + $hash1 = $this->mhash_sha1($magic, $key); + $hash2 = $this->mhash_sha1($hash1.$magic, $key); + $hash3 = $this->mhash_sha1($hash1, $key); + $hash4 = $this->mhash_sha1($hash3.$magic, $key); return $hash2.substr($hash4, 0, 4); } @@ -2664,7 +2663,7 @@ X-OIM-Sequence-Num: 1 $key3 = $this->derive_key($key1, 'WS-SecureConversationSESSION KEY ENCRYPTION'); // get hash of challenge using key2 - $hash = mhash(MHASH_SHA1, $challenge, $key2); + $hash = $this->mhash_sha1($challenge, $key2); // get 8 bytes random data $iv = substr(base64_encode(rand(1000,9999).rand(1000,9999)), 2, 8); @@ -3180,4 +3179,32 @@ X-OIM-Sequence-Num: 1 $buf .= "$h_str $a_str\n"; return $buf; } + + function mhash_sha1($data, $key) + { + if (extension_loaded("mhash")) + return mhash(MHASH_SHA1, $data, $key); + + if (function_exists("hash_hmac")) + return hash_hmac('sha1', $data, $key, true); + + // RFC 2104 HMAC implementation for php. Hacked by Lance Rushing + $b = 64; + if (strlen($key) > $b) + $key = pack("H*", sha1($key)); + $key = str_pad($key, $b, chr(0x00)); + $ipad = str_pad("", $b, chr(0x36)); + $opad = str_pad("", $b, chr(0x5c)); + $k_ipad = $key ^ $ipad ; + $k_opad = $key ^ $opad; + + $sha1_value = sha1($k_opad . pack("H*", sha1($k_ipad . $data))); + + $hash_data = ''; + $str = join('',explode('\x', $sha1_value)); + $len = strlen($str); + for ($i = 0; $i < $len; $i += 2) + $hash_data .= chr(hexdec(substr($str, $i, 2))); + return $hash_data; + } } diff --git a/plugins/Msn/msnmanager.php b/plugins/Msn/msnmanager.php index bd6f6e1fc9..09efa32fae 100644 --- a/plugins/Msn/msnmanager.php +++ b/plugins/Msn/msnmanager.php @@ -204,10 +204,11 @@ class MsnManager extends ImManager { /** * Called by callback to log failure during connect * + * @param string $message error message reported * @return void */ - public function handle_connect_failed() { - common_log(LOG_NOTICE, 'MSN connect failed, retrying'); + public function handle_connect_failed($message) { + common_log(LOG_NOTICE, 'MSN connect failed, retrying: ' . $message); } /**