Use hash if available

This commit is contained in:
Craig Andrews 2010-08-18 14:07:40 -04:00
parent 05712ae62b
commit 6c02c665f2
4 changed files with 38 additions and 128 deletions

View File

@ -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;
}

View File

@ -1,115 +0,0 @@
<?php
// +----------------------------------------------------------------------+
// | PHP Version 4 |
// +----------------------------------------------------------------------+
// | Copyright (c) 1997-2004 The PHP Group |
// +----------------------------------------------------------------------+
// | This source file is subject to version 3.0 of the PHP license, |
// | that is bundled with this package in the file LICENSE, and is |
// | available at through the world-wide-web at |
// | http://www.php.net/license/3_0.txt. |
// | If you did not receive a copy of the PHP license and are unable to |
// | obtain it through the world-wide-web, please send a note to |
// | license@php.net so we can mail you a copy immediately. |
// +----------------------------------------------------------------------+
// | Authors: Aidan Lister <aidan@php.net> |
// +----------------------------------------------------------------------+
//
// $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 <aidan@php.net>
* @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;
}
}
}
?>

View File

@ -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;
}
}

View File

@ -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);
}
/**