Pleiades

IO Research · Cryptography

Decentralised key recovery via threshold secret sharing

🦀 Rust MIT License

The Seven Sisters

In Greek mythology, the Pleiades were the seven daughters of the titan Atlas and the sea-nymph Pleione — Alcyone, Maia, Electra, Taygeta, Merope, Celaeno, and Asterope. Condemned to hold up the sky, Atlas could no longer protect them. Zeus transformed the sisters into stars, scattering them across the heavens.

No single star tells the full story. One sister, Merope, hides in shame — the "lost Pleiad" — just as a single share of a secret reveals nothing alone. Only when enough sisters reunite does the constellation take shape.

Input Output Group's Pleiades mirrors this myth: a secret is split into shares distributed among guardians. Only when enough shares converge can the constellation be redrawn and the secret recovered.

σ₁ σ₂ σ₃ σ₄ σ₅ σ₆ s

What Pleiades Gives You

Three complementary schemes, one library. Choose the level of trust you need.

🔒

Threshold Security

Any t+1 shares reconstruct the secret. Fewer than t+1 reveal nothing — information-theoretic security.

✅

Verifiable Shares

Feldman VSS publishes elliptic curve group commitments so every participant can verify their share without trusting the dealer.

🗝️

Stateless Recovery

BUSS guardians derive their share on-demand from their own secret key — no extra storage, no pre-coordination.

⚡

FFT-Optimised

Polynomial evaluation via FFT over elliptic curve multiplicative subgroup — O(n log n) for large share counts.

🧩

Generic over Curves

Core schemes are generic over any PrimeField and Group — not locked to one curve.

🦀

Pure Rust

Idiomatic Result-based error handling and a clean API designed for embedding in larger protocols.

Quick Start

Add Pleiades to your project and split a secret in a few lines.

Cargo.toml
[dependencies]
arc-pleiades = "0.1"
src/main.rs
use arc_pleiades::ShamirSecretSharing;
use midnight_curves::Fr as Scalar;
use rand::thread_rng;

fn main() -> Result<(), arc_pleiades::Error> {
    // 3-of-5: split into 4 shares, reconstruct from any 3
    let sss = ShamirSecretSharing::new(2, 5)?;
    let secret = Scalar::from(0xdeadbeef_u64);

    let shares = sss.split(secret, &mut thread_rng())?;
    println!("Distributed {} shares", shares.len()); // 4

    let recovered = sss.reconstruct(&shares[..3])?;
    assert_eq!(secret, recovered);
    println!("Secret recovered ✓");
    Ok(())
}