TgCrypto-pyrofork


NameTgCrypto-pyrofork JSON
Version 1.2.8 PyPI version JSON
download
home_pagehttps://github.com/Mayuri-Chan
SummaryFast and Portable Cryptography Extension Library for Pyrofork
upload_time2025-10-24 09:25:24
maintainerNone
docs_urlNone
authorwulan17
requires_python~=3.10
licenseLGPLv3+
keywords pyrogram pyrofork telegram crypto cryptography encryption mtproto extension library aes
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # 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"
}
        
Elapsed time: 2.07106s