From b35fabd9d59f681f1a22e7678198f372492c4177 Mon Sep 17 00:00:00 2001
From: Dan <14043624+delivrance@users.noreply.github.com>
Date: Tue, 19 Dec 2017 13:59:15 +0100
Subject: [PATCH] Add AES CTR operation mode
---
pyrogram/crypto/__init__.py | 1 +
pyrogram/crypto/ctr.py | 35 +++++++++++++++++++++++++++++++++++
2 files changed, 36 insertions(+)
create mode 100644 pyrogram/crypto/ctr.py
diff --git a/pyrogram/crypto/__init__.py b/pyrogram/crypto/__init__.py
index 71f177ed..e18fbdb2 100644
--- a/pyrogram/crypto/__init__.py
+++ b/pyrogram/crypto/__init__.py
@@ -16,6 +16,7 @@
# You should have received a copy of the GNU Lesser General Public License
# along with Pyrogram. If not, see .
+from .ctr import CTR
from .ige import IGE
from .kdf import KDF
from .prime import Prime
diff --git a/pyrogram/crypto/ctr.py b/pyrogram/crypto/ctr.py
new file mode 100644
index 00000000..11144f44
--- /dev/null
+++ b/pyrogram/crypto/ctr.py
@@ -0,0 +1,35 @@
+# Pyrogram - Telegram MTProto API Client Library for Python
+# Copyright (C) 2017 Dan Tès
+#
+# This file is part of Pyrogram.
+#
+# Pyrogram is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License as published
+# by the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# Pyrogram is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with Pyrogram. If not, see .
+
+try:
+ from pyaes import AESModeOfOperationCTR
+except ImportError:
+ pass
+
+
+class CTR:
+ def __init__(self, key: bytes, iv: bytes):
+ self.ctr = AESModeOfOperationCTR(key)
+ self.iv = iv
+
+ def decrypt(self, data: bytes, offset: int) -> bytes:
+ replace = int.to_bytes(offset // 16, byteorder="big", length=4)
+ iv = self.iv[:-4] + replace
+ self.ctr._counter._counter = list(iv)
+
+ return self.ctr.decrypt(data)