Undo breaking change and speed up key fingerprint matching

This commit is contained in:
Daniil Gentili 2017-01-26 14:29:58 +01:00
parent 7df2526d9c
commit 6e3e9e5d12
3 changed files with 17 additions and 19 deletions

View File

@ -30,7 +30,6 @@ class MTProto extends PrimeModule
use \danog\MadelineProto\MTProtoTools\UpdateHandler; use \danog\MadelineProto\MTProtoTools\UpdateHandler;
use \danog\MadelineProto\TL\TL; use \danog\MadelineProto\TL\TL;
use \danog\MadelineProto\Tools; use \danog\MadelineProto\Tools;
use \danog\MadelineProto\RSA;
public $settings = []; public $settings = [];
public $config = ['expires' => -1]; public $config = ['expires' => -1];
@ -48,7 +47,7 @@ class MTProto extends PrimeModule
// Load rsa key // Load rsa key
\danog\MadelineProto\Logger::log('Loading RSA key...', Logger::ULTRA_VERBOSE); \danog\MadelineProto\Logger::log('Loading RSA key...', Logger::ULTRA_VERBOSE);
$this->key = $this->loadKey($this->settings['authorization']['rsa_key']); $this->key = new RSA($this->settings['authorization']['rsa_key']);
// Istantiate TL class // Istantiate TL class
\danog\MadelineProto\Logger::log('Translating tl schemas...', Logger::ULTRA_VERBOSE); \danog\MadelineProto\Logger::log('Translating tl schemas...', Logger::ULTRA_VERBOSE);

View File

@ -63,8 +63,7 @@ trait AuthKeyHandler
* Find our key in the server_public_key_fingerprints vector * Find our key in the server_public_key_fingerprints vector
*/ */
foreach ($ResPQ['server_public_key_fingerprints'] as $curfp) { foreach ($ResPQ['server_public_key_fingerprints'] as $curfp) {
$curfp_biginteger = new \phpseclib\Math\BigInteger($curfp); if ($this->key->keydata['fp'] === $curfp) {
if ($this->key['fp']->equals($curfp_biginteger)) {
$public_key_fingerprint = $curfp; $public_key_fingerprint = $curfp;
break; break;
} }
@ -123,7 +122,7 @@ trait AuthKeyHandler
$sha_digest = sha1($p_q_inner_data, true); $sha_digest = sha1($p_q_inner_data, true);
$random_bytes = $this->random(255 - strlen($p_q_inner_data) - strlen($sha_digest)); $random_bytes = $this->random(255 - strlen($p_q_inner_data) - strlen($sha_digest));
$to_encrypt = $sha_digest.$p_q_inner_data.$random_bytes; $to_encrypt = $sha_digest.$p_q_inner_data.$random_bytes;
$encrypted_data = $this->RSA_encrypt($to_encrypt, $this->key); $encrypted_data = $this->key->encrypt($to_encrypt);
\danog\MadelineProto\Logger::log('Starting Diffie Hellman key exchange', \danog\MadelineProto\Logger::VERBOSE); \danog\MadelineProto\Logger::log('Starting Diffie Hellman key exchange', \danog\MadelineProto\Logger::VERBOSE);
/* /*

View File

@ -12,9 +12,13 @@ If not, see <http://www.gnu.org/licenses/>.
namespace danog\MadelineProto; namespace danog\MadelineProto;
trait RSA class RSA
{ {
public function loadKey($rsa_key) use \danog\MadelineProto\TL\TL;
use \danog\MadelineProto\Tools;
public $keydata = [];
public function __construct($rsa_key)
{ {
\danog\MadelineProto\Logger::log('Istantiating \phpseclib\Crypt\RSA...', LOGGER::ULTRA_VERBOSE); \danog\MadelineProto\Logger::log('Istantiating \phpseclib\Crypt\RSA...', LOGGER::ULTRA_VERBOSE);
$key = new \phpseclib\Crypt\RSA(); $key = new \phpseclib\Crypt\RSA();
@ -25,35 +29,31 @@ trait RSA
} else { } else {
$key->loadKey($rsa_key); $key->loadKey($rsa_key);
} }
$keydata = ['n' => $key->modulus, 'e' => $key->exponent]; $this->keydata = ['n' => $key->modulus, 'e' => $key->exponent];
\danog\MadelineProto\Logger::log('Computing fingerprint...', LOGGER::ULTRA_VERBOSE); \danog\MadelineProto\Logger::log('Computing fingerprint...', LOGGER::ULTRA_VERBOSE);
$keydata['fp_bytes'] = substr( $this->keydata['fp'] = \danog\PHP\Struct::unpack('<q', substr(
sha1( sha1(
$this->serialize_object( $this->serialize_object(
['type' => 'bytes'], ['type' => 'bytes'],
$keydata['n']->toBytes() $this->keydata['n']->toBytes()
) )
. .
$this->serialize_object( $this->serialize_object(
['type' => 'bytes'], ['type' => 'bytes'],
$keydata['e']->toBytes() $this->keydata['e']->toBytes()
), ),
true true
), ),
-8 -8
); ))[0];
return $this->keydata;
\danog\MadelineProto\Logger::log('Generating BigInteger object for fingerprint...', LOGGER::ULTRA_VERBOSE);
$keydata['fp'] = new \phpseclib\Math\BigInteger(strrev($keydata['fp_bytes']), -256);
return $keydata;
} }
public function RSA_encrypt($data, $keydata) public function encrypt($data)
{ {
\danog\MadelineProto\Logger::log('Encrypting with rsa key...', LOGGER::VERBOSE); \danog\MadelineProto\Logger::log('Encrypting with rsa key...', LOGGER::VERBOSE);
return (new \phpseclib\Math\BigInteger($data, 256))->powMod($keydata['e'], $keydata['n'])->toBytes(); return (new \phpseclib\Math\BigInteger($data, 256))->powMod($this->keydata['e'], $this->keydata['n'])->toBytes();
} }
} }