def getMessageId(self): msg_id = int((Now() + self.time_offset) * (1 << 30)) * 4 if self.message_id >= msg_id: self.message_id += 4 else: self.message_id = msg_id return self.message_id
def GetTimeout(self): timer, time = self.treap.Top() if timer is None: return None now = Now() if time > now: return time - now return 0
def process_future_salts(self, msg_id, seq_no, data): self.time_offset = data.now - Now() for future_salt in data.salts: logging.info("Salt: {}; Valid: {} - {}".format(future_salt.salt, datetime.fromtimestamp(future_salt.valid_since), datetime.fromtimestamp(future_salt.valid_until))) self.session.salt = Long.Dump(data.salts[0].salt) self.salt_timer.Set(future_salt.valid_until, 0, lambda: self.Send(get_future_salts.Create(1), relevant=False)) if not self.ready: self.ready = True
def _Queue(self, msg_id, seq_no, data, relevant, encrypted): logging.debug("Queueing message: dc={}, msgid={}, seqno={}, data={}".format(self.id, msg_id, seq_no, data)) if relevant: self.sent_messages[msg_id] = data if encrypted: self.queue.append((msg_id, seq_no, data)) self.flush_timer.Set(Now(), 0, self.Flush) return return self._Send(msg_id, seq_no, data, encrypted)
def process_server_DH_inner_data(self, msg_id, seq_no, data): if data.nonce != self.nonce: raise SecurityError('data.nonce != self.nonce') if data.server_nonce != self.server_nonce: raise SecurityError('data.server_nonce != self.server_nonce') self.time_offset = data.server_time - Now() b = random.getrandbits(2048) g_b = pow(data.g, b, data.dh_prime) g_ab = pow(data.g_a, b, data.dh_prime) self.session.auth_key = g_ab.to_bytes(256, 'big') encrypted_data = self.aes_ige.encrypt(client_DH_inner_data.Create(data.nonce, data.server_nonce, self.retry_id, g_b)) self.retry_id += 1 self.Send(set_client_DH_params.Create(data.nonce, data.server_nonce, encrypted_data), False, False)
def timer_callback(self): self.join(0) if self.is_alive(): self.timer.Set(Now() + 1, 0, self.timer_callback) return self.callback(self.result)
def _Send(self, msg_id, seq_no, data, encrypted=True): logging.debug("Sending message: dc={}, msgid={}, seqno={}, data={}".format(self.id, msg_id, seq_no, data)) self.ping_timer.Set(Now() + 1, 0, self.Send, ping.Create(random.getrandbits(64)), relevant=False) return self.session.Send(msg_id, seq_no, data, encrypted)