Python reference implementation for codex32 (BIP93) and codex32-encoded master seeds.
Project description
python-codex32
Reference implementation of BIP-0093 (codex32): checksummed, SSSS-aware BIP32 seed strings.
This repository implements the codex32 string format described by BIP-0093. It provides encoding/decoding, regular/long codex32 checksums, CRC padding for base conversions, Shamir secret sharing scheme (SSSS) interpolation helpers and helpers to build codex32 strings from seed bytes.
Features
- Encode/decode codex32 data via
from_stringandfrom_unchecksummed_string. - Regular checksum (13 chars) and long checksum (15 chars) support.
- Construct codex32 strings from raw seed bytes via
from_seed. - CRC-based default padding scheme for
from_seed. - Default
from_seedidentifier is the bech32-encoded BIP32 fingerprint. - Interpolate/recover shares via
interpolate_at. - Parse codex32 strings and access parts via properties.
- Mutate codex32 strings by reassigning
is_upper,hrp,k,ident,share_idx,data, andpad_val. - Contains module and tests for Bech32/Bech32m and segwit addresses.
Security
Caution: This is reference code. Verify carefully before using with real funds.
Installation
Compatibility: Python 3.10–3.14
Recommended: use a virtual environment
Linux / macOS
python -m venv .venv
source .venv/bin/activate
pip install codex32
Windows
python -m venv .venv
.venv\Scripts\Activate.ps1
pip install codex32
Quick usage
from codex32 import Codex32String
# Create from seed bytes
s = Codex32String.from_seed(
bytes.fromhex('ffeeddccbbaa99887766554433221100'),
"ms13cashs", # prefix string, (HRP + '1' + header)
0 # padding value (default "CRC", otherwise integer)
)
print(s.s) # codex32 string
# Parse an existing codex32 string and inspect parts
a = Codex32String("ms13casha320zyxwvutsrqpnmlkjhgfedca2a8d0zehn8a0t")
print(a.hrp) # human-readable part
print(a.k) # threshold parameter
print(a.ident) # 4 character identifier
print(a.share_idx) # share index character
print(a.payload) # payload part
print(a.checksum) # checksum part
print(len(a)) # length of the codex32 string
print(a.is_upper) # case is upper True/False
print(s.data.hex()) # raw seed bytes as hex
print(a.pad_val) # padding value integer, (MSB first)
# Create from unchecksummed string (will append checksum)
c = Codex32String.from_unchecksummed_string("ms13cashcacdefghjklmnpqrstuvwxyz023")
print(str(c)) # equivalent to print(c.s)
# Interpolate shares to recover or derive target share index
shares = [s, a, c]
derived_share_d = Codex32String.interpolate_at(shares, target='d')
print(derived_share_d.s)
# Create Codex32String object from existing codex32 string and validate any HRP
e = Codex32String.from_string("cl", "cl10lueasd35kw6r5de5kueedxyesqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqanvrktzhlhusz")
print(e.ident)
print(e.s)
# Relabel a Codex32String object
e.ident = "cln2"
print(e.ident)
print(e.s)
# Uppercase a Codex32String object (for encoding in QR codes or handwriting)
e.is_upper = True
print(e.s)
Tests
pip install -e .[dev]
pytest
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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file codex32-0.6.1.tar.gz.
File metadata
- Download URL: codex32-0.6.1.tar.gz
- Upload date:
- Size: 27.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
57e2645e4eab870f59500217de44d8ba1f059d6b78ae6daf96705a0c31679871
|
|
| MD5 |
12b09652e8009a9a518f062448e0d674
|
|
| BLAKE2b-256 |
2ac61a7893241e236003fad8049d9421a41d0f0ed0629c5174cd14a82e548835
|
Provenance
The following attestation bundles were made for codex32-0.6.1.tar.gz:
Publisher:
python-publish.yml on BenWestgate/python-codex32
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
codex32-0.6.1.tar.gz -
Subject digest:
57e2645e4eab870f59500217de44d8ba1f059d6b78ae6daf96705a0c31679871 - Sigstore transparency entry: 843251031
- Sigstore integration time:
-
Permalink:
BenWestgate/python-codex32@c4980f60413effa0bf6a9a2720a73830209fb4ca -
Branch / Tag:
refs/tags/v0.6.1-beta - Owner: https://github.com/BenWestgate
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-publish.yml@c4980f60413effa0bf6a9a2720a73830209fb4ca -
Trigger Event:
release
-
Statement type:
File details
Details for the file codex32-0.6.1-py3-none-any.whl.
File metadata
- Download URL: codex32-0.6.1-py3-none-any.whl
- Upload date:
- Size: 14.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
aeeed3c0be7aa95c360d19c1f29e48e49cf70ee9573a578d4f9b1ac19b1a13fb
|
|
| MD5 |
700345a70c6128d402e4856602dfbf0e
|
|
| BLAKE2b-256 |
3b9a145d385da3bb5b71fed1e2c339fc71530b3c587b3a39a35a41c58d2d17f6
|
Provenance
The following attestation bundles were made for codex32-0.6.1-py3-none-any.whl:
Publisher:
python-publish.yml on BenWestgate/python-codex32
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
codex32-0.6.1-py3-none-any.whl -
Subject digest:
aeeed3c0be7aa95c360d19c1f29e48e49cf70ee9573a578d4f9b1ac19b1a13fb - Sigstore transparency entry: 843251084
- Sigstore integration time:
-
Permalink:
BenWestgate/python-codex32@c4980f60413effa0bf6a9a2720a73830209fb4ca -
Branch / Tag:
refs/tags/v0.6.1-beta - Owner: https://github.com/BenWestgate
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-publish.yml@c4980f60413effa0bf6a9a2720a73830209fb4ca -
Trigger Event:
release
-
Statement type: