Skip to main content

Rust-powered drop-in replacement for TgCrypto

Project description

TgCryptoRust

Rust-powered, AES-NI accelerated cryptography for Telegram clients.

CI License Python Rust

TgCryptoRust is a drop-in replacement for TgCrypto, implemented in Rust and packaged for Python through PyO3 and maturin. It provides the Telegram-focused AES-256 modes used by MTProto clients:

  • AES-256-IGE for MTProto message encryption
  • AES-256-CTR for CDN file encryption
  • AES-256-CBC for Telegram Passport credentials

[!IMPORTANT] This project is provided for educational and experimental purposes. The implementation follows public AES specifications and is tested against known vectors, but it has not received a formal third-party security audit. Do not treat it as a certified cryptographic module.

Requirements

  • Python 3.9 through 3.14
  • Rust 1.83 or newer when building from source

Prebuilt wheels are intended for common desktop and server platforms. Rust is only required when a wheel is not available for your platform or when you are developing the project locally.

Installation

uv add TgCryptoRust
uv pip install TgCryptoRust
pip install TgCryptoRust

Imports

Existing TgCrypto users can keep importing tgcrypto:

import tgcrypto

New code can import the branded module directly:

import tgcryptors

Both modules expose the same API.

Usage

import os
import tgcrypto

data = os.urandom(1024)
key = os.urandom(32)
iv = os.urandom(32)

encrypted = tgcrypto.ige256_encrypt(data, key, iv)
decrypted = tgcrypto.ige256_decrypt(encrypted, key, iv)

assert decrypted == data

CTR Mode

CTR accepts arbitrary-length data. The state argument is a one-byte offset inside the current keystream block and is kept for TgCrypto compatibility.

import os
import tgcryptors

data = os.urandom(1000)
key = os.urandom(32)
iv = os.urandom(16)
state = b"\x00"

encrypted = tgcryptors.ctr256_encrypt(data, key, iv, state)
decrypted = tgcryptors.ctr256_decrypt(encrypted, key, iv, state)

assert decrypted == data

CBC Mode

CBC input must be aligned to 16-byte AES blocks.

import os
import tgcrypto

data = os.urandom(1024)
key = os.urandom(32)
iv = os.urandom(16)

encrypted = tgcrypto.cbc256_encrypt(data, key, iv)
decrypted = tgcrypto.cbc256_decrypt(encrypted, key, iv)

assert decrypted == data

Streaming API

Use the streaming classes when processing one logical stream in chunks. The key schedule is expanded once and reused.

import os
import tgcryptors

key = os.urandom(32)
iv = os.urandom(16)
data = os.urandom(1024)

stream = tgcryptors.Ctr256(key, iv)
encrypted = stream.update(data[:300]) + stream.update(data[300:])

IGE streaming is also available for block-aligned chunks:

import os
import tgcrypto

key = os.urandom(32)
iv = os.urandom(32)
data = os.urandom(1024)

stream = tgcrypto.Ige256(key, iv)
encrypted = stream.encrypt(data[:512]) + stream.encrypt(data[512:])

Compatibility

TgCryptoRust keeps the TgCrypto-compatible function names, argument order, return types, and validation behavior for:

  • ige256_encrypt(data, key, iv)
  • ige256_decrypt(data, key, iv)
  • ctr256_encrypt(data, key, iv, state)
  • ctr256_decrypt(data, key, iv, state)
  • cbc256_encrypt(data, key, iv)
  • cbc256_decrypt(data, key, iv)

The PyPI package name is TgCryptoRust. The native module is tgcryptors, and the compatibility module is tgcrypto.

Runtime Metadata

import tgcryptors

print(tgcryptors.__version__)
print(tgcryptors.runtime_info())

Development

uv sync --python 3.14
uv run maturin develop --release
.venv/bin/python -m unittest discover -s tests -v

Run the Rust checks:

cargo fmt --all -- --check
cargo clippy --all-targets --all-features -- -D warnings
cargo test --release

Build a wheel:

uv build --wheel

Architecture

  • tgcryptors-core contains the Rust AES primitive and Telegram block modes.
  • tgcryptors-python exposes the PyO3 extension module.
  • python/tgcrypto.py re-exports tgcryptors for TgCrypto compatibility.
  • tests/ covers the public Python API and import compatibility.

On x86 and x86_64, AES-NI is detected at runtime when the crate is built with the default aesni feature. Other targets use the software fallback. The software fallback uses table lookups and is not guaranteed to be constant-time on every CPU.

Migration From TgrCrypto

TgrCrypto is deprecated in favor of TgCryptoRust.

pip uninstall TgrCrypto
pip install TgCryptoRust

Existing code that imports tgcrypto can remain unchanged.

License

LGPL-3.0-or-later. See COPYING and COPYING.lesser.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

tgcryptorust-1.1.2.tar.gz (50.4 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

tgcryptorust-1.1.2-cp314-cp314-win_amd64.whl (203.7 kB view details)

Uploaded CPython 3.14Windows x86-64

tgcryptorust-1.1.2-cp314-cp314-manylinux_2_34_x86_64.whl (298.0 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.34+ x86-64

tgcryptorust-1.1.2-cp314-cp314-macosx_11_0_arm64.whl (264.3 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

tgcryptorust-1.1.2-cp313-cp313-win_amd64.whl (203.7 kB view details)

Uploaded CPython 3.13Windows x86-64

tgcryptorust-1.1.2-cp313-cp313-manylinux_2_34_x86_64.whl (298.1 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.34+ x86-64

tgcryptorust-1.1.2-cp313-cp313-macosx_11_0_arm64.whl (264.2 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

tgcryptorust-1.1.2-cp312-cp312-win_amd64.whl (203.5 kB view details)

Uploaded CPython 3.12Windows x86-64

tgcryptorust-1.1.2-cp312-cp312-manylinux_2_34_x86_64.whl (297.8 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.34+ x86-64

tgcryptorust-1.1.2-cp312-cp312-macosx_11_0_arm64.whl (264.0 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

tgcryptorust-1.1.2-cp311-cp311-win_amd64.whl (205.1 kB view details)

Uploaded CPython 3.11Windows x86-64

tgcryptorust-1.1.2-cp311-cp311-manylinux_2_34_x86_64.whl (297.9 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.34+ x86-64

tgcryptorust-1.1.2-cp311-cp311-macosx_11_0_arm64.whl (263.9 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

tgcryptorust-1.1.2-cp310-cp310-win_amd64.whl (205.3 kB view details)

Uploaded CPython 3.10Windows x86-64

tgcryptorust-1.1.2-cp310-cp310-manylinux_2_34_x86_64.whl (298.2 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.34+ x86-64

tgcryptorust-1.1.2-cp310-cp310-macosx_11_0_arm64.whl (264.1 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

tgcryptorust-1.1.2-cp39-cp39-win_amd64.whl (207.8 kB view details)

Uploaded CPython 3.9Windows x86-64

tgcryptorust-1.1.2-cp39-cp39-manylinux_2_34_x86_64.whl (299.8 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.34+ x86-64

tgcryptorust-1.1.2-cp39-cp39-macosx_11_0_arm64.whl (265.6 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

File details

Details for the file tgcryptorust-1.1.2.tar.gz.

File metadata

  • Download URL: tgcryptorust-1.1.2.tar.gz
  • Upload date:
  • Size: 50.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for tgcryptorust-1.1.2.tar.gz
Algorithm Hash digest
SHA256 1e4a19f567e60561615654ec8f75f0623aaaf3e3bb62a1f53331db6741907a15
MD5 578f395d543ac2e19b416b1767f72006
BLAKE2b-256 804d81ae72e0bd4c489c22ba54747d9029e9bd9b240f0232c5a3d5813d6dc978

See more details on using hashes here.

Provenance

The following attestation bundles were made for tgcryptorust-1.1.2.tar.gz:

Publisher: pypi.yml on joyccn/TgCryptoRust

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tgcryptorust-1.1.2-cp314-cp314-win_amd64.whl.

File metadata

File hashes

Hashes for tgcryptorust-1.1.2-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 49791c34c9f3fbba69d42a0606d7209e939d11ebcfc7d4f581d1315b17cfd378
MD5 28d672cbb7ffc02cd9fbc980515854b9
BLAKE2b-256 147ed7e3d1c42336c1a164c1381e1e6d30c2f8774574efd394bcc78988de92b2

See more details on using hashes here.

Provenance

The following attestation bundles were made for tgcryptorust-1.1.2-cp314-cp314-win_amd64.whl:

Publisher: pypi.yml on joyccn/TgCryptoRust

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tgcryptorust-1.1.2-cp314-cp314-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for tgcryptorust-1.1.2-cp314-cp314-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 03617418bac000ddeb43e92fcbfbd96593877433725bbabb3ad42a2e1804caf2
MD5 6298c5a402e414835257b943efcd700e
BLAKE2b-256 0cf1b2434c7232f6c057d55a86f5c282ec6a45248b9e7fc10c1879fd99940bd2

See more details on using hashes here.

Provenance

The following attestation bundles were made for tgcryptorust-1.1.2-cp314-cp314-manylinux_2_34_x86_64.whl:

Publisher: pypi.yml on joyccn/TgCryptoRust

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tgcryptorust-1.1.2-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for tgcryptorust-1.1.2-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e4832a9b25952712ff3784184dc0e5b192a12ab3c7aaa3c286414c8d341dae45
MD5 fc9b9676fee515716c48264ff835e849
BLAKE2b-256 847377df11826543e8cba7680406ef7a5c9066fcd6961a6f1d03de5c3399c6c3

See more details on using hashes here.

Provenance

The following attestation bundles were made for tgcryptorust-1.1.2-cp314-cp314-macosx_11_0_arm64.whl:

Publisher: pypi.yml on joyccn/TgCryptoRust

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tgcryptorust-1.1.2-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for tgcryptorust-1.1.2-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 84e70f352038a1023b5106af1c1912079ee49b083481924fdf97765e2417d13c
MD5 25b4e81e5056e76c262c530305e79f97
BLAKE2b-256 7efb8dd81fbdb5dcade3c65a7136432b38df196cc0a1b4f32749d06817feeff0

See more details on using hashes here.

Provenance

The following attestation bundles were made for tgcryptorust-1.1.2-cp313-cp313-win_amd64.whl:

Publisher: pypi.yml on joyccn/TgCryptoRust

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tgcryptorust-1.1.2-cp313-cp313-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for tgcryptorust-1.1.2-cp313-cp313-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 9435d9dfb4d49dc72d36be583f459796d5b7ddf6a64fd1ceb3c92181200e4155
MD5 51fb60e60770a47857180fefd9f17203
BLAKE2b-256 32f335015c67132239c0d53ce238f7eca3f4eeba9bcf2ac3b440122768193a05

See more details on using hashes here.

Provenance

The following attestation bundles were made for tgcryptorust-1.1.2-cp313-cp313-manylinux_2_34_x86_64.whl:

Publisher: pypi.yml on joyccn/TgCryptoRust

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tgcryptorust-1.1.2-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for tgcryptorust-1.1.2-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 62209248b52f383ba504c5f03fe0c4813523e2a1fed4365a7c1c4222e5b28fb7
MD5 01a31150186b6afd887143bb9fe0c7f6
BLAKE2b-256 bf7ca7f7062d967ce67445f470d1e3cd58c83e84e04bf65d4cf6b288d024c890

See more details on using hashes here.

Provenance

The following attestation bundles were made for tgcryptorust-1.1.2-cp313-cp313-macosx_11_0_arm64.whl:

Publisher: pypi.yml on joyccn/TgCryptoRust

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tgcryptorust-1.1.2-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for tgcryptorust-1.1.2-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 abf6aeef987f0136f460080cedbcf7f50d1bbda8300990b383fd234e89c17b6b
MD5 7a1d866c86b8b1fb2ad18eb0eaa53178
BLAKE2b-256 f84641f53b7d39e5319138bab5a107eada8e563890b6aaa677c8951beb0e2d7f

See more details on using hashes here.

Provenance

The following attestation bundles were made for tgcryptorust-1.1.2-cp312-cp312-win_amd64.whl:

Publisher: pypi.yml on joyccn/TgCryptoRust

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tgcryptorust-1.1.2-cp312-cp312-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for tgcryptorust-1.1.2-cp312-cp312-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 ac7ba8e03ca06a76020261f6240dd438bf7b1dd26998ab29b965841f81e0dca2
MD5 4b1ad86af03684ae2468901fab0e5cd2
BLAKE2b-256 121ec7ec8f65303110675eecec52bc706851f88e06fabe657b09dcf7bf66c376

See more details on using hashes here.

Provenance

The following attestation bundles were made for tgcryptorust-1.1.2-cp312-cp312-manylinux_2_34_x86_64.whl:

Publisher: pypi.yml on joyccn/TgCryptoRust

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tgcryptorust-1.1.2-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for tgcryptorust-1.1.2-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 92e724acc1aa0f9b5d60bbb36c4136d0869b8e87128a330cb0fad789a6dcc617
MD5 848b8d1f937e1dcf61d61353caa8980e
BLAKE2b-256 e37e174553b8b773813ae6951d54d4ca2b286350cdd2fdc53146ab359fffa70c

See more details on using hashes here.

Provenance

The following attestation bundles were made for tgcryptorust-1.1.2-cp312-cp312-macosx_11_0_arm64.whl:

Publisher: pypi.yml on joyccn/TgCryptoRust

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tgcryptorust-1.1.2-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for tgcryptorust-1.1.2-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 9e95d55cad03c5b73df92cabc9b402bf4379d19e5bc82cb976e64d757abd7d23
MD5 7ee93e276f907a380a00fa7c790d0216
BLAKE2b-256 7b66d1b9a9f2fef49cf3704a02044c5c194a78ec595a4f612af5e470ddc3b066

See more details on using hashes here.

Provenance

The following attestation bundles were made for tgcryptorust-1.1.2-cp311-cp311-win_amd64.whl:

Publisher: pypi.yml on joyccn/TgCryptoRust

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tgcryptorust-1.1.2-cp311-cp311-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for tgcryptorust-1.1.2-cp311-cp311-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 531ac977d8244e79b4b3fce54eb6c3b8a441f3919c31e40d6cc5d6d95a760df0
MD5 5c3860e659ba215cf745915de5d42728
BLAKE2b-256 1112381568edd73ff609e87d5705b9bbdbcbdc4a3bbbf558d167f697e852c5a4

See more details on using hashes here.

Provenance

The following attestation bundles were made for tgcryptorust-1.1.2-cp311-cp311-manylinux_2_34_x86_64.whl:

Publisher: pypi.yml on joyccn/TgCryptoRust

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tgcryptorust-1.1.2-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for tgcryptorust-1.1.2-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a38209b384ace9afd8b8fe1f30560bc89e291c83d3f8f5ce83d48da63db1d0d3
MD5 5925d581bf505fcf3820f1e9b28d47e7
BLAKE2b-256 001d2a11fb4585c191250b2b9a181823edc5817b50664802fdbfc4d8ee271c7c

See more details on using hashes here.

Provenance

The following attestation bundles were made for tgcryptorust-1.1.2-cp311-cp311-macosx_11_0_arm64.whl:

Publisher: pypi.yml on joyccn/TgCryptoRust

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tgcryptorust-1.1.2-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for tgcryptorust-1.1.2-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 4b40c13b461d6ed34200d745a43e89e094e4699a597abfb7aa08700dbc5a53d2
MD5 4884707a128b8c549c91e5494b0ef3b0
BLAKE2b-256 75a16599bef945ae402aa20b3a91101649b2670b95ad13c98aec77788d369e22

See more details on using hashes here.

Provenance

The following attestation bundles were made for tgcryptorust-1.1.2-cp310-cp310-win_amd64.whl:

Publisher: pypi.yml on joyccn/TgCryptoRust

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tgcryptorust-1.1.2-cp310-cp310-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for tgcryptorust-1.1.2-cp310-cp310-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 2532b4a0d9f71162b0d9b0cdb797796db1673f23d334fe6a28cb7d0b5d862578
MD5 46d1938c67cdfcd8fe4b72bdef5aa24b
BLAKE2b-256 e68f1ee3b5add22715e3226081d2c728697634256e9898a2d93632ac8133f089

See more details on using hashes here.

Provenance

The following attestation bundles were made for tgcryptorust-1.1.2-cp310-cp310-manylinux_2_34_x86_64.whl:

Publisher: pypi.yml on joyccn/TgCryptoRust

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tgcryptorust-1.1.2-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for tgcryptorust-1.1.2-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ed34760714e2fc310d324654e25099cc6a5bdeae324900513c0fd388c00ee4cc
MD5 503c2be09324a5334e5ca4285b7cf524
BLAKE2b-256 5a758b8a841b3a7bc9f5523272dbcb2f1af10f711f770e59a73f3e3d9afca18d

See more details on using hashes here.

Provenance

The following attestation bundles were made for tgcryptorust-1.1.2-cp310-cp310-macosx_11_0_arm64.whl:

Publisher: pypi.yml on joyccn/TgCryptoRust

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tgcryptorust-1.1.2-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: tgcryptorust-1.1.2-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 207.8 kB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for tgcryptorust-1.1.2-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 db609de3538dcfed07b70c432602201d654525aafb07722726e10dc3e867df96
MD5 b2322f5373bb11734a5a3db27c03d8b6
BLAKE2b-256 7331c8efae1057e43e3783be0084c05777dde7c609a6b9a855cc04a226f884a5

See more details on using hashes here.

Provenance

The following attestation bundles were made for tgcryptorust-1.1.2-cp39-cp39-win_amd64.whl:

Publisher: pypi.yml on joyccn/TgCryptoRust

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tgcryptorust-1.1.2-cp39-cp39-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for tgcryptorust-1.1.2-cp39-cp39-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 c031e1468a3488639643ae4fce384435e07aa21097762374a2d54e3b82f5b48b
MD5 e02765b94b219fb3fcebf98ff7e7460c
BLAKE2b-256 21b6a27a20562314796f318da5e5e8b34b6d1e91b83b595ebf75aa816f782902

See more details on using hashes here.

Provenance

The following attestation bundles were made for tgcryptorust-1.1.2-cp39-cp39-manylinux_2_34_x86_64.whl:

Publisher: pypi.yml on joyccn/TgCryptoRust

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tgcryptorust-1.1.2-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for tgcryptorust-1.1.2-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 dc542c2641a68c1325dcd4c8f5565e226e12aa9bbd7b3d2f6161bf893f6a3c85
MD5 6a6ebf549c55cb8fec068da05ef241f9
BLAKE2b-256 322e22152e93254601e95f1af70b5980403f00f5bc4de083ded502575996da7c

See more details on using hashes here.

Provenance

The following attestation bundles were made for tgcryptorust-1.1.2-cp39-cp39-macosx_11_0_arm64.whl:

Publisher: pypi.yml on joyccn/TgCryptoRust

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page