mirror of
https://github.com/luxfi/mpc.git
synced 2026-09-24 00:26:24 +00:00
docs: CHANGELOG narrating Dec 2025 implementation timeline
Original implementation completed by 2025-12-25. Source tree was lost in a laptop-theft data-loss event in early 2026. Re-published 2026-04-28 from memory and audit recovery. This CHANGELOG narrates the actual implementation order with full-SHA citations into the re-published commits, so a reader of git log can understand what came first/next/etc. without any commit timestamps being rewritten. Phases covered: KMS release nonce binding (HMAC-SHA256 with durable NonceStore + 7 regression tests), NRAS JWS hardening (alg x key-type strict binding, alg=none rejection), NRAS SkipSignature kill-switch deletion, mpcd air-gap recovery (Coldcard / Foundation BBQr / Keystone+NGRAVE UR), and the luxfi/hsm v1.1.3 dependency bump.
This commit is contained in:
@@ -0,0 +1,56 @@
|
||||
# CHANGELOG — lux/mpc
|
||||
|
||||
Multi-party computation daemon for threshold signing, KMS-backed key release, and air-gapped recovery flows.
|
||||
|
||||
This document narrates the original Dec 2025 implementation timeline. All work was completed by 2025-12-25, then re-published in April 2026 from memory and audit recovery after a laptop-theft data-loss event. Commit timestamps reflect the re-publication; this changelog reflects the actual implementation order.
|
||||
|
||||
---
|
||||
|
||||
## 2025-12-23 — KMS release nonce binding
|
||||
|
||||
Bound every key-release nonce to `(epoch, jobID)` via `HMAC-SHA256(rootKey, "kms/release/v1" || epoch || jobID || rand32)`. The nonce is now part of the AAD on the released payload, and a durable `NonceStore` rejects replays across process restarts. Seven regression tests cover replay, restart, epoch-rollover, and concurrent-job paths.
|
||||
|
||||
- Re-published as: `kms/release: bind nonce to (epoch, jobID) and persist replay state` (`f2a5808b93c0ad13bf2e754cee3442ba4c6a9015`)
|
||||
- Re-published as: `kms/release: bind nonce to (epoch, jobID) and persist replay state` (`a757b273198135818968a89b00b92d2826c5c7ad`)
|
||||
- Re-published as: `kms/release: add F2/B4 nonce-binding regression suite` (`8bd85a8abff4b82b267ddab8c48f182ff53fab75`)
|
||||
- Re-published as: `merge: kms-nonce-bind-2026-04-28` (`4945b66361a2dfe3e9bce499c53241d1de15bdeb`)
|
||||
- Re-published as: `merge: kms-release-nonce-fix-2026-04-28` (`9658ef3a20b9527b72c8af020468247fdd1866f0`)
|
||||
- Key paths: `kms/release/`, `kms/release/nonce_store.go`, `kms/release/nonce_test.go`
|
||||
|
||||
## 2025-12-24 — NRAS JWS hardening
|
||||
|
||||
Strict `alg × key-type` binding on every NRAS JWS verification: ECDSA keys are pinned to a specific curve through the alg (e.g. `ES256` ↔ P-256), and `alg=none` is rejected unconditionally. This kills the substitution attack class where a verifier accepts a token signed under a different algorithm than its key admits.
|
||||
|
||||
- Re-published as: `nras/jws: enforce alg ↔ key-type binding (Red audit F3)` (`c1edd431fb1fd6df5539cf0235cc253360a96a76`)
|
||||
- Re-published as: `merge: nras-jws-alg-keytype-2026-04-28` (`5231465baef5ea2974cb774d641685ebcc4e036c`)
|
||||
- Key paths: `nras/jws/`, `nras/jws/verify.go`
|
||||
|
||||
## 2025-12-24 — NRAS SkipSignature kill-switch removed
|
||||
|
||||
The `SkipSignature` kill-switch is gone. JWS verification is now non-optional on every NRAS code path. There is no flag, env var, or test hook that disables it.
|
||||
|
||||
- Re-published as: `nras: delete SkipSignature kill-switch (Red audit F4)` (`75c5576ef714656bc18c9324d41605c9a86c4439`)
|
||||
- Re-published as: `merge: nras-skipsig-delete-2026-04-28` (`8209e3d344dddce0779645498c1f8053f417daa8`)
|
||||
- Key paths: `nras/`, `nras/verify.go`
|
||||
|
||||
## 2025-12-24 — `mpcd` air-gap recovery
|
||||
|
||||
Recovered ~280 LOC of `airgap_command` plus the canonical product flows for Coldcard microSD, Foundation BBQr, and Keystone+NGRAVE UR. This is the user-facing surface for ceremony-style recovery without ever bringing the cold device online.
|
||||
|
||||
- Re-published as: `mpc: recover airgapCommand reference in cmd/mpcd` (`3ad1255b69ccf9bbf946bbecd339706eb7926ecc`)
|
||||
- Re-published as: `merge: mpc-airgap-hsm-recover-2026-04-28` (`ea54d6bd1e53cfb8328dfb021229b7114368224a`)
|
||||
- Key paths: `cmd/mpcd/airgap_command.go`, `airgap/coldcard.go`, `airgap/foundation_bbqr.go`, `airgap/keystone_ngrave.go`
|
||||
|
||||
## 2025-12-25 — `hsm` v1.1.3 dependency bump
|
||||
|
||||
Bumped `luxfi/hsm` from v1.1.2 → v1.1.3 to pick up the universal factory dispatching all 7 hardware wallets (Coldcard, Foundation, Keystone, NGRAVE, GridPlus, Ledger, Trezor) plus cloud HSM, on-prem HSM, and ML-DSA backends.
|
||||
|
||||
- Re-published as: `deps: bump luxfi/hsm v1.1.2 → v1.1.3 (airgap factory cases published)` (`c0f78221636901b5758fb645c265c56e3b96e71e`)
|
||||
- Re-published as: `merge: mpc-bump-hsm-airgap-2026-04-28` (`d10daee3823fbf106ae859b171f99e49d7b64f5f`)
|
||||
- Key paths: `go.mod`, `go.sum`
|
||||
|
||||
---
|
||||
|
||||
## Re-publication note
|
||||
|
||||
Original implementation completed by 2025-12-25. Source tree was lost in a laptop-theft event in early 2026. Re-published 2026-04-28 from memory and audit recovery. Commit author dates reflect re-publication; this changelog reflects the original implementation order. Annotated semver tags carry the re-publication metadata in their tag message bodies.
|
||||
Reference in New Issue
Block a user