Skip to main content

Authenticated local encryption and Shamir threshold recovery with offline workflows.

Project description

shard-core

CI Python 3.9+ License: Apache--2.0 OR MIT--0

shard-core protects sensitive bytes and recovery phrases with authenticated encryption, threshold recovery, and fail-closed file handling.

Security status: 0.3.0 is the current source release and has not received an independent security audit. Tests and AI-assisted review are not a security audit. Use synthetic material for evaluation and rehearse recovery before protecting production secrets. The installation commands below remain pinned to the last verified published release until 0.3.0 publication is confirmed.

What it provides

Capability Status
ChaCha20-Poly1305 authenticated encryption Included
Scrypt passphrase encryption Included
AEAD plus Shamir threshold protection Included
Corrupt-extra-share recovery and ambiguity detection Included
Fordefi Recovery Phrases workflow Included
Custodian, peer, and multi-party custody guidance Included
Optional SLIP-39 support .[slip39] extra
Reproducible, hash-verified offline bundle pipeline Included
Implicit plaintext output or silent overwrite Refused

Architecture

Protect

plaintext
    |
    | encrypt with random 32-byte data-encryption key (DEK)
    v
ChaCha20-Poly1305 --------------------> authenticated ciphertext C
    ^                                               |
    |                                               |
random DEK -- Shamir split --> K1, K2, ... Kn       |
                              |                      |
                              +--> SHRD i = header + Ki + C

Each SHRD artifact contains a unique Shamir key share and the same ciphertext. That duplication is intentional: every valid threshold subset is self-contained. The trade-off is additional storage, not weaker confidentiality.

The plaintext itself is never Shamir-split. A wrong key-share combination fails AEAD authentication instead of returning plausible but incorrect plaintext.

Recover

supplied SHRD files
    |
    v
parse and group candidate sets
    |
    v
try bounded threshold combinations
    |
    v
reconstruct DEK -> verify AEAD tag -> plaintext
                       |
                       +--> fail closed on corruption or ambiguity

See THREAT_MODEL.md for the security properties, assumptions, and non-goals.

Install

Requires Python 3.9 or newer.

Quick install

Install the stable release from PyPI:

python3 -m venv .venv
. .venv/bin/activate
python -m pip install 'shard-core==0.2.0'
shard-core --version

To include optional SLIP-39 support:

python -m pip install 'shard-core[slip39]==0.2.0'

To install the same immutable release from source instead:

git clone --branch v0.2.0 --depth 1 \
  https://github.com/Protocol-Wealth/shard-core.git
cd shard-core
python3 -m venv .venv
. .venv/bin/activate
python -m pip install .
shard-core --version

For development:

python -m pip install -e '.[test]'

Advanced verified build

For a hash-locked, network-disabled, rootless Podman build and an installable offline bundle, follow OFFLINE_BUILD.md. The top-level install.sh only dispatches to an already built offline bundle; it is not the quick installer.

Quickstart

Authenticated threshold shares

shard-core protect \
  --threshold 2 \
  --shares 3 \
  --input secret.bin \
  --out-dir shares

shard-core verify-set --require-complete \
  shares/share-01.txt \
  shares/share-02.txt \
  shares/share-03.txt

shard-core recover \
  --output recovered.bin \
  shares/share-01.txt \
  shares/share-03.txt

Passphrase encryption

shard-core encrypt --input secret.bin --output secret.shen
shard-core decrypt --input secret.shen --output recovered.bin

The commands prompt without echo. For controlled automation, use a private regular file with --passphrase-file; environment-variable passphrases emit a warning.

Custodians, businesses, and trusted people

The current source-tree wizard exposes Choose a custody route as an explicit, non-default menu option. The existing commands can also be used directly:

Route Capability shard-core boundary
CoinCover Key Vault CLI Locally encrypts the original key file and uploads provider ciphertext Separate native workflow; do not create SHEN/SHRD first
Station70 native Fordefi/Bunker Uses Fordefi Public Key Upload and a Station70 recovery policy Separate native workflow; shard-core is not required
Station70 Custom Upload Browser-encrypts supplied text or a file before upload Separate by default; SHEN/SHRD would be a deliberate nested design
Station70 SWAT Provider-to-provider continuity into a linked standby wallet Not a SHEN or SHRD file-recovery path
External provider or person Holds one opaque SHEN file and returns it byte-for-byte Store the wrapping credential on a separate approved path
Two or more independent holders Each holds one SHRD file under an n-of-m policy Every holder must confirm exact SHRD acceptance and retrieval

For example, a 2-of-3 SHRD policy can use the labels protocol, station70, and trusted-friend, but naming a holder does not establish that it accepts the artifact. Provider capabilities and release requirements must be confirmed against current documentation and the applicable agreement.

The project never calls a vendor API or uploads an artifact. See docs/CUSTODY-PATTERNS.md for CoinCover-native, Station70 Bunker and Custom Upload, Nemean, peer-to-peer, tri-party, and nested-provider patterns.

Fordefi backup choice

Fordefi lets the operator choose among Public Key Upload, Recovery Phrases, and managed provider or hardware-backed methods.

Fordefi backup method
    |
    +--> Public Key Upload
    |        +--> self-managed RSA or YubiKey
    |        +--> managed CoinCover or Station70 Bunker
    |        +--> public-key recovery path; shard-core is not required
    |
    +--> Recovery Phrases
             +--> phrase -> SHEN plus separate credential
             +--> phrase -> threshold SHRD shares

For the Recovery Phrases path, direct encryption is:

shard-core fordefi encrypt --output protocol-phrase.shen
shard-core fordefi decrypt \
  --input protocol-phrase.shen \
  --output protocol-phrase.txt

Fordefi phrase entry is hidden and confirmed twice. Standard entry requires 12 lowercase ASCII words; whitespace is canonicalized without changing spelling, order, or case. shard-core does not assume a Fordefi phrase is BIP-39.

Follow docs/FORDEFI-DISASTER-RECOVERY.md for method selection, 2-of-2 phrase custody, external-custodian role checks, and the final offline Fordefi recovery boundary.

SLIP-39

Install .[slip39], then use the explicit slip39 command family for material independently confirmed to be compatible:

shard-core slip39 split \
  --threshold 2 \
  --shares 3 \
  --bip39-file mnemonic.txt \
  --out-dir slip39-shares

shard-core slip39 combine \
  --bip39 \
  --output recovered-mnemonic.txt \
  slip39-shares/share-01.txt \
  slip39-shares/share-03.txt

Safety defaults

  • Sensitive recovery and decryption require --output FILE or deliberate --stdout.
  • Existing output files are refused unless --force is explicit.
  • Final-component symlinks are refused even with --force.
  • Multi-file output is fully preflighted before any share is written.
  • New secret files use mode 0600; new private directories use mode 0700.
  • Identical duplicate shares are reported; conflicting duplicates fail.
  • Independent complete sets in one recovery invocation fail as ambiguous.
  • Recovery combinations are bounded to prevent uncontrolled work.
  • Manifests contain artifact hashes and set metadata, never plaintext hashes.

These controls assume a trusted host and controlled parent directories. See THREAT_MODEL.md and CEREMONY.md.

Formats and compatibility

  • SHEN v2 stores scrypt parameters, salt, nonce, tag, and ciphertext.
  • SHRD v2 stores the authenticated common header, one key share, and ciphertext.
  • SHEN v1/v2 and SHRD v1/v2 readers remain supported.
  • Display comments and holder labels are not cryptographically authenticated.

Wire-format changes require a separate compatibility and cryptographic review.

Documentation

Test

PYTHONPATH=src python -m unittest discover -s tests -v
PYTHONPATH=src python -O -m unittest discover -s tests -v

License

Dual-licensed under Apache-2.0 or MIT-0. See LICENSE and LICENSE-MIT-0.

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

shard_core-0.3.0.tar.gz (60.8 kB view details)

Uploaded Source

Built Distribution

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

shard_core-0.3.0-py3-none-any.whl (36.6 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for shard_core-0.3.0.tar.gz
Algorithm Hash digest
SHA256 65545d35c0b41da33c29aee70ba5dc928cfef355832fe375b1051b745562af9a
MD5 a5a02bd6c0ddf4843a62d06b2359a2d2
BLAKE2b-256 bd904199a0a24c48a869ed42ca94a4cf8e4bef3d34abe57a39711dcbc5bc47da

See more details on using hashes here.

Provenance

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

Publisher: publish-pypi.yml on Protocol-Wealth/shard-core

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

File details

Details for the file shard_core-0.3.0-py3-none-any.whl.

File metadata

  • Download URL: shard_core-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 36.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for shard_core-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 25444ccad4cef8b83ed92bb76286c22e60ebfe5287e9c075ced60f2674bbcc24
MD5 785bd54f5966dcc205e8b4d814642f9f
BLAKE2b-256 e04fa1011e1019e8cd87ea2103e88ede45ba1562fefe294cc867868954bb9937

See more details on using hashes here.

Provenance

The following attestation bundles were made for shard_core-0.3.0-py3-none-any.whl:

Publisher: publish-pypi.yml on Protocol-Wealth/shard-core

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