Skip to main content

Python bindings for the RustCrypto Twofish block cipher implementation

Project description

oxifish

Python bindings for the RustCrypto Twofish block cipher implementation.

A session-oriented API: construct a TwofishKey once, then either call its one-shot encrypt/decrypt (the dominant case) or open a streaming TwofishSession for incremental processing. Padding, IV handling, and chunk buffering are handled internally — there is no separate pad()/ unpad() step and no manual block-alignment bookkeeping.

Which construct do I need? If you have Twofish-encrypted data from KeePass/KDBX, OpenPGP, or a dm-crypt twofish-cbc-essiv:sha256 volume — TwofishKey (below). If you have a VeraCrypt volume, a TrueCrypt volume (5.0 or later), or a dm-crypt/LUKS twofish-xts-plain64 volume — TwofishXTS. If you're migrating off the dead PyPI twofish package — see "Migrating from the twofish package".

Installation

pip install oxifish

Usage

One-shot (the hot path)

The KeePass use case — the IV lives in the KDBX header, so decrypting is one line:

from oxifish import TwofishKey

derived_key = bytes(range(32))  # stand-in for a KeePass-derived key
key = TwofishKey(derived_key)  # 16, 24, or 32 bytes

# In real usage, `ciphertext` and `header_iv` come from the KDBX file --
# synthesized here via a real encrypt() call so this block runs standalone.
header_iv, ciphertext = key.encrypt(b"a secret message")
plaintext = key.decrypt(ciphertext, iv=header_iv)  # PKCS7 padding by default

Encrypting without an IV of your own auto-generates one (via the OS CSPRNG) and returns it alongside the ciphertext — the two values that must travel together:

iv, ciphertext = key.encrypt(plaintext)

# Store IV with ciphertext (IV is not secret)
encrypted_message = iv + ciphertext

Supplying your own IV returns bare ciphertext bytes instead (symmetric with decrypt). In practice "your own IV" comes from an existing source (e.g. a KDBX header) rather than being hand-generated — omitting iv and letting encrypt generate one already does that safely; this fence draws a fresh one only so it runs standalone:

import secrets

from oxifish import Padding

aligned_data = bytes(range(32))  # Padding.NONE requires exact block multiples
iv2 = secrets.token_bytes(16)  # a fresh IV -- never reuse `iv` from above
ct = key.encrypt(aligned_data, iv=iv2, padding=Padding.NONE)

Modes

CBC (the default), CTR, CFB, and OFB are selected via the mode parameter on encrypt/decrypt/encryptor/decryptor:

from oxifish import Mode

iv, ciphertext = key.encrypt(plaintext, Mode.CTR)

For CTR, iv is the full 16-byte initial counter block (big-endian 128-bit increment), not a nonce+counter split — unless you pass ctr_width, which selects a narrower, NIST-style nonce||counter split: only the low ctr_width bits of iv increment, matching legacy formats built on PyCryptodome-style Counter(nonce=..., initial_value=...) layouts (the dead twofish package's own users' homegrown CTR):

nonce8 = bytes(range(8))
iv3 = nonce8 + (0).to_bytes(8, "big")  # 8-byte nonce || 8-byte BE counter
ciphertext64 = key.encrypt(aligned_data, Mode.CTR, iv=iv3, ctr_width=64)
key.decrypt(ciphertext64, Mode.CTR, iv=iv3, ctr_width=64)

ctr_width defaults to 128 (today's behavior: the whole IV is the counter) and must be 32, 64, or 128; passing it for any mode other than CTR raises ValueError. The low ctr_width bits wrap through zero as they increment — that's expected, matching every real split-counter format — but a single stream (one-shot, or summed across a session's update() calls) is limited to 2**ctr_width - 1 blocks; asking for more raises ValueError rather than silently reusing keystream. At ctr_width=128 that limit is unreachable by any real payload, so default behavior is unchanged.

Never reuse an iv under the same key. For CTR and OFB this is catastrophic: the keystream repeats, and XORing the two ciphertexts recovers the XOR of the two plaintexts. CFB carries the same risk up to the first differing block, after which the feedback register diverges. For CBC, IV reuse leaks whether two messages share a common prefix. Omitting iv and letting encrypt/encryptor auto-generate one via the OS CSPRNG (see above) already does the right thing — only supply your own IV when correctness requires it (e.g. KDBX interop, where the IV must match the header), and never hand the same one to two encryptions under one key.

Padding

padding defaults to PKCS7 for CBC. Stream modes (CTR/CFB/OFB) never take padding — passing any explicit value (including Padding.NONE) raises ValueError, since there is nothing to pad.

from oxifish import Padding

data = bytes(range(32))  # block-aligned so the Padding.NONE call below is valid too
key.encrypt(data, padding=Padding.PKCS7)   # default for CBC; iv omitted -> fresh each call
key.encrypt(data, padding=Padding.NONE)    # data must already be block-aligned
key.encrypt(data, padding=Padding.ISO7816)
key.encrypt(data, padding=Padding.ANSIX923)
key.encrypt(data, padding=Padding.ZEROS)   # ambiguous if plaintext ends in 0x00

Streaming

For processing data incrementally, open a session bound to one mode, one IV, and one padding policy:

chunk1, chunk2 = b"first chunk of ", b"the message"

enc = key.encryptor(Mode.CFB)  # iv omitted -> fresh IV auto-generated, readable via enc.iv
ciphertext = enc.update(chunk1) + enc.update(chunk2) + enc.finalize()

dec = key.decryptor(Mode.CFB, iv=enc.iv)
plaintext = dec.update(ciphertext) + dec.finalize()

update() accepts chunks of any size — internal buffering handles alignment. Padded-decrypt sessions withhold the most recent complete block until finalize(), since it may carry padding. A session is single-use: calling update()/finalize() after finalize() raises RuntimeError.

ECB

ECB does not provide semantic security and is reachable only through its own factories — never through mode=:

from oxifish import Padding

block = bytes(range(16))  # ECB processes exactly one block here
ciphertext = key.ecb_encryptor(padding=Padding.NONE).finalize(block)
plaintext = key.ecb_decryptor(padding=Padding.NONE).finalize(ciphertext)

finalize(data) accepting an argument is what keeps this a single expression, since ECB has no dedicated one-shot method.

Warning: ECB mode leaks equal-block plaintext patterns at any length — nothing enforces a single-block limit, so a caller can push an arbitrarily large payload through ecb_encryptor/ecb_decryptor and get full pattern leakage across it. The dedicated factories gate discoverability (ECB is unreachable via the shared mode= parameter), not payload size; keeping ECB use to single blocks is on the caller. Restrict actual use to single blocks (e.g. known-answer tests) or explicit interop.

XTS (disk-volume encryption)

TwofishXTS is a structurally separate construct from everything above — not reachable via Mode — for VeraCrypt, TrueCrypt (5.0 or later), and dm-crypt/LUKS twofish-xts-plain64 volumes. It takes one concatenated double-length key instead of a single key, a per-call tweak (the data-unit/sector number) instead of an IV, and no padding parameter — ciphertext stealing handles data units that aren't a multiple of 16 bytes, so len(ciphertext) == len(data) always. It is one-shot only: XTS is random-access by construction (every data unit is encrypted/decrypted independently), so there is no streaming session.

from oxifish import TwofishXTS

# One concatenated key: the first half drives the data cipher, the second
# half drives the tweak (IEEE 1619's Key1 || Key2 order) -- e.g. VeraCrypt's
# volume-header "master keydata" field is exactly this shape. The two
# halves must differ; each half is independently 16, 24, or 32 bytes.
xts_key = bytes(range(32)) + bytes(range(32, 64))
xts = TwofishXTS(xts_key)

sector = bytes(512)  # VeraCrypt's data unit is always 512 bytes,
                      # regardless of the drive's physical sector size
byte_offset = 512 * 42
data_unit = byte_offset // 512  # NOT the OS's reported sector number

ciphertext = xts.encrypt(sector, tweak=data_unit)
plaintext = xts.decrypt(ciphertext, tweak=data_unit)

The tweak is a position, not a nonce. Unlike every IV-taking mode above, reusing the same tweak to re-encrypt the same data unit is correct — that's what a tweakable mode is for. The misuse case is the wrong tweak for a position (silent garbage plaintext, no error), not a repeated one. Do not carry the "never reuse an IV" rule from the rest of this README over to tweak=; the fence above has no IV and is intentionally exempt from that rule.

Migrating from the twofish package

The PyPI twofish package is archived upstream and broken on Python 3.12+. Its entire API was single-block encrypt/decrypt — callers built their own modes on top of it. The migration target is the same bare block primitive shown above: ecb_encryptor/ecb_decryptor with Padding.NONE. Composing modes yourself on top of a raw block primitive is almost always a mistake (that's why this library hides one behind Mode/encrypt instead); this construct exists for known-answer tests and mechanical migration, not for new designs.

from oxifish import Padding

# One block (the KAT / known-answer shape -- what `twofish.encrypt()` did):
block_in = bytes(range(16))  # exactly one block
block_out = key.ecb_encryptor(padding=Padding.NONE).finalize(block_in)

# Many blocks (the real migration shape): ONE session, reused.
# ECB no-padding sessions flush eagerly -- update() returns each block
# immediately -- so a fresh session per block works but wastes a
# construction + FFI crossing per call.
migration_blocks = [bytes([i]) * 16 for i in range(4)]
enc_session = key.ecb_encryptor(padding=Padding.NONE)
migrated_ciphertext = (
    b"".join(enc_session.update(b) for b in migration_blocks) + enc_session.finalize()
)

# Decrypt direction: the same one-session-reused shape.
dec_session = key.ecb_decryptor(padding=Padding.NONE)
migrated_plaintext = (
    b"".join(
        dec_session.update(migrated_ciphertext[i : i + 16])
        for i in range(0, len(migrated_ciphertext), 16)
    )
    + dec_session.finalize()
)

Errors

  • ValueError — invalid key/IV length, an unrecognized mode/padding string (including "ecb", which is reachable only via the ecb_* factories), a misaligned data length when padding=Padding.NONE, an explicit padding on a stream mode, an invalid ctr_width (must be 32, 64, or 128) or ctr_width on a non-CTR mode, or CTR keystream exhaustion (2**ctr_width - 1 blocks per stream — unreachable at the default ctr_width=128). For TwofishXTS: a key length outside {32, 48, 64} bytes, equal key halves, a data unit outside 16 bytes to 16 MiB, or a tweak outside 0 <= tweak < 2**128.
  • DecryptionError (a ValueError subclass) — invalid or corrupted padded ciphertext. One fixed message closes the error-string side channel; this is not a constant-time guarantee (Twofish's key-dependent S-boxes are inherently non-constant-time). Wrong key, wrong IV, or wrong mode on unpadded data is not detected — it silently yields garbage plaintext, which is inherent to unauthenticated ciphers. If an attacker can submit chosen ciphertexts and observe whether DecryptionError is raised, that accept/reject channel is a padding oracle (a Vaudenay-style attack on CBC padding), regardless of the message-uniformity work above — the only real defense is encrypt-then-MAC with the MAC verified before any decryption is attempted, never decrypt-then-check.
  • RuntimeError — raised by update()/finalize() on an already-finalized session; by concurrent access to the same session from two threads (PyO3's borrow-check error, distinct from the finalized-session message); and, rarely, if the OS CSPRNG fails during auto-generated IV creation.

Security

This library is primarily intended for compatibility with existing systems that require Twofish, such as KeePass databases. It implements no authentication (AEAD) — callers needing integrity should use an outer MAC, as KDBX does.

Note: Twofish is not constant-time due to key-dependent S-boxes. This is fine for local file decryption but not suitable for server-side encryption where timing attacks are feasible. For new projects, prefer AES-GCM or ChaCha20-Poly1305.

See SECURITY.md for vulnerability reporting and details on key/IV zeroization.

Development

Requires Rust and Python 3.11+.

# Install Rust if you haven't
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

# Install uv if you haven't
curl -LsSf https://astral.sh/uv/install.sh | sh

# Build the extension and sync dev dependencies
uv sync --dev

# Run tests
uv run pytest

License

MIT License. See LICENSE for details.

This project uses the RustCrypto twofish crate which is dual-licensed under MIT/Apache-2.0. We use it under the MIT license.

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

oxifish-0.3.0.tar.gz (279.0 kB view details)

Uploaded Source

Built Distributions

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

oxifish-0.3.0-cp314-cp314-win_amd64.whl (181.4 kB view details)

Uploaded CPython 3.14Windows x86-64

oxifish-0.3.0-cp314-cp314-musllinux_1_2_x86_64.whl (510.4 kB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ x86-64

oxifish-0.3.0-cp314-cp314-musllinux_1_2_aarch64.whl (472.6 kB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ ARM64

oxifish-0.3.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (299.0 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ x86-64

oxifish-0.3.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (296.5 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ ARM64

oxifish-0.3.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl (318.6 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.5+ i686

oxifish-0.3.0-cp314-cp314-macosx_11_0_arm64.whl (273.1 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

oxifish-0.3.0-cp314-cp314-macosx_10_12_x86_64.whl (283.5 kB view details)

Uploaded CPython 3.14macOS 10.12+ x86-64

oxifish-0.3.0-cp313-cp313-win_amd64.whl (180.9 kB view details)

Uploaded CPython 3.13Windows x86-64

oxifish-0.3.0-cp313-cp313-musllinux_1_2_x86_64.whl (509.2 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

oxifish-0.3.0-cp313-cp313-musllinux_1_2_aarch64.whl (471.7 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ ARM64

oxifish-0.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (297.8 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

oxifish-0.3.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (295.6 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ ARM64

oxifish-0.3.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl (317.4 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.5+ i686

oxifish-0.3.0-cp313-cp313-macosx_11_0_arm64.whl (272.4 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

oxifish-0.3.0-cp313-cp313-macosx_10_12_x86_64.whl (282.9 kB view details)

Uploaded CPython 3.13macOS 10.12+ x86-64

oxifish-0.3.0-cp312-cp312-win_amd64.whl (180.3 kB view details)

Uploaded CPython 3.12Windows x86-64

oxifish-0.3.0-cp312-cp312-musllinux_1_2_x86_64.whl (508.1 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

oxifish-0.3.0-cp312-cp312-musllinux_1_2_aarch64.whl (470.7 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ ARM64

oxifish-0.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (296.9 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

oxifish-0.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (294.7 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARM64

oxifish-0.3.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl (317.1 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.5+ i686

oxifish-0.3.0-cp312-cp312-macosx_11_0_arm64.whl (271.5 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

oxifish-0.3.0-cp312-cp312-macosx_10_12_x86_64.whl (282.2 kB view details)

Uploaded CPython 3.12macOS 10.12+ x86-64

oxifish-0.3.0-cp311-cp311-win_amd64.whl (183.2 kB view details)

Uploaded CPython 3.11Windows x86-64

oxifish-0.3.0-cp311-cp311-musllinux_1_2_x86_64.whl (510.2 kB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ x86-64

oxifish-0.3.0-cp311-cp311-musllinux_1_2_aarch64.whl (473.0 kB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ ARM64

oxifish-0.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (298.9 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

oxifish-0.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (296.6 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ ARM64

oxifish-0.3.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl (319.7 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.5+ i686

oxifish-0.3.0-cp311-cp311-macosx_11_0_arm64.whl (274.5 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

oxifish-0.3.0-cp311-cp311-macosx_10_12_x86_64.whl (280.8 kB view details)

Uploaded CPython 3.11macOS 10.12+ x86-64

File details

Details for the file oxifish-0.3.0.tar.gz.

File metadata

  • Download URL: oxifish-0.3.0.tar.gz
  • Upload date:
  • Size: 279.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for oxifish-0.3.0.tar.gz
Algorithm Hash digest
SHA256 e90b9a54a80cb82a4bdf91fd377b6cd82b1ee31d7949b03ba10e18f415fb8e83
MD5 83feb6d030fbfd96d82465e1e0dcd1eb
BLAKE2b-256 1a2642c73eda97eda0daf1af7833ddbbf8258d8a189aaedd2a2ac440be00658e

See more details on using hashes here.

Provenance

The following attestation bundles were made for oxifish-0.3.0.tar.gz:

Publisher: release.yml on coreyleavitt/oxifish

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

File details

Details for the file oxifish-0.3.0-cp314-cp314-win_amd64.whl.

File metadata

  • Download URL: oxifish-0.3.0-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 181.4 kB
  • Tags: CPython 3.14, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for oxifish-0.3.0-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 6fdc09d0dadff6d20aa731463d06fc5e5357eb58d3588b6a21ba26348582eb80
MD5 2a910614a93194bc9716ed41df3b790e
BLAKE2b-256 a7df0f57eb5b6d1a25c001b861a45df52f465121bfe6c3fe2f2b7fcda0f8d07b

See more details on using hashes here.

Provenance

The following attestation bundles were made for oxifish-0.3.0-cp314-cp314-win_amd64.whl:

Publisher: release.yml on coreyleavitt/oxifish

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

File details

Details for the file oxifish-0.3.0-cp314-cp314-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for oxifish-0.3.0-cp314-cp314-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 3ac9d0a153decd9a89431038aaab7803d0a531c7213f065bbd46d9852b248060
MD5 ca8e5e0d521c72777ce2cc5f46cc40cc
BLAKE2b-256 9663d5d2548ffef5902a549e7b28ba654f629e763dd9a660bb690b9a644447ae

See more details on using hashes here.

Provenance

The following attestation bundles were made for oxifish-0.3.0-cp314-cp314-musllinux_1_2_x86_64.whl:

Publisher: release.yml on coreyleavitt/oxifish

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

File details

Details for the file oxifish-0.3.0-cp314-cp314-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for oxifish-0.3.0-cp314-cp314-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 e8d12aefd60184dd917ae173db01f12e01af12024fe9c9b87a167a4ea7d01c5b
MD5 c3f16afc34f5251a52fd4fecedbea84b
BLAKE2b-256 4aeb7a85d2149d4cccf0cb8d44914f9fb3175b7fc5a9dc55eb6f41216cc3565b

See more details on using hashes here.

Provenance

The following attestation bundles were made for oxifish-0.3.0-cp314-cp314-musllinux_1_2_aarch64.whl:

Publisher: release.yml on coreyleavitt/oxifish

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

File details

Details for the file oxifish-0.3.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for oxifish-0.3.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 0bd676e22c581184f74b3355df705e4b745545c996f8e8d1a50e31779378e187
MD5 4884ce141e400a43c38a060bc998424a
BLAKE2b-256 e69d9cda7ad824303452d284907dccfe46f1061938583e91a40e4b0a5fd32072

See more details on using hashes here.

Provenance

The following attestation bundles were made for oxifish-0.3.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on coreyleavitt/oxifish

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

File details

Details for the file oxifish-0.3.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for oxifish-0.3.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 429d55b05c627bdef3806fbf937d651b87a16dc6e5b7656fa3a7bbc78b56f9ff
MD5 81f404d6404d207763620158a56e1a3e
BLAKE2b-256 254ef5264d7cc6de9e0d0098681838e068b7a8902972b00af965bd8396f2c26a

See more details on using hashes here.

Provenance

The following attestation bundles were made for oxifish-0.3.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: release.yml on coreyleavitt/oxifish

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

File details

Details for the file oxifish-0.3.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl.

File metadata

File hashes

Hashes for oxifish-0.3.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl
Algorithm Hash digest
SHA256 158220a9c27f7fe36deff26691dac21f5ededf9dce3b3c8e4a18b92060fcb6a5
MD5 03d6483c6251f05eef9c4fd302df10d2
BLAKE2b-256 0c80418da5f36c32b37c45369fcf1b42643565076a0380957945d98aebf6345a

See more details on using hashes here.

Provenance

The following attestation bundles were made for oxifish-0.3.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl:

Publisher: release.yml on coreyleavitt/oxifish

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

File details

Details for the file oxifish-0.3.0-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for oxifish-0.3.0-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 804224783c7a76297e9eca9321a4ee99cb5521677d11ed327b32738cad71c501
MD5 22f5863f4ef23f7ad5e463d3e7c24146
BLAKE2b-256 eea7284992348b1df2a03d3d457af8aee19baa40cf7818538638bb39cc8682cc

See more details on using hashes here.

Provenance

The following attestation bundles were made for oxifish-0.3.0-cp314-cp314-macosx_11_0_arm64.whl:

Publisher: release.yml on coreyleavitt/oxifish

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

File details

Details for the file oxifish-0.3.0-cp314-cp314-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for oxifish-0.3.0-cp314-cp314-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 e2e039a4cfdf2307289d75c252b1f63769d54921dcbc33da069d427e6204b558
MD5 68c25c177d2dd4abcb54a60e542ed0e6
BLAKE2b-256 3110f50e49ca53ec7d21a3629cb0c0fdd89a587ad0537773e552ab21c2860f56

See more details on using hashes here.

Provenance

The following attestation bundles were made for oxifish-0.3.0-cp314-cp314-macosx_10_12_x86_64.whl:

Publisher: release.yml on coreyleavitt/oxifish

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

File details

Details for the file oxifish-0.3.0-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: oxifish-0.3.0-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 180.9 kB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for oxifish-0.3.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 1fb806393763a5221d1273e11fac32162b005c750f49556984d527096668c8f0
MD5 c1c51c470839fb5fb91a73a0cdbc7f75
BLAKE2b-256 c5cbe550875aee37d1d2832ac49742594f90e2144f2307b270af0e49c0aa6696

See more details on using hashes here.

Provenance

The following attestation bundles were made for oxifish-0.3.0-cp313-cp313-win_amd64.whl:

Publisher: release.yml on coreyleavitt/oxifish

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

File details

Details for the file oxifish-0.3.0-cp313-cp313-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for oxifish-0.3.0-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 521e9fe3dccb684c2ac62476a6bff2cfd1fc248a893dae63aa3118d0056bc6ea
MD5 f1fab75499f5c813242cda10ec58b883
BLAKE2b-256 440d89166bea271da388faa47538675f8c52c0eb87ab991c7033b3dc9fa3ad59

See more details on using hashes here.

Provenance

The following attestation bundles were made for oxifish-0.3.0-cp313-cp313-musllinux_1_2_x86_64.whl:

Publisher: release.yml on coreyleavitt/oxifish

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

File details

Details for the file oxifish-0.3.0-cp313-cp313-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for oxifish-0.3.0-cp313-cp313-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 748d9c20d31c16362352587bf79fb5eed6d9449ba2eb913b6689dabbf3ab2ed0
MD5 a7bb4540165f3e8345154916e0aae2d3
BLAKE2b-256 dd5e6c3026695caecfb172ed8b41543c48c09a6711e5b95a1b07f570a98ec7a3

See more details on using hashes here.

Provenance

The following attestation bundles were made for oxifish-0.3.0-cp313-cp313-musllinux_1_2_aarch64.whl:

Publisher: release.yml on coreyleavitt/oxifish

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

File details

Details for the file oxifish-0.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for oxifish-0.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 4795ea2abeceb35d92da5226ae6e574ed82279d06657299cb6e3056e77255807
MD5 4802e7abe0fdd25d99f29240da5da72f
BLAKE2b-256 96a1f5fc4d9e6d89f737375bf93c523cf69f3d6a65af25bacbb589a890e23bbe

See more details on using hashes here.

Provenance

The following attestation bundles were made for oxifish-0.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on coreyleavitt/oxifish

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

File details

Details for the file oxifish-0.3.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for oxifish-0.3.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 ac043fb43f67d5ec84ea310c58d074741021d1ac5c04d0dcfb17eb83fcf928d9
MD5 14a3a5f03e1c23cffdf64d7292d0ebcc
BLAKE2b-256 8d1776621763f203353625995fe623db07315f808b6a17c5643eb995ef035830

See more details on using hashes here.

Provenance

The following attestation bundles were made for oxifish-0.3.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: release.yml on coreyleavitt/oxifish

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

File details

Details for the file oxifish-0.3.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl.

File metadata

File hashes

Hashes for oxifish-0.3.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl
Algorithm Hash digest
SHA256 2f20f0141f93043e3cbd179a476c82c317a9a42f7250b065720aaea63c025ec9
MD5 cffa2439612c5247877627aabd9c1d36
BLAKE2b-256 f7b30cc14220c76395cbbfee51411206b10e2d225c843701a529bfd26d6aef4b

See more details on using hashes here.

Provenance

The following attestation bundles were made for oxifish-0.3.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl:

Publisher: release.yml on coreyleavitt/oxifish

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

File details

Details for the file oxifish-0.3.0-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for oxifish-0.3.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 798289fef091a1b541d03736d161598e980bd235d04f5d31d544ae3d3715a299
MD5 b1e298501b6b7dff83f66368c14c05d1
BLAKE2b-256 33f1cf05d9cc3da42545d1f4a7a41d5e564b5e34d5b2e26ed62012865e996c13

See more details on using hashes here.

Provenance

The following attestation bundles were made for oxifish-0.3.0-cp313-cp313-macosx_11_0_arm64.whl:

Publisher: release.yml on coreyleavitt/oxifish

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

File details

Details for the file oxifish-0.3.0-cp313-cp313-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for oxifish-0.3.0-cp313-cp313-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 b4d98cc037b229d310f5e77e597981cf2f15899d402367e860a2f0658c447183
MD5 905e7b76d9fd8d8cf3c7d7557aa319ad
BLAKE2b-256 82cb4013fbf0bd18fa094dc83f45594cc9d242c7bf3f15ad1dccc21f9bdd4db3

See more details on using hashes here.

Provenance

The following attestation bundles were made for oxifish-0.3.0-cp313-cp313-macosx_10_12_x86_64.whl:

Publisher: release.yml on coreyleavitt/oxifish

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

File details

Details for the file oxifish-0.3.0-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: oxifish-0.3.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 180.3 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for oxifish-0.3.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 4023627a98b308914bca289be2ea388a0dda076e51d84c6c77fd002acc6d51be
MD5 d4901863529dfbf8c1a2f0b55ba9e372
BLAKE2b-256 6cdf249da5435561b49b62eecfc59e3ff5adec13436751a43fd10d4b5d16496e

See more details on using hashes here.

Provenance

The following attestation bundles were made for oxifish-0.3.0-cp312-cp312-win_amd64.whl:

Publisher: release.yml on coreyleavitt/oxifish

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

File details

Details for the file oxifish-0.3.0-cp312-cp312-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for oxifish-0.3.0-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 150fa9cb6c119e088437afcec4c14ad977d982afce22ed08ac97cc923e3e9291
MD5 c9ef1c24333d26ba75252c5d4a67e777
BLAKE2b-256 aab670b05893b0fcc766ab2d09dd3c8c7801c227c40f462a38c0057e49366dad

See more details on using hashes here.

Provenance

The following attestation bundles were made for oxifish-0.3.0-cp312-cp312-musllinux_1_2_x86_64.whl:

Publisher: release.yml on coreyleavitt/oxifish

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

File details

Details for the file oxifish-0.3.0-cp312-cp312-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for oxifish-0.3.0-cp312-cp312-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 926abcbac03b990a3423ae141cc0946bf96993709456e5dc3c4bb372260314ca
MD5 c65ec5b4b66f9c6879db3190c072f67c
BLAKE2b-256 0664c78146b275af87c1b55d6152e8e9834cd36bc9f4c4d7b9d488d9362bc040

See more details on using hashes here.

Provenance

The following attestation bundles were made for oxifish-0.3.0-cp312-cp312-musllinux_1_2_aarch64.whl:

Publisher: release.yml on coreyleavitt/oxifish

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

File details

Details for the file oxifish-0.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for oxifish-0.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 310f8e27074452331c5c1aa51b9c06e0e417c84baa46096a799db948f8169227
MD5 4d00810712b8be70cb476076f81f3b66
BLAKE2b-256 c8429f1fce177fe674e3cc03a541f87436154fba7dd7b52e55a38b92d06f5054

See more details on using hashes here.

Provenance

The following attestation bundles were made for oxifish-0.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on coreyleavitt/oxifish

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

File details

Details for the file oxifish-0.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for oxifish-0.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 a1d724f0a191df5b41291da1a906dd59c68d63c133c8231b9d5072061ec5c04c
MD5 af15be1f46a65df69986d102cd81d350
BLAKE2b-256 509d07e3eef4fe70dd55bd9d531bb388337291cafbc86728ca3fba0ef94d6e51

See more details on using hashes here.

Provenance

The following attestation bundles were made for oxifish-0.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: release.yml on coreyleavitt/oxifish

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

File details

Details for the file oxifish-0.3.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl.

File metadata

File hashes

Hashes for oxifish-0.3.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl
Algorithm Hash digest
SHA256 fb99d7510dde2009c9a2724b78ab71acddf3cc9739cd2c98f19f9b3d67f99837
MD5 5e30e1fc7e4148c96234e40bacab448c
BLAKE2b-256 a05bb2fa7af17fc0a3c54db7720a76db978929387f5218610b52db6aa96ef1a5

See more details on using hashes here.

Provenance

The following attestation bundles were made for oxifish-0.3.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl:

Publisher: release.yml on coreyleavitt/oxifish

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

File details

Details for the file oxifish-0.3.0-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for oxifish-0.3.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 153f314a39d3f666098b196615beb4840291941b4d9ae89d2b6d49ea368bcfc8
MD5 666c6c61c5faf43723aee806e5c849ad
BLAKE2b-256 67e8a4397090b1e683847105b85de4b528f9fe763d43a929e2a69c23e5362714

See more details on using hashes here.

Provenance

The following attestation bundles were made for oxifish-0.3.0-cp312-cp312-macosx_11_0_arm64.whl:

Publisher: release.yml on coreyleavitt/oxifish

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

File details

Details for the file oxifish-0.3.0-cp312-cp312-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for oxifish-0.3.0-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 1ac2253b2ebc0516d8b7a117829506b7c3ed6b49fb65f7eb145c724448644a12
MD5 33a90b1055ade16fb0f10ba68c046748
BLAKE2b-256 e1f3282503e9d6296edfd5ea62f6e7142df6e026833dc53690b6786fa20eb109

See more details on using hashes here.

Provenance

The following attestation bundles were made for oxifish-0.3.0-cp312-cp312-macosx_10_12_x86_64.whl:

Publisher: release.yml on coreyleavitt/oxifish

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

File details

Details for the file oxifish-0.3.0-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: oxifish-0.3.0-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 183.2 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for oxifish-0.3.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 daed1f6f186f3ce8e15a871a0e0a72381b8189eb9ef1f1486ce65e56d384f515
MD5 2fb4181a638a9130d618e6db0ee02e2d
BLAKE2b-256 fc9fe1bc5e5b866d74ce0630a08b3fad38a1eba5aeec5c5c5deebba1eeb7d59c

See more details on using hashes here.

Provenance

The following attestation bundles were made for oxifish-0.3.0-cp311-cp311-win_amd64.whl:

Publisher: release.yml on coreyleavitt/oxifish

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

File details

Details for the file oxifish-0.3.0-cp311-cp311-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for oxifish-0.3.0-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 24d5d99550fd7f90c30758ee6aa635ccac2ab3133cff8af03cba7201b01f174d
MD5 9cdad8df8092c2cfd92336caedf39fbc
BLAKE2b-256 081817f2bcc331e48cee9fb5349d5acef61feaf44af49bd4383d2d13a7ef7790

See more details on using hashes here.

Provenance

The following attestation bundles were made for oxifish-0.3.0-cp311-cp311-musllinux_1_2_x86_64.whl:

Publisher: release.yml on coreyleavitt/oxifish

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

File details

Details for the file oxifish-0.3.0-cp311-cp311-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for oxifish-0.3.0-cp311-cp311-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 9a43e7cfd05c0c0444d3db8cb0da267ac065e3a1eb34f420b25c17aea9c87894
MD5 0973705811ecfa63897fa6101408cda2
BLAKE2b-256 fa6a9d5bc735531e5c7f7857346a6e0e419a02286dff54f612ef8177a2b9292d

See more details on using hashes here.

Provenance

The following attestation bundles were made for oxifish-0.3.0-cp311-cp311-musllinux_1_2_aarch64.whl:

Publisher: release.yml on coreyleavitt/oxifish

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

File details

Details for the file oxifish-0.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for oxifish-0.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 9f94c8a685b49a4cea95d8ee6104b5315ebadb69b35cba4a4ddb4df04d9c4f41
MD5 a873fe811903cbe09c86eafcb81d1ac6
BLAKE2b-256 ddb105bede1575affbb70814766c48fd861c1d642367d1c63b3b52736f63cd68

See more details on using hashes here.

Provenance

The following attestation bundles were made for oxifish-0.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on coreyleavitt/oxifish

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

File details

Details for the file oxifish-0.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for oxifish-0.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 7b61860ff9a287fd12cc300436ba565fb3552c504cc289bdfee74151fa29d833
MD5 e3df40c996a439165f2498b659a6f3bd
BLAKE2b-256 94e7186234bb11cc1c5a7307b9e931e104095c80ce84148437f5cf229514d2d5

See more details on using hashes here.

Provenance

The following attestation bundles were made for oxifish-0.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: release.yml on coreyleavitt/oxifish

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

File details

Details for the file oxifish-0.3.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl.

File metadata

File hashes

Hashes for oxifish-0.3.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl
Algorithm Hash digest
SHA256 189b90471744bceedd67bd07a8b0ef1feeb20edd6c8f64755c210cbdda30bc8a
MD5 63049f83d5a22ae09bae53bac8f6bed0
BLAKE2b-256 7af1bd9c45228bfad84f62d2bf6b1eed691eb8e3637ee50767939df14eb10462

See more details on using hashes here.

Provenance

The following attestation bundles were made for oxifish-0.3.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl:

Publisher: release.yml on coreyleavitt/oxifish

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

File details

Details for the file oxifish-0.3.0-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for oxifish-0.3.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 1cef4799e3114dc3e54b1efc2ac452ac513de21f8fd81bfe22f86dfffdddf4f1
MD5 6ef886f4e78c2196f75dd089f944c8a2
BLAKE2b-256 e46a7ad64a8dcb9afc719d416992fbd9be3ec8797604506949af043174b3a6cb

See more details on using hashes here.

Provenance

The following attestation bundles were made for oxifish-0.3.0-cp311-cp311-macosx_11_0_arm64.whl:

Publisher: release.yml on coreyleavitt/oxifish

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

File details

Details for the file oxifish-0.3.0-cp311-cp311-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for oxifish-0.3.0-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 c2ddc2a3d3a6fdd538a48aee95e766c554a1c73496d03f917c33ab35e57714a2
MD5 a856885ae382c77e41413e264fd1ffb1
BLAKE2b-256 2f7645a64b8199ed894f773c0d247ad9c03941788044e8b77ce7996291cda45f

See more details on using hashes here.

Provenance

The following attestation bundles were made for oxifish-0.3.0-cp311-cp311-macosx_10_12_x86_64.whl:

Publisher: release.yml on coreyleavitt/oxifish

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