The new escrow package reaches the hub only when its code is claimed (R-978, unreleased)
The root ceremony uploaded the new package before the new code was claimed, and the hub overwrites the current package when the sealed secrets are unchanged: a customer who started the ceremony again and walked away kept a written-down code that opened nothing. Json mode (the FELHOM_ESCROW argv, unchanged) now returns the package (CeremonyOutput v2, PendingUpload); the daemon uploads it at POST /escrow/ceremony/claim before handing out the code. A failed upload is a 502 with the code still claimable; TTL and a new start wait for an in-flight claim upload; no uploader is a 503. Text mode still uploads at once. No sudoers change. Tests TestEscrowCeremony_R978_* (localapi) and the cmd-side defer/delivery/wiring tests, red-proved.
This commit is contained in:
1 parent
f7b7308c4d
commit
8561dc8a5c
9 files changed
+592
-36
No files matched your search
@@ -1,5 +1,7 @@
|
||||
package escrow
|
||||
|
||||
import "encoding/json"
|
||||
|
||||
// Controller-driven ceremony contract (v0.88.0, TASK 2026-07-13; mechanics validated by
|
||||
// felhom.eu/documentation/audits/SPIKE-controller-escrow-2026-07-13.md). The agent's local API
|
||||
// re-invokes the agent binary as root via `sudo -n` with ONE fixed argument vector; sudoers
|
||||
@@ -43,7 +45,15 @@ type CeremonyOutput struct {
|
||||
IdentityBlobBytes int `json:"identity_blob_bytes"`
|
||||
ResticPwSealed bool `json:"restic_pw_sealed"`
|
||||
Uploaded bool `json:"uploaded"`
|
||||
// PendingUpload (version 2, R-978) is the hub upload body — the R-wrapped blobs (ciphertext), the key
|
||||
// fingerprint and the sealed password's hash — that json mode hands back INSTEAD of uploading. The agent
|
||||
// daemon uploads it only when the customer claims the new recovery code, so a ceremony that is started
|
||||
// and abandoned never replaces the package the customer's previous code opens. Not a secret without R,
|
||||
// but never logged. Uploaded is false whenever this is set.
|
||||
PendingUpload json.RawMessage `json:"pending_upload,omitempty"`
|
||||
}
|
||||
|
||||
// CeremonyOutputVersion is the current CeremonyOutput.Version value.
|
||||
const CeremonyOutputVersion = 1
|
||||
// CeremonyOutputVersion is the current CeremonyOutput.Version value. 2 (R-978): json mode no longer
|
||||
// uploads; it returns PendingUpload. The daemon refuses any other version (a binary/daemon mismatch
|
||||
// fails the ceremony instead of losing a package).
|
||||
const CeremonyOutputVersion = 2
|
||||
Reference in new issue
Block a user