Skip to content
Back to skills

Frost

ASecurity

FROST (Flexible Round-Optimised Schnorr Threshold): t-of-n threshold signing on secp256k1. n participants share a key via Distributed Key Generation (DKG) or trusted dealer; any t can produce a Schnorr signature. Differs from MuSig2 (which is n-of-n). USE WHEN: t-of-n threshold custody (e.g., 3-of-5 board signatures) with single-sig appearance on chain, federated services, multi-sig with availability.

  • 31 stars
  • 0 votes
  • 0 copies
  • 2 views
  • Added September 8, 2026
ai-agentsrusttestinggitapisecurity

Works with

  • cli
  • api

Security analysis

A100/100

Scanned September 22, 2026

npx -y skills add claude-dev-suite/claude-dev-suite --skill frost --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Frost?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Frost
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/claude-dev-suite-frost/badge)](https://www.skillsdirectory.com/skills/claude-dev-suite-frost)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: bitcoin-frost
description: |
  FROST (Flexible Round-Optimised Schnorr Threshold): t-of-n threshold
  signing on secp256k1. n participants share a key via Distributed Key
  Generation (DKG) or trusted dealer; any t can produce a Schnorr
  signature. Differs from MuSig2 (which is n-of-n).
  USE WHEN: t-of-n threshold custody (e.g., 3-of-5 board signatures)
  with single-sig appearance on chain, federated services, multi-sig
  with availability.
allowed-tools: Read, Grep, Glob
---

# FROST — t-of-n Threshold Schnorr

FROST is the standard t-of-n threshold Schnorr signature scheme suitable
for Bitcoin. Like MuSig2, it produces a single 64-byte BIP340 signature
under one aggregated pubkey. Unlike MuSig2 (which requires all n parties
to sign), FROST allows any t ≤ n parties to sign.

## Key properties

- **t-of-n** — any t parties can sign, fewer cannot.
- **Single-sig appearance** — output looks like a regular Schnorr sig
  on a regular x-only pubkey.
- **Two rounds** in the FROST signing protocol (after one-time DKG).
- **No on-chain multisig** — saves bytes and improves privacy.

## Two phases

### Phase 1: Distributed Key Generation (DKG)

n parties run a DKG protocol to set up shares of a common private key
`d` corresponding to public key `P = d * G`. No single party ever
knows `d` itself.

DKG variants:
- **Pedersen DKG** (classical, 2 rounds with broadcast).
- **Trusted dealer** — one party generates `d`, hands shares out.
  Acceptable for some custody models.
- **DKG with verifiable secret sharing** — using Feldman / Pedersen
  VSS so parties can verify their shares.

After DKG, each party i has:
- Share `s_i` (Shamir share of `d`).
- Public verification key `S_i = s_i * G`.
- Group public key `P = d * G`.

### Phase 2: Threshold signing

When t parties want to sign message m:

#### Round 1 (commit)
Each signer i:
1. Generates two ephemeral nonces `(d_i, e_i)`.
2. Computes `(D_i, E_i) = (d_i*G, e_i*G)`.
3. Broadcasts `(D_i, E_i)` to coordinator.

#### Aggregation
Coordinator:
- Computes binding factor `ρ_i = H(i, m, ((D_j, E_j) for all signers))`.
- Computes group commitment `R = sum(D_i + ρ_i * E_i)`.

#### Round 2 (sign)
Each signer i:
- Computes Lagrange coefficient `λ_i` for the cooperating subset of
  size t.
- `c = TaggedHash("BIP0340/challenge", R.x || P.x || m)`.
- Partial sig: `z_i = d_i + ρ_i*e_i + λ_i * s_i * c   mod n`.
- Sends `z_i` to coordinator.

#### Aggregation
- `s = sum(z_i) mod n`.
- Final sig: `(R.x, s)`.

## FROST vs MuSig2

| Aspect | MuSig2 | FROST |
|--------|--------|-------|
| Threshold | n-of-n | t-of-n |
| Setup | trivial (just sum keys) | requires DKG |
| Round trip | 2 rounds + nonce setup | 2 rounds + DKG once |
| Partial sigs | per-signer-key contribution | Lagrange-based with subset selection |
| BIP | 327 | 445 (draft, PR open) |
| Bitcoin-specific | yes (BIP340 alignment) | yes (BIP340 alignment) |

Use **MuSig2** when all n parties always sign together (e.g., 2-of-2
joint custody).
Use **FROST** when subset signing is needed (e.g., 3-of-5 board, 2-of-3
multisig with social recovery).

## Implementations

- `frost-secp256k1` (Zcash / ZF FROST) — Rust reference.
- `secp256k1-frost` (bancaditalia/secp256k1-frost) — third-party Banca
  d'Italia (itcoin) fork of libsecp256k1 adding a `secp256k1_frost_*` C
  API; self-described "testing and experimentation" only, and **not** an
  upstream module as of September 2026 (see Status below).
- `chillDKG` (Blockstream research) — practical DKG with state recovery;
  now a submitted BIP draft (see Status below).
- `frostsnap` — Rust FROST stack behind the Frostsnap hardware wallet,
  MIT-licensed firmware + coordinator app (github.com/frostsnap/frostsnap).
- `frost-dalek` (Ristretto, not Bitcoin-relevant).
- Tools: `frost-cli` proof-of-concept.

## Status for Bitcoin

- **BIP 445** — "FROST Signing Protocol for BIP340 Signatures" (Sivaram
  Dhakshinamoorthy). Number assigned 2026-01-30; Status: Draft, spec
  version 0.10.0 (2026-08-26) as of September 2026. Submitted as
  `bitcoin/bips#2070` (opened 2026-01-03, still open — no BIP 445 file in
  the bips repo yet; the README table skips 443 → 446). Specifies the
  **FROST3** variant and adds what RFC 9591 lacks: BIP340 compatibility
  and key *tweaking* for BIP32 derivation and BIP341 Taproot. Key
  generation is explicitly out of scope for BIP 445.
- **ChillDKG BIP draft** — "ChillDKG: Distributed Key Generation for
  FROST" (Ruffing, Nick, Melnyk, Zhvanko, Dhakshinamoorthy), `Requires:
  445`, spec version 0.3.0-dev, no BIP number assigned yet. Submitted as
  `bitcoin/bips#2227` on 2026-07-30, still open as of September 2026.
  Dev repo: `BlockstreamResearch/bip-frost-dkg`.
- **RFC 9591 is not a drop-in for Bitcoin.** The IRTF published FROST as
  RFC 9591 (June 2024), including a `FROST(secp256k1, SHA-256)`
  ciphersuite — but its signatures are *not* BIP340-compatible, because
  BIP340 uses x-only public keys, and it specifies no key tweaking. An
  RFC 9591 library dropped into a Bitcoin wallet produces signatures
  Bitcoin will not accept. Use BIP 445 for signing; for key generation
  BIP 445 points at either ChillDKG or RFC 9591's own trusted-dealer
  setup (Appendix C).
- **No FROST module in either C library** (as of September 2026).
  bitcoin-core/secp256k1 master ships no FROST module — its module list
  is in [secp256k1/SKILL.md](../secp256k1/SKILL.md) — and secp256k1-zkp
  has only unmerged FROST pull requests, #138 (opened 2021-07-21) and
  #278 "FROST Trusted Dealer" (opened 2023-11-23), both still open. C
  callers have no upstream option; the Banca d'Italia `secp256k1-frost`
  fork above is not production-ready (last push 2026-06-11).
- Test deployments: Zcash uses FROST for orchard treasury; Bitcoin
  custodians experimenting (Coinkite, Lightning Labs research).
- Hardware wallet support: narrow, but no longer absent. **Frostsnap**
  ships a FROST-native Bitcoin hardware wallet — on-device DKG so the
  wallet secret never exists on any one device, arbitrary t-of-n,
  memory-safe Rust firmware on an ESP32-C3, MIT-licensed with
  deterministic builds; app/firmware v0.4.0 released 2026-08-25, units
  orderable with ~10-day delivery as of September 2026. The larger
  vendors had still not shipped FROST as of 2025.

## Security model

- **DKG correctness** — must use a robust DKG; bad DKG can leak `d`.
- **Nonce uniqueness** — same as MuSig2, never reuse nonces.
- **Subset binding** (`ρ_i` factor) — defeats the same Wagner-style
  attack that MuSig2 mitigates.
- **Identifiable abort** — modern FROST variants identify which party
  cheated (vs old "round failed, who?" problem).

## Use cases in Bitcoin

1. **Federated mints** (Fedimint guardians).
2. **Lightning Service Providers** with t-of-n key servers.
3. **Wallet recovery social schemes** (e.g., 2-of-3 friends).
4. **Multi-vendor multisig with availability** — currently P2WSH
   2-of-3 on chain; FROST collapses to single-sig on-chain.

## Common bugs

- Skipping verification step in DKG → silently corrupted shares.
- Reusing `(d_i, e_i)` nonces across signing sessions → key leak.
- Using non-Lagrange subset coefficients (e.g., linear weights) →
  produces wrong combined key.
- Mixing FROST and MuSig2 nonce derivation in a unified library and
  conflating tag domains.

## See also

- [musig2/SKILL.md](../musig2/SKILL.md)
- [schnorr/SKILL.md](../schnorr/SKILL.md)
- [../../l2/fedimint/SKILL.md](../../l2/fedimint/SKILL.md)

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…