285 lines
14 KiB
PHP
Executable File
285 lines
14 KiB
PHP
Executable File
<?php
|
||
set_include_path(get_include_path() . PATH_SEPARATOR . dirname(__FILE__) . DIRECTORY_SEPARATOR . 'libpy2php');
|
||
require_once ('libpy2php.php');
|
||
require_once ('os_path.php');
|
||
require_once ('crypt.php');
|
||
require_once ('prime.php');
|
||
require_once ('TL.php');
|
||
function newcrc32($data) {
|
||
return crc32($data) & 4294967295;
|
||
}
|
||
/**
|
||
* Function to visualize byte streams. Split into bytes, print to console.
|
||
* :param bs: BYTE STRING
|
||
*/
|
||
define('BIG_ENDIAN', pack('L', 1) === pack('N', 1));
|
||
function pack_le($format, ...$n) {
|
||
$res = "";
|
||
foreach ($n as $key => $curn) {
|
||
if (BIG_ENDIAN) {
|
||
$res .= strrev(pack($format[$key], $curn));
|
||
}
|
||
$res .= pack($format[$key], $curn);
|
||
}
|
||
return $res;
|
||
}
|
||
function vis($bs) {
|
||
$bs = bytearray($bs);
|
||
$symbols_in_one_line = 8;
|
||
$n = floor(count($bs) / $symbols_in_one_line);
|
||
$i = 0;
|
||
foreach (pyjslib_range($n) as $i) {
|
||
pyjslib_printnl(
|
||
join(pyjslib_str(($i * $symbols_in_one_line)) . ' | ' . ' ',
|
||
array_map(function($el) { return "%02X" % $el; }, array_slice($bs,$i*$symbols_in_one_line, ($i+1)*$symbols_in_one_line))
|
||
));
|
||
}
|
||
if (!(((count($bs) % $symbols_in_one_line) == 0))) {
|
||
pyjslib_printnl(join(pyjslib_str((($i + 1) * $symbols_in_one_line)) . ' | ' . ' ',
|
||
array_map(function($el) { return "%02X" % $el; }, array_slice($bs, ($i+1)*$symbols_in_one_line), null)
|
||
) . '
|
||
');
|
||
}
|
||
}
|
||
/**
|
||
* bytes_to_long(string) : long
|
||
* Convert a byte string to a long integer.
|
||
* This is (essentially) the inverse of long_to_bytes().
|
||
*/
|
||
function bytes_to_long($s) {
|
||
$acc = 0;
|
||
$length = count($s);
|
||
if (($length % 4)) {
|
||
$extra = (4 - ($length % 4));
|
||
$s = (($b('') * $extra) + $s);
|
||
$length = ($length + $extra);
|
||
}
|
||
foreach( pyjslib_range(0, $length, 4) as $i ) {
|
||
$acc = ($acc << 32 + unpack('I', array_slice($s, $i, ($i + 4) - $i))[0]);
|
||
}
|
||
return $acc;
|
||
}
|
||
|
||
function fread_all($handle) {
|
||
$pos = ftell($handle);
|
||
fseek($handle, 0);
|
||
$content = fread($handle, fstat($handle)["size"]);
|
||
fseek($handle, $pos);
|
||
return $content;
|
||
}
|
||
|
||
/**
|
||
* long_to_bytes(n:long, blocksize:int) : string
|
||
* Convert a long integer to a byte string.
|
||
* If optional blocksize is given and greater than zero, pad the front of the
|
||
* byte string with binary zeros so that the length is a multiple of
|
||
* blocksize.
|
||
*/
|
||
function long_to_bytes($n,$blocksize=0) {
|
||
$s = $b('');
|
||
$n = long($n);
|
||
while (($n > 0)) {
|
||
$s = (pack('>I', $n & 4294967295) + $s);
|
||
$n = $n >> 32;
|
||
}
|
||
foreach( pyjslib_range(count($s)) as $i ) {
|
||
if (($s[$i] != $b('')[0])) {
|
||
break;
|
||
}
|
||
}
|
||
$s = array_slice($s, $i, null);
|
||
if (($blocksize > 0) && (count($s) % $blocksize)) {
|
||
$s = ((($blocksize - (count($s) % $blocksize)) * $b('')) + $s);
|
||
}
|
||
return $s;
|
||
}
|
||
/**
|
||
* Manages TCP Transport. encryption and message frames
|
||
*/
|
||
class Session {
|
||
function __construct($ip, $port, $auth_key = null, $server_salt = null) {
|
||
$this->sock = fsockopen($ip, $port);
|
||
$this->number = 0;
|
||
$this->timedelta = 0;
|
||
$this->session_id = random_bytes(8);
|
||
$this->auth_key = $auth_key;
|
||
$this->auth_key_id = $this->auth_key ? array_slice(sha1($this->auth_key, true), -8, null) : null;
|
||
stream_set_timeout($this->sock, 5.0);
|
||
$this->MAX_RETRY = 5;
|
||
$this->AUTH_MAX_RETRY = 5;
|
||
}
|
||
function __del__() {
|
||
fclose($this->sock);
|
||
}
|
||
/**
|
||
* Forming the message frame and sending message to server
|
||
* :param message: byte string to send
|
||
*/
|
||
function send_message($message_data) {
|
||
$message_id = pack_le('Q', (pyjslib_int(((time() + $this->timedelta) * pow(2, 30))) * 4));
|
||
var_dump($message_data);
|
||
if (($this->auth_key == null) || ($this->server_salt == null)) {
|
||
$message = ' |