# TgCrypto
> Fast and Portable Cryptography Extension Library for Pyrofork
**TgCrypto** is a Cryptography Library written in C as a Python extension. It is designed to be portable, fast,
easy to install and use. TgCrypto is intended for [Pyrofork](https://github.com/Mayuri-Chan/pyrofork) and implements the
cryptographic algorithms Telegram requires, namely:
- **`AES-256-IGE`** - used in [MTProto v2.0](https://core.telegram.org/mtproto).
- **`AES-256-CTR`** - used for [CDN encrypted files](https://core.telegram.org/cdn).
- **`AES-256-CBC`** - used for [encrypted passport credentials](https://core.telegram.org/passport).
## Requirements
- Python 3.7 or higher.
## Installation
``` bash
$ pip3 install -U tgcrypto
```
## API
TgCrypto API consists of these six methods:
```python
def ige256_encrypt(data: bytes, key: bytes, iv: bytes) -> bytes: ...
def ige256_decrypt(data: bytes, key: bytes, iv: bytes) -> bytes: ...
def ctr256_encrypt(data: bytes, key: bytes, iv: bytes, state: bytes) -> bytes: ...
def ctr256_decrypt(data: bytes, key: bytes, iv: bytes, state: bytes) -> bytes: ...
def cbc256_encrypt(data: bytes, key: bytes, iv: bytes) -> bytes: ...
def cbc256_decrypt(data: bytes, key: bytes, iv: bytes) -> bytes: ...
```
## Usage
### IGE Mode
**Note**: Data must be padded to match a multiple of the block size (16 bytes).
``` python
import os
import tgcrypto
data = os.urandom(10 * 1024 * 1024 + 7) # 10 MB of random data + 7 bytes to show padding
key = os.urandom(32) # Random Key
iv = os.urandom(32) # Random IV
# Pad with zeroes: -7 % 16 = 9
data += bytes(-len(data) % 16)
ige_encrypted = tgcrypto.ige256_encrypt(data, key, iv)
ige_decrypted = tgcrypto.ige256_decrypt(ige_encrypted, key, iv)
print(data == ige_decrypted) # True
```
### CTR Mode (single chunk)
``` python
import os
import tgcrypto
data = os.urandom(10 * 1024 * 1024) # 10 MB of random data
key = os.urandom(32) # Random Key
enc_iv = bytearray(os.urandom(16)) # Random IV
dec_iv = enc_iv.copy() # Keep a copy for decryption
ctr_encrypted = tgcrypto.ctr256_encrypt(data, key, enc_iv, bytes(1))
ctr_decrypted = tgcrypto.ctr256_decrypt(ctr_encrypted, key, dec_iv, bytes(1))
print(data == ctr_decrypted) # True
```
### CTR Mode (stream)
``` python
import os
from io import BytesIO
import tgcrypto
data = BytesIO(os.urandom(10 * 1024 * 1024)) # 10 MB of random data
key = os.urandom(32) # Random Key
enc_iv = bytearray(os.urandom(16)) # Random IV
dec_iv = enc_iv.copy() # Keep a copy for decryption
enc_state = bytes(1) # Encryption state, starts from 0
dec_state = bytes(1) # Decryption state, starts from 0
encrypted_data = BytesIO() # Encrypted data buffer
decrypted_data = BytesIO() # Decrypted data buffer
while True:
chunk = data.read(1024)
if not chunk:
break
# Write 1K encrypted bytes into the encrypted data buffer
encrypted_data.write(tgcrypto.ctr256_encrypt(chunk, key, enc_iv, enc_state))
# Reset position. We need to read it now
encrypted_data.seek(0)
while True:
chunk = encrypted_data.read(1024)
if not chunk:
break
# Write 1K decrypted bytes into the decrypted data buffer
decrypted_data.write(tgcrypto.ctr256_decrypt(chunk, key, dec_iv, dec_state))
print(data.getvalue() == decrypted_data.getvalue()) # True
```
### CBC Mode
**Note**: Data must be padded to match a multiple of the block size (16 bytes).
``` python
import os
import tgcrypto
data = os.urandom(10 * 1024 * 1024 + 7) # 10 MB of random data + 7 bytes to show padding
key = os.urandom(32) # Random Key
enc_iv = bytearray(os.urandom(16)) # Random IV
dec_iv = enc_iv.copy() # Keep a copy for decryption
# Pad with zeroes: -7 % 16 = 9
data += bytes(-len(data) % 16)
cbc_encrypted = tgcrypto.cbc256_encrypt(data, key, enc_iv)
cbc_decrypted = tgcrypto.cbc256_decrypt(cbc_encrypted, key, dec_iv)
print(data == cbc_decrypted) # True
```
## Testing
1. Clone this repository: `git clone https://github.com/pyrogram/tgcrypto`.
2. Enter the directory: `cd tgcrypto`.
3. Install `tox`: `pip3 install tox`
4. Run tests: `tox`.
## License
[LGPLv3+](COPYING.lesser) © 2017-present [Dan](https://github.com/delivrance)
[LGPLv3+](COPYING.lesser) © 2024-present [Mayuri-Chan](https://github.com/Mayuri-Chan)
Raw data
{
"_id": null,
"home_page": "https://github.com/Mayuri-Chan",
"name": "TgCrypto-pyrofork",
"maintainer": null,
"docs_url": null,
"requires_python": "~=3.9",
"maintainer_email": null,
"keywords": "pyrogram pyrofork telegram crypto cryptography encryption mtproto extension library aes",
"author": "wulan17",
"author_email": "mayuri@mayuri.my.id",
"download_url": "https://files.pythonhosted.org/packages/96/80/bae4260b65885765407e2e8e59c0452bf180f6b5b23779596a354223c6c5/TgCrypto-pyrofork-1.2.7.tar.gz",
"platform": null,
"description": "# TgCrypto\n\n> Fast and Portable Cryptography Extension Library for Pyrofork\n\n**TgCrypto** is a Cryptography Library written in C as a Python extension. It is designed to be portable, fast,\neasy to install and use. TgCrypto is intended for [Pyrofork](https://github.com/Mayuri-Chan/pyrofork) and implements the\ncryptographic algorithms Telegram requires, namely:\n\n- **`AES-256-IGE`** - used in [MTProto v2.0](https://core.telegram.org/mtproto).\n- **`AES-256-CTR`** - used for [CDN encrypted files](https://core.telegram.org/cdn).\n- **`AES-256-CBC`** - used for [encrypted passport credentials](https://core.telegram.org/passport).\n\n## Requirements\n\n- Python 3.7 or higher.\n\n## Installation\n\n``` bash\n$ pip3 install -U tgcrypto\n```\n\n## API\n\nTgCrypto API consists of these six methods:\n\n```python\ndef ige256_encrypt(data: bytes, key: bytes, iv: bytes) -> bytes: ...\ndef ige256_decrypt(data: bytes, key: bytes, iv: bytes) -> bytes: ...\n\ndef ctr256_encrypt(data: bytes, key: bytes, iv: bytes, state: bytes) -> bytes: ...\ndef ctr256_decrypt(data: bytes, key: bytes, iv: bytes, state: bytes) -> bytes: ...\n\ndef cbc256_encrypt(data: bytes, key: bytes, iv: bytes) -> bytes: ...\ndef cbc256_decrypt(data: bytes, key: bytes, iv: bytes) -> bytes: ...\n```\n\n## Usage\n\n### IGE Mode\n\n**Note**: Data must be padded to match a multiple of the block size (16 bytes).\n\n``` python\nimport os\n\nimport tgcrypto\n\ndata = os.urandom(10 * 1024 * 1024 + 7) # 10 MB of random data + 7 bytes to show padding\nkey = os.urandom(32) # Random Key\niv = os.urandom(32) # Random IV\n\n# Pad with zeroes: -7 % 16 = 9\ndata += bytes(-len(data) % 16)\n\nige_encrypted = tgcrypto.ige256_encrypt(data, key, iv)\nige_decrypted = tgcrypto.ige256_decrypt(ige_encrypted, key, iv)\n\nprint(data == ige_decrypted) # True\n```\n \n### CTR Mode (single chunk)\n\n``` python\nimport os\n\nimport tgcrypto\n\ndata = os.urandom(10 * 1024 * 1024) # 10 MB of random data\n\nkey = os.urandom(32) # Random Key\n\nenc_iv = bytearray(os.urandom(16)) # Random IV\ndec_iv = enc_iv.copy() # Keep a copy for decryption\n\nctr_encrypted = tgcrypto.ctr256_encrypt(data, key, enc_iv, bytes(1))\nctr_decrypted = tgcrypto.ctr256_decrypt(ctr_encrypted, key, dec_iv, bytes(1))\n\nprint(data == ctr_decrypted) # True\n```\n\n### CTR Mode (stream)\n\n``` python\nimport os\nfrom io import BytesIO\n\nimport tgcrypto\n\ndata = BytesIO(os.urandom(10 * 1024 * 1024)) # 10 MB of random data\n\nkey = os.urandom(32) # Random Key\n\nenc_iv = bytearray(os.urandom(16)) # Random IV\ndec_iv = enc_iv.copy() # Keep a copy for decryption\n\nenc_state = bytes(1) # Encryption state, starts from 0\ndec_state = bytes(1) # Decryption state, starts from 0\n\nencrypted_data = BytesIO() # Encrypted data buffer\ndecrypted_data = BytesIO() # Decrypted data buffer\n\nwhile True:\n chunk = data.read(1024)\n\n if not chunk:\n break\n\n # Write 1K encrypted bytes into the encrypted data buffer\n encrypted_data.write(tgcrypto.ctr256_encrypt(chunk, key, enc_iv, enc_state))\n\n# Reset position. We need to read it now\nencrypted_data.seek(0)\n\nwhile True:\n chunk = encrypted_data.read(1024)\n\n if not chunk:\n break\n\n # Write 1K decrypted bytes into the decrypted data buffer\n decrypted_data.write(tgcrypto.ctr256_decrypt(chunk, key, dec_iv, dec_state))\n\nprint(data.getvalue() == decrypted_data.getvalue()) # True\n```\n\n### CBC Mode\n\n**Note**: Data must be padded to match a multiple of the block size (16 bytes).\n\n``` python\nimport os\n\nimport tgcrypto\n\ndata = os.urandom(10 * 1024 * 1024 + 7) # 10 MB of random data + 7 bytes to show padding\nkey = os.urandom(32) # Random Key\n\nenc_iv = bytearray(os.urandom(16)) # Random IV\ndec_iv = enc_iv.copy() # Keep a copy for decryption\n\n# Pad with zeroes: -7 % 16 = 9\ndata += bytes(-len(data) % 16)\n\ncbc_encrypted = tgcrypto.cbc256_encrypt(data, key, enc_iv)\ncbc_decrypted = tgcrypto.cbc256_decrypt(cbc_encrypted, key, dec_iv)\n\nprint(data == cbc_decrypted) # True\n```\n\n## Testing\n\n1. Clone this repository: `git clone https://github.com/pyrogram/tgcrypto`.\n2. Enter the directory: `cd tgcrypto`.\n3. Install `tox`: `pip3 install tox`\n4. Run tests: `tox`.\n\n## License\n\n[LGPLv3+](COPYING.lesser) \u00a9 2017-present [Dan](https://github.com/delivrance) \n[LGPLv3+](COPYING.lesser) \u00a9 2024-present [Mayuri-Chan](https://github.com/Mayuri-Chan)\n",
"bugtrack_url": null,
"license": "LGPLv3+",
"summary": "Fast and Portable Cryptography Extension Library for Pyrofork",
"version": "1.2.7",
"project_urls": {
"Community": "https://t.me/MayuriChan_Chat",
"Documentation": "https://pyrofork.mayuri.my.id",
"Download": "https://github.com/Mayuri-Chan/tgcrypto/releases/latest",
"Homepage": "https://github.com/Mayuri-Chan",
"Source": "https://github.com/Mayuri-Chan/tgcrypto",
"Tracker": "https://github.com/Mayuri-Chan/tgcrypto/issues"
},
"split_keywords": [
"pyrogram",
"pyrofork",
"telegram",
"crypto",
"cryptography",
"encryption",
"mtproto",
"extension",
"library",
"aes"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "344aa67b5e19f3586d5b49b05a8ac5c1a6ce00ba9262fdc78782b3ac434ab757",
"md5": "0ba6d3653a0914c32fea5c8b8a987ec3",
"sha256": "cd8b4282b15b30f71ee2f6f28dcac57c3a53cd6b2d672525970ba522159b7afc"
},
"downloads": -1,
"filename": "TgCrypto_pyrofork-1.2.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"has_sig": false,
"md5_digest": "0ba6d3653a0914c32fea5c8b8a987ec3",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": "~=3.9",
"size": 62120,
"upload_time": "2024-10-08T07:46:28",
"upload_time_iso_8601": "2024-10-08T07:46:28.599351Z",
"url": "https://files.pythonhosted.org/packages/34/4a/a67b5e19f3586d5b49b05a8ac5c1a6ce00ba9262fdc78782b3ac434ab757/TgCrypto_pyrofork-1.2.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "5b41f12de6a01a2eb1593bd5006e2f5d91b287a7bbdf520520f743b97e6401e3",
"md5": "5ba8495071dc56d59d8219e7380ae2ce",
"sha256": "06f79351fbc726d1f83adf4700f2a3056ee5fdaaf3792aa85483895c0f193649"
},
"downloads": -1,
"filename": "TgCrypto_pyrofork-1.2.7-cp310-cp310-musllinux_1_2_aarch64.whl",
"has_sig": false,
"md5_digest": "5ba8495071dc56d59d8219e7380ae2ce",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": "~=3.9",
"size": 61042,
"upload_time": "2024-10-08T07:46:30",
"upload_time_iso_8601": "2024-10-08T07:46:30.311631Z",
"url": "https://files.pythonhosted.org/packages/5b/41/f12de6a01a2eb1593bd5006e2f5d91b287a7bbdf520520f743b97e6401e3/TgCrypto_pyrofork-1.2.7-cp310-cp310-musllinux_1_2_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "204177b81c17be553b071e5b5ff86bfc8f781fc583403a929466bb57ceba54a3",
"md5": "6b4805ad5885d82302b291ea8b992be1",
"sha256": "1fecb418f8b563e5692f2b0ac2cbab75c883d2dfcffdec6b5a9641ca2bbe6b6b"
},
"downloads": -1,
"filename": "TgCrypto_pyrofork-1.2.7-cp310-cp310-win32.whl",
"has_sig": false,
"md5_digest": "6b4805ad5885d82302b291ea8b992be1",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": "~=3.9",
"size": 45082,
"upload_time": "2024-10-08T08:16:59",
"upload_time_iso_8601": "2024-10-08T08:16:59.173647Z",
"url": "https://files.pythonhosted.org/packages/20/41/77b81c17be553b071e5b5ff86bfc8f781fc583403a929466bb57ceba54a3/TgCrypto_pyrofork-1.2.7-cp310-cp310-win32.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "f3cc0c4f96694575d2209dc3aefe341004d2e92fa3b9e33690692fc4dd097b55",
"md5": "c11e8ea7d0c5efd2df5390be7cd5ac0c",
"sha256": "73eb1a703106a97d5ee9d3542cc2f2a20b882e01ddb0954b46e7c721752904a7"
},
"downloads": -1,
"filename": "TgCrypto_pyrofork-1.2.7-cp310-cp310-win_amd64.whl",
"has_sig": false,
"md5_digest": "c11e8ea7d0c5efd2df5390be7cd5ac0c",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": "~=3.9",
"size": 45678,
"upload_time": "2024-10-08T08:17:00",
"upload_time_iso_8601": "2024-10-08T08:17:00.896715Z",
"url": "https://files.pythonhosted.org/packages/f3/cc/0c4f96694575d2209dc3aefe341004d2e92fa3b9e33690692fc4dd097b55/TgCrypto_pyrofork-1.2.7-cp310-cp310-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "63ed850c1aea4fd12bee2e14d4ca3d3378054864d9bd42bf9972d98687ad4248",
"md5": "2b51dcc6aee5c257fb2dd17ec8612eea",
"sha256": "6a8a4f5b3940cd5fe0d7cd6c4e72eb58e2ff75cd39b0649e5b158c21e231cb2e"
},
"downloads": -1,
"filename": "TgCrypto_pyrofork-1.2.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"has_sig": false,
"md5_digest": "2b51dcc6aee5c257fb2dd17ec8612eea",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": "~=3.9",
"size": 62907,
"upload_time": "2024-10-08T07:46:31",
"upload_time_iso_8601": "2024-10-08T07:46:31.843633Z",
"url": "https://files.pythonhosted.org/packages/63/ed/850c1aea4fd12bee2e14d4ca3d3378054864d9bd42bf9972d98687ad4248/TgCrypto_pyrofork-1.2.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "c8d2604964b0c982df872e6f492255e76114a7c3120176e84d53fb345f306535",
"md5": "bae9a7f562958c2636aa7e040f049174",
"sha256": "640104e8b859729469db6de8234975a52988a06c3362ad6c8b46edd92ac543c0"
},
"downloads": -1,
"filename": "TgCrypto_pyrofork-1.2.7-cp311-cp311-musllinux_1_2_aarch64.whl",
"has_sig": false,
"md5_digest": "bae9a7f562958c2636aa7e040f049174",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": "~=3.9",
"size": 61829,
"upload_time": "2024-10-08T07:46:33",
"upload_time_iso_8601": "2024-10-08T07:46:33.430956Z",
"url": "https://files.pythonhosted.org/packages/c8/d2/604964b0c982df872e6f492255e76114a7c3120176e84d53fb345f306535/TgCrypto_pyrofork-1.2.7-cp311-cp311-musllinux_1_2_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "3dcabf4a3af79b585eb69baccb1dd4ce1b1bdb8d4fb74df1230204b2c72b3692",
"md5": "5e0d5377d1604f5712fb5c26d749b1bd",
"sha256": "3264b2ee060be4363c7f46d82320e2b65d944598de2dc192d4f395a3ba33ee27"
},
"downloads": -1,
"filename": "TgCrypto_pyrofork-1.2.7-cp311-cp311-win32.whl",
"has_sig": false,
"md5_digest": "5e0d5377d1604f5712fb5c26d749b1bd",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": "~=3.9",
"size": 45080,
"upload_time": "2024-10-08T08:17:03",
"upload_time_iso_8601": "2024-10-08T08:17:03.046341Z",
"url": "https://files.pythonhosted.org/packages/3d/ca/bf4a3af79b585eb69baccb1dd4ce1b1bdb8d4fb74df1230204b2c72b3692/TgCrypto_pyrofork-1.2.7-cp311-cp311-win32.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "5e1a50dc01a9530bf681e0e2692d67d7f9a155a3d8cbf534373372238b1c4807",
"md5": "65f6b0559ca79eee32ae9604d68fe943",
"sha256": "fbff80b2099e6d42ab680bd2cf01de4aa003ac6acf4928b659d8aaa082ea7b72"
},
"downloads": -1,
"filename": "TgCrypto_pyrofork-1.2.7-cp311-cp311-win_amd64.whl",
"has_sig": false,
"md5_digest": "65f6b0559ca79eee32ae9604d68fe943",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": "~=3.9",
"size": 45683,
"upload_time": "2024-10-08T08:17:04",
"upload_time_iso_8601": "2024-10-08T08:17:04.467488Z",
"url": "https://files.pythonhosted.org/packages/5e/1a/50dc01a9530bf681e0e2692d67d7f9a155a3d8cbf534373372238b1c4807/TgCrypto_pyrofork-1.2.7-cp311-cp311-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "05a4f891a83b182db7695519a0b3164c0101deee636ad316f7af91b60c74bd97",
"md5": "4c50b161bcbfc124f7002630e61db631",
"sha256": "4a8d67d3065a9e35e92bbacbac8676b014acefbb7d77adf980f2efeaedeee7a3"
},
"downloads": -1,
"filename": "TgCrypto_pyrofork-1.2.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"has_sig": false,
"md5_digest": "4c50b161bcbfc124f7002630e61db631",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": "~=3.9",
"size": 62546,
"upload_time": "2024-10-08T07:46:34",
"upload_time_iso_8601": "2024-10-08T07:46:34.787076Z",
"url": "https://files.pythonhosted.org/packages/05/a4/f891a83b182db7695519a0b3164c0101deee636ad316f7af91b60c74bd97/TgCrypto_pyrofork-1.2.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "f6fffdeb386cc58c837d6b0592091a5839950dc7657436fce0c672dcf70aa17f",
"md5": "143c017fbaf5f54def65fd96fc1926ed",
"sha256": "0a750d23e714a7da9bf5ff14900e62fcfd704592a68b52b9859426b153f7e325"
},
"downloads": -1,
"filename": "TgCrypto_pyrofork-1.2.7-cp312-cp312-musllinux_1_2_aarch64.whl",
"has_sig": false,
"md5_digest": "143c017fbaf5f54def65fd96fc1926ed",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": "~=3.9",
"size": 61482,
"upload_time": "2024-10-08T07:46:35",
"upload_time_iso_8601": "2024-10-08T07:46:35.939184Z",
"url": "https://files.pythonhosted.org/packages/f6/ff/fdeb386cc58c837d6b0592091a5839950dc7657436fce0c672dcf70aa17f/TgCrypto_pyrofork-1.2.7-cp312-cp312-musllinux_1_2_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "12b8490c26190cb77ad8450e6dda33ea7ae44317aa950b1e5c4fee2575943743",
"md5": "3b196663194649b70085fff829ca11a1",
"sha256": "7bf3d77fe040a6d498487d595335d10778ed22dad403b63c7527432910b6c256"
},
"downloads": -1,
"filename": "TgCrypto_pyrofork-1.2.7-cp312-cp312-win32.whl",
"has_sig": false,
"md5_digest": "3b196663194649b70085fff829ca11a1",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": "~=3.9",
"size": 45079,
"upload_time": "2024-10-08T08:17:06",
"upload_time_iso_8601": "2024-10-08T08:17:06.013638Z",
"url": "https://files.pythonhosted.org/packages/12/b8/490c26190cb77ad8450e6dda33ea7ae44317aa950b1e5c4fee2575943743/TgCrypto_pyrofork-1.2.7-cp312-cp312-win32.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "f55b6aa76f506c29b13fb86dcfa3e79b4d8e7589d8bf3e9d045efa906733da03",
"md5": "a269e4229f0b7294ef0256f59978f5b5",
"sha256": "7b158ae63e74a09cf42920f818e937919a57b495d61bc3616fffb2b92a3b21f7"
},
"downloads": -1,
"filename": "TgCrypto_pyrofork-1.2.7-cp312-cp312-win_amd64.whl",
"has_sig": false,
"md5_digest": "a269e4229f0b7294ef0256f59978f5b5",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": "~=3.9",
"size": 45679,
"upload_time": "2024-10-08T08:17:08",
"upload_time_iso_8601": "2024-10-08T08:17:08.583753Z",
"url": "https://files.pythonhosted.org/packages/f5/5b/6aa76f506c29b13fb86dcfa3e79b4d8e7589d8bf3e9d045efa906733da03/TgCrypto_pyrofork-1.2.7-cp312-cp312-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "112aa634c7974f08462e16a3250599ed08a9260b6fb0757eaca92770fd87c019",
"md5": "9772534f575ac99f91255c7cf150c315",
"sha256": "d8d627bd0ffc26f9919db3fa31c7618060b1b728041bd4aec80f114f0d82cf13"
},
"downloads": -1,
"filename": "TgCrypto_pyrofork-1.2.7-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"has_sig": false,
"md5_digest": "9772534f575ac99f91255c7cf150c315",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": "~=3.9",
"size": 62469,
"upload_time": "2024-10-08T07:46:37",
"upload_time_iso_8601": "2024-10-08T07:46:37.486260Z",
"url": "https://files.pythonhosted.org/packages/11/2a/a634c7974f08462e16a3250599ed08a9260b6fb0757eaca92770fd87c019/TgCrypto_pyrofork-1.2.7-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "8d16780b25d2e83f0a8fa069b9f17c116d928ccb126007e88e2d174751d24aa1",
"md5": "5be0fece45f6126f7c58d625b23b8359",
"sha256": "dd3cbd29f92f9f01c52deab22be7febe80aaa085d46b7c8f2cc2a7969434a96f"
},
"downloads": -1,
"filename": "TgCrypto_pyrofork-1.2.7-cp313-cp313-musllinux_1_2_aarch64.whl",
"has_sig": false,
"md5_digest": "5be0fece45f6126f7c58d625b23b8359",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": "~=3.9",
"size": 61524,
"upload_time": "2024-10-08T07:46:38",
"upload_time_iso_8601": "2024-10-08T07:46:38.845569Z",
"url": "https://files.pythonhosted.org/packages/8d/16/780b25d2e83f0a8fa069b9f17c116d928ccb126007e88e2d174751d24aa1/TgCrypto_pyrofork-1.2.7-cp313-cp313-musllinux_1_2_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "5ff84ef2dd105693788b39785b0ccc8c800e01e80ae996fdeb02608c18b15bff",
"md5": "36c148d759d3838d275f051b646ff774",
"sha256": "9974ba74bac28074776a1c16ef66026ca0448665876b568c70011bddbd9c33b2"
},
"downloads": -1,
"filename": "TgCrypto_pyrofork-1.2.7-cp313-cp313-win32.whl",
"has_sig": false,
"md5_digest": "36c148d759d3838d275f051b646ff774",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": "~=3.9",
"size": 45077,
"upload_time": "2024-10-08T08:17:10",
"upload_time_iso_8601": "2024-10-08T08:17:10.192596Z",
"url": "https://files.pythonhosted.org/packages/5f/f8/4ef2dd105693788b39785b0ccc8c800e01e80ae996fdeb02608c18b15bff/TgCrypto_pyrofork-1.2.7-cp313-cp313-win32.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "8315dba4c5c9299b0ca1b2f0ef8e4e4be02a79e3ce1efeecb05562c9ac98ff2f",
"md5": "f3a763b3469ec74d7f61b3a19d60d98c",
"sha256": "5dd7251a43990216790590ec22f56169b4be3ba87c8d3591c56111d5f94f0898"
},
"downloads": -1,
"filename": "TgCrypto_pyrofork-1.2.7-cp313-cp313-win_amd64.whl",
"has_sig": false,
"md5_digest": "f3a763b3469ec74d7f61b3a19d60d98c",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": "~=3.9",
"size": 45677,
"upload_time": "2024-10-08T08:17:11",
"upload_time_iso_8601": "2024-10-08T08:17:11.590325Z",
"url": "https://files.pythonhosted.org/packages/83/15/dba4c5c9299b0ca1b2f0ef8e4e4be02a79e3ce1efeecb05562c9ac98ff2f/TgCrypto_pyrofork-1.2.7-cp313-cp313-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "52707d0fae9334e0c178baea20cb1a889a4898073d05a902999e8555a3b9b6c1",
"md5": "1090b9ecd18a93f65c4e0d138f627040",
"sha256": "2b9ff14080fa0ecf94dc710f47a15703e249edf14968478dc93f05185223cd0d"
},
"downloads": -1,
"filename": "TgCrypto_pyrofork-1.2.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"has_sig": false,
"md5_digest": "1090b9ecd18a93f65c4e0d138f627040",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": "~=3.9",
"size": 61914,
"upload_time": "2024-10-08T07:46:39",
"upload_time_iso_8601": "2024-10-08T07:46:39.742464Z",
"url": "https://files.pythonhosted.org/packages/52/70/7d0fae9334e0c178baea20cb1a889a4898073d05a902999e8555a3b9b6c1/TgCrypto_pyrofork-1.2.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "9395d17792326a6f5e118e61683c986aced9a55d1a92d593c99ff11065cc66d2",
"md5": "ee1de6f4fc6551022294271544623c78",
"sha256": "8c9e71b3e6a2d7c25de0a4f80f861955e9e699dff54552e3144b8cd6dd53bcaa"
},
"downloads": -1,
"filename": "TgCrypto_pyrofork-1.2.7-cp39-cp39-musllinux_1_2_aarch64.whl",
"has_sig": false,
"md5_digest": "ee1de6f4fc6551022294271544623c78",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": "~=3.9",
"size": 60845,
"upload_time": "2024-10-08T07:46:41",
"upload_time_iso_8601": "2024-10-08T07:46:41.138624Z",
"url": "https://files.pythonhosted.org/packages/93/95/d17792326a6f5e118e61683c986aced9a55d1a92d593c99ff11065cc66d2/TgCrypto_pyrofork-1.2.7-cp39-cp39-musllinux_1_2_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "f1e873ddd4ec0bda11cd5c8405dde8c87c73704326725e9ad60d87eb0392c6e5",
"md5": "bc7aa47a68ade9b5c45ae9b21f0d4b35",
"sha256": "e982c67df4d693e5db8682ba79e73e2aabc042492c6acc3738185887aad4beb9"
},
"downloads": -1,
"filename": "TgCrypto_pyrofork-1.2.7-cp39-cp39-win32.whl",
"has_sig": false,
"md5_digest": "bc7aa47a68ade9b5c45ae9b21f0d4b35",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": "~=3.9",
"size": 45075,
"upload_time": "2024-10-08T08:17:13",
"upload_time_iso_8601": "2024-10-08T08:17:13.254428Z",
"url": "https://files.pythonhosted.org/packages/f1/e8/73ddd4ec0bda11cd5c8405dde8c87c73704326725e9ad60d87eb0392c6e5/TgCrypto_pyrofork-1.2.7-cp39-cp39-win32.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "29c90509353dc217a4579ffd22499d7366b8b5547921802997164a9a1f51e031",
"md5": "1bd50787267d4f8aa4aaf966348cb7cf",
"sha256": "5e487e9d67d6605649cddc3aa3fac1d0a3ff5affa1abf94293ea1cdada3ffd13"
},
"downloads": -1,
"filename": "TgCrypto_pyrofork-1.2.7-cp39-cp39-win_amd64.whl",
"has_sig": false,
"md5_digest": "1bd50787267d4f8aa4aaf966348cb7cf",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": "~=3.9",
"size": 45676,
"upload_time": "2024-10-08T08:17:14",
"upload_time_iso_8601": "2024-10-08T08:17:14.157222Z",
"url": "https://files.pythonhosted.org/packages/29/c9/0509353dc217a4579ffd22499d7366b8b5547921802997164a9a1f51e031/TgCrypto_pyrofork-1.2.7-cp39-cp39-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "7c50ffcf5964639cf14bf184498d3fde0e0f5313654ea752c524431c55e72af4",
"md5": "c40a7863d10285924a2a1c8bd7fead06",
"sha256": "1b7195fd1ae6b705a05512c636e94f1b78dae7bf7c80dad6deac1414fec4cef3"
},
"downloads": -1,
"filename": "TgCrypto_pyrofork-1.2.7-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"has_sig": false,
"md5_digest": "c40a7863d10285924a2a1c8bd7fead06",
"packagetype": "bdist_wheel",
"python_version": "pp310",
"requires_python": "~=3.9",
"size": 46277,
"upload_time": "2024-10-08T07:46:41",
"upload_time_iso_8601": "2024-10-08T07:46:41.987496Z",
"url": "https://files.pythonhosted.org/packages/7c/50/ffcf5964639cf14bf184498d3fde0e0f5313654ea752c524431c55e72af4/TgCrypto_pyrofork-1.2.7-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "7cc0a47a0edd6d7a05937d4ee087a4b7154392d798ed99461e98145c5ce2b9eb",
"md5": "8bd9a920e04ba88f345abc5eb9a5a361",
"sha256": "0d44149f628b31a098f44dee93e7e1bc13dafe7e77f5fae65f2881a20cfda8dd"
},
"downloads": -1,
"filename": "TgCrypto_pyrofork-1.2.7-pp310-pypy310_pp73-win_amd64.whl",
"has_sig": false,
"md5_digest": "8bd9a920e04ba88f345abc5eb9a5a361",
"packagetype": "bdist_wheel",
"python_version": "pp310",
"requires_python": "~=3.9",
"size": 45811,
"upload_time": "2024-10-08T08:17:15",
"upload_time_iso_8601": "2024-10-08T08:17:15.068083Z",
"url": "https://files.pythonhosted.org/packages/7c/c0/a47a0edd6d7a05937d4ee087a4b7154392d798ed99461e98145c5ce2b9eb/TgCrypto_pyrofork-1.2.7-pp310-pypy310_pp73-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "1116c01fc568ee8c11d3fbb70ff4a826958a0462d1e187f7b5384d8a67364ab0",
"md5": "166a85e8f12d6787c6073d9e923a39b4",
"sha256": "6daa354c84ff67f75b4304df8896859e3beb39840866d2ac95751e5719d4463a"
},
"downloads": -1,
"filename": "TgCrypto_pyrofork-1.2.7-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"has_sig": false,
"md5_digest": "166a85e8f12d6787c6073d9e923a39b4",
"packagetype": "bdist_wheel",
"python_version": "pp39",
"requires_python": "~=3.9",
"size": 46275,
"upload_time": "2024-10-08T07:46:43",
"upload_time_iso_8601": "2024-10-08T07:46:43.465562Z",
"url": "https://files.pythonhosted.org/packages/11/16/c01fc568ee8c11d3fbb70ff4a826958a0462d1e187f7b5384d8a67364ab0/TgCrypto_pyrofork-1.2.7-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "0d4e66d5b0604d7089f84420327ea89e549db1ce3477d94f71ef9161f1c8a469",
"md5": "c841f15700348f9fefab9cf195bf7ae7",
"sha256": "13d3f25e49ea6cc746502cf543c9ffc420c0f4f5524ddd5329fcf76a0362445a"
},
"downloads": -1,
"filename": "TgCrypto_pyrofork-1.2.7-pp39-pypy39_pp73-win_amd64.whl",
"has_sig": false,
"md5_digest": "c841f15700348f9fefab9cf195bf7ae7",
"packagetype": "bdist_wheel",
"python_version": "pp39",
"requires_python": "~=3.9",
"size": 45808,
"upload_time": "2024-10-08T08:17:16",
"upload_time_iso_8601": "2024-10-08T08:17:16.001497Z",
"url": "https://files.pythonhosted.org/packages/0d/4e/66d5b0604d7089f84420327ea89e549db1ce3477d94f71ef9161f1c8a469/TgCrypto_pyrofork-1.2.7-pp39-pypy39_pp73-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "9680bae4260b65885765407e2e8e59c0452bf180f6b5b23779596a354223c6c5",
"md5": "0998839b7196f2bc220dd61630d21746",
"sha256": "1b91bbd14bac6e661912719efdac2446d48fec9b9bcb7980069a1a94fd622ff9"
},
"downloads": -1,
"filename": "TgCrypto-pyrofork-1.2.7.tar.gz",
"has_sig": false,
"md5_digest": "0998839b7196f2bc220dd61630d21746",
"packagetype": "sdist",
"python_version": "source",
"requires_python": "~=3.9",
"size": 37369,
"upload_time": "2024-10-08T07:50:19",
"upload_time_iso_8601": "2024-10-08T07:50:19.806335Z",
"url": "https://files.pythonhosted.org/packages/96/80/bae4260b65885765407e2e8e59c0452bf180f6b5b23779596a354223c6c5/TgCrypto-pyrofork-1.2.7.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-10-08 07:50:19",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "Mayuri-Chan",
"github_project": "tgcrypto",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"circle": true,
"tox": true,
"lcname": "tgcrypto-pyrofork"
}