Telethon/utils/helpers.py
Lonami 1dac866118 Initial release
The initial release contains the most basic implementation of TLSharp core.
This is also fully untested, since no test can be done until more work is done.
2016-08-26 12:58:53 +02:00

57 lines
1.4 KiB
Python

import random
from utils.binary_writer import BinaryWriter
from hashlib import sha1
def generate_random_long(signed=True):
result = random.getrandbits(64)
if not signed:
result &= 0xFFFFFFFFFFFFFFFF # Ensure it's unsigned
return result
def generate_random_bytes(count):
with BinaryWriter() as writer:
for _ in range(count):
writer.write(random.getrandbits(8))
return writer.get_bytes()
def calc_key(shared_key, msg_key, client):
x = 0 if client else 8
buffer = [0] * 48
buffer[0:16] = msg_key
buffer[16:48] = shared_key[x:x + 32]
sha1a = sha1(buffer)
buffer[0:16] = shared_key[x + 32:x + 48]
buffer[16:32] = msg_key
buffer[32:48] = shared_key[x + 48:x + 64]
sha1b = sha1(buffer)
buffer[0:32] = shared_key[x + 64:x + 96]
buffer[32:48] = msg_key
sha1c = sha1(buffer)
buffer[0:16] = msg_key
buffer[16:48] = shared_key[x + 96:x + 128]
sha1d = sha1(buffer)
key = sha1a[0:8] + sha1b[8:20] + sha1c[4:16]
iv = sha1a[8:20] + sha1b[0:8] + sha1c[16:20] + sha1d[0:8]
return key, iv
def calc_msg_key(data):
return sha1(data)[4:20]
def calc_msg_key_offset(data, offset, limit):
# TODO untested, may not be offset like this
# In the original code it was as parameters for the sha function, not slicing the array
return sha1(data[offset:offset + limit])[4:20]