Skip to content

feat(sign): prove a sign-time anchor carries an upgrade - #82

Merged
Bugs5382 merged 3 commits into
mainfrom
feat/41-sign-anchor-proof
Oct 16, 2026
Merged

Bugs5382 merged 3 commits into
mainfrom
feat/41-sign-anchor-proof

Conversation

@Bugs5382

Copy link
Copy Markdown
Contributor

What and why

Closes #41

An operator who downloads the unsigned release UKI and signs it afterwards now gets a node that takes in-place upgrades. switchroot already carries a sign-time anchor to init (#80); this pins the cryptos-node commit that reads it and ships cryptosctl image sign (CryptOS-PKI/cryptos-node#382, 01cf9e5), and proves the whole path in the QEMU suite.

  • go.mod/go.sum move cryptos-node to v0.0.0-20261016122123-01cf9e529716 (checksums from sum.golang.org), and release/pins.yaml follows so task release:guard stays consistent.
  • test/image/build-bridge.sh now also builds the candidate the release-asset way (no SB_CERT, and it fails if /init holds a certificate anyway), twice with different versions. It signs each with the pinned cryptosctl image sign and a second throwaway key K2 on /dev/shm, and checks each .sig with openssl. Those are the doc's how-to steps, run as written.
  • TestBridgeUpgrade gets three sign-time anchor steps on a fresh nodeid Root:
    1. sbverify --cert K2 on both signed UKIs, and the detached .sig checked in Go;
    2. boot the signed image and run the ceremony. image status has to answer with the running version (an image with no anchor answers Unimplemented);
    3. staging the bridge-key candidate is refused, and the second K2-signed image stages, activates and boots with the same identity.
  • docs/secure-boot.md gets a "Sign a downloaded unsigned image" how-to using cryptosctl image sign (replacing the note that signing afterwards leaves no anchor). docs/image-upgrade.md and docs/release.md are updated to match.

Verification

  • The bridge job's step table: the seven bridge upgrade steps plus the three sign-time anchor steps.
  • task release:guard in CI with the moved pin.

How this was verified

CI is the proof; nothing was built, tested or booted locally. go.mod and go.sum were edited by hand from the checksum database, and CI's module download verifies them. gofmt, bash -n and actionlint are clean.

The engine now reads the sign-time upgrade anchor from
CRYPTOS_UPGRADE_ANCHOR and ships cryptosctl image sign. release/pins.yaml
follows go.mod so the release guard stays consistent.

Refs #41

Signed-off-by: Bugs5382 <12115015+Bugs5382@users.noreply.github.com>
The bridge job builds the candidate unsigned with no build-time anchor,
signs it with cryptosctl image sign and a second throwaway key, checks it
with sbverify --cert and the detached signature, boots it, refuses an image
signed by the other key, and stages, activates and boots a second image
signed the same way.

Closes #41

Signed-off-by: Bugs5382 <12115015+Bugs5382@users.noreply.github.com>
…mage sign

Refs #41

Signed-off-by: Bugs5382 <12115015+Bugs5382@users.noreply.github.com>
@Bugs5382 Bugs5382 added this to the v0.1.0 milestone Oct 16, 2026
@Bugs5382 Bugs5382 added the enhancement New feature (feat). Minor version bump. label Oct 16, 2026
@Bugs5382 Bugs5382 self-assigned this Oct 16, 2026
@Bugs5382
Bugs5382 merged commit 6ca1a60 into main Oct 16, 2026
18 checks passed
@Bugs5382
Bugs5382 deleted the feat/41-sign-anchor-proof branch October 16, 2026 13:01
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature (feat). Minor version bump.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat(sign): sign a downloaded unsigned image with your own key, including the upgrade anchor

1 participant