·
19 commits
to main
since this release
Immutable
release. Only release title and notes can be modified.
Security & constant-timeness
- Hardened constant-time execution from best-effort to actual guarantees: no measurable timing behavior on 200K samples. Scalar multiplication now uses secret-scalar blinding via CSPRNG, un-precomputed points now use a constant-time fixed-window multiply instead of variable-time fallbacks, and modular arithmetic helpers were hardened. New CT benchmarks track timing behavior.
- General hardening across all modules
- Fixes from the Trail of Bits review: recovered ECDSA signatures are now bound to their recovery id, non-canonical BLS signature encodings are rejected, Edwards <-> Montgomery conversion helpers were corrected, and FROST DKG round-2 retry handling was hardened.
X25519 hardening
It was possible to execute a remote timing attack on X25519, across many samples, and learn up to 4.036 bits of long-term private key. Other 247 bits were NOT affected.
The impact: mainly fingerprinting (recognition of key across deployments), NOT key recovery, NOT X25519 breakage. Maintainer was also not able to escalate to co-residency (SMT).
Reported and found by:
- George Stergiopoulos, Department of Informatics, Athens University of Economics and Business, Greece (
geostergiop@aueb.gr) - Constantinos Patsakis, Department of Informatics, University of Piraeus, 80 Karaoli & Dimitriou str., 18534 Piraeus, Greece (
kpatsak@unipi.gr)
Performance
- ECDSA/EdDSA verification up to +32%, Weierstrass ECDH up to +19%, x25519 getPublicKey 2.7×
- BLS signatures 2x
- Init time (first getPublicKey or sign) reduced ~2x for ed25519, p256, p384, p521
- Also faster verification of recovered signatures, pairing tower / FFT / Pippenger optimizations, and joint-MSM paths in FROST and OPRF
- getPublicKey / sign got slower because we've decreased window size (W=8 => W=6) and hardened CT execution (see above). Long-running apps that prefer 2.2.0-level speed can restore it with one line:
secp256k1.Point.BASE.precompute(8)(likewise for other curves).
Misc
- Smaller bundles: improved tree-shaking across modules
- Better error messages and type checks
- Upgrade noble-hashes to 2.3.0, with performance boost
- Reduce on-disk size 1831kb → 1548kb (-282kb) by disabling source maps (they became less relevant).
Full Changelog: 2.2.0...2.3.0