Skip to content

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 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.

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.3.0'
shard-core --version

To include optional SLIP-39 support:

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

To install the same immutable release from source instead:

git clone --branch v0.3.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.

About

Authenticated threshold secret recovery with AEAD, Shamir sharing, Fordefi workflows, and reproducible offline bundles.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages