<?php | |
/** | |
* Created by JetBrains PhpStorm. | |
* User: max | |
* Date: 29-1-14 | |
* Time: 11:55 | |
* To change this template use File | Settings | File Templates. | |
*/ | |
require_once("rc4.php"); | |
require_once("func.php"); | |
class KeyStream | |
{ | |
public static $AuthMethod = "WAUTH-2"; | |
const DROP = 768; | |
private $rc4; | |
private $seq; | |
private $macKey; | |
public function __construct($key, $macKey) | |
{ | |
$this->rc4 = new rc4($key, self::DROP); | |
$this->macKey = $macKey; | |
} | |
public static function GenerateKeys($password, $nonce) | |
{ | |
$array = array( | |
"key", //placeholders | |
"key", | |
"key", | |
"key" | |
); | |
$array2 = array(1, 2, 3, 4); | |
$nonce .= '0'; | |
for ($j = 0; $j < count($array); $j++) { | |
$nonce[(strlen($nonce) - 1)] = chr($array2[$j]); | |
$foo = wa_pbkdf2("sha1", $password, $nonce, 2, 20, true); | |
$array[$j] = $foo; | |
} | |
return $array; | |
} | |
public function DecodeMessage($buffer, $macOffset, $offset, $length) | |
{ | |
$mac = $this->computeMac($buffer, $offset, $length); | |
//validate mac | |
for ($i = 0; $i < 4; $i++) { | |
$foo = ord($buffer[$macOffset + $i]); | |
$bar = ord($mac[$i]); | |
if ($foo !== $bar) { | |
throw new Exception("MAC mismatch: $foo != $bar"); | |
} | |
} | |
return $this->rc4->cipher($buffer, $offset, $length); | |
} | |
public function EncodeMessage($buffer, $macOffset, $offset, $length) | |
{ | |
$data = $this->rc4->cipher($buffer, $offset, $length); | |
$mac = $this->computeMac($data, $offset, $length); | |
return substr($data, 0, $macOffset) . substr($mac, 0, 4) . substr($data, $macOffset + 4); | |
} | |
private function computeMac($buffer, $offset, $length) | |
{ | |
$hmac = hash_init("sha1", HASH_HMAC, $this->macKey); | |
hash_update($hmac, substr($buffer, $offset, $length)); | |
$array = chr($this->seq >> 24) | |
. chr($this->seq >> 16) | |
. chr($this->seq >> 8) | |
. chr($this->seq); | |
hash_update($hmac, $array); | |
$this->seq++; | |
return hash_final($hmac, true); | |
} | |
} |