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:
2026-04-28 00:01:45 -07:00
parent 4e7907ec38
commit be35565e4b
+56
View File
@@ -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.