# 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.10",
"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://github.com/Mayuri-Chan/tgcrypto/releases/latest",
"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.8",
"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": null,
"digests": {
"blake2b_256": "7cbeb4785113c4316b5b88096910c69b6859f45143da59e3257aa5ab6153f63e",
"md5": "e9c45fe226d24608272cff8b42472436",
"sha256": "ca660aff1827879aaf228d8442c3cd0a5c61b437fdb5f3838dc209d709de77a6"
},
"downloads": -1,
"filename": "tgcrypto_pyrofork-1.2.8-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl",
"has_sig": false,
"md5_digest": "e9c45fe226d24608272cff8b42472436",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": "~=3.10",
"size": 59892,
"upload_time": "2025-10-24T09:25:24",
"upload_time_iso_8601": "2025-10-24T09:25:24.570528Z",
"url": "https://files.pythonhosted.org/packages/7c/be/b4785113c4316b5b88096910c69b6859f45143da59e3257aa5ab6153f63e/tgcrypto_pyrofork-1.2.8-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "7b08606be1878f3c028b826a023cd79e1af4570420ea180bb3fe4ca70a2df26e",
"md5": "5bab6947694e79530fd1d7fc03d4d701",
"sha256": "03731cf0f053bff39516e73d09cb9fbf532b22417396d729c61b5862315dbd9d"
},
"downloads": -1,
"filename": "tgcrypto_pyrofork-1.2.8-cp310-cp310-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "5bab6947694e79530fd1d7fc03d4d701",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": "~=3.10",
"size": 60011,
"upload_time": "2025-10-24T09:25:25",
"upload_time_iso_8601": "2025-10-24T09:25:25.575758Z",
"url": "https://files.pythonhosted.org/packages/7b/08/606be1878f3c028b826a023cd79e1af4570420ea180bb3fe4ca70a2df26e/tgcrypto_pyrofork-1.2.8-cp310-cp310-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "ebafd27e22949aba709f5375461fd993d0c66610828551f1e3f6e10a833d8f0d",
"md5": "fc106903264f5d7618ca4dcc6feb119f",
"sha256": "066fb06cfc31be72926ebf0182bb682119d08b031d7e0a1548bff44759cefac9"
},
"downloads": -1,
"filename": "tgcrypto_pyrofork-1.2.8-cp310-cp310-win32.whl",
"has_sig": false,
"md5_digest": "fc106903264f5d7618ca4dcc6feb119f",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": "~=3.10",
"size": 45168,
"upload_time": "2025-10-24T09:25:27",
"upload_time_iso_8601": "2025-10-24T09:25:27.768189Z",
"url": "https://files.pythonhosted.org/packages/eb/af/d27e22949aba709f5375461fd993d0c66610828551f1e3f6e10a833d8f0d/tgcrypto_pyrofork-1.2.8-cp310-cp310-win32.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "44fd8bc790d71de23188e82240a5db06f82b2c5d1cb3cbc2c14dd2cc49ad14cd",
"md5": "5b47b6d99256374d445eb8e7ffbc2308",
"sha256": "8ad0720256a87222e92dff2364e53d8aa4c03109c4e4d0392b1248c7ea17b003"
},
"downloads": -1,
"filename": "tgcrypto_pyrofork-1.2.8-cp310-cp310-win_amd64.whl",
"has_sig": false,
"md5_digest": "5b47b6d99256374d445eb8e7ffbc2308",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": "~=3.10",
"size": 45923,
"upload_time": "2025-10-24T09:25:28",
"upload_time_iso_8601": "2025-10-24T09:25:28.770572Z",
"url": "https://files.pythonhosted.org/packages/44/fd/8bc790d71de23188e82240a5db06f82b2c5d1cb3cbc2c14dd2cc49ad14cd/tgcrypto_pyrofork-1.2.8-cp310-cp310-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "6417a1d0bbccf5e35780078620d45b806b81d83fd9213614b1629e8c3855e29d",
"md5": "94774d5afd7f944f5c68210fce45a8f2",
"sha256": "56386772dc26dc8d60717bce826e6f40dc0e1f4f1513818adf5541e668e30e39"
},
"downloads": -1,
"filename": "tgcrypto_pyrofork-1.2.8-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl",
"has_sig": false,
"md5_digest": "94774d5afd7f944f5c68210fce45a8f2",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": "~=3.10",
"size": 60645,
"upload_time": "2025-10-24T09:25:26",
"upload_time_iso_8601": "2025-10-24T09:25:26.336177Z",
"url": "https://files.pythonhosted.org/packages/64/17/a1d0bbccf5e35780078620d45b806b81d83fd9213614b1629e8c3855e29d/tgcrypto_pyrofork-1.2.8-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "1476ec7eb9648f2e7fe8a06da4015b0a66d6c3df56d83a2e3de758bc276db5e4",
"md5": "3370cac3b2e6c2a8a99ba4861b50b1f1",
"sha256": "aa68d0a01080f5ae9ca081639dc748451882af6c7542b016887498834d39c400"
},
"downloads": -1,
"filename": "tgcrypto_pyrofork-1.2.8-cp311-cp311-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "3370cac3b2e6c2a8a99ba4861b50b1f1",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": "~=3.10",
"size": 60791,
"upload_time": "2025-10-24T09:25:27",
"upload_time_iso_8601": "2025-10-24T09:25:27.087573Z",
"url": "https://files.pythonhosted.org/packages/14/76/ec7eb9648f2e7fe8a06da4015b0a66d6c3df56d83a2e3de758bc276db5e4/tgcrypto_pyrofork-1.2.8-cp311-cp311-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "7087190a27a699237189952d6677b0a335d447a1fdd6a00b4682c67dd165a04c",
"md5": "104c587f6fed403928f76a9ce7c0a88b",
"sha256": "728759dec7c014c193d1b1898edd83891e862c14f0c6d3d7ff6bf0bcd4dfdd75"
},
"downloads": -1,
"filename": "tgcrypto_pyrofork-1.2.8-cp311-cp311-win32.whl",
"has_sig": false,
"md5_digest": "104c587f6fed403928f76a9ce7c0a88b",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": "~=3.10",
"size": 45171,
"upload_time": "2025-10-24T09:25:30",
"upload_time_iso_8601": "2025-10-24T09:25:30.416330Z",
"url": "https://files.pythonhosted.org/packages/70/87/190a27a699237189952d6677b0a335d447a1fdd6a00b4682c67dd165a04c/tgcrypto_pyrofork-1.2.8-cp311-cp311-win32.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "3e5e1b55759191ea577c8683e4b0df570ee624d92c9bc6119e3fdbe28e43d194",
"md5": "29c11e001ace9b51603e8ba4670adc86",
"sha256": "683d6f12de4e9dcd96b5e56f84cf026750524696c29ee61dc366d4edee2b8868"
},
"downloads": -1,
"filename": "tgcrypto_pyrofork-1.2.8-cp311-cp311-win_amd64.whl",
"has_sig": false,
"md5_digest": "29c11e001ace9b51603e8ba4670adc86",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": "~=3.10",
"size": 45920,
"upload_time": "2025-10-24T09:25:31",
"upload_time_iso_8601": "2025-10-24T09:25:31.711375Z",
"url": "https://files.pythonhosted.org/packages/3e/5e/1b55759191ea577c8683e4b0df570ee624d92c9bc6119e3fdbe28e43d194/tgcrypto_pyrofork-1.2.8-cp311-cp311-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "e6fae2d8df9640c4a3506ecc6f82726ce557143e8cd27c0f22d15f042a3abc57",
"md5": "5e71085012703bec05bbcf19e3981e06",
"sha256": "5bcb37b87c12d989c5c974869a93d705493457b8976d97e40b37cc476c6336bb"
},
"downloads": -1,
"filename": "tgcrypto_pyrofork-1.2.8-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl",
"has_sig": false,
"md5_digest": "5e71085012703bec05bbcf19e3981e06",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": "~=3.10",
"size": 60309,
"upload_time": "2025-10-24T09:25:27",
"upload_time_iso_8601": "2025-10-24T09:25:27.977932Z",
"url": "https://files.pythonhosted.org/packages/e6/fa/e2d8df9640c4a3506ecc6f82726ce557143e8cd27c0f22d15f042a3abc57/tgcrypto_pyrofork-1.2.8-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "3be6f3865513c1d8c69aa1205d2f8f1eb7537ee5c3fd7f61a5d0911b2d8a0299",
"md5": "99ffa6d7722f2a8ac613ed9948aec79b",
"sha256": "12d7255b99d33e862272af7fa4712b4e91aea76362969b53ca03afc8fa610005"
},
"downloads": -1,
"filename": "tgcrypto_pyrofork-1.2.8-cp312-cp312-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "99ffa6d7722f2a8ac613ed9948aec79b",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": "~=3.10",
"size": 60461,
"upload_time": "2025-10-24T09:25:29",
"upload_time_iso_8601": "2025-10-24T09:25:29.547161Z",
"url": "https://files.pythonhosted.org/packages/3b/e6/f3865513c1d8c69aa1205d2f8f1eb7537ee5c3fd7f61a5d0911b2d8a0299/tgcrypto_pyrofork-1.2.8-cp312-cp312-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "63943a99af9bcba7772c177812bb3b75ee50bf5be4d18e7502dfb4274be3ff1e",
"md5": "2542f51dda1bb20f8dde456fe5e0d5ad",
"sha256": "7594c508edb1ae1c939c733b033c2043ddd769559970195c93bcbe39628af0ca"
},
"downloads": -1,
"filename": "tgcrypto_pyrofork-1.2.8-cp312-cp312-win32.whl",
"has_sig": false,
"md5_digest": "2542f51dda1bb20f8dde456fe5e0d5ad",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": "~=3.10",
"size": 45167,
"upload_time": "2025-10-24T09:25:33",
"upload_time_iso_8601": "2025-10-24T09:25:33.194433Z",
"url": "https://files.pythonhosted.org/packages/63/94/3a99af9bcba7772c177812bb3b75ee50bf5be4d18e7502dfb4274be3ff1e/tgcrypto_pyrofork-1.2.8-cp312-cp312-win32.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "e61b96a45ded03e0f2ed156a63c050f0d9ca86c373d6a8757b0e9e521f21f40e",
"md5": "090593fbb7ddb7bf9927542ffd559554",
"sha256": "e3cc194a514288627a2c0323b21875183eebb72764d066e490ebd494a3660cc0"
},
"downloads": -1,
"filename": "tgcrypto_pyrofork-1.2.8-cp312-cp312-win_amd64.whl",
"has_sig": false,
"md5_digest": "090593fbb7ddb7bf9927542ffd559554",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": "~=3.10",
"size": 45922,
"upload_time": "2025-10-24T09:25:34",
"upload_time_iso_8601": "2025-10-24T09:25:34.553376Z",
"url": "https://files.pythonhosted.org/packages/e6/1b/96a45ded03e0f2ed156a63c050f0d9ca86c373d6a8757b0e9e521f21f40e/tgcrypto_pyrofork-1.2.8-cp312-cp312-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "f8bb0193ab5a6012172995fa96a009b79c2b786c0e63106f244ab4b7a9846bc6",
"md5": "14f159f293c0dc272f6bc4d8b92ef21f",
"sha256": "d4886fa409c891e129c6ab439542e0b80b001b31bcefac63509340b0c691f73b"
},
"downloads": -1,
"filename": "tgcrypto_pyrofork-1.2.8-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl",
"has_sig": false,
"md5_digest": "14f159f293c0dc272f6bc4d8b92ef21f",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": "~=3.10",
"size": 60306,
"upload_time": "2025-10-24T09:25:31",
"upload_time_iso_8601": "2025-10-24T09:25:31.058585Z",
"url": "https://files.pythonhosted.org/packages/f8/bb/0193ab5a6012172995fa96a009b79c2b786c0e63106f244ab4b7a9846bc6/tgcrypto_pyrofork-1.2.8-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "5355100fde3d9a2215d25d469a36ae116d533a2455005d4fa83b9cb4caef49fc",
"md5": "f4e1d1a123a5e7dfde0d724b6f742d38",
"sha256": "1ff578ac8b54607e6d536f9593f78d8bea9b99f2e607ea4bd71b1b2a3a5f949c"
},
"downloads": -1,
"filename": "tgcrypto_pyrofork-1.2.8-cp313-cp313-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "f4e1d1a123a5e7dfde0d724b6f742d38",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": "~=3.10",
"size": 60528,
"upload_time": "2025-10-24T09:25:32",
"upload_time_iso_8601": "2025-10-24T09:25:32.644639Z",
"url": "https://files.pythonhosted.org/packages/53/55/100fde3d9a2215d25d469a36ae116d533a2455005d4fa83b9cb4caef49fc/tgcrypto_pyrofork-1.2.8-cp313-cp313-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "97bf45480165ac318e7a230f1ea44c97f45007c1f4f60ab7121d4034f0b16ac7",
"md5": "030a28ca3cecd78949f1b6a27078f185",
"sha256": "a8572c5c46c51352e294f7f68df2ed425756e25c08d0e2ef94e055ed243e3104"
},
"downloads": -1,
"filename": "tgcrypto_pyrofork-1.2.8-cp313-cp313-win32.whl",
"has_sig": false,
"md5_digest": "030a28ca3cecd78949f1b6a27078f185",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": "~=3.10",
"size": 45164,
"upload_time": "2025-10-24T09:25:35",
"upload_time_iso_8601": "2025-10-24T09:25:35.927317Z",
"url": "https://files.pythonhosted.org/packages/97/bf/45480165ac318e7a230f1ea44c97f45007c1f4f60ab7121d4034f0b16ac7/tgcrypto_pyrofork-1.2.8-cp313-cp313-win32.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "d5f615df88cdf00d71832c883cdd366ccfe7c6bf6dd7cc678ee42007b4b27bce",
"md5": "6158a7a5587965bee8dbe2aef6750ffa",
"sha256": "66792dfd71a90248cea9b855a40e9339686d19dc131134bd7ce4ec10b99a3509"
},
"downloads": -1,
"filename": "tgcrypto_pyrofork-1.2.8-cp313-cp313-win_amd64.whl",
"has_sig": false,
"md5_digest": "6158a7a5587965bee8dbe2aef6750ffa",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": "~=3.10",
"size": 45920,
"upload_time": "2025-10-24T09:25:37",
"upload_time_iso_8601": "2025-10-24T09:25:37.638041Z",
"url": "https://files.pythonhosted.org/packages/d5/f6/15df88cdf00d71832c883cdd366ccfe7c6bf6dd7cc678ee42007b4b27bce/tgcrypto_pyrofork-1.2.8-cp313-cp313-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "5f7868a5af0e776b65e598f8926c0814d8aa418b424f16e2a611efdcc3ba3695",
"md5": "2a251b41bc46bdb7c46afee07b8c0b89",
"sha256": "ae1a23ed300786e28e8d9c2024effba7efc732d99fd8a2db314c02c35355f01f"
},
"downloads": -1,
"filename": "tgcrypto_pyrofork-1.2.8-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl",
"has_sig": false,
"md5_digest": "2a251b41bc46bdb7c46afee07b8c0b89",
"packagetype": "bdist_wheel",
"python_version": "cp314",
"requires_python": "~=3.10",
"size": 60477,
"upload_time": "2025-10-24T09:25:33",
"upload_time_iso_8601": "2025-10-24T09:25:33.896367Z",
"url": "https://files.pythonhosted.org/packages/5f/78/68a5af0e776b65e598f8926c0814d8aa418b424f16e2a611efdcc3ba3695/tgcrypto_pyrofork-1.2.8-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "b4653f26e9680e312ee4cae8639e37035944037280c9b03bb17c2204020b024f",
"md5": "b79487b4ef4f3802f5510ec9c7c766d5",
"sha256": "fe3d75abef53bfbfa6e80dc6d25075f603f3ebe1dafa9d5c09b2780e0ea3a382"
},
"downloads": -1,
"filename": "tgcrypto_pyrofork-1.2.8-cp314-cp314-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "b79487b4ef4f3802f5510ec9c7c766d5",
"packagetype": "bdist_wheel",
"python_version": "cp314",
"requires_python": "~=3.10",
"size": 60651,
"upload_time": "2025-10-24T09:25:35",
"upload_time_iso_8601": "2025-10-24T09:25:35.269627Z",
"url": "https://files.pythonhosted.org/packages/b4/65/3f26e9680e312ee4cae8639e37035944037280c9b03bb17c2204020b024f/tgcrypto_pyrofork-1.2.8-cp314-cp314-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "7a445c3582787210840bd9e752a0e79d2c7a6b01339d4f11e243d2b79e003644",
"md5": "76fe3a3b685ce5fa3c6d2eff7d81d8b8",
"sha256": "d3441ec567f9411ffbe5182fd4fb8c49fbd12faccd71c50fc469b9784e15b04d"
},
"downloads": -1,
"filename": "tgcrypto_pyrofork-1.2.8-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl",
"has_sig": false,
"md5_digest": "76fe3a3b685ce5fa3c6d2eff7d81d8b8",
"packagetype": "bdist_wheel",
"python_version": "cp314",
"requires_python": "~=3.10",
"size": 60493,
"upload_time": "2025-10-24T09:25:36",
"upload_time_iso_8601": "2025-10-24T09:25:36.657330Z",
"url": "https://files.pythonhosted.org/packages/7a/44/5c3582787210840bd9e752a0e79d2c7a6b01339d4f11e243d2b79e003644/tgcrypto_pyrofork-1.2.8-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "6f508e944e574f2dd3155db54a17c260cb550953cd7ecbd677c4e3d128e36de3",
"md5": "401506bc6db05a992c16e40b76014fde",
"sha256": "bc888db2675247a1e3d9040577e025d64b66b72702223030b0e18ed10037b99e"
},
"downloads": -1,
"filename": "tgcrypto_pyrofork-1.2.8-cp314-cp314t-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "401506bc6db05a992c16e40b76014fde",
"packagetype": "bdist_wheel",
"python_version": "cp314",
"requires_python": "~=3.10",
"size": 60691,
"upload_time": "2025-10-24T09:25:38",
"upload_time_iso_8601": "2025-10-24T09:25:38.274515Z",
"url": "https://files.pythonhosted.org/packages/6f/50/8e944e574f2dd3155db54a17c260cb550953cd7ecbd677c4e3d128e36de3/tgcrypto_pyrofork-1.2.8-cp314-cp314t-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "f8cf6fb83ac9e739cec63cad9700a96e6e0cffefe27a24b517bb1251b5378c20",
"md5": "7d8ae078eb96742f66ab085a55810f57",
"sha256": "cebd0cf96f27de50fedbbb836e459fb2d7d960ea1a454ac141ead0209d43bf5f"
},
"downloads": -1,
"filename": "tgcrypto_pyrofork-1.2.8-cp314-cp314t-win32.whl",
"has_sig": false,
"md5_digest": "7d8ae078eb96742f66ab085a55810f57",
"packagetype": "bdist_wheel",
"python_version": "cp314",
"requires_python": "~=3.10",
"size": 47123,
"upload_time": "2025-10-24T09:25:41",
"upload_time_iso_8601": "2025-10-24T09:25:41.175604Z",
"url": "https://files.pythonhosted.org/packages/f8/cf/6fb83ac9e739cec63cad9700a96e6e0cffefe27a24b517bb1251b5378c20/tgcrypto_pyrofork-1.2.8-cp314-cp314t-win32.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "411b7deb72797d4a1e5bd25fc362de16d0f1aa0e3fef5417f41fec1b6bdc40e7",
"md5": "b4bd9d348a8111712787651f72e895b9",
"sha256": "2e94273c733cba188b28b903eb10ed014eaeb454ccc9269e96c89d7f43d12ddf"
},
"downloads": -1,
"filename": "tgcrypto_pyrofork-1.2.8-cp314-cp314t-win_amd64.whl",
"has_sig": false,
"md5_digest": "b4bd9d348a8111712787651f72e895b9",
"packagetype": "bdist_wheel",
"python_version": "cp314",
"requires_python": "~=3.10",
"size": 47884,
"upload_time": "2025-10-24T09:25:41",
"upload_time_iso_8601": "2025-10-24T09:25:41.972140Z",
"url": "https://files.pythonhosted.org/packages/41/1b/7deb72797d4a1e5bd25fc362de16d0f1aa0e3fef5417f41fec1b6bdc40e7/tgcrypto_pyrofork-1.2.8-cp314-cp314t-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "49c3bec17c976b0caca2ae90cab295ab50c4384036b0b3df1096c0eaa329eb06",
"md5": "93de5f751b4a4e7c9a60e0b5a3d35668",
"sha256": "f17a4dd0197e0972f056242bc06f97d86e890f8e29bda69af3dbc6f25d40c33f"
},
"downloads": -1,
"filename": "tgcrypto_pyrofork-1.2.8-cp314-cp314-win32.whl",
"has_sig": false,
"md5_digest": "93de5f751b4a4e7c9a60e0b5a3d35668",
"packagetype": "bdist_wheel",
"python_version": "cp314",
"requires_python": "~=3.10",
"size": 47116,
"upload_time": "2025-10-24T09:25:39",
"upload_time_iso_8601": "2025-10-24T09:25:39.203052Z",
"url": "https://files.pythonhosted.org/packages/49/c3/bec17c976b0caca2ae90cab295ab50c4384036b0b3df1096c0eaa329eb06/tgcrypto_pyrofork-1.2.8-cp314-cp314-win32.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "25a4a2ca8127e03c31793e9659ab02fb8aeaf4ff2481cfc77f05c1651b0f8b0c",
"md5": "702a3d93e0815c8cb8c235f5f23575a9",
"sha256": "8eaf42413eb7b2efae1122106803c26dc792f0ad6d98ed77d179950c979d0d35"
},
"downloads": -1,
"filename": "tgcrypto_pyrofork-1.2.8-cp314-cp314-win_amd64.whl",
"has_sig": false,
"md5_digest": "702a3d93e0815c8cb8c235f5f23575a9",
"packagetype": "bdist_wheel",
"python_version": "cp314",
"requires_python": "~=3.10",
"size": 47880,
"upload_time": "2025-10-24T09:25:40",
"upload_time_iso_8601": "2025-10-24T09:25:40.434918Z",
"url": "https://files.pythonhosted.org/packages/25/a4/a2ca8127e03c31793e9659ab02fb8aeaf4ff2481cfc77f05c1651b0f8b0c/tgcrypto_pyrofork-1.2.8-cp314-cp314-win_amd64.whl",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-10-24 09:25:24",
"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"
}