Esempio n. 1
0
 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
Esempio n. 2
0
 def GetTimeout(self):
     timer, time = self.treap.Top()
     if timer is None:
         return None
     now = Now()
     if time > now:
         return time - now
     return 0
Esempio n. 3
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
Esempio n. 4
0
 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)
Esempio n. 5
0
    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)
Esempio n. 6
0
 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)
Esempio n. 7
0
 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)