mirror of
https://github.com/danog/MadelineProto.git
synced 2024-11-26 23:14:38 +01:00
Fixed serialization of vectors, written bind_temp_auth_key function
This commit is contained in:
parent
d1e7cce35b
commit
7b468c9d0d
@ -34,9 +34,9 @@ src/danog/MadelineProto/
|
|||||||
DataCenter - Handles mtproto datacenters
|
DataCenter - Handles mtproto datacenters
|
||||||
DebugTools - Various debugging tools
|
DebugTools - Various debugging tools
|
||||||
Exception - Handles exceptions in the main namespace
|
Exception - Handles exceptions in the main namespace
|
||||||
MTProto - Extends MTProtoTools, handles initial connection, generation of authorization keys, istantiation of classes
|
MTProto - Extends MTProtoTools, handles initial connection, generation of authorization keys, istantiation of classes, writing of client info
|
||||||
MTProtoTools - Extends all of the classes in MTProtoTools/
|
MTProtoTools - Extends all of the classes in MTProtoTools/
|
||||||
prime.py - prime module (python) for p and q generation
|
prime.py and getpq.py - prime module (python) for p and q generation
|
||||||
PrimeModule.php - prime module (php) for p and q generation by wrapping the python module, using wolfram alpha or a built in PHP engine
|
PrimeModule.php - prime module (php) for p and q generation by wrapping the python module, using wolfram alpha or a built in PHP engine
|
||||||
RSA - Handles RSA public keys and signatures
|
RSA - Handles RSA public keys and signatures
|
||||||
Tools - Various tools (positive modulus, string2bin, python-like range)
|
Tools - Various tools (positive modulus, string2bin, python-like range)
|
||||||
|
@ -115,9 +115,13 @@ Slv8kg9qv1m6XHVQY3PnEw+QQtqSIXklHwIDAQAB
|
|||||||
$this->connection->dc_connect(2);
|
$this->connection->dc_connect(2);
|
||||||
|
|
||||||
// Load rsa key
|
// Load rsa key
|
||||||
|
$this->log->log('Loading RSA key...');
|
||||||
$this->key = new RSA($settings['authorization']['rsa_key']);
|
$this->key = new RSA($settings['authorization']['rsa_key']);
|
||||||
|
|
||||||
// Istantiate struct class
|
// Istantiate struct class
|
||||||
|
$this->log->log('Initializing StructTools...');
|
||||||
$this->struct = new \danog\PHP\StructTools();
|
$this->struct = new \danog\PHP\StructTools();
|
||||||
|
|
||||||
// Istantiate TL class
|
// Istantiate TL class
|
||||||
$this->log->log('Translating tl schemas...');
|
$this->log->log('Translating tl schemas...');
|
||||||
$this->tl = new TL\TL($this->settings['tl_schema']['src']);
|
$this->tl = new TL\TL($this->settings['tl_schema']['src']);
|
||||||
@ -130,11 +134,14 @@ Slv8kg9qv1m6XHVQY3PnEw+QQtqSIXklHwIDAQAB
|
|||||||
|
|
||||||
if ($this->settings['authorization']['temp_auth_key'] == null || $this->settings['authorization']['auth_key'] == null) {
|
if ($this->settings['authorization']['temp_auth_key'] == null || $this->settings['authorization']['auth_key'] == null) {
|
||||||
if ($this->settings['authorization']['auth_key'] == null) {
|
if ($this->settings['authorization']['auth_key'] == null) {
|
||||||
|
$this->log->log('Generating permanent authorization key...');
|
||||||
$this->settings['authorization']['auth_key'] = $this->create_auth_key(-1);
|
$this->settings['authorization']['auth_key'] = $this->create_auth_key(-1);
|
||||||
}
|
}
|
||||||
|
$this->log->log('Generating temporary authorization key...');
|
||||||
$this->settings['authorization']['temp_auth_key'] = $this->create_auth_key($this->settings['authorization']['default_temp_auth_key_expires_in']);
|
$this->settings['authorization']['temp_auth_key'] = $this->create_auth_key($this->settings['authorization']['default_temp_auth_key_expires_in']);
|
||||||
}
|
}
|
||||||
$this->write_client_info();
|
$this->write_client_info();
|
||||||
|
$this->bind_temp_auth_key($this->settings['authorization']['default_temp_auth_key_expires_in']);
|
||||||
$nearestDc = $this->method_call('auth.sendCode', [
|
$nearestDc = $this->method_call('auth.sendCode', [
|
||||||
'phone_number' => '393373737',
|
'phone_number' => '393373737',
|
||||||
'sms_type' => 5,
|
'sms_type' => 5,
|
||||||
@ -146,6 +153,7 @@ var_dump($nearestDc);
|
|||||||
}
|
}
|
||||||
|
|
||||||
public function write_client_info() {
|
public function write_client_info() {
|
||||||
|
$this->log->log('Writing client info...');
|
||||||
$nearestDc = $this->method_call('invokeWithLayer', [
|
$nearestDc = $this->method_call('invokeWithLayer', [
|
||||||
'layer' => $this->settings['tl_schema']['layer'],
|
'layer' => $this->settings['tl_schema']['layer'],
|
||||||
'query' => $this->tl->serialize_method('initConnection',
|
'query' => $this->tl->serialize_method('initConnection',
|
||||||
|
@ -458,9 +458,35 @@ class AuthKeyHandler extends AckHandler
|
|||||||
|
|
||||||
throw new Exception('Auth Failed');
|
throw new Exception('Auth Failed');
|
||||||
}
|
}
|
||||||
public function bind_temp_auth_key($expires_in = 86400) {
|
public function bind_temp_auth_key($expires_in) {
|
||||||
$nonce = $this->struct->unpack('<q', \phpseclib\Crypt\Random::string(8));
|
$nonce = $this->struct->unpack('<q', \phpseclib\Crypt\Random::string(8))[0];
|
||||||
$expires_at = time() + $expires_in;
|
$expires_at = time() + $expires_in;
|
||||||
|
$temp_auth_key_id = $this->struct->unpack('<q', $this->settings['authorization']['temp_auth_key']['id'])[0];
|
||||||
|
$perm_auth_key_id= $this->struct->unpack('<q', $this->settings['authorization']['auth_key']['id'])[0];
|
||||||
|
$temp_session_id = $this->struct->unpack('<q', $this->settings['authorization']['session_id'])[0];
|
||||||
|
$message_data = $this->tl->serialize_obj('bind_auth_key_inner',
|
||||||
|
[
|
||||||
|
'nonce' => $nonce,
|
||||||
|
'temp_auth_key_id' => $temp_auth_key_id,
|
||||||
|
'perm_auth_key_id' => $perm_auth_key_id,
|
||||||
|
'temp_session_id' => $temp_session_id,
|
||||||
|
'expires_at' => $expires_at,
|
||||||
|
]
|
||||||
|
);
|
||||||
|
$int_message_id = $this->generate_message_id();
|
||||||
|
$message_id = $this->struct->pack('<Q', $int_message_id);
|
||||||
|
$seq_no = 0;
|
||||||
|
$encrypted_data = \phpseclib\Crypt\Random::string(16).$message_id.$this->struct->pack('<II', $seq_no, strlen($message_data)).$message_data;
|
||||||
|
$message_key = substr(sha1($encrypted_data, true), -16);
|
||||||
|
$padding = \phpseclib\Crypt\Random::string($this->posmod(-strlen($encrypted_data), 16));
|
||||||
|
list($aes_key, $aes_iv) = $this->aes_calculate($message_key, $this->settings['authorization']['auth_key']['auth_key']);
|
||||||
|
$encrypted_message = $this->settings['authorization']['auth_key']['id'].$message_key.$this->ige_encrypt($encrypted_data.$padding, $aes_key, $aes_iv);
|
||||||
|
|
||||||
|
if ($this->method_call('auth.bindTempAuthKey', ['perm_auth_key_id' => $perm_auth_key_id, 'nonce' => $nonce, 'expires_at' => $expires_at, 'encrypted_message' => $encrypted_message])) {
|
||||||
|
$this->log->log('Successfully binded temporary and permanent authorization keys.');
|
||||||
|
$this->write_client_info();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
throw new Exception('An error occurred while binding temporary and permanent authorization keys.');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -14,13 +14,13 @@ namespace danog\MadelineProto\MTProtoTools;
|
|||||||
|
|
||||||
class Crypt extends CallHandler
|
class Crypt extends CallHandler
|
||||||
{
|
{
|
||||||
public function aes_calculate($msg_key, $direction = 'to server')
|
public function aes_calculate($msg_key, $auth_key, $direction = 'to server')
|
||||||
{
|
{
|
||||||
$x = ($direction == 'to server') ? 0 : 8;
|
$x = ($direction == 'to server') ? 0 : 8;
|
||||||
$sha1_a = sha1($msg_key.substr($this->settings['authorization']['temp_auth_key']['auth_key'], $x, ($x + 32) - $x), true);
|
$sha1_a = sha1($msg_key.substr($auth_key, $x, ($x + 32) - $x), true);
|
||||||
$sha1_b = sha1(substr($this->settings['authorization']['temp_auth_key']['auth_key'], ($x + 32), ($x + 48) - ($x + 32)).$msg_key.substr($this->settings['authorization']['temp_auth_key']['auth_key'], (48 + $x), (64 + $x) - (48 + $x)), true);
|
$sha1_b = sha1(substr($auth_key, ($x + 32), ($x + 48) - ($x + 32)).$msg_key.substr($auth_key, (48 + $x), (64 + $x) - (48 + $x)), true);
|
||||||
$sha1_c = sha1(substr($this->settings['authorization']['temp_auth_key']['auth_key'], ($x + 64), ($x + 96) - ($x + 64)).$msg_key, true);
|
$sha1_c = sha1(substr($auth_key, ($x + 64), ($x + 96) - ($x + 64)).$msg_key, true);
|
||||||
$sha1_d = sha1($msg_key.substr($this->settings['authorization']['temp_auth_key']['auth_key'], ($x + 96), ($x + 128) - ($x + 96)), true);
|
$sha1_d = sha1($msg_key.substr($auth_key, ($x + 96), ($x + 128) - ($x + 96)), true);
|
||||||
$aes_key = substr($sha1_a, 0, 8 - 0).substr($sha1_b, 8, 20 - 8).substr($sha1_c, 4, 16 - 4);
|
$aes_key = substr($sha1_a, 0, 8 - 0).substr($sha1_b, 8, 20 - 8).substr($sha1_c, 4, 16 - 4);
|
||||||
$aes_iv = substr($sha1_a, 8, 20 - 8).substr($sha1_b, 0, 8 - 0).substr($sha1_c, 16, 20 - 16).substr($sha1_d, 0, 8 - 0);
|
$aes_iv = substr($sha1_a, 8, 20 - 8).substr($sha1_b, 0, 8 - 0).substr($sha1_c, 16, 20 - 16).substr($sha1_d, 0, 8 - 0);
|
||||||
|
|
||||||
|
@ -32,7 +32,7 @@ class MessageHandler extends Crypt
|
|||||||
$encrypted_data = $this->struct->pack('<q', $this->settings['authorization']['temp_auth_key']['server_salt']).$this->settings['authorization']['session_id'].$message_id.$this->struct->pack('<II', $seq_no, strlen($message_data)).$message_data;
|
$encrypted_data = $this->struct->pack('<q', $this->settings['authorization']['temp_auth_key']['server_salt']).$this->settings['authorization']['session_id'].$message_id.$this->struct->pack('<II', $seq_no, strlen($message_data)).$message_data;
|
||||||
$message_key = substr(sha1($encrypted_data, true), -16);
|
$message_key = substr(sha1($encrypted_data, true), -16);
|
||||||
$padding = \phpseclib\Crypt\Random::string($this->posmod(-strlen($encrypted_data), 16));
|
$padding = \phpseclib\Crypt\Random::string($this->posmod(-strlen($encrypted_data), 16));
|
||||||
list($aes_key, $aes_iv) = $this->aes_calculate($message_key);
|
list($aes_key, $aes_iv) = $this->aes_calculate($message_key, $this->settings['authorization']['temp_auth_key']['auth_key']);
|
||||||
$message = $this->settings['authorization']['temp_auth_key']['id'].$message_key.$this->ige_encrypt($encrypted_data.$padding, $aes_key, $aes_iv);
|
$message = $this->settings['authorization']['temp_auth_key']['id'].$message_key.$this->ige_encrypt($encrypted_data.$padding, $aes_key, $aes_iv);
|
||||||
$this->outgoing_messages[$int_message_id]['seq_no'] = $seq_no;
|
$this->outgoing_messages[$int_message_id]['seq_no'] = $seq_no;
|
||||||
}
|
}
|
||||||
@ -58,7 +58,7 @@ class MessageHandler extends Crypt
|
|||||||
} elseif ($auth_key_id == $this->settings['authorization']['temp_auth_key']['id']) {
|
} elseif ($auth_key_id == $this->settings['authorization']['temp_auth_key']['id']) {
|
||||||
$message_key = fread($payload, 16);
|
$message_key = fread($payload, 16);
|
||||||
$encrypted_data = stream_get_contents($payload);
|
$encrypted_data = stream_get_contents($payload);
|
||||||
list($aes_key, $aes_iv) = $this->aes_calculate($message_key, 'from server');
|
list($aes_key, $aes_iv) = $this->aes_calculate($message_key, $this->settings['authorization']['temp_auth_key']['auth_key'], 'from server');
|
||||||
$decrypted_data = $this->ige_decrypt($encrypted_data, $aes_key, $aes_iv);
|
$decrypted_data = $this->ige_decrypt($encrypted_data, $aes_key, $aes_iv);
|
||||||
|
|
||||||
$server_salt = $this->struct->unpack('<q', substr($decrypted_data, 0, 8))[0];
|
$server_salt = $this->struct->unpack('<q', substr($decrypted_data, 0, 8))[0];
|
||||||
|
@ -168,6 +168,8 @@ class TL extends \danog\MadelineProto\Tools
|
|||||||
return $value;
|
return $value;
|
||||||
case 'Vector t':
|
case 'Vector t':
|
||||||
$concat = $this->struct->pack('<i', $this->constructor_type['vector']->id);
|
$concat = $this->struct->pack('<i', $this->constructor_type['vector']->id);
|
||||||
|
|
||||||
|
$concat .= $this->struct->pack('<l', count($value));
|
||||||
foreach ($value as $curv) {
|
foreach ($value as $curv) {
|
||||||
$concat .= $this->serialize_param($subtype, null, $curv);
|
$concat .= $this->serialize_param($subtype, null, $curv);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user