Skip to content

feat(release): verify detached release signatures - #222

Closed
seonghobae wants to merge 11 commits into
feat/release-evidence-contract-v1from
feat/release-signature-verification-v1
Closed

feat(release): verify detached release signatures#222
seonghobae wants to merge 11 commits into
feat/release-evidence-contract-v1from
feat/release-signature-verification-v1

Conversation

@seonghobae

@seonghobae seonghobae commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

Scope

Stacked on #217. This advances #210 from structural signature-presence evidence to a cryptographic, operator-invokable verification boundary. It does not publish a release candidate, distribute trust roots, or claim release readiness.

RED -> implementation

  • RED d7f43b90dfc0ec810b3cc7a759c0b05d251cecba: signature verifier absent; contract requires valid Ed25519 verification and rejection of forged signatures, unknown key identity, release/version substitution, subject-digest substitution, non-Ed25519 trust material, malformed trust maps, and non-canonical envelopes.
  • GREEN implementation 9e8ae50ca1a5098ac3232ce4032c900e53d3862b: verifyReleaseEvidenceSignatures reuses feat(release): add exact release evidence index contract #217's exact artifact byte/digest verification, reopens detached signature artifacts with O_NOFOLLOW, bounds and re-hashes the envelope, requires canonical JSON and exact release/subject identity, and verifies Ed25519 against an operator-supplied explicit trusted-key map.
  • Quality-gate wiring a6aae50f1360881afadd090a7cc3f1dd54cb6fa9.
  • RED b6f10140f2097338f799cddb940b93dbaeb5d367: requires a bounded operator CLI surface for signature verification.
  • GREEN ca0c16992d36034b71c957935d5991112e8864fd: adds verify-release --index ... --artifacts ... --trusted-keys ...; success output contains only release version and exact source commit.
  • RED 93a3954061d4edad8bb7c60ef9e3a2060f87e5cf: detects the existing lstat/readFile race at JSON-input trust boundaries.
  • GREEN 806633e2879c9f5637e7a5cba440e57d4912cd26: all commercial-readiness JSON inputs now open one descriptor with O_NOFOLLOW, validate that same descriptor with stat, read through it, and fail closed on final-symlink substitution.
  • Current exact head 280cd9ffe5c36f47c55aab8fa75523baf671514d includes static-check coverage for the new CLI/security regressions.

The signed statement is versioned as life-os.release-signature.v1 and binds exact source commit, channel, version, subject artifact name, and subject SHA-256 digest. Trust is never inferred from a key embedded in the artifact, a GitHub actor, or model output. Verification failures are payload-free.

Deliberate boundary

This slice verifies detached Ed25519 signature bytes and exposes the local operator verification command. It does not define key issuance, rotation, revocation, hardware custody, Sigstore/cosign identity policy, transparency-log acceptance, artifact publication, or #210's install/upgrade/backup/restore/buyer-journey gates. Those remain separate release work.

Keep Draft while parent #217 is Draft/unmerged. After #217 integrates through normal policy, retarget/rebase non-destructively onto the resulting protected main and obtain fresh exact-head repository + central required workflow/review evidence. The focused RED/GREEN sequence is repository history; queued, absent, predecessor, or skipped hosted evidence is not passing.

Refs #210, #217.

@coderabbitai

coderabbitai Bot commented Sep 1, 2026

Copy link
Copy Markdown

Important

Draft PR not reviewed

Draft PRs are not automatically reviewed by default.

  • Trigger a manual review

To automatically review draft PRs, update your CodeRabbit configuration:

reviews:
  auto_review:
    drafts: true

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

Copy link
Copy Markdown
Contributor Author

Superseded by #236 after verified complete, non-destructive transfer. The predecessor exact head e56a954bbea84f7cf49462da1834adfffde60cbe owns six release-signature/CLI paths relative to historical parent c5529fe5423b43039745f6da8ca0d7b8dd1ebb79. Current #217 head 38b2683654de0cd575e35bd4ebda45d8a8693c02 adds/modifies only the disjoint release-evidence directory-boundary test and release-evidence.mjs. #236 exact head 2f0924f2e4a8776afe352378279a6cd0cd45222a is a two-parent descendant of both this predecessor head and current #217; fresh comparison from current #217 is ahead-only with exactly the same six predecessor-owned paths. No predecessor review/check evidence transfers; #236 remains Draft for fresh exact-head evidence.

@seonghobae seonghobae closed this Sep 2, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant