Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 27 additions & 10 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -187,24 +187,41 @@ jobs:
--note "Release ${{ github.ref_name }}"

# The ephemeral attestation anchors HEAD, whose trust chain ends at the
# maintainer's KEL. The repo publishes that KEL under refs/auths/registry
# (KEL-native distribution) — seed the runner's ~/.auths so the verifier
# can resolve it.
- name: Seed maintainer registry for verification
shell: bash
# maintainer's KEL. Resolve that KEL from the committed identity bundle
# (.auths/ci-bundle.json) — the same stateless bundle the commit-verify
# job uses — instead of seeding ~/.auths from refs/auths/registry. The
# git-ref mirror was unreliable (transportless push → drift, see #374);
# the bundle travels with the repo and needs no network fetch.
# Staleness tripwire: the committed bundle is a snapshot, so a key
# rotation silently invalidates it. Verifying HEAD's own commit through
# the bundle exercises the exact trust chain the artifact check needs and
# fails fast with an actionable message instead of at the last step.
- name: Guard — committed bundle still covers the signer (Unix)
if: matrix.ext == '.tar.gz'
run: |
./staging/auths verify HEAD --identity-bundle .auths/ci-bundle.json || {
echo "::error::.auths/ci-bundle.json no longer verifies HEAD — the maintainer key likely rotated after the bundle was exported. Regenerate with: auths id export-bundle --alias main --output .auths/ci-bundle.json --max-age-secs 31536000, commit, and re-tag."
exit 1
}

- name: Guard — committed bundle still covers the signer (Windows)
if: matrix.ext == '.zip'
shell: pwsh
run: |
git init -q "$HOME/.auths"
git -C "$HOME/.auths" fetch -q "$GITHUB_SERVER_URL/$GITHUB_REPOSITORY" 'refs/auths/*:refs/auths/*'
git -C "$HOME/.auths" for-each-ref refs/auths/
.\staging\auths.exe verify HEAD --identity-bundle .auths/ci-bundle.json
if ($LASTEXITCODE -ne 0) {
Write-Host "::error::.auths/ci-bundle.json no longer verifies HEAD - regenerate with 'auths id export-bundle --alias main --output .auths/ci-bundle.json --max-age-secs 31536000', commit, and re-tag."
exit 1
}

- name: Verify own attestation (Unix)
if: matrix.ext == '.tar.gz'
run: ./staging/auths artifact verify "${{ matrix.asset_name }}${{ matrix.ext }}"
run: ./staging/auths artifact verify "${{ matrix.asset_name }}${{ matrix.ext }}" --identity-bundle .auths/ci-bundle.json

- name: Verify own attestation (Windows)
if: matrix.ext == '.zip'
shell: pwsh
run: .\staging\auths.exe artifact verify "${{ matrix.asset_name }}${{ matrix.ext }}"
run: .\staging\auths.exe artifact verify "${{ matrix.asset_name }}${{ matrix.ext }}" --identity-bundle .auths/ci-bundle.json

- name: Upload artifact
uses: actions/upload-artifact@v4
Expand Down
3 changes: 0 additions & 3 deletions crates/auths-cli/src/cli.rs
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,6 @@ use crate::commands::oobi::OobiCommand;
use crate::commands::org::OrgCommand;
use crate::commands::policy::PolicyCommand;
use crate::commands::publish::PublishCommand;
use crate::commands::registry::RegistryCommand;
use crate::commands::reset::ResetCommand;
use crate::commands::scim::ScimCommand;
use crate::commands::sign::SignCommand;
Expand Down Expand Up @@ -156,8 +155,6 @@ pub enum RootCommand {
Audit(AuditCommand),
#[command(hide = true)]
Auth(AuthCommand),
#[command(hide = true)]
Registry(RegistryCommand),

// ── Internal (visible via --help-all) ──
#[command(hide = true)]
Expand Down
1 change: 0 additions & 1 deletion crates/auths-cli/src/commands/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,6 @@ pub mod org;
pub mod policy;
pub mod provision;
pub mod publish;
pub mod registry;
pub mod reset;
pub mod scim;
pub mod sign;
Expand Down
153 changes: 0 additions & 153 deletions crates/auths-cli/src/commands/registry.rs

This file was deleted.

15 changes: 0 additions & 15 deletions crates/auths-cli/src/commands/unified_verify.rs
Original file line number Diff line number Diff line change
Expand Up @@ -130,19 +130,6 @@ pub struct UnifiedVerifyCommand {
#[arg(long, value_name = "PATH")]
pub signature: Option<PathBuf>,

/// Override the git remote a signer's KEL is fetched from when it is absent
/// locally. Defaults to the repo's own `origin`. The local registry stays the
/// trusted floor — a remote can only advance the key-state, never roll it
/// back, and nothing is fetched when the KEL is already local.
#[arg(long)]
pub remote: Option<String>,

/// Fetch signer KELs over HTTP from this OOBI base URL (SSRF-hardened:
/// HTTPS-only, no redirects, private/loopback hosts blocked). Takes
/// precedence over `--remote`.
#[arg(long)]
pub oobi: Option<String>,

/// Fail verification when the signer's root KEL has not reached witness
/// quorum (fail-closed). Default: warn and continue.
#[arg(long = "require-witnesses")]
Expand All @@ -166,8 +153,6 @@ pub async fn handle_verify_unified(
witness_receipts: cmd.witness_receipts,
witness_threshold: cmd.witness_threshold,
witness_keys: cmd.witness_keys,
remote: cmd.remote,
oobi: cmd.oobi,
require_witnesses: cmd.require_witnesses,
// Honor --identity-bundle for commit/git-ref targets (previously dropped
// here, silently verifying against the wrong/default trust root).
Expand Down
Loading
Loading