Skip to content
Back to skills

Secp256k1

ASecurity

secp256k1 elliptic curve: parameters, group law, key encoding, point serialization, library bindings (libsecp256k1 in C, Rust, Python). USE WHEN: low-level key/point operations, debugging signature failures, understanding why Bitcoin uses this curve specifically.

  • 31 stars
  • 0 votes
  • 0 copies
  • 7 views
  • Added September 8, 2026
ai-agentspythonrustgoswiftnodedebugginggitapisecurity

Works with

  • cli
  • api

Security analysis

A100/100

Scanned September 22, 2026

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

Installs into .claude/skills of the current project.

Are you the author of Secp256k1?

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

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

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-secp256k1
description: |
  secp256k1 elliptic curve: parameters, group law, key encoding, point
  serialization, library bindings (libsecp256k1 in C, Rust, Python).
  USE WHEN: low-level key/point operations, debugging signature failures,
  understanding why Bitcoin uses this curve specifically.
allowed-tools: Read, Grep, Glob
---

# secp256k1

The elliptic curve Bitcoin uses for all signatures (ECDSA + Schnorr).
Defined by SECG (`SEC 2: Recommended Elliptic Curve Domain Parameters`).

## Parameters

```
p = 2^256 - 2^32 - 977   (the field prime)
a = 0
b = 7
G = (0x79BE667E_F9DCBBAC_55A06295_CE870B07_029BFCDB_2DCE28D9_59F2815B_16F81798,
     0x483ADA77_26A3C465_5DA4FBFC_0E1108A8_FD17B448_A6855419_9C47D08F_FB10D4B8)
n = 0xFFFFFFFF_FFFFFFFF_FFFFFFFF_FFFFFFFE_BAAEDCE6_AF48A03B_BFD25E8C_D0364141
h = 1   (cofactor)
```

The curve equation: `y^2 = x^3 + 7  (mod p)`.

## Point operations

- **Point addition**: P + Q with chord-and-tangent rule mod p.
- **Scalar multiplication**: `k*G` is the public key for private scalar k.
- **Point doubling**: 2P via tangent line.
- **Point at infinity**: identity for the group.

## Key encoding

### Public key (full)
- **Uncompressed (65 bytes)**: `0x04 || x || y` (32-byte each).
- **Compressed (33 bytes)**: `0x02 || x` if y even, `0x03 || x` if y odd.

### x-only (BIP340, Taproot)
- **32 bytes**: just `x`. Implicit even-y convention.
- Used in Schnorr signatures and Taproot output keys.

## Why secp256k1 (not P-256)?

- **No NSA-derived seed** in the parameter generation (P-256 has
  the controversial Dual_EC seeds and the ad-hoc base point).
- **Endomorphism** `λ = ...` allows fast multiplication: any point P
  has a known `(λ·P)` derivable cheaply, used in optimized scalar mult.
- **Sufficient security**: ~128-bit *classical* security against
  discrete-log attacks, parity to symmetric-128. See the quantum
  caveat below.

## Quantum outlook (as of September 2026)

The ~128-bit figure above is classical security. Shor's algorithm
solves the discrete log on an elliptic curve in polynomial time, so no
secp256k1 key size helps against a cryptographically relevant quantum
computer; the exposed surface is any *published* public key (a Taproot
x-only key sits in the scriptPubKey, a reused-address ECDSA key sits in
a spent input). None of this changes how you sign or verify today.

Two consensus-track drafts frame the response. Both are **Draft** in
the BIPs repo as of September 2026, with no activation parameters:

- **BIP 360, "Pay-to-Merkle-Root (P2MR)"** (Beast, Heilman, Foxen Duke;
  Consensus soft fork, assigned 2024-12-18, spec version 0.12.1) — P2TR
  with the key path removed, so the output publishes no EC point. It
  targets *long exposure* attacks only and deliberately picks no
  post-quantum signature algorithm, deferring that to a later proposal.
- **BIP 361, "Post Quantum Migration and Legacy Signature Sunset"**
  (Lopp et al.; Consensus soft fork, Type: Informational, assigned
  2026-02-11) — a phased sunset that first disallows sending to
  quantum-vulnerable outputs, then encumbers ECDSA/Schnorr spends with
  a quantum-safe rescue protocol.

Detail lives in [schnorr/SKILL.md](../schnorr/SKILL.md) (BIP340 key
exposure) and [../../protocol/proposals/SKILL.md](../../protocol/proposals/SKILL.md)
(output types, migration policy, rescue mechanics). libsecp256k1 ships
no post-quantum module.

## Critical operations to never mess up

1. **Modular inverse**: Use Fermat's little theorem `a^(p-2) mod p` or
   extended Euclidean. Constant-time required for security.
2. **Scalar generation**: 32 bytes of CSPRNG, reduce mod n. **Reject
   zero**. On a signing device, show the raw device-generated entropy
   and mix in independent user entropy (dice/coin) — both practices
   were reinforced by the July 2026 Coldcard advisory below.
3. **Range check pubkey**: x in [0, p), y satisfies curve equation.
4. **Co-factor**: cofactor h = 1, so any non-zero point on curve is in
   the prime-order subgroup. No subgroup check needed.

## Recommended library: libsecp256k1

The C library maintained at `github.com/bitcoin-core/secp256k1`:
- Constant-time everywhere by default.
- Optimized scalar mult using endomorphism.
- Modular APIs: `secp256k1_ec_*`, `secp256k1_ecdsa_*`,
  `secp256k1_xonly_*` / `secp256k1_keypair_*` (extrakeys),
  `secp256k1_schnorrsig_*` (BIP340), `secp256k1_ecdh_*`,
  `secp256k1_recovery_*`, `secp256k1_musig_*` (MuSig2, BIP327 — the C
  prefix has no `2`), `secp256k1_ellswift_*` (BIP324),
  `secp256k1_silentpayments_*` (BIP352). All modules are configure-time
  options; as of master (September 2026) every one defaults to enabled
  except `recovery`, which is off by default.
- **There is no FROST module upstream** (checked against master,
  September 2026). `secp256k1-frost` is a third-party fork, not a
  libsecp256k1 module — see [frost/SKILL.md](../frost/SKILL.md).
- Bindings: `rust-secp256k1`, `python-bitcoinlib` (via cffi),
  `secp256k1-node`, etc.

**Avoid** rolling your own EC math in production. Subtle errors here
are catastrophic.

### Current release (as of September 2026)

**v0.8.0 (2026-08-03)**. Modules are exactly: ecdh, ellswift, extrakeys,
musig, recovery, schnorrsig, silentpayments.

- v0.8.0 added the `silentpayments` module (BIP352 send/receive; needs
  full transaction data, no light-client scanning yet) and
  `secp256k1_context_set_sha256_compression`. `secp256k1_ellswift_xdh`
  now rejects secret keys >= the curve order instead of silently
  reducing them.
- v0.8.0 **removed** `secp256k1_context_no_precomp` (use
  `secp256k1_context_static`), the `secp256k1_schnorrsig_sign` alias
  (use `secp256k1_schnorrsig_sign32`) and the `SECP256K1_GNUC_PREREQ`
  macro. The two symbols break old callers at link time; the macro
  breaks them at compile time.
- v0.7.0 (2025-07-21) made the static context pointers `const` and
  removed the deprecated `secp256k1_ec_privkey_*` aliases (use
  `secp256k1_ec_seckey_*`); CMake minimum rose to 3.22 and CMake builds
  stopped being experimental. v0.7.1 (2026-01-26) is maintenance: wider
  stack-secret clearing, a parallel unit-test framework, and a fix for
  an x86_64 assembly feature check that could silently fall back to the
  slower C implementation.
- `rust-secp256k1` (crate `secp256k1`) is at 0.33.1 on crates.io
  (2026-08-29). The 0.32 series added MuSig2 support and **removed the
  `Secp256k1` context from the public API** in favour of a global
  context — a breaking change for every caller.

## Common bugs

- Using a non-CT mod-inverse → side-channel key leak.
- Accepting public keys without curve-equation check → invalid-curve
  attack on `(P + Q)` operations.
- Confusing `n` (group order) with `p` (field prime) — they differ.
- Generating private keys from a buggy RNG (e.g., `Math.random()` in
  JS) → catastrophic. Shipped-hardware case: Coldcard's July 2026
  advisory — a build/link error routed `rng_get()` to MicroPython's
  Yasmarang PRNG from March 2021 on (~40 bits of effective search space
  on Mk2/Mk3, ~72 on Mk4/Mk5/Q, both preliminary). Fixed in 5.6.0
  (Mk4/Mk5), 1.5.0Q (Q), 4.2.0 (Mk2/Mk3), Edge 6.6.0X/6.6.0QX; updating
  does **not** repair an already-generated seed. Details in
  [../../hardware/coldcard/SKILL.md](../../hardware/coldcard/SKILL.md).

## See also

- [ecdsa/SKILL.md](../ecdsa/SKILL.md)
- [schnorr/SKILL.md](../schnorr/SKILL.md)
- [../../libraries/secp256k1-c/SKILL.md](../../libraries/secp256k1-c/SKILL.md)
- [../../libraries/secp256k1-rs/SKILL.md](../../libraries/secp256k1-rs/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…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.