Skip to main content

Drop-in ssl stdlib library using BoringSSL with first-class fingerprint impersonation.

Project description

BoringSSL-backed TLS for CPython, with Chrome impersonation

Drop-in replacement for the ssl stdlib with a Fingerprint API for Chrome impersonation. Built on stock BoringSSL through boring-sys - no vendored patches, no curl-impersonate, no Go runtime at import time. Use it with any known Python http client you like or used to.

Supports CPython 3.7 onward, including freethreaded builds.

Why this exists

We sat on this for a long time, kept it private as we needed to think longer about whether the world really needed one more TLS library.

The initial thinking was: why do I have to install yet whole another http client just because we need to look like a real browser? The Python ecosystem already ships perfectly fine http clients - urllib3, niquests, httpx, aiohttp - and all of them ride on top of ssl. If the impersonation lives one layer down, in the SSL layer itself, every one of them gets it for free. No fork of curl, no Go runtime imported at module load, no second http client to teach your codebase, no patched BoringSSL to maintain across CVE cycles.

That is what utls is: the ClientHello machinery, plugged in exactly where the rest of Python already plugs in.

It was private until now. Enjoy it, but with care - browser impersonation has legitimate uses (interop testing, anti-bot researches, making sure your own service still answers a real Chrome correctly) and it has illegitimate ones. The license forbids nothing; your judgment does.

Contributions are welcome. New Chrome versions are one profile module plus one registry line; platform fixes, bug reports and CI cleanups are read and merged.

Getting Started

Install from PyPI (pre-built wheels for Linux, macOS, and Windows):

pip install utls

Then swap ssl for utls anywhere in your code:

import utls as ssl

ctx = ssl.create_default_context()

Or use it alongside the stdlib:

from utls import SSLContext, PROTOCOL_TLS_CLIENT

ctx = SSLContext(PROTOCOL_TLS_CLIENT)
ctx.load_default_certs()

import socket
sock = socket.create_connection(("example.com", 443))
ssock = ctx.wrap_socket(sock, server_hostname="example.com")
ssock.sendall(b"GET / HTTP/1.1\r\nHost: example.com\r\n\r\n")
print(ssock.recv(4096).decode())

It works with asyncio out of the box:

import asyncio
import utls as ssl

async def main():
    ctx = ssl.create_default_context()
    reader, writer = await asyncio.open_connection("example.com", 443, ssl=ctx)
    writer.write(b"GET / HTTP/1.1\r\nHost: example.com\r\n\r\n")
    await writer.drain()
    print((await reader.read(4096)).decode())
    writer.close()

asyncio.run(main())

Browser impersonation

import utls, socket

ctx = utls.create_default_context()
ctx.set_fingerprint("chrome:stable")

with socket.create_connection(("www.google.com", 443)) as raw:
    with ctx.wrap_socket(raw, server_hostname="www.google.com") as s:
        s.sendall(b"GET / HTTP/1.1\r\nHost: www.google.com\r\nConnection: close\r\n\r\n")
        print(s.recv(4096))

The bundled profile registry can be inspected at runtime:

from utls import Fingerprint, presets

print(presets())
# ['chrome:131', 'chrome:142', 'chrome:146', 'chrome:148', 'chrome:150', 'chrome:stable']

fp = Fingerprint.from_preset("chrome:stable")
print(fp.ja3_hash, fp.ja4_hash)

Profiles ship as plain Python modules under utls.profiles.*. utls is Chrome-only by design. Adding a new Chrome version is one .py file plus one registry line.

What impersonation actually rewrites

set_fingerprint controls the TLS ClientHello bytes: cipher suite list and order, extension list and order, named groups, key shares, signature algorithms, ALPN/ALPS payloads, GREASE placement, certificate compression, explicit ECH GREASE or real config, and so on. Everything that goes into a JA3 or JA4 hash, utls drives.

What it does not rewrite, because they live above TLS:

  • The HTTP request line, method, path, and body.
  • HTTP/2 SETTINGS frames, WINDOW_UPDATE values, HEADERS frame priority flags, and the Akamai HTTP/2 fingerprint that some bot-detection vendors track. Those belong to your HTTP client; pair utls with niquests or urllib3-future if you need them honored end-to-end.

Carrying the canonical Chrome header set

Each profile also publishes the exact HTTP request-header set Chrome sends on a top-level navigation, in the on-the-wire insertion order. The HTTP layer is yours to drive, but the headers are right there if you want matched cosmetics:

from utls import Fingerprint

fp = Fingerprint.from_preset("chrome:stable")
for name, value in fp.http_headers.items():
    print(f"{name}: {value}")
# sec-ch-ua: "Chromium";v="148", "Google Chrome";v="148", "Not/A)Brand";v="99"
# sec-ch-ua-mobile: ?0
# sec-ch-ua-platform: "Linux"
# User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 ...
# Accept: text/html,application/xhtml+xml,...
# ...

Request- or session-dependent headers (Host, Cookie, Referer, Content-Length, Content-Type) are deliberately omitted from the dict; the HTTP client is responsible for emitting those. For HTTP/1.1, prepend Host at position 0 to preserve Chrome's wire order.

Choosing a profile

  • chrome:stable always tracks the newest Chrome major shipped in a utls release. Use this if you want to drift with Chrome without code changes.
  • chrome:148, chrome:146, chrome:142, chrome:131 pin to specific Chrome majors. Use these when reproducibility matters - e.g. a long- running scraper that should not silently change shape when utls is upgraded.

The JA4 hash is the fingerprint identity that bot-detection vendors and TLS observatories actually index on. chrome:142 / chrome:146 / chrome:148 share the same JA4 because they share the same TLS-layer ClientHello (the deltas are HTTP-layer); chrome:131 differs because it uses the legacy ALPS codepoint (0x4469 vs 0x44cd). chrome:150 also differs: it is the first stable major to advertise post-quantum ML-DSA (FIPS 204) signature algorithms, which changes the signature_algorithms bytes and therefore the JA4.

Why JA3 varies but JA4 stays put

Chrome 110+ permutes its TLS extension order on every connection to defeat order-based fingerprinting. utls mirrors that behavior. As a result:

  • JA3 hashes the wire order verbatim, so fp.ja3_hash (and the hash you'd compute from a live capture) shifts per connection. Use the JA3 string for diffing the extension set, not the hash for equality.
  • JA4 sorts extension codepoints before hashing, so fp.ja4_hash is stable and the value that matches your live capture.

Capturing a fingerprint from a live ClientHello

If you have raw ClientHello bytes (e.g. captured via tcpdump, mitmproxy, or a custom TLS trap), you can rebuild a Fingerprint from them and feed it back into a context:

from utls import Fingerprint, SSLContext

raw = open("clienthello.bin", "rb").read()
fp = Fingerprint.from_capture(raw)
print(fp.ja4_hash)

ctx = SSLContext()
ctx.set_fingerprint(fp)

Captured fingerprints carry no HTTP headers (fp.http_headers == {}); they only encode the TLS layer. To round-trip a full profile, use fp.to_dict() + Fingerprint.from_dict(...) and add http_headers manually.

Server-side and impersonation

set_fingerprint on a server-side context raises at the Rust level. The ClientHello is, by definition, the client's choice; a server-side fingerprint would be meaningless on the wire. Server contexts can still inspect the peer ClientHello for diagnostics (see the Server-side section below).

Encrypted Client Hello (ECH)

Chrome profiles ship with ECH GREASE enabled by default, matching real Chrome. To offer real ECH - encrypting the inner ClientHello (including the real SNI) under the server's published HPKE config - fork a per-peer context carrying the wire-format ECHConfigList bytes:

import utls, socket

base = utls.SSLContext()
base.load_default_certs()
base.set_fingerprint("chrome:stable")

# ECH configs are peer-specific* - each origin publishes its own in a DNS
# HTTPS RR. `set_ech_configs` is non-mutating: it returns a NEW SSLContext
# that shares the underlying SSL_CTX (and CA store) with `base` via
# SSL_CTX_up_ref, so the fork is cheap. `base` is untouched and can be
# re-forked for other peers.
ech_bytes = ...  # you are responsible to get it yourself!
ctx = base.set_ech_configs(ech_bytes)

with socket.create_connection(("example.com", 443)) as raw:
    ssl_sock = ctx.wrap_socket(raw, server_hostname="example.com")
    ssl_sock.do_handshake()

utls does not perform the DNS HTTPS RR lookup; the caller fetches the ech= bytes (e.g. via dnspython's HTTPS rdata). Pass None to clear the ECH override in the fork.

Niquests or urllib3-future does ECH transparently via a custom resolver (E.g. DNS over HTTPS) No effort required.

Feature parity with stdlib

utls re-exports the public names of the ssl module that matter for client and server code paths. The Python facade is a real subclass of ssl.SSLContext, so isinstance(ctx, ssl.SSLContext) is true and most downstream libraries (urllib3-future, niquests, httpx with custom transports) accept a utls context directly.

What's different from ssl:

  • TLS 1.2 is the minimum version. SSLv2, SSLv3, TLS 1.0 and TLS 1.1 are not available - BoringSSL refuses to negotiate them (No decent client out there should try < TLS 1.2).
  • Hostname verification uses SAN only, never the Common Name.
  • compression() always returns None (TLS compression is disabled, as it should be - BoringSSL doesn't ship it - as anyone should).
  • PSK callbacks are not available - BoringSSL deleted them upstream.
  • A Fingerprint API exists and is honored on the client side. Server-side set_fingerprint rejects at the Rust level: the ClientHello is the client's choice, not the server's.

Server-side

Server-side TLS is supported for everything BoringSSL still exposes:

  • mTLS (client certificate auth via verify_mode=CERT_REQUIRED),
  • ALPN selection from a server preference list,
  • SNI dispatch via set_servername_callback,
  • ECDH curve restriction (set_ecdh_curve),
  • Session ticket count (set_num_tickets),
  • set_session_id_context,
  • Server-side ClientHello fingerprinting (read-only diagnostics).

Things you can't have on the server side because BoringSSL doesn't have them: DTLS, FFDHE parameters, SSLv2/SSLv3, TLS compression, PSK.

urllib3-future / niquests

utls is automatically picked up if installed. enjoy.

Disclaimer

Early/Beta project. The public API is stable; we do not plan to diverge from stdlib for the ssl-compatible subset. Not pure Python - you need either a pre-built wheel or a build environment (Rust + cmake + ninja + Go for BoringSSL).

MIT-licensed (see LICENSE). BoringSSL is permissively licensed; boring-sys is Apache-2.0 - bundled into the wheel.

  • FIPS mode is not on the roadmap.
  • Chrome only. Firefox / Safari / Edge are unlikely. Thus, contribution are welcomed.
  • PyPy is not supported.

Throughput is on par with stdlib ssl: ~343 MiB/s for bulk recv vs. stdlib's 340 MiB/s on a loopback TLS 1.3 / AES-256-GCM connection. (yes, it is faster than rtls!)

Contributions, bug reports and feedback are welcome.

Versioning

This project uses CalVer (YYYY.0M.0D). It aims to be a drop-in replacement for stdlib ssl, so semantic versioning would be misleading - pin a lower bound, not an upper bound.

Prior art

  • rtls - same drop-in approach over rustls. utls's MemoryBIO-first design and read-batching pass are directly inspired by it; many of the compatibility tests were ported from there.
  • uTLS - the reference Go-language TLS fingerprinting library. The spec data encoded in our Chrome profiles is checked against uTLS's published ClientHellos.
  • curl-impersonate - the original "browser-on-the-wire" project. utls aims to give Python the same capability without a non-native Python http client or a patched BoringSSL.

JA4 pinning

The JA4 fingerprint algorithm is pinned to FoxIO-LLC/ja4 spec revision 0.18.8. The constant is duplicated in python/utls/_fingerprint.py (JA4_SPEC_VERSION) and crates/utls-core/src/fingerprint/ja4.rs, and a dedicated CI job asserts they agree.

Documentation

For the ssl-compatible surface, the stdlib documentation at https://docs.python.org/3/library/ssl.html applies almost verbatim - the notable exceptions are listed under Feature parity with stdlib.

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

utls-2026.7.8.tar.gz (117.7 kB view details)

Uploaded Source

Built Distributions

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

utls-2026.7.8-cp314-cp314t-win_arm64.whl (1.1 MB view details)

Uploaded CPython 3.14tWindows ARM64

utls-2026.7.8-cp314-cp314t-win_amd64.whl (1.4 MB view details)

Uploaded CPython 3.14tWindows x86-64

utls-2026.7.8-cp314-cp314t-win32.whl (1.1 MB view details)

Uploaded CPython 3.14tWindows x86

utls-2026.7.8-cp314-cp314t-musllinux_1_1_x86_64.whl (8.0 MB view details)

Uploaded CPython 3.14tmusllinux: musl 1.1+ x86-64

utls-2026.7.8-cp314-cp314t-musllinux_1_1_armv7l.whl (7.5 MB view details)

Uploaded CPython 3.14tmusllinux: musl 1.1+ ARMv7l

utls-2026.7.8-cp314-cp314t-musllinux_1_1_aarch64.whl (7.7 MB view details)

Uploaded CPython 3.14tmusllinux: musl 1.1+ ARM64

utls-2026.7.8-cp314-cp314t-manylinux_2_28_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.28+ ARM64

utls-2026.7.8-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.17+ x86-64

utls-2026.7.8-cp314-cp314t-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl (2.4 MB view details)

Uploaded CPython 3.14tmacOS 10.15+ universal2 (ARM64, x86-64)macOS 10.15+ x86-64macOS 11.0+ ARM64

utls-2026.7.8-cp313-cp313t-win_arm64.whl (1.2 MB view details)

Uploaded CPython 3.13tWindows ARM64

utls-2026.7.8-cp313-cp313t-win_amd64.whl (1.4 MB view details)

Uploaded CPython 3.13tWindows x86-64

utls-2026.7.8-cp313-cp313t-win32.whl (1.1 MB view details)

Uploaded CPython 3.13tWindows x86

utls-2026.7.8-cp313-cp313t-musllinux_1_1_x86_64.whl (8.0 MB view details)

Uploaded CPython 3.13tmusllinux: musl 1.1+ x86-64

utls-2026.7.8-cp313-cp313t-musllinux_1_1_armv7l.whl (7.5 MB view details)

Uploaded CPython 3.13tmusllinux: musl 1.1+ ARMv7l

utls-2026.7.8-cp313-cp313t-musllinux_1_1_aarch64.whl (7.7 MB view details)

Uploaded CPython 3.13tmusllinux: musl 1.1+ ARM64

utls-2026.7.8-cp313-cp313t-manylinux_2_28_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.13tmanylinux: glibc 2.28+ ARM64

utls-2026.7.8-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.13tmanylinux: glibc 2.17+ x86-64

utls-2026.7.8-cp313-cp313t-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl (2.4 MB view details)

Uploaded CPython 3.13tmacOS 10.15+ universal2 (ARM64, x86-64)macOS 10.15+ x86-64macOS 11.0+ ARM64

utls-2026.7.8-cp37-abi3-win_arm64.whl (1.2 MB view details)

Uploaded CPython 3.7+Windows ARM64

utls-2026.7.8-cp37-abi3-win_amd64.whl (1.4 MB view details)

Uploaded CPython 3.7+Windows x86-64

utls-2026.7.8-cp37-abi3-win32.whl (1.1 MB view details)

Uploaded CPython 3.7+Windows x86

utls-2026.7.8-cp37-abi3-musllinux_1_1_x86_64.whl (8.0 MB view details)

Uploaded CPython 3.7+musllinux: musl 1.1+ x86-64

utls-2026.7.8-cp37-abi3-musllinux_1_1_armv7l.whl (7.5 MB view details)

Uploaded CPython 3.7+musllinux: musl 1.1+ ARMv7l

utls-2026.7.8-cp37-abi3-musllinux_1_1_aarch64.whl (7.7 MB view details)

Uploaded CPython 3.7+musllinux: musl 1.1+ ARM64

utls-2026.7.8-cp37-abi3-manylinux_2_28_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.7+manylinux: glibc 2.28+ ARM64

utls-2026.7.8-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.7+manylinux: glibc 2.17+ x86-64

utls-2026.7.8-cp37-abi3-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl (2.4 MB view details)

Uploaded CPython 3.7+macOS 10.15+ universal2 (ARM64, x86-64)macOS 10.15+ x86-64macOS 11.0+ ARM64

File details

Details for the file utls-2026.7.8.tar.gz.

File metadata

  • Download URL: utls-2026.7.8.tar.gz
  • Upload date:
  • Size: 117.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for utls-2026.7.8.tar.gz
Algorithm Hash digest
SHA256 5e064d516862d4afc05138e096224fa5b805dc3591096a9d7f57a0fc026d9fd3
MD5 aa0c5c92844305ebfb41740375039993
BLAKE2b-256 7cf080ba65019c61b22cd52e99074a1981071e13593fe4ce199c057fc800affd

See more details on using hashes here.

Provenance

The following attestation bundles were made for utls-2026.7.8.tar.gz:

Publisher: CI.yml on jawah/utls

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

File details

Details for the file utls-2026.7.8-cp314-cp314t-win_arm64.whl.

File metadata

  • Download URL: utls-2026.7.8-cp314-cp314t-win_arm64.whl
  • Upload date:
  • Size: 1.1 MB
  • Tags: CPython 3.14t, Windows ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for utls-2026.7.8-cp314-cp314t-win_arm64.whl
Algorithm Hash digest
SHA256 dc7b4c559fd45b193ae4825b15f0e0cd225288e0964e42adc53d062edc3df31c
MD5 e86a853af0d570947db0eb528e33462a
BLAKE2b-256 02e3acd79bcbf04afdf789a22d17ae4de349ca1c3d18a90b61df601ba807690a

See more details on using hashes here.

Provenance

The following attestation bundles were made for utls-2026.7.8-cp314-cp314t-win_arm64.whl:

Publisher: CI.yml on jawah/utls

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

File details

Details for the file utls-2026.7.8-cp314-cp314t-win_amd64.whl.

File metadata

  • Download URL: utls-2026.7.8-cp314-cp314t-win_amd64.whl
  • Upload date:
  • Size: 1.4 MB
  • Tags: CPython 3.14t, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for utls-2026.7.8-cp314-cp314t-win_amd64.whl
Algorithm Hash digest
SHA256 1b1171d0270faf9eba8e8d20c95b6c4f898950effcc94e3496abe5752712ed94
MD5 f6f6decdda695789915e8eae966a4020
BLAKE2b-256 ea6b4d05fe6c594a16877ca542030c38126be935ec2380dfd3d1eead4952dd36

See more details on using hashes here.

Provenance

The following attestation bundles were made for utls-2026.7.8-cp314-cp314t-win_amd64.whl:

Publisher: CI.yml on jawah/utls

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

File details

Details for the file utls-2026.7.8-cp314-cp314t-win32.whl.

File metadata

  • Download URL: utls-2026.7.8-cp314-cp314t-win32.whl
  • Upload date:
  • Size: 1.1 MB
  • Tags: CPython 3.14t, Windows x86
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for utls-2026.7.8-cp314-cp314t-win32.whl
Algorithm Hash digest
SHA256 3f3b8fdcf748b91f62dc0d9526b8961726b5b63be4ca6e42e7a47f73f86e543e
MD5 dbda8d7f7b1a036de92efc27cef7a438
BLAKE2b-256 218709a8c891488f17b7e6409f2f751464791427d4c5114b41f5046507e541c5

See more details on using hashes here.

Provenance

The following attestation bundles were made for utls-2026.7.8-cp314-cp314t-win32.whl:

Publisher: CI.yml on jawah/utls

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

File details

Details for the file utls-2026.7.8-cp314-cp314t-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for utls-2026.7.8-cp314-cp314t-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 4d04ab208429cbe2df36bc334dbec8f2ee76c88eaa0779f8978b98bf0409918a
MD5 ce954eb984c3a8dafc8650fedbcce1e5
BLAKE2b-256 439b0d11ac643ddb6f77ac909a4af8a5f28f4c03cfc29481c49a5b78d57d3699

See more details on using hashes here.

Provenance

The following attestation bundles were made for utls-2026.7.8-cp314-cp314t-musllinux_1_1_x86_64.whl:

Publisher: CI.yml on jawah/utls

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

File details

Details for the file utls-2026.7.8-cp314-cp314t-musllinux_1_1_armv7l.whl.

File metadata

File hashes

Hashes for utls-2026.7.8-cp314-cp314t-musllinux_1_1_armv7l.whl
Algorithm Hash digest
SHA256 1de7a2fa3068cf467c29f08ac4255f445141f46fad9e1ce0162844d3c7ec02de
MD5 654302a05fb03c6d8db8b43451e6094f
BLAKE2b-256 62693ba3ab0617383bca625995cf69248942fb397e351eacb88e66912458a326

See more details on using hashes here.

Provenance

The following attestation bundles were made for utls-2026.7.8-cp314-cp314t-musllinux_1_1_armv7l.whl:

Publisher: CI.yml on jawah/utls

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

File details

Details for the file utls-2026.7.8-cp314-cp314t-musllinux_1_1_aarch64.whl.

File metadata

File hashes

Hashes for utls-2026.7.8-cp314-cp314t-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 b22b79a74b50c34f32c8b3afb897f1d5b1c827e57e1a40abeffe20b9f4bd8073
MD5 80d3c3fa7a6ad7ab256c79b90e25d35e
BLAKE2b-256 8e0fe74a1f7306c0ce72f5b359a2d81402afa42d321b254869dd7a442414144e

See more details on using hashes here.

Provenance

The following attestation bundles were made for utls-2026.7.8-cp314-cp314t-musllinux_1_1_aarch64.whl:

Publisher: CI.yml on jawah/utls

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

File details

Details for the file utls-2026.7.8-cp314-cp314t-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for utls-2026.7.8-cp314-cp314t-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 9ecfe7bf5803f363a1371b929efe6d21a7eb4c62b8ac8a54603f49118d008d90
MD5 b8f54abb4ce1ad9faeb0542171f49a25
BLAKE2b-256 a04e559fdf5bda67d57cf3b099a4e5e1b988b4caddee9200861d12d408fac3fd

See more details on using hashes here.

Provenance

The following attestation bundles were made for utls-2026.7.8-cp314-cp314t-manylinux_2_28_aarch64.whl:

Publisher: CI.yml on jawah/utls

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

File details

Details for the file utls-2026.7.8-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for utls-2026.7.8-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 97319b9fdb682ff54c83aa693a727cd982b91860e7d0497f2efb30f9711d37f8
MD5 fef30d7e7c57c150e91200430ecca0f8
BLAKE2b-256 c372f33cb69b8bce6c063daab1c0036e7ec57206c772e78abfb92a55e074e115

See more details on using hashes here.

Provenance

The following attestation bundles were made for utls-2026.7.8-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: CI.yml on jawah/utls

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

File details

Details for the file utls-2026.7.8-cp314-cp314t-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl.

File metadata

File hashes

Hashes for utls-2026.7.8-cp314-cp314t-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl
Algorithm Hash digest
SHA256 9f6cfb704e2e6897421040711ddb22d4a2743b6da34b51df0cb84380b9dc20f5
MD5 08d96273f0961fd13e32ed8638ab910c
BLAKE2b-256 44ebd5a25b0f470fd28d914e872a538771e5d78ba9df6d062725287495339dad

See more details on using hashes here.

Provenance

The following attestation bundles were made for utls-2026.7.8-cp314-cp314t-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl:

Publisher: CI.yml on jawah/utls

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

File details

Details for the file utls-2026.7.8-cp313-cp313t-win_arm64.whl.

File metadata

  • Download URL: utls-2026.7.8-cp313-cp313t-win_arm64.whl
  • Upload date:
  • Size: 1.2 MB
  • Tags: CPython 3.13t, Windows ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for utls-2026.7.8-cp313-cp313t-win_arm64.whl
Algorithm Hash digest
SHA256 7568cb1d992f33c29f8a2d03ec3f6c69e1e2e0f3ccae2017d69a6b85c7b2bba6
MD5 6bf34ebef6a71e69a45a4c8e45ae9d2d
BLAKE2b-256 1a6012b51b89caf6734171d951fc25bc5dc644fb4b031668a25bb152160af7d7

See more details on using hashes here.

Provenance

The following attestation bundles were made for utls-2026.7.8-cp313-cp313t-win_arm64.whl:

Publisher: CI.yml on jawah/utls

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

File details

Details for the file utls-2026.7.8-cp313-cp313t-win_amd64.whl.

File metadata

  • Download URL: utls-2026.7.8-cp313-cp313t-win_amd64.whl
  • Upload date:
  • Size: 1.4 MB
  • Tags: CPython 3.13t, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for utls-2026.7.8-cp313-cp313t-win_amd64.whl
Algorithm Hash digest
SHA256 745ac8b76490409e19aa058a8a5513c964ef7eccad2ab18afb5c1297640b4549
MD5 558288fda89c64ddeb3bba8ed38d5695
BLAKE2b-256 42f3c942db8c89338196b67928f4ae9ff26c9c83d917aa63c907cb621e6d73ab

See more details on using hashes here.

Provenance

The following attestation bundles were made for utls-2026.7.8-cp313-cp313t-win_amd64.whl:

Publisher: CI.yml on jawah/utls

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

File details

Details for the file utls-2026.7.8-cp313-cp313t-win32.whl.

File metadata

  • Download URL: utls-2026.7.8-cp313-cp313t-win32.whl
  • Upload date:
  • Size: 1.1 MB
  • Tags: CPython 3.13t, Windows x86
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for utls-2026.7.8-cp313-cp313t-win32.whl
Algorithm Hash digest
SHA256 75fe20f383840a86b7f30a366e71c004ddaf67e36b76c95dab078d4ac29fd71c
MD5 c906910ead73abbaa903012d1aeab915
BLAKE2b-256 a0ffdcba09243e911d7c16f01c3ba6ac5537c4f3549011f511bef47991e75d0e

See more details on using hashes here.

Provenance

The following attestation bundles were made for utls-2026.7.8-cp313-cp313t-win32.whl:

Publisher: CI.yml on jawah/utls

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

File details

Details for the file utls-2026.7.8-cp313-cp313t-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for utls-2026.7.8-cp313-cp313t-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 2661f927761ca2b267ef9f5023c66782eff920d922bc975b5be244f41e61a542
MD5 1d3dff9dacb01bafacf4aee4b7927ed0
BLAKE2b-256 1a6a755be39924677b2802d51d4b1f7306c6768d4512e4e6054731474caa494e

See more details on using hashes here.

Provenance

The following attestation bundles were made for utls-2026.7.8-cp313-cp313t-musllinux_1_1_x86_64.whl:

Publisher: CI.yml on jawah/utls

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

File details

Details for the file utls-2026.7.8-cp313-cp313t-musllinux_1_1_armv7l.whl.

File metadata

File hashes

Hashes for utls-2026.7.8-cp313-cp313t-musllinux_1_1_armv7l.whl
Algorithm Hash digest
SHA256 704491e2c9c699725e0fd352e4a6587b6152bd86f3882f464fc257110214e0aa
MD5 0ff68bfbc63247d783ce4debf8b83ad6
BLAKE2b-256 6dadab004745ed7bc687b1d216e47b3f13641aaa0103b7fb0685fd3b157ba76f

See more details on using hashes here.

Provenance

The following attestation bundles were made for utls-2026.7.8-cp313-cp313t-musllinux_1_1_armv7l.whl:

Publisher: CI.yml on jawah/utls

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

File details

Details for the file utls-2026.7.8-cp313-cp313t-musllinux_1_1_aarch64.whl.

File metadata

File hashes

Hashes for utls-2026.7.8-cp313-cp313t-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 751d7ff9db5dbca36659b21118881e2838479e6d24dc6f23525ded8ef8f4263f
MD5 8604c66f72a8aa2e1cad81d89297b879
BLAKE2b-256 8a950634aa887e7d346279a8b8f048fda3bffb69ad7a706b42ee2e4551795e00

See more details on using hashes here.

Provenance

The following attestation bundles were made for utls-2026.7.8-cp313-cp313t-musllinux_1_1_aarch64.whl:

Publisher: CI.yml on jawah/utls

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

File details

Details for the file utls-2026.7.8-cp313-cp313t-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for utls-2026.7.8-cp313-cp313t-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 2f0fd1562c9599d3ab27612e44d4c139d5b1633b1a809e56bc938b7bd788756d
MD5 cd5399de42bd4ae357e8720a2e9210b9
BLAKE2b-256 d4fb944ed565cb5d120c67367a7c9901b2ddc27c041df618e5c3b0704ba08719

See more details on using hashes here.

Provenance

The following attestation bundles were made for utls-2026.7.8-cp313-cp313t-manylinux_2_28_aarch64.whl:

Publisher: CI.yml on jawah/utls

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

File details

Details for the file utls-2026.7.8-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for utls-2026.7.8-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a460998bb810c05a7685f2939e7089ad86df6b2651e72e4ad806efc86202107b
MD5 88b1b3f47d20cc6c82e0c778335aa77f
BLAKE2b-256 1345cf278dcb65148be0d183762940229e8049732afedf5c149444a3109d86ea

See more details on using hashes here.

Provenance

The following attestation bundles were made for utls-2026.7.8-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: CI.yml on jawah/utls

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

File details

Details for the file utls-2026.7.8-cp313-cp313t-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl.

File metadata

File hashes

Hashes for utls-2026.7.8-cp313-cp313t-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl
Algorithm Hash digest
SHA256 ac78a66c3224f7b199d8ab88ab70e98ef39b50df906547369f830699450ff3ef
MD5 78788bcac4e0797013bb7ff0f734b475
BLAKE2b-256 e9cc38cfe9338500aeb6855ca25ff92759938825d3d79b4589bb5a5bcc7705d7

See more details on using hashes here.

Provenance

The following attestation bundles were made for utls-2026.7.8-cp313-cp313t-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl:

Publisher: CI.yml on jawah/utls

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

File details

Details for the file utls-2026.7.8-cp37-abi3-win_arm64.whl.

File metadata

  • Download URL: utls-2026.7.8-cp37-abi3-win_arm64.whl
  • Upload date:
  • Size: 1.2 MB
  • Tags: CPython 3.7+, Windows ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for utls-2026.7.8-cp37-abi3-win_arm64.whl
Algorithm Hash digest
SHA256 b9f39ed61aeea4d03e8d86481e6b2df58cb5e97d6e32324dc09e1482a02f12ec
MD5 01c9a599623bfef8fed92af07d05874f
BLAKE2b-256 3b3df48e121566cafefcb5bda05987baf60f688ef5737bfa3ba7898b73d05fad

See more details on using hashes here.

Provenance

The following attestation bundles were made for utls-2026.7.8-cp37-abi3-win_arm64.whl:

Publisher: CI.yml on jawah/utls

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

File details

Details for the file utls-2026.7.8-cp37-abi3-win_amd64.whl.

File metadata

  • Download URL: utls-2026.7.8-cp37-abi3-win_amd64.whl
  • Upload date:
  • Size: 1.4 MB
  • Tags: CPython 3.7+, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for utls-2026.7.8-cp37-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 53c2584141b38ad3c4fbb0027e2ed815d60cc33628095a536f2a5b9db1ac0459
MD5 8562531f458d953a3cf3cf0aabdb4f79
BLAKE2b-256 b152c9ca5dc5eb1c0a3c406acdec605181b751d0e6de7d545f3f3a09082565fa

See more details on using hashes here.

Provenance

The following attestation bundles were made for utls-2026.7.8-cp37-abi3-win_amd64.whl:

Publisher: CI.yml on jawah/utls

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

File details

Details for the file utls-2026.7.8-cp37-abi3-win32.whl.

File metadata

  • Download URL: utls-2026.7.8-cp37-abi3-win32.whl
  • Upload date:
  • Size: 1.1 MB
  • Tags: CPython 3.7+, Windows x86
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for utls-2026.7.8-cp37-abi3-win32.whl
Algorithm Hash digest
SHA256 273688100888cfe329c9f3e65761c33fe84a1cc30cdde411e36a76c0b70c999d
MD5 0a16458964678ccdee0b8df4f5539fa6
BLAKE2b-256 62a07b678ebcab938e978d155dad06d05bdace98b6422baa264989fcf977d390

See more details on using hashes here.

Provenance

The following attestation bundles were made for utls-2026.7.8-cp37-abi3-win32.whl:

Publisher: CI.yml on jawah/utls

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

File details

Details for the file utls-2026.7.8-cp37-abi3-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for utls-2026.7.8-cp37-abi3-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 ba3dcd2f173f1c15a59b9494545afc20fa81eb49ed71162e1fed2141f4bdce8a
MD5 d38049dd0379aabf489b13955279003e
BLAKE2b-256 4cbf232a793c6f2ec0cf1997918eff63581cef16f714949575d063ae496f83a3

See more details on using hashes here.

Provenance

The following attestation bundles were made for utls-2026.7.8-cp37-abi3-musllinux_1_1_x86_64.whl:

Publisher: CI.yml on jawah/utls

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

File details

Details for the file utls-2026.7.8-cp37-abi3-musllinux_1_1_armv7l.whl.

File metadata

File hashes

Hashes for utls-2026.7.8-cp37-abi3-musllinux_1_1_armv7l.whl
Algorithm Hash digest
SHA256 5b48007f5f63d2bf2a07fc9aae0a849c7533587e8236abff76762cecb8312604
MD5 b989f2efbf11c07cbf3b4450d8273d45
BLAKE2b-256 bf2a72e2630d57cbcba622764540a3f685cebf16d3faad1279ae9c1d398cef11

See more details on using hashes here.

Provenance

The following attestation bundles were made for utls-2026.7.8-cp37-abi3-musllinux_1_1_armv7l.whl:

Publisher: CI.yml on jawah/utls

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

File details

Details for the file utls-2026.7.8-cp37-abi3-musllinux_1_1_aarch64.whl.

File metadata

File hashes

Hashes for utls-2026.7.8-cp37-abi3-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 53730947920216b2d471b9c0e19270a315368a87a640fcb4f2af09b418de0120
MD5 1d821ccc60043dbae4b9fb4a32314aa4
BLAKE2b-256 f8d5719489a6c8d438de0f775ed2dad6a60e894408488c36f764d63e07093664

See more details on using hashes here.

Provenance

The following attestation bundles were made for utls-2026.7.8-cp37-abi3-musllinux_1_1_aarch64.whl:

Publisher: CI.yml on jawah/utls

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

File details

Details for the file utls-2026.7.8-cp37-abi3-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for utls-2026.7.8-cp37-abi3-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 3a2fd1be9e91405d725903cb1b404243d59d9cd120f372197a691f82b6b01f4b
MD5 83036aaae20dc89d65d0305c74ebf4a4
BLAKE2b-256 3e8291640df91a4e9b8a7851ecbe7277aa46991165a1e9ef05fdcce6c430d8b5

See more details on using hashes here.

Provenance

The following attestation bundles were made for utls-2026.7.8-cp37-abi3-manylinux_2_28_aarch64.whl:

Publisher: CI.yml on jawah/utls

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

File details

Details for the file utls-2026.7.8-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for utls-2026.7.8-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 2d65ce69c64d6d9d388f1a5d7b58aec2cd951fc69830da840ab16852c6f15f67
MD5 d4a58f0706f60c518ed7eddb47372e90
BLAKE2b-256 1e2c551d20826d19a58042be5e9e3a15c58ba7c93ce25988cd510817961aa37f

See more details on using hashes here.

Provenance

The following attestation bundles were made for utls-2026.7.8-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: CI.yml on jawah/utls

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

File details

Details for the file utls-2026.7.8-cp37-abi3-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl.

File metadata

File hashes

Hashes for utls-2026.7.8-cp37-abi3-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl
Algorithm Hash digest
SHA256 1760d2fdfc1e84a8779f7be7319ecd88626c30886e4310d3c0d7a21db49981ab
MD5 c948b52669550cf52638cb8db51f61f5
BLAKE2b-256 d8fbb22bce17ea3d695f036db4dd9e302619525465c255ab7e4156942519e8a2

See more details on using hashes here.

Provenance

The following attestation bundles were made for utls-2026.7.8-cp37-abi3-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl:

Publisher: CI.yml on jawah/utls

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