mirror of
https://github.com/alexbers/mtprotoproxy.git
synced 2026-03-13 23:03:09 +00:00
support for cryptography module and advise to use it
This commit is contained in:
@@ -20,7 +20,46 @@ try:
|
||||
except ImportError:
|
||||
pass
|
||||
|
||||
try:
|
||||
|
||||
def try_use_cryptography_module():
|
||||
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
|
||||
from cryptography.hazmat.backends import default_backend
|
||||
|
||||
def create_aes_ctr(key, iv):
|
||||
class EncryptorAdapter:
|
||||
def __init__(self, cipher):
|
||||
self.encryptor = cipher.encryptor()
|
||||
self.decryptor = cipher.decryptor()
|
||||
|
||||
def encrypt(self, data):
|
||||
return self.encryptor.update(data)
|
||||
|
||||
def decrypt(self, data):
|
||||
return self.decryptor.update(data)
|
||||
|
||||
iv_bytes = int.to_bytes(iv, 16, "big")
|
||||
cipher = Cipher(algorithms.AES(key), modes.CTR(iv_bytes), default_backend())
|
||||
return EncryptorAdapter(cipher)
|
||||
|
||||
def create_aes_cbc(key, iv):
|
||||
class EncryptorAdapter:
|
||||
def __init__(self, cipher):
|
||||
self.encryptor = cipher.encryptor()
|
||||
self.decryptor = cipher.decryptor()
|
||||
|
||||
def encrypt(self, data):
|
||||
return self.encryptor.update(data)
|
||||
|
||||
def decrypt(self, data):
|
||||
return self.decryptor.update(data)
|
||||
|
||||
cipher = Cipher(algorithms.AES(key), modes.CBC(iv), default_backend())
|
||||
return EncryptorAdapter(cipher)
|
||||
|
||||
return create_aes_ctr, create_aes_cbc
|
||||
|
||||
|
||||
def try_use_pycrypto_or_pycryptodome_module():
|
||||
from Crypto.Cipher import AES
|
||||
from Crypto.Util import Counter
|
||||
|
||||
@@ -31,11 +70,16 @@ try:
|
||||
def create_aes_cbc(key, iv):
|
||||
return AES.new(key, AES.MODE_CBC, iv)
|
||||
|
||||
except ImportError:
|
||||
print("Failed to find pycryptodome or pycrypto, using slow AES implementation",
|
||||
flush=True, file=sys.stderr)
|
||||
return create_aes_ctr, create_aes_cbc
|
||||
|
||||
|
||||
def use_slow_bundled_cryptography_module():
|
||||
import pyaes
|
||||
|
||||
msg = "To make the program a *lot* faster, please install cryptography module: "
|
||||
msg += "pip install cryptography\n"
|
||||
print(msg, flush=True, file=sys.stderr)
|
||||
|
||||
def create_aes_ctr(key, iv):
|
||||
ctr = pyaes.Counter(iv)
|
||||
return pyaes.AESModeOfOperationCTR(key, ctr)
|
||||
@@ -55,8 +99,17 @@ except ImportError:
|
||||
|
||||
mode = pyaes.AESModeOfOperationCBC(key, iv)
|
||||
return EncryptorAdapter(mode)
|
||||
return create_aes_ctr, create_aes_cbc
|
||||
|
||||
|
||||
try:
|
||||
create_aes_ctr, create_aes_cbc = try_use_cryptography_module()
|
||||
except ImportError:
|
||||
try:
|
||||
create_aes_ctr, create_aes_cbc = try_use_pycrypto_or_pycryptodome_module()
|
||||
except ImportError:
|
||||
create_aes_ctr, create_aes_cbc = use_slow_bundled_cryptography_module()
|
||||
|
||||
try:
|
||||
import resource
|
||||
soft_fd_limit, hard_fd_limit = resource.getrlimit(resource.RLIMIT_NOFILE)
|
||||
|
||||
Reference in New Issue
Block a user