Skip to content

Commit

Permalink
Use tgcrypto if available (#1715)
Browse files Browse the repository at this point in the history
  • Loading branch information
igerzog committed Mar 2, 2021
1 parent d9691c9 commit 42cc9e6
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 14 deletions.
28 changes: 19 additions & 9 deletions telethon/crypto/aes.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
"""
AES IGE implementation in Python.
If available, cryptg will be used instead, otherwise
If available, tgcrypto will be used instead, otherwise
if available, cryptg will be used instead, otherwise
if available, libssl will be used instead, otherwise
the Python implementation will be used.
"""
Expand All @@ -15,15 +16,20 @@


try:
import cryptg
__log__.info('cryptg detected, it will be used for encryption')
import tgcrypto
__log__.debug('tgcrypto detected, it will be used for encryption')
except ImportError:
cryptg = None
if libssl.encrypt_ige and libssl.decrypt_ige:
__log__.info('libssl detected, it will be used for encryption')
else:
__log__.info('cryptg module not installed and libssl not found, '
'falling back to (slower) Python encryption')
tgcrypto = None
try:
import cryptg
__log__.debug('cryptg detected, it will be used for encryption')
except ImportError:
cryptg = None
if libssl.encrypt_ige and libssl.decrypt_ige:
__log__.debug('libssl detected, it will be used for encryption')
else:
__log__.debug('tgcrypto or cryptg modules not installed and libssl not found, '
'falling back to (slower) Python encryption')


class AES:
Expand All @@ -37,6 +43,8 @@ def decrypt_ige(cipher_text, key, iv):
Decrypts the given text in 16-bytes blocks by using the
given key and 32-bytes initialization vector.
"""
if tgcrypto:
return tgcrypto.ige256_decrypt(cipher_text, key, iv)
if cryptg:
return cryptg.decrypt_ige(cipher_text, key, iv)
if libssl.decrypt_ige:
Expand Down Expand Up @@ -78,6 +86,8 @@ def encrypt_ige(plain_text, key, iv):
if padding:
plain_text += os.urandom(16 - padding)

if tgcrypto:
return tgcrypto.ige256_encrypt(plain_text, key, iv)
if cryptg:
return cryptg.encrypt_ige(plain_text, key, iv)
if libssl.encrypt_ige:
Expand Down
30 changes: 25 additions & 5 deletions telethon/crypto/aesctr.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,19 @@
This module holds the AESModeCTR wrapper class.
"""
import pyaes
import logging


__log__ = logging.getLogger(__name__)


try:
import tgcrypto
__log__.debug('tgcrypto detected, it will be used for ctr encryption')
except ImportError:
tgcrypto = None
__log__.debug('tgcrypto module not installed, '
'falling back to (slower) Python encryption')


class AESModeCTR:
Expand All @@ -16,12 +29,15 @@ def __init__(self, key, iv):
:param iv: the bytes initialization vector. Must have a length of 16.
"""
# TODO Use libssl if available
assert isinstance(key, bytes)
self._aes = pyaes.AESModeOfOperationCTR(key)
if tgcrypto:
self._aes = (key, iv, bytearray(1))
else:
assert isinstance(key, bytes)
self._aes = pyaes.AESModeOfOperationCTR(key)

assert isinstance(iv, bytes)
assert len(iv) == 16
self._aes._counter._counter = list(iv)
assert isinstance(iv, bytes)
assert len(iv) == 16
self._aes._counter._counter = list(iv)

def encrypt(self, data):
"""
Expand All @@ -30,6 +46,8 @@ def encrypt(self, data):
:param data: the plain text to be encrypted.
:return: the encrypted cipher text.
"""
if tgcrypto:
return tgcrypto.ctr256_encrypt(data, *self._aes)
return self._aes.encrypt(data)

def decrypt(self, data):
Expand All @@ -39,4 +57,6 @@ def decrypt(self, data):
:param data: the cipher text to be decrypted.
:return: the decrypted plain text.
"""
if tgcrypto:
return tgcrypto.ctr256_decrypt(data, *self._aes)
return self._aes.decrypt(data)

0 comments on commit 42cc9e6

Please sign in to comment.