Use signed salt

This commit is contained in:
Lonami Exo 2017-12-03 21:10:22 +01:00
parent 6662f49bcb
commit d4d7aa9063
2 changed files with 9 additions and 7 deletions

View File

@ -155,7 +155,7 @@ class MtProtoSender:
:param message: the TLMessage to be sent. :param message: the TLMessage to be sent.
""" """
plain_text = \ plain_text = \
struct.pack('<QQ', self.session.salt, self.session.id) \ struct.pack('<qQ', self.session.salt, self.session.id) \
+ bytes(message) + bytes(message)
msg_key = utils.calc_msg_key(plain_text) msg_key = utils.calc_msg_key(plain_text)
@ -401,10 +401,7 @@ class MtProtoSender:
bad_salt = reader.tgread_object() bad_salt = reader.tgread_object()
assert isinstance(bad_salt, BadServerSalt) assert isinstance(bad_salt, BadServerSalt)
# Our salt is unsigned, but the objects work with signed salts self.session.salt = bad_salt.new_server_salt
self.session.salt = struct.unpack(
'<Q', struct.pack('<q', bad_salt.new_server_salt)
)[0]
self.session.save() self.session.save()
# "the bad_server_salt response is received with the # "the bad_server_salt response is received with the

View File

@ -1,6 +1,7 @@
import json import json
import os import os
import platform import platform
import struct
import time import time
from base64 import b64encode, b64decode from base64 import b64encode, b64decode
from os.path import isfile as file_exists from os.path import isfile as file_exists
@ -58,7 +59,7 @@ class Session:
self._msg_id_lock = Lock() self._msg_id_lock = Lock()
self._save_lock = Lock() self._save_lock = Lock()
self.id = helpers.generate_random_long(signed=False) self.id = helpers.generate_random_long(signed=True)
self._sequence = 0 self._sequence = 0
self.time_offset = 0 self.time_offset = 0
self._last_msg_id = 0 # Long self._last_msg_id = 0 # Long
@ -68,7 +69,7 @@ class Session:
self.port = None self.port = None
self.auth_key = None self.auth_key = None
self.layer = 0 self.layer = 0
self.salt = 0 # Unsigned long self.salt = 0 # Signed long
self.entities = EntityDatabase() # Known and cached entities self.entities = EntityDatabase() # Known and cached entities
def save(self): def save(self):
@ -126,6 +127,10 @@ class Session:
data = json.load(file) data = json.load(file)
result.port = data.get('port', result.port) result.port = data.get('port', result.port)
result.salt = data.get('salt', result.salt) result.salt = data.get('salt', result.salt)
# Keep while migrating from unsigned to signed salt
result.salt = struct.unpack(
'q', struct.pack('Q', result.salt))[0]
result.layer = data.get('layer', result.layer) result.layer = data.get('layer', result.layer)
result.server_address = \ result.server_address = \
data.get('server_address', result.server_address) data.get('server_address', result.server_address)